Webサイト攻撃にあったログを見てみた

  • ---

    LINEで送る
  • -

    ブックマーク
  • -

    pocket
  • -

    rss
ハッカー

Webサーバーへのサイト攻撃にあいました。そのログを解析した結果を考えます。

犯人の目的は、『editBlackAndWhiteList』と『phpMyAdmin』です。

IPアドレスへの無差別攻撃

今回、攻撃にあったのは

直接IPアドレス指定

(https://xxx.xxx.xxx.xxx)

です。ホスト名(xxx.comなど)ではありません。なぜそれが分かるかというと、Webサーバーのデフォルトホストのログに残っていたからです。

運用しているサイトではない。Webサーバーをインストールしたときに用意される『ようこそ!』のようなページです。

本来は、このデフォルトホストは消しておくかアクセス拒否しておくものです。マネしないでください。

ハニーポットほどではないが、どういうアクセスがあるのか調査するため残しておいた。

ハニーポット(Honey Pot)

直訳すると『蜜のつぼ』。

わざとセキュリティの穴を開けて攻撃させ、攻撃パターンを解析するのに使う。

かんたんなものはログ解析程度だが、高度なものは解析プログラムと連動させる。

editBlackAndWhiteListって何?

Webサーバーのログです。

アクセスログ"POST /editBlackAndWhiteList HTTP/1.1" 404 146 "-" "ApiTool" "-"
エラーログopen() "/usr/share/nginx/html/editBlackAndWhiteList" failed (2: No such file or directory)

ブラックリストとホワイトリストの編集?

何かのAPIでしょうか?

調べると情報は少ないですが、共通しているのは

DVR/NVR/IPC機器のAPIの脆弱性を狙った攻撃

らしいです。DVR? NVR? IPC?ですね?

かんたんにいうと、監視カメラなどの映像を保存する機器のことです。もちろんインターネットを介してデータをやり取りするもの。

ブラックリストやホワイトリストを編集して不正に侵入するための下調べでしょうか。このアクセスでいい反応が来たら一気に侵入を試みるのでしょう。

これはけっこうな頻度(1日数回)でアクセスがあります。ただ、瞬間的に大量にアクセスするものではなく、1回につき1リクエストなのでサーバー負荷はありません。

ボクは放置です。

(もちろんログは残しています。)

ホスト名のある、運用しているサイトではまったく見られない。

とりあえず手当たり次第にIPアドレスに投げまくって、進入できそうなものを探しているか?

phpMyAdminは何かやろうとしている

アクセスログでもうひとつ気になるところです。

"GET /w00tw00t.at.blackhats.romanian.anti-sec:) HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /pma/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /myadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpmy/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /MyAdmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /mysql/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /mysqladmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /MySQL/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /pHpMyAdMiN/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /web/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /configuracion/phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /_phpMyAdmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /admin/phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /websql/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /db/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /dbadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /sqladmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpMyAdmin2/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /php-my-admin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /php/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /admin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /php/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpmyadmin/scripts/setup.php/index.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpMyAdmin-2.8.0.4/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /PMA/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpmy-admin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /php-admin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpMyAdmin-2.8.2/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpMyAdmin-2.8.1/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /phpMyAdmin-2.8.0/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /wp-content/plugins/wp-phpmyadmin/wp-phpmyadmin/phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /wp-phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /wp-phpmyadmin/phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /wordpress/wp-content/plugins/wp-phpmyadmin/phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /wp/wp-content/plugins/wp-phpmyadmin/phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"
"GET /webapps/phpmyadmin/scripts/setup.php HTTP/1.1" 404 146 "-" "ZmEu" "-"

phpMyAdminは、Web上からサーバーのデータベースの操作を行なうPHPプログラムで作られたアプリケーションです。

"setup.php"ファイルを探して実行しようとしているのが分かります。

インストールされているphpMyAdminを探して、初期設定をしようとしているんですね?

上手くいったらデータベースの接続を試みて、データを壊そうとしているのでしょう。個人情報を盗もうとしているのかもしれません。

インストールされているであろうディレクトリを手当たり次第に探しています。

WordPressやフレームワークも想定しています。

wp-content/plugins/WordPressの構成ディレクトリ
db
webapps
フレームワークでよく見るディレクトリ

完全な愉快犯

ワルいことしてやるぜ~。

と宣言しています。

w00tw00t.at.blackhats.romanian.anti-sec

w00tw00t『ヒャッほー!』みたいなスラング。
危ないヤツの奇声みたいなもの。
blackhatsブラックハット。
悪いことをするハッカー。
romanianルーマニア人。
本当にルーマニア人かはあやしい。
anti-secアンチ・セキュリティー。
『セキュリティーを壊してやる』とでも言いたいのか?

堂々と『やってやるぜ!』とケンカを売っています。ちなみにボクのサーバーでは何も起きませんでした。

エラーログ/usr/share/nginx/html/w00tw00t.at.blackhats.romanian.anti-sec:)" failed (2: No such file or directory)

すべてのアクセスで『No such file or directory』です。そりぁそうです。phpMyAdminをインストールしていませんから。

ただし、短時間に手当たり次第に、Webサーバーの公開ディレクトリに対してアクセスが集中します。

(20秒で40アクセス)

大したことはないですが、バレない程度の多くのアクセスを狙っているのかも?

ログには『やってやるぜ!』と出ているのに。

Webサーバーがギリギリのところで大量のアクセスをさばいているときは、けっこう負担になります。

それで気がつきました。

気をつけること

どちらも海外からの攻撃です。

editBlackAndWhiteList台湾の台北市。
台湾大手のプロバイダ。
phpMyAdminイタリアのフィレンツェのはずれの田舎町。
イタリアで有名なドメイン登録会社のプロバイダ。

アクセスログやエラーログの送信元IPアドレスから次のサービスで検索するとすぐに分かります。

こういうのは、いくつものサーバーを経由するし、送信元でさえ使われているだけかもしれないので、即、『このサーバーが悪い』とはなりません。

『ルーマニア人じゃないじゃん。イタリア人じゃねーか』と言いたくなりますが。

IPアドレス指定のアクセスを拒否

さっきも言いましたが、Webサーバーの初期設定ではIPアドレスでのURL指定が可能です。

https://192.168.3.101/index.html

これをアクセス拒否しましょう。

Webサーバーがリクエストを受け付けるのはホスト指定(xxxxxx.comなど)だけにします。

NGINXの設定

nginxのIP直打ち拒否
server {
    listen       80;
    server_name  default_server;

    location / {
        # なにも返さない
        # root   /usr/share/nginx/html;
        # index  index.html index.htm;
	return 444;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ /\.ht {
        deny  all;
    }
}

nginxの設定ファイルは/etc/nginx/conf.dにあります。ここで、サーバー名が'default_server'の設定ファイルを探してください。

その中の

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}

を次のように変更します。

location / {
    return 444;
}

httpステータスの444は、NGINXだけに用意された架空のステータスです。

これを返すとNGINXはリクエストを受け付けるだけでなにも返しません。

(レスポンスを返す処理の分だけCPU, メモリ, ディスク使用が節約される。)

じっさいは、IPアドレス拒否ではなく、初期ページのサイト全体がレスポンスを返しません。

設定の反映も忘れずに。

systemctl reload nginx

Apache HTTP Server 2.4系の設定

# default HTTP
<VirtualHost _default_:80>
    DocumentRoot /var/www/html
    ServerName example.com:80
    # add アクセス拒否
    <Location />
        Require all denied
    </Location>
</VirtualHost>

Apache(httpd)の設定ファイルは/etc/httpd/conf.dにあります。ここで、サーバー名が''example.com"の設定ファイルを探してください。

<Location />
    Require all denied
</Location>

<VirtualHost>があればその中に追加します。

初期ページを表示するサイト全体をアクセス拒否しました。

設定の反映も忘れずに。

systemctl reload httpd

正規表現を使えばIPアドレスだけを拒否できますが、こっちのほうがかんたんです。

PHPプログラムをURLから直接実行させない

ログでは、直接URLからphpプログラムを実行しようとしています。

https://sample.com/sample.php

これをアクセス拒否しましょう。URLはパスで指定し、リクエストを受けたら対応するphpプログラムを実行するようにします。

https://sample.com/product-list

のリクエストを受けたら

get-product-list.phpを動かすとか。

phpじゃなくても同じです。(pythonの.pyとか)

WordPressやフレームワークはこの作りになっている。

Webサーバーの公開ディレクトリは変更する

Webサーバー初期設定の公開ディレクトリを使うのはやめましょう。IPアドレスでランダムにアクセスされたとき、運用しているサイトに被害が出るかもしれません。

Apache/var/www
Nginx/usr/share/nginx

ユーザーを作成して、"/home/(new user)/"に作るのがベストです。

実行ファイルは公開ディレクトリに置かない

Webの公開ディレクトリの中に、プログラムの実行ファイルを置くのもよくありません。

"/home/(new user)/"の公開ディレクトリ以外に置いて、urlから実行ファイルを指定できないようにしましょう。

/home
  |---new-user
        |--- www <=== Webの公開ディレクトリ
        |--- bin <=== 実行プログラム

APIなど置かざるを得ないときは認証機能をつけるなど、ひと手間を加えて直接実行できないようにしましょう。

実行ファイルだと分からないようなファイル名のものを用意して、その中で実行するのもありです。

ただし、公開ディレクトリ配下をぜんぶリクエストされたら終わりなので、認証機能付き。

実行そのものは行うので。

(他人のサイトの公開ディレクトリ配下のファイルリストはかんたんに作れます。)

サイトの内容を変更するリクエストはひと手間加える。

(とくにデータベース操作。)

データベースのデータ取得なども注意。

(個人データをhttpリクエストで取られてしまう。)

SNSでも記事を配信しています。
コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

top
この記事を気に入ったらぜひシェアも!!