Webサーバーへのサイト攻撃にあいました。そのログを見たところ、いろんな痕跡が残っています。
犯人の目的は、『editBlackAndWhiteList』と『phpMyAdmin』です。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? ですね?
かんたんにいうと、監視カメラなどの映像を保存する機器のことです。もちろんインターネットを介してデータをやり取りするもの。
ブラックリストやホワイトリストを編集して不正に侵入するための下調べでしょうか。このアクセスでいい反応が来たら一気に侵入を試みるのでしょう。
ブラックリスト: 接続を許可しないIPなどのリスト
ホワイトリスト: 接続を許可するIPなどのリスト
(IP以外のアクセス元の情報を使うこともある。)
これはけっこうな頻度(1日数回)でアクセスがあります。ただ、瞬間的に大量にアクセスするものではなく、1回につき1リクエストなのでサーバー負荷はありません。
ボクは放置です。
(もちろんログに記録しています。)
ホスト名のある、運用しているサイトではまったく見られない。
とりあえず手当たり次第にIPアドレスに投げまくって、進入できそうなものを探しているか?
phpMyAdminでDBの不正操作?
アクセスログでもうひとつ気になるところです。
"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の設定
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サーバーの公開ディレクトリは変更する
Webサーバー初期設定の公開ディレクトリを使うのはやめましょう。IPアドレスでランダムにアクセスされたとき、運用しているサイトに被害が出るかもしれません。
Apache | /var/www |
Nginx | /usr/share/nginx |
OSユーザーを作成して、"/home/(new user)/" に作るのがベストです。
実行ファイルは公開ディレクトリに置かない
Webの公開ディレクトリの中に、プログラムの実行ファイルを置くのもよくありません。
"/home/(new user)/" の公開ディレクトリ以外に置いて、urlで実行ファイルを指定されても何もできないようにしましょう。
/home
|---new-user
|--- www <=== Webの公開ディレクトリ
|--- bin <=== 実行プログラム
APIなど置かざるを得ないときは認証機能をつけるなど、ひと手間を加えて直接実行できないようにしましょう。
実行ファイルだと分からないようなファイル名のものを用意して、その中で実行するのもありです。
ただし、公開ディレクトリ配下をぜんぶリクエストされたら終わりなので、認証機能付き。
実行そのものは行うので。
(他人のサイトの公開ディレクトリ配下のファイルリストはかんたんに作れます。)
サイトの内容を変更するリクエストは認証機能などひと手間加える。
(とくにデータベース操作。)
データベースのデータ取得なども注意。
(個人データをhttpリクエストで取られてしまう。)