WordPress侵入対策まとめ:ブルートフォースアタック編

鍵を壊す攻撃者 技術
この記事は約10分で読めます。

(2019-06-21 WPScanのセルフチェックについて追記しました)

前回WordPressの脆弱性についてまとめた記事が好評でしたので、すこし掘り下げようと思います。

WordPressの脆弱性まとめ
最近は脆弱性という言葉もよく聞くようになりました。 ウィルス対策は企業では当たり前になりましたが、では、「脆弱性」対策は? Windows Updateできてるから大丈夫? インターネットに公開しているサービス、特にウェブサイト大丈夫...

WordPressは、そのままの設定だとブルートフォースアタック(総当たり攻撃)に弱いと言われています。今回はその対策についてまとめます。

ログインユーザの推測防止

攻撃者がブルートフォースアタックするには、まずは攻撃対象のログインIDを特定する必要があります。

WordPressは、デフォルト状態だとログインID、特に管理者IDが簡単にわかってしまいます。ご自身のサイトで以下のようなURLにアクセスしてみてください。

サイトドメイン/?author=1

URLはリダイレクトされ、以下のようになるかと思います。

サイトドメイン/author/admin/

たったこれで、管理者IDがURLに出てきてしまいます。みなさんのサイトではどうだったでしょうか。

author=の後ろの数字を増やしていくことで、登録された全ユーザが見えてしまうと思います。

WordPressでは、固定ページ、投稿ページ、メディア、ユーザなどのエンティティは固有のslug(スラッグ)を持っており、通常は自動的にそのスラッグを使ったページにリダイレクトされるため、上記のような事が発生します。

これを防ぐには、ユーザ用のslugを変更する必要がありますが、素のWordPressでは変更する手段がありません。

Edit Author Slug」プラグインはこのユーザ用slugを変更することができます。

Edit Author Slug
Allows an admin (or capable user) to edit the author slug of a user, and change the author base.

これを使うことで、slugをログインIDではない適当な文字列に変更したり、「author=xx」のままとすることもできます。

ここを変えてもブログ上の表示名がログインIDのままでは意味がありません。そこも変えておきましょう。(下記ユーザ編集画面の「ブログ上の表示名」)

ブルートフォースアタックの防止

第三者に対してログインIDを秘匿しましたが、何らかの理由でIDが分かってしまう事もあるでしょう。そうなると次の防御を準備しておかなければなりません。

ブルートフォースアタックは、あらゆるパスワードでログインを試す方法です。試す順番は、使われそうな単語などを先にといった工夫をしますが、基本的にはすべての文字の組み合わせを試すため、ものすごい回数のログイン試行が発生します。コンピュータでどんどん試行していくため、安直なパスワードだと結構簡単に突破されるようです。

この手法を回避するには、ある程度認証に失敗したらペナルティを課すことで、試行の速度をものすごく遅くすることが効果的です。

1秒間に100回試行されてしまうとしても、10回間違えたら3分ペナルティでアクセス禁止するだけでも、

デフォルト状態:3分間で18,000回試行
ペナルティ有り:3分間で10回試行

と、1,800倍も遅くすることができます。無策の場合に3日でパスワードを見つけられてしまう状態だとすると、ペナルティを追加することでざっと15年くらいかかる計算になります。

それでも繰り返し試行されたら、例えばブラックリストに登録して永久にアクセス禁止としても良いですし、半日ロックアウトでも良いかもしれません。そんな事を可能とするプラグインが、これです。

Limit Login Attempts Reloaded」プラグインです。

Limit Login Attempts Reloaded
Reloaded version of the original Limit Login Attempts plugin for Login Protection by a team of WordPress developers. GDPR compliant.

シンプルな画面ですが、ここで説明した内容は一通り設定できます。

ログインURLの変更

ここまで対策しても、ログイン失敗時に警告メールを管理者に送信していると、コツコツとドアをノックする状況(ログインを試す状況)が発生することがわかります。まあ大丈夫なはずなのですが、そんな行為そのものを止めたい、そういう向きにはログインURLを変更してしまうという方法があります。

URLが変われば、そもそも攻撃先がわかりませんから、かなり安心することができますね。

それを可能とするのがこちら、「SiteGuard WP Plugin」です。

SiteGuard WP Plugin
SiteGuard WP Plugin は、管理ページとログインへの攻撃からの保護に特化したプラグインです。

これは、WordPressのセキュリティに必要ないくつもの機能を併せ持ったセキュリティ専用プラグインです。ログインURLを変更するのみならず、ログイン時にID/PWに加えCAPCHAを要求することで、機械的なブルートフォースアタックを回避する機能もあります。しかもCAPCHAに要求するのが日本語なので日本語を使わない攻撃者には難易度がさらに上がります。

また、ログイン画面や管理画面へのアクセスをIPアドレスで制限したりすることも可能なため、.htaccessを編集しなくても良くなります。

XML-RPC経由のブルートフォースアタック防止

ここまでは、人がブラウザを通してWordPressの管理画面にアクセスする際の認証について説明してきました。

WordPressにはXML-RPCという外部のサービスと連携するためのAPIが存在します。ピンバック(Pingback)やトラックバック(Trackback)で使われています。そのAPIの中に認証機能を持つものもあるため、攻撃者がパスワードを探り当てるためにこちらをブルートフォース攻撃に使うケースが増えています。

攻撃者はこのAPIを使ってパスワードを見つけ出し、あとから普通のログイン画面からそのパスワードでログインするのです。

対策で一番簡単なのは、XML-RPCを停止する方法です。これであれば悪用しようがなくなります。.htaccessを使うのが一番確実でしょうか。DDoSアタック時の負荷とかを考えると0.0.0.0にリダイレクトするのが良いらしいです。404とかのエラーとするとWordPressがエラーページのレンダリングする負荷が発生するということなのでしょう。WordPressのインストール方法などで色々変わりますので、詳細は省略します。(各自確認ください)

RewriteBase /
RewriteRule ^xmlrpc\.php$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]

ただこれだとXML-RPCを使ったサービス連携ができなくなります。XML-RPCを使うサービスで有名なのだとJetpackやAkismetなんかが該当します。その場合は、XML-RPCもウェブ画面のログインと同様に試行回数を制限するという方法もあります。前述「Limit Login Attempts Reloaded」や「SiteGuard WP Plugin」をはじめいくつかのプラグインでXML-RPCに対応しているようです。

プラグインはなるべく入れないほうが良いって言うけど?

WordPressの説明サイトなんかを見ていると、「プラグインいっぱい入れるのは初心者」「プラグインどうしで干渉するからxx個までにしておけ」なんて書かれていたりします。

半分同意します。似たような機能のプラグインが何種類も入っていたら、それは干渉するかもしれません。上記の「Limit Login Attempts Reloaded」と「SiteGuard WP Plugin」は重複する機能がだいぶあるので干渉する可能性が高いなと思います。

ただ、素のWordPressがこの無防備状態なのですから、プラグインを導入するのは致し方ないと思いますし、多分設計者も、防御方法は利用者によって異なるから、それはプラグインを使ってほしいと思っているんじゃないか、そう考えています。

functions.phpをガシガシ書くのもいいですが、それだって度を越すとfunctions.php内部のコードどうしで干渉します。結局ケースバイケースです。

私の結論は「プラグインは必要ならば入れればいい。ただよく考えて。そしてそのプラグインが信用できるかどうかよく見極めて。」です。

このように「たかがWordPressサイト1つ」でも様々なノウハウが存在します。えばれる程ではありませんが、弊社も様々なサイトでWordPressを使わせて頂いた経験に裏打ちされたノウハウがあります。もしWordPressの事でも、インフラやその他のシステムの事でも、気になることがあれば弊社にご相談ください。丁寧に対応させていただきます。
2019-06-21 追記(WPScan)

皆様興味深く読んで頂けたようで、はてなブックマークからコメント頂きました。

これだけやっても多分WPScanで検出できると思うよ

おお、そういうものがあったのか!ということで早速試しました!

$ wpscan -u "https://www.jtrustsystem.co.jp" --wp-plugins-dir (略) -e u
_______________________________________________________________
        __          _______   _____
        \ \        / /  __ \ / ____|
         \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
          \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
           \  /\  /  | |     ____) | (__| (_| | | | |
            \/  \/   |_|    |_____/ \___|\__,_|_| |_|

        WordPress Security Scanner by the WPScan Team

(略) 
_______________________________________________________________

[+] URL: https://www.jtrustsystem.co.jp/
[+] Started: Fri Jun 21 14:53:37 2019

[+] Interesting header: LINK: <https://www.jtrustsystem.co.jp/wp-json/>; rel="https://api.w.org/"
[+] Interesting header: LINK: <https://wp.me/Pao4cf-1A>; rel=shortlink
[+] Interesting header: SERVER: Apache
[+] Interesting header: X-CONTENT-TYPE-OPTIONS: nosniff
[+] Interesting header: X-UA-COMPATIBLE: IE=edge
[+] robots.txt available under: https://www.jtrustsystem.co.jp/robots.txt   [HTTP 200]

(略)

[!] 1 user exposed via API: https://www.jtrustsystem.co.jp/wp-json/wp/v2/users
+----+------+--------------------------------------------+
| ID | Name | URL                                        |
+----+------+--------------------------------------------+
| 2  | Kaz  | https://www.jtrustsystem.co.jp/member/kaz/ |
+----+------+--------------------------------------------+
[+] Found an RSS Feed: https://www.jtrustsystem.co.jp/feed/   [HTTP 200]
[!] Detected 1 user from RSS feed:
+------+
| Name |
+------+
| Kaz  |
+------+

[+] Enumerating WordPress version ...

[i] WordPress version can not be detected

(略)

[+] Finished: Fri Jun 21 15:04:53 2019
[+] Elapsed time: 00:11:15

いろいろ分かってしまうのですね。一部は伏せさせて頂きましたが、まあ大丈夫な範囲でした。出てきたのは私以外のユーザとかですが、ログインIDばっちりということはありませんでした。脆弱性も今の所無かったようです。良かった良かった。

一応言っておきます。弊社サーバを含め、個別に了承を得ていないサーバにこのツールを使うのは、日本の法律「不正アクセス禁止法」に違反します。お止めくださいね。
(押すなよ押すなよという意味ではありません。本当にやめてください。仕事増やさないでください。泣)

ただ、WPScanは一応ホワイトハット系ツールです。世の中にはもっと恐ろしいブラックハット系のツールがあるかもしれません。精進せねばと思いました。

コメント

  1. […] WordPress侵入対策まとめ:ブルートフォースアタック編 […]