WordPressに仕込まれたマルウェアのコードが恐ろしすぎた

『Googleから「マルウェアに感染している」という警告が届いたので、調査して欲しい』という依頼を受けて、とあるサイトの調査をしたところ、どうやらWordPressにマルウェアが仕込まれている模様。

かなり時間を掛けて広範囲にヤラれていたので、マルウェアをすべて取り除くのに苦労したのですが、その際に見付けたマルウェアが中々恐しいものだったので、ここに書き残しておきたいと思います。

なお、真似してマルウェアを作られても困るので、ソースの一部を画像で載せることにします。

マルウェアのソースを人間に読めるようにしてみる

では、早速マルウェアの中身を見てみましょう。

WordPress malware (1)

まず、いきなり始まるコメント行。そして、長くて一見ランダムに見える文字列。

WordPress malware (2)

そして2行目でランダムに見える文字列を base64_decode() し、eval() しています。base64_encode()しているのは、ソースを読み難くするためでしょう。1行目がコメント行なのも、ソースを読み難くするためなのでしょうね。エディタの syntax highlighting ですぐにコメントとわかっちゃいますけどw

このコードをそのまま実行してしまうのは危険なので、eval() を echo() に書き換えて実行してみます。

WordPress malware (3)

すると、こんなコードが出力されました。eval() がないからこれで終わりかな? と思ったのですが、preg_replace() に “e” という修飾子が付いているのがポイントでした。PHPのリファレンスマニュアルによると、

この非推奨の修飾子を設定すると、preg_replace() は、置換文字列において後方参照に関する通常の置換を行った後、PHP コードとして評価し、検索文字列を置換するためにその結果を使用します。

とあるので、実質的に eval() と同じですね。

これは危険なので、

preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\ ...

の “e” 修飾子を削除し、

echo preg_replace("/.*/","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\ ...

と書き換えて実行してみます。

WordPress malware (4)

すると、また出て来ました。eval() です。。念入りに何重にも難読化(?)されています。ただ、解読の手法はまったく同じなので、eval() を echo() に書き換えてまた実行してみると。。。

WordPress malware (5)

ようやく本体っぽいコードが出て来ました! 解読した直後はすべてが一行になってて読み難くされていたので、改行やインデントを入れて読み易いように整形してあります。

マルウェアの動作を読む

では、マルウェアの本体がわかったところで、どのような動作をしているのが読んで行ってみましょう。

ちなみにここから先は、下手に動作させると危険なため、コードは実行していません。そのため、実際にはバグで一部のコードが動かないなんてこともあるでしょうし、私が読み間違えている可能性もあります。ただ、どのような情報を取得しようとしているのか、システムに対して何をしようとしているのかはわかると思います。

WordPress malware (6)

まずはこの部分。ディスクの空き容量、OSのバージョンを調べ、exploit-db.com というサイトにアクセスしています。このサイトにはアクセスしていないのですが、名前からしてOSの脆弱性を調べるサイトなのではないでしょうか。

この画像の後半部分ではWebサーバの実行ユーザ、実行グループを取得していますが、これらはディスク空き容量と共に画面に出力するようになっています。

WordPress malware (7)

与えられたパラメータに対し、scandir()を実行しています。パラメータは別の場所で POST で与えられるようになっており、Webサーバの実行ユーザがアクセス出来るディレクトリであれば、中にどのようなファイルがあるか調べることが出来るようになってます。

WordPress malware (8)

Apacheのモジュール、curlのバージョン、DBの情報、/etc/passwdや/etc/shadowのパーミッション、OSのバージョン、特定のコマンドの有無など、システムの情報を洗いざらい調べています。

WordPress malware (9)

POSTで送ったPHPのコードをeval()で実行しています。これはつまり、Webサーバの権限で任意のPHPコードを実行することが出来るということです。

WordPress malware (10)

ファイルマネージャーでしょうか。Webサーバの権限で書き込める場所であれば、どこにでもファイルをアップロード出来るようになっています。また、ディレクトリの作成、ファイルの削除なども出来るようになってます。

WordPress malware (11)

外部から指定したサーバへブルートフォースアタックするコード。ftp, mysql, postgresqlに対応しています。

WordPress malware (12)

また意味のわからない文字列が出て来ました。もうちょっと先を読んでみると…

WordPress malware (13)

文字列をbase64_decode()して /tmp 下に保存して実行しています。では、ここでこの文字列をbase64_decode() して表示してみましょう。

WordPress malware (14)

ポートを開いて、外部から任意のシェルコマンドを実行するプログラムになっていました。

これらの他にもユーティリティ系の関数などがあるのですが、直接システムに害を及ぼすのはこんなところでしょうか。

  • OSやApacheの情報の取得
  • ファイルのアップロード、ダウンロード
  • 外部へのブルートフォースアタック
  • PHP、シェルの任意のコマンド実行

と、あらゆる攻撃が可能になっています。

もちろん、実行権限はあくまでもWebサーバの実行ユーザですが、

  • 全 Virtual Host が影響を受ける
  • OSにローカルユーザがroot権限を取れる脆弱性があれば、root権限を奪われる可能性もある

というわけで、影響は決して小さくありません。ちなみにこのサーバでは、侵入されたと思われる Virtual Host 以外の Virtual Host のファイルも大量に書き換えられていました。

最後に

WordPressは現在世界中で一番使われているブログシステムでありCMSであるわけですが、それは「最も狙われやすいWebアプリ」ということでもあります。

WordPressが一番使われている理由の一つが「システムに詳しくない人でも、誰でも簡単にインストールして使える」ことだと思うのですが、「誰でも簡単に」使えるようにするため、デフォルト状態の WordPressのセキュリティは決して高いものとは言えません。

そのため、WordPressをセキュアに使うためには、別途対策が必要となります。対策として一番まとまっているのは、WordPress公式ページの下記の記事でしょう。

WordPressの安全性を高める

このブログでも、私が実施したセキュリティ対策について書いて行きたいと思います。

追記(2014/10/22)

マルウェアが仕込まれた経緯について、記事にしました。

WordPressサーバにマルウェアが仕込まれた経緯について

スポンサーリンク
スポンサーリンク:

フォローする