クラッキングされたWebサイトの応急処置をしました

プログラマとして同じ攻撃に合う人が一人でも減るように、書き残しておきます。 知り合いのサイトが破壊されていました。 ハッキングというとエンジニアに突っ込まれるので以降クラッキングと呼びます。 技術者以外の方にもぜひ読んでほしいので専門用語は補足するつもりです。

セキュリティに詳しい方へ、筆者は未熟なエンジニアです。 ご意見いただけると筆者は喜びます。その際はできる限り優しくお願いします。

アクセスできないことが発覚


平日の午前0時。 自分のブログのついでに知り合いのサイトも正常稼働しているか確認するためアクセス。 以前wordpressの更新を行った際に一部のページにアクセスできなくなったことがあり、ときどき気にかけていました。

やけに読み込みが遅く、嫌な予感が。 表示されたのは「500 Internet Server Error」でした。(httpステータスコードの意味はこちら)

管理者に最近更新を行ったか確認しましたが、手動ではプラグイン等の更新を行っていないとのこと。 自動的に更新をかけるようなプラグインがあったら作動している可能性があるかもしれないということで プラグインのせいにしてその日は就寝しました。

FTPからファイルの状況を調査


翌朝、職場の休憩時間を利用して調査を行うことにしました。(良い子は仕事しよう。) ドメインにアクセスすると500エラーで入れないのだからwordpressの管理画面にも入れない。 仕方がないので管理者に許可を取ってFTPアカウントへ入りました。

サーバーに存在するファイルを読むことでwebサイトは表示されます。友達の部屋に行って本を読ませてもらう、というイメージの行為を機械(PCやスマホ)に命令しています。私が入ったFTPアカウントとはサーバーに存在するファイルの束をWindowsのエクスプローラーを見るように操作できるサーバーの管理画面のことを指します。 (FTPについて詳しく知りたい方は【入門】FTPとは?通信・ソフトについて分かりやすく解説します | カゴヤのサーバー研究室を参照してください。)

FTPアカウントに入ってすぐに異変に気付きました。 全てではないにしろ多くのファイルが前日のAM8:58のタイムスタンプで上書きされていました。

何が起きたのか詳しく調査するためwordpressのデバッグ機能をONにしたいところですよね。 しかし調査している端末は自宅のPCではなくスマホ。 気付いたところでファイルの内容を編集をするのは途方もない作業でした。

Google Search Consoleの権限を管理者から受け取っていなかったため、レンタルサーバーのアクセスログを確認。

cra1

ご覧の通り、上書きされたファイルのタイムスタンプAM8:58付近を境にアクセスできなくなっていることがわかりました。 何かの原因でファイルが上書きされたことにより500エラーが引き起こされるようになったようです。 対応状況を管理者に伝え、仕事に集中。

帰宅後、原因究明にかかりました。 当然ながら管理画面にアクセスすることもできないため、wordpreessのdebug機能をONに。 function.phpに入れてみましたが読み取り順が早すぎるらしくなかなか真相にたどり着けません。

ふと気づいたのですが(ドメイン名).comにアクセスしているのに強制リダイレクト(転送)されるのです。 リダイレクト先は(ドメイン名).com/wp-admin.php/setup-config.php そこでsetup-config.phpにデバッグ機能がONになるコードを入れてみました。

- define('WP_DEBUG',false);//デバッグ内容をブラウザに非表示 
+ define('WP_DEBUG',true);//表示

(参照:Debugging in WordPress « WordPress Codex)

cra2

WordPressへようこそ。

違う。これじゃない。 このサイトにはwp-config.phpがないらしいです。 (あとで聞いたのですが壊されたのではなく、もともとなかったらしい。) wp-config.php作成してみます。

データベース接続エラー

はいはい。データべ―ス名修正しました。

Parse error: syntax error, unexpected ‘text’ (TSTRING) in /home/digitech/publichtml/wp-includes/class-oembed.php on line 461

何言っとるかわからん。直し方わからんしググろう。これは長い戦いになるぞ…。

対処方法


そして直し方を見つけました。

‘text’ (T_STRING) | Topic: syntax error, unexpected (wordpress.org support)

Since it doesn’t, you should replace the damaged files.Try downloading WordPress again, そうではないので、あなたは破損したファイルを交換するべきです。WordPressをもう一度ダウンロードしてみてください。 (中略)Since this looks like a hack, carefully follow this guide. When you’re done, you may want to implement some (if not all) of the recommended security measures これはハックのように見えるので、慎重にこのガイドに従ってください。完了したら、推奨されるセキュリティ対策の一部(全部ではないにしても)を実装することをお勧めします。

一瞬、現実が受け入れられませんでした。 端末が感染したならネットワークから遮断するのが定石ですが、事件はレンタルサーバー上で起きています。

今まで該当サイトにアクセスした全端末をウイルススキャンしながら、猛ダッシュでBASIC認証をかける作業に入りました。 セキュリティに疎い私が一般ユーザーを入れないためにできることはこれしかありませんでした。

サイトのトップページである(ドメイン名).comとwww.(ドメイン名).comに大してアクセスがあった場合、認証IDとパスワードを入れないと入れない設定。.htaccessは上書きされてしまうのでバックアップを取って書き換えました。

AuthUserFile /(ドキュメントルート)/(ドメイン名)/.htpasswdまでのパス) //パスワードとIDを記載したファイルの場所
AuthName "ユーザー名とパスワードが必要です" //ここで指定した文字列が認証画面ポップアップの中で表示される
AuthType Basic //「Basic認証」を使うために指定
require valid-user //全てのユーザーに認証を表示させる

管理者に状況を伝え一旦.htaccessを書き換えることによって該当サイトを閲覧するには認証IDとパスワードが必要な設定に変更しました。 正しいIDとパスワードを入力しなければ401認証エラーになりサイトに入れないため、一般ユーザーにサイトを見せない作戦です。

この方法の採用理由


全てのファイルを削除しindex.htmlを設置して「工事中です」とするか、 503ステータスコードを返して「ただいまメンテナンス中です」としたかったのですが

1.今回setup-config.phpに強制リダイレクトされており緊急度的に修正方法を探している時間はない。

2.(503を書いたことがないため)アクセスしてきた一般ユーザーを、絶対にサイトに接続させない仕組みかどうかわからなかった

3.他人のサイトだからファイルを消せない

以上の理由がBASIC認証採用理由です。つまり無知だったんですね。 SEO上位のサイトだと順位が下がるので痛いです。(この状態もSEO的にだいぶまずいですが) 反省を生かして503ステータスコードを返す方法は別の機会にまとめようと思います。

いつもいろいろとお世話になっているaguse.jp経由でサイトにアクセスするとaguseサーバーがサイトの写真を取ってきてくれます。 「(ドメイン名).com」と「www.(ドメイン名).com」にアクセスして認証が効いていることを確認。 管理者に対応状況を伝えました。管理者は時間を見つけてファイルを全て削除、サーバーはキレイな状態になりました。

本当に改ざんされていた痕跡


後日、管理者から攻撃を受けたサイトのファイル一群を送ってもらいました。 タイムスタンプを上書きされたファイルの中には謎のスクリプトが埋め込まれたものもあれば 何も変更が加えられていないものもありました。

自分がこのファイルを上書きされたら嫌だなという観点で探しました、改ざんされた一部を画像でご紹介します。 怪しいスクリプトは記載しませんので、安心して閲覧してください。 左が正常なファイル、右が攻撃されたファイルです。 濃いオレンジが違う箇所、クリックすると画像が拡大できます。

wp-login.php

cra3

サイト管理画面にログインするときにこのphpファイルを通ります。 何やら16進数表記がありますね。テキストエディタで見てみました。コ―ドを模写されないように一部加工しています。

cra4.jpg

wp-login.phpの<head>タグの中に<script></script>で囲われた怪しげなソースコードを発見しました。 これは何かを仕掛けられているのか、ただ壊されただけなのか... 私には何もわかりません...。

index.php

cra5

1行目から怪しさ満載です。/**/で囲われている部分はコメントです。機械に命令する言葉ではありません。 includeの後に怪しげな数字と文字列が追加されています、この場所にあるファイルを読み込めということなんでしょうか? 隠した部分には、攻撃されたサイトのドメイン名の間に数字が挟み込まれた文字列が埋め込まれていました。(伝われ)

setup-config.php

cra6

(ドメイン名).comにアクセスすると強制的に表示されていたsetup-config.phpです。 先ほどのwp-login.phpとよく似たスクリプトが2か所埋め込まれていました。

花金の夜にこの気味の悪いコードを眺めているなんて気が狂いそうです。

クラッキング対策のためにWebサイト管理者ができること


クラッキングされたまま放置しておくと

空き巣に荒らされた部屋をそのまま放置して生活する人はいませんよね? サイトも同じです。このままでは迷惑メールの発射台にされたり、このサイトを訪れた人の端末を好きに操れるソースコードを埋め込んでしまうリスクがあるのです。このWebサイトの管理者はサイトを攻撃された被害者でありながら、サイトを訪問してくださった人にとっての加害者になる可能性があったのです。

対策1:パスワードを変更

wordpress管理画面、FTP、データベース、レンタルサーバーなどあらゆる場所のID・パスワードが盗まれた可能性が非常に高いです。 二度と侵入されないようにパスワードの変更するよう伝えました。 またwordpress管理画面のIDにadminを使っている場合もリスク高です。当ブログは急いで変更しました。 (2019/4/13 追記:wordpressを卒業しSPA製ブログへ切り替えたため、当ブログはデータベースの脆弱性を突かれる心配がなくなりました。wordpressの管理画面もなくなっているので管理人は安心です。)

対策2:端末のセキュリティは万全に

端末が最初からウイルスに感染しておりその端末で管理画面に出入りしていると攻撃対象になる可能性があります。 ウイルス対策ソフトを入れて常に安全な状態を保ちましょう。複数人で管理しているサイトはリスクが高まります。

対策3:wordpress/テーマ/プラグインは常に最新にしておく

脆弱性を残したまま放置しているとその隙をついて攻撃されるかもしれません。 テーマ/プラグインの開発者さんがアップデートしてくださることで脆弱性が排除されます。 wordpressから飛んでくる更新通知メールに気を配って、こまめに更新しておきましょう。

対策4:ファイルのパーミッション(アクセス権限)を見直す

FTPのお話です。.htaccessファイルを第三者に対して書き込み/実行権限を与えたままにしておくと、サイトを訪れたユーザーを他のサイトに転送する設定に書き換えられてしまう危険性などがあります。 詳細はパーミッションについて / ファイル管理 / マニュアル - レンタルサーバーならロリポップ!を参照して下さい。

まとめ


長文にも関わらずお読みいただきありがとうございました。 なにより私自身がセキュリティに対する認識を見直すきっかけになりました。 今後多くの人の役に立つのなら、と快く記事化を承諾してくれた知り合いに感謝です。 そして良い子は他人のサイトを壊さないように。

※ポンコツ具合は認めますので、今回の対応に関する批判・中傷はご遠慮ください。