ノラWEB屋 野良人(のらんど)- 個人営業のWEB屋さん

【事例】WordPressサイト改ざんの復旧と対策を行いました

2018年12月13日

改ざん被害にあったWordPressサイトの復旧と調査、再発防止のための対策を行いました。同様の被害にあわないために/被害にあってしまった人のために、事例を共有したいと思います。

この記事が不正な改ざん等の被害を減らすお役立て頂けると幸いです。また、より良い対策について知見があれば共有頂けると更に有難いです。

    WordPressサイト改ざん被害の内容

    WordPressサイト改ざん被害の実例

    サイトの全ページのヘッダに海外のアダルト系商品(バイアグラかなにか)のECサイトへのリンクが埋め込まれていました。

    表示パターンの一例

    以下のようなテキストが表示されます。下線部がリンクになっています(以下ではリンクはしていません)。前半のour partnersとかの部分と後半のリンク部分の組み合わせはランダムになっています。

    • our partners cialisfrance24.com
    • our dealers cialis 20mg
    • our partners cialis pas cher

    改ざん箇所:header.phpに悪意のあるコードを注入

    テーマファイルのheader.phpが改ざんされ、bodyタグの直後に以下のコードが追加されていました。

    PHP
    <body><?php /* 32a9bfbd026a7c5ae1d84ec6a582aa2f */ ?><?php load_extra_modules() ?>
    
    <?php
    function _z($t){if(preg_match_all('!{([^}]+)}!',$t,$o,PREG_SET_ORDER)){$r=abs(crc32($_SERVER['REQUEST_URI']));foreach($o as $x){$m=explode('|',$x[1]);$t=str_replace($x[0],$m[$r%count($m)],$t);}}return $t;}
    function load_extra_modules(){
    $a[]="{our partners|our dealers} <a href='{http://cialisfrance24.com/' title='cialis'>cialisfrance24.com|http://cialisfrance24.com/' title='cialis 20mg'>cialis 20mg|http://cialisfrance24.com/' title='cialis pas cher'>cialis pas cher|http://cialisfrance24.com/' title='cialis prix'>cialis prix}</a>";
    
    
    $za=mt_rand(111,999);$zb=mt_rand(111,999);$zc=mt_rand(11,99);$zd=$za*$zb+$zc;$ze="{$za}*{$zb}+{$zc}";$s="<div class='medicfr$zd' id='$zd'><ul>";
    foreach($a as $x)$s.=_z("<li>$x</li>");echo "$s</ul></div>\n";}
    
    ?><?php /* 32a9bfbd026a7c5ae1d84ec6a582aa2f */ ?>
    

    ひとまず上記を削除し、その他の改ざんを受けていないかどうかスキャンしたり、可能な範囲でファイルを新しいものに置き換えるなどしてから最新版に更新しました。

    サーバーログから見る具体的な攻撃手法

    実際に改ざんを行ったとみられるログは以下のものです(一部加工しています)。header.phpのファイル更新日時と同じ日時なのでまず間違いないでしょう。

    管理画面からログインし、テーマエディターで編集しています。手動かな。

    178.137.19.88 - - [DD/MM/YYYY:HH:44:12 +0900] "GET /wp-login.php HTTP/1.1" 200 2287 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    178.137.19.88 - - [DD/MM/YYYY:HH:44:14 +0900] "POST /wp-login.php HTTP/1.1" 302 - "http://example.com/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    178.137.19.88 - - [DD/MM/YYYY:HH:44:15 +0900] "GET /wp-admin/ HTTP/1.1" 200 39103 "http://example.com/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    178.137.19.88 - - [DD/MM/YYYY:HH:44:18 +0900] "GET /wp-admin/theme-editor.php HTTP/1.1" 200 39717 "http://example.com/wp-admin/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    178.137.19.88 - - [DD/MM/YYYY:HH:44:21 +0900] "GET /wp-admin/theme-editor.php?file=header.php&theme=themename HTTP/1.1" 200 32476 "http://example.com/wp-admin/theme-editor.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    178.137.19.88 - - [DD/MM/YYYY:HH:44:24 +0900] "POST /wp-admin/theme-editor.php HTTP/1.1" 302 - "http://example.com/wp-admin/theme-editor.php?file=header.php&theme=themename" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    178.137.19.88 - - [DD/MM/YYYY:HH:44:25 +0900] "GET /wp-admin/theme-editor.php?file=header.php&theme=themename&scrollto=0&updated=true HTTP/1.1" 200 34044 "http://example.com/wp-admin/theme-editor.php?file=header.php&theme=themename" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    178.137.19.88 - - [DD/MM/YYYY:HH:44:28 +0900] "GET /wp-admin/theme-editor.php?file=header.php&theme=themename HTTP/1.1" 200 33918 "http://example.com/wp-admin/theme-editor.php?file=header.php&theme=themename&scrollto=0&updated=true" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2705.58 Safari/537.36"
    

    同じIPからのアクセスはこれ以外にないのですが、ログインは一発で成功しており、ログイン情報が漏洩していたと思われます。

    以下のように、ログイン画面に対するブルートフォースアタック(総当り攻撃)は毎日のようにくらっており、侵入の直前にも3000回以上試行されています。IPは別ですが、同一の攻撃者が踏み台か何かを使ってIPを偽装して攻撃を仕掛けて割り出したものではないかと考えています。

    185.234.217.191 - - [DD/MM/YYYY:HH:58:02 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:03 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:05 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:06 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:08 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:10 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:12 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:13 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    185.234.217.191 - - [DD/MM/YYYY:HH:58:15 +0900] "POST /wp-login.php HTTP/1.1" 200 3261 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"
    

    サイトの状態

    サイトは以下のような状態でした。

    • ユーザーID:admin
    • パスワード:ドメインからTLDとハイフンを除いたもの(例:example-domain.com→exampledomain)
    • WordPressのバージョン:3.9.25(この時点での最新版は4.9.8)
    • プラグインのバージョン:数年前のもの

    IDとパスワードが短く推測されやすいものになっており、総当り攻撃に対する強度が不足していたと思われます。また、WordPressやプラグインが古い状態だったため、脆弱性をついた被害を受ける可能性がありました。

    • WordPress本体やプラグインを最新版に保つ(自動アップデートを有効にする)
    • IDやパスワードは推測されにくいものにする

    上記はWordPressに限らず基本的な対策ですが、これらが不十分だったために被害を受けたという事例もよく耳にするように思います。

    もしこの記事をご覧の方に心当たりがあれば、今すぐアップデートやパスワードを変更することをお勧めします。

    再発防止のための対策

    以下は再度の改ざんを防ぐために実施した各種取り組みです。WordPressのCodexにも対応が紹介されており、参考になるのでぜひ一度目を通しておくとよいでしょう。

    FAQ/ハッキング・クラッキング被害 – WordPress Codex 日本語版

    アカウントの変更

    既存のアカウントは攻撃者によって乗っ取られている状態なので、新しくアカウントを作成のうえ削除しました。

    新アカウントの作成にあたってはパスワードジェネレーターを使い、無作為に強度の強いものを作成しました。

    セキュリティプラグインの導入

    SiteGuard WP Plugin

    上記プラグインを導入して設定を行いました。レンタルサーバーでも標準でインストールされているなど、信頼性の高い国産プラグインで非常におすすめです。

    投稿者アーカイブの無効化

    85.128.142.55 - - [DD/MM/YYYY:HH:34:15 +0900] "GET //?author=1 HTTP/1.1" 301 - "-" "Python-urllib/2.7"
    85.128.142.55 - - [DD/MM/YYYY:HH:34:18 +0900] "GET /archives/author/admin HTTP/1.1" 200 3858 "-" "Python-urllib/2.7"
    

    投稿者アーカイブのURLからログインIDが割り出せてしまうというのは有名な話で、サーバーログにもそちらへのアクセスは多数確認できました。

    このサイトでは投稿者アーカイブは使用していなかったので無効化して対応しました。公式ディレクトリにプラグインもありますが、数行の処理なので自前でプラグインにして追加してあります。

    自動更新の設定

    WordPress本体のマイナーアップデートは3.7くらい以降は自動ですが、加えてプラグインのアップデートを自動更新に設定しました。

    不要テーマの削除

    47.92.135.145 - - [DD/MM/YYYY:HH:14:04 +0900] "HEAD /wp-content/themes/twentyseventeen/inc/icon-functions.php HTTP/1.1" 404 - "-" "-"
    120.35.38.196 - - [DD/MM/YYYY:HH:02:09 +0900] "HEAD /wp-content/themes/twentyfourteen/functions.php HTTP/1.1" 301 - "-" "-"
    39.104.16.60 - - [DD/MM/YYYY:HH:09:39 +0900] "HEAD /wp-content/themes/twentysixteen/template-parts/content-single.php HTTP/1.1" 301 - "-" "-"
    

    使用していないデフォルトテーマに対しても様々なパターンでアクセスが試みられていました。リスクなだけなので、念のため全て削除しました。

    海外IPフィルタリング

    これは提案中ですが、攻撃はほぼ100%が海外IPからのものなので、サーバーで提供されている海外IPフィルタリング機能の導入は効果的ではないかと思います。主要なレンタルサーバー会社各社では、管理画面から比較的手軽に設定できる機能を提供しているのではないかと思います。

    サーバーによっては、攻撃だけでなく通常のサイトの閲覧も制限されてしまったり、Googlebotも制限してしまうため検索結果に表示されなくなる、といった注意点もあるので確認が必要です。

    被害にあう前にセキュリティ対策と保守管理を

    以上、実際に発生したWordPressサイトの改ざん被害事例と、対応を紹介しました。現在は引き続き不正なアクセスを監視などを行っています。

    不正アクセスによる被害を受けてしまうと、企業イメージ・信頼感の毀損だけでなく、場合によっては個人情報や企業機密の流出など、調査・復旧の費用に加えて、事前の対策コストをはるかに超える対応コストが発生してしまいます。被害を受ける前に、「再発防止のための対策」で紹介した項目などを参考に、ご自身の管理されているサイトのセキュリティを点検して頂ければと思います。また、以下の記事でもほかの事例や対策を紹介しているので、参考になれば幸いです。

    WordPressサイト改ざん等の被害事例とセキュリティ対策

    お困りの場合は

    自分でセキュリティ対策を行うのは難しい、不安だという場合は、セキュリティ対策も対応できる制作業者に依頼しましょう。野良人でもWordPressサイトをはじめとしたセキュリティ対策を承っております。

    また、既に被害にあってしまった場合の復旧や調査も対応しておりますので、まずはお気軽にお問い合わせください。

    お問い合わせ │ ノラWEB屋 野良人(のらんど)
    このエントリーをはてなブックマークに追加