/cgi-bin/phpへの魔法少女アパッチ☆マギカ攻撃への注意喚起

先日に書いた CGI版PHPへのApache Magica攻撃の観察 の記事ですが、さくらのVPSに来ているアクセスを追っていると、この攻撃はここ1週間ほど猛烈な勢いで行われているようです。

どうも日本国内でもかなりの数のサーバが攻撃を受けてボット化している気がする(というか、気がするんじゃなくて事実しているはず)ため、ここでちょっとした注意喚起をしてみたいと思います。というかこの攻撃、名前付いてないんでしょうかね。本当に魔法少女アパッチ☆マギカ攻撃でいいんだろうか?(CGI版PHPに対する魔法少女アパッチマギカ攻撃を観測しました | 徳丸浩の日記)

確認が必要な対象者

CGIPHPをインストールしてインターネットに公開しているWebサーバ管理者です。ここで注意しないといけないのは、CGIPHPはインストールしているつもりが無くても入ってしまっている場合が多々あるということです。そのため、以下のURLを実際に自分で叩いてみましょう。

http://(あなたの管理ホスト)/cgi-bin/php
http://(あなたの管理ホスト)/cgi-bin/php4
http://(あなたの管理ホスト)/cgi-bin/php5
http://(あなたの管理ホスト)/cgi-bin/php-cgi
http://(あなたの管理ホスト)/cgi-bin/php.cgi

アクセスしてみて、全て[404 Not Found]ならば対処の必要はありません。[500 Internal Server Error]ならば確認の必要があります。

あるいは、Apacheで設定している/cgi-bin/を直接覗いてみてももちろん構いません。具体的には、httpd.confファイルで設定している/cgi-bin/ ディレクトリの場所を確認し、該当パスにcdしてからlsして、php*という名前のファイルが無いかを確認してください。

$ cd /var/www/cgi-bin
$ ls -alF php*

phpファイルがあれば確認が必要です。

PHPのバージョン確認

まず、お使いのサーバにインストールされているCGIPHPのバージョンを確認します。パス名は各自の環境に合わせて読み替えてください。

$ /var/www/cgi-bin/php-cgi -v
PHP 5.4.2 (cgi-fcgi) (built: Nov  5 2013 23:54:47)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

CVE-2012-1823およびCVE-2012-2311脆弱性の影響を受ける、"PHP before 5.3.13 and 5.4.x before 5.4.3"ならばさらに確認が必要です。この例ではPHP 5.4.2なので、もちろん確認が必要です。

なお未知の脆弱性がある可能性もあるため、対象外のバージョンでもアクセスログの確認はお勧めします。

攻撃を受けたかどうかの確認

ここ1週間ほどの我が家での観察によると、この魔法少女アパッチ☆マギカ攻撃(でいいのか?)は、Webサーバの以下のパスを狙ってきます。

/cgi-bin/php
/cgi-bin/php4
/cgi-bin/php5
/cgi-bin/php-cgi
/cgi-bin/php.cgi

なおアクセスの際、/cgi-bin/phpなどパス部分は丸ごとURLエンコードされている場合が多いため、単純にアクセスログを'/cgi-bin/php'でgrepしても引っかからないことが多いです。URLエンコード後の'/%63%67%69%2D%62%69%6E/%70%68%70'でもgrepしないといけません。

$ grep '/cgi-bin/php' access_log*
に加えて、
$ grep '/%63%67%69%2D%62%69%6E/%70%68%70' access_log*

※きちんと/cgi-bin/phpで攻撃してくる人もいるため、両方でgrepしないといけません。攻撃グループによって違うのかな

ログを確認してみて、攻撃を受けていると(というか相当広範囲にスキャンしているようなので、アクセスがある方が普通だと思います)、以下のようなアクセスログが見つかると思います。

xx.xx.xx.xx - - [14/Nov/2013:09:16:48 +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%(省略)%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 "-" "-"

今までもPHPには多くの脆弱性が見つかってきましたが、それらはindex.phpなどの「サーバに設置されたPHPスクリプトファイル」がターゲットでした。そのため、「脆弱性のあるCGIPHPをサーバにインストールしているけど、サーバ上にindex.phpなどのPHPスクリプトのファイルを置いていない」場合は実質的に無害となっていました。具体的には、数年前にLinuxをインストールして、そのまま放置されているサーバ、というケースです(かなり多そう)。

今回の脆弱性は/cgi-bin/phpを直接狙うため、サーバにindex.phpなどのPHPスクリプトを置いていなくても(さらには、ApacheAddHandlerしてCGIPHPの設定をしていなくても)、/cgi-bin/phpさえあれば攻撃が成立してしまいます。具体的には、先ほどアクセスログで返却しているHTTPステータスが200 OKだった場合は、既に攻撃を受けてボット化している可能性が非常に高いです。

xx.xx.xx.xx - - [14/Nov/2013:09:16:48 +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%6
...
...
%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%6E HTTP/1.1" 500 602 "-" "-"

Apacheアクセスログの出力設定にもよりますが、デフォルトならばクライアントからのリクエストの次のカラムに来る数字3ケタが返却しているHTTPステータスです。

(省略) HTTP/1.1" 500 602 "-" "-"

ここでは、500(Internal Server Error)を返していることになります。もしこれが200を返していたら、そのサーバは攻撃を受け付けてしまった可能性が高いです。

攻撃を受けてしまっていたら

うちのハニーポットもどきサーバでの観察は以前の日記に書きましたが、C&Cサーバに接続してバックドアを開くためのbotが既に設置されてしまっていると思われます。つまりあなたのサーバは既にボットネットに組み込まれたゾンビPCとなっています。そのため、ネットワークからの切り離しが最優先です(切り離す直前にnetstatコマンドを打ち、どこに通信していたかの記録保全はしておいた方がいいかもしれません)。

この攻撃ではhttpdの実行ユーザ権限で任意のコマンドが実行されますので、httpdを実行しているユーザで不審なプロセスが動いていないか確認します。なお、$0を書き換えて動作させるものがほとんどなので、psコマンドの出力は偽装されています。ps auxwwとps cauxwwと、cを付けたものと付けないもので確認しましょう。

$ ps auxww
$ ps cauxww
(httpd実行ユーザで動いているプロセスのうち、不審なものが無いかを確認)

しかし現実的には、サーバ初期化が最短の道でしょう。