HydraでHTTPのログインをブルートフォース

HydraでHTTP（POSTフォーム）のログインページをブルートフォースアタックする方法についてメモ。

（Hydraの読み方は**ハイドラ**です。）

# Hydraに必要な情報をBurp Suiteで取得する

Burp Suite上のブラウザを使ってターゲットのログインページにいく。

（Burp Suiteを開いて、Proxy > Intercept > Open Browser）
![loginpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/dd55693c-1b70-5712-b457-47af0699f970.png)

<br><br>

まず試しに適当なユーザネームとパスワードの組み合わせでログインを試みる。

Username: admin, Password: adminの組み合わせで試したところ次のように表示された：
![invalidcreds.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/279ed6db-0a03-e25c-e71d-094619d844aa.png)

この**ログイン失敗時に表示される文言をメモっておく**。今回の場合は「Invalid Password!」

**失敗時に表示される文章**がまず必要なもの一つ目。

<br><br>

次に、Burp SuiteでProxy > HTTP historyと進み、先ほどログインした際のPOSTリクエストの履歴を見つける：
![postreq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/77ec40a1-bcad-47c3-ef1c-88881ce41520.png)

このPOSTリクエストより次をメモしておく：

- /department/login.php
- username=admin&password=admin

つまり、ログインページのパス（URL）と、POSTするデータおよびそのフォーマット。

これが必要なもの二つ目。

<br><br>

以上でBurp Suiteによる情報収集のステップは完了。

ここからは、得られた情報を使って実際にHydraでこのログインページに対してブルートフォースしていく。

# ブラウザ開発者ツール

実は、上でみてきた情報を得るにはわざわざBurp SuiteやWireSharkを開く必要ない。

ターゲットのログインページにてブラウザの開発者ツールを開く（そのページで右クリックして「検証」をクリック）。

開発者ツールにて、「ネットワーク」タブをクリックして表示した状態で、最初のように適当なユーザネームとパスワードの組み合わせでログインを試みる：
![devtool2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/9b0d643d-dc29-0a92-79d0-c516b0145143.png)

Hydraに必要な、ログインページのパス（URL）ってのはそもそもURLのバーにあるhttp\://10.10.10.43/department/login.phpから判断して「/department/login.php」をメモっておけばよい。

また、BurpのHTTP historyでみたPOSTリクエストで渡すデータおよびそのフォーマットについても、開発者ツールネットワークタブの、login.phpのデータにて「Payload」をクリックすれば表示される。

![devtool1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/15d0e547-8754-8ae4-8f4c-0977bbb9cbd0.png)

（開発者ツールでネットワークタブ押しても何も表示されていない場合は、その状態で開発者ツールを閉じずに再度適当な組み合わせでログインしてみる。そうすれば表示される。）

上のやつはChromeの開発者ツールだが、FireFoxの方がより正確：
![forxdev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/636f2368-94b7-230d-8aa0-babd31fa50f1.png)

FireFoxの方も、ネットワークタブでlogin.phpをクリックし「要求」をクリック。その後「生データ」に切り替えるとPOSTデータが表示される。

# Hydraを使う

ここではユーザ名として「admin」、パスワードリストは「/usr/share/wordlists/rockyou.txt」を使う。

次のようにHydraのコマンドを実行すればよい：

```
hydra -V -f -l admin -P /usr/share/wordlists/rockyou.txt 10.10.10.43 http-post-form '/user/login.php:username=^USER^&password=^PASS^:Invalid Password!'
```

`-V`で冗長に表示、`-f`はログインに成功したらそのタイミングでブルートフォースを止める。

`-l`でユーザ名を指定。`-P`でパスワードリストを指定。

その後にターゲットのIPアドレスと、`http-post-form`の指定。

それ以降の部分はにBurp Suiteで得られた情報を指定する：

```
'ログインページのパス：POSTリクエストデータフォーマット：失敗時の文言'
```

ただしPOSTリクエストデータフォーマットの部分においては、ユーザ名が入る部分に`^USER^`を、パスワードが入る部分に`^PASS^`と書く。

以上でHydraの書き方はOK。後はHydraを走らせて待つだけ。

<br><br>

パスワードリストではなく、一つのパスワードを指定したい場合は`-p P@ssw0rd!`のように小文字のpを使う。

一つのユーザ名ではなく、ユーザ名のリストを使いたいなら`-L users.txt`のように大文字のLにする。また、ユーザリストを使う場合は`-u`オプションを指定するべし。

ユーザXに対して、全パスワードをブルートフォースしてから次のユーザYに対して再び全パスワード試行するというユーザ名固定のスタイルがデフォルト。`-u`オプションでは、パスワードAに対してユーザ名だけ変えながらブルートフォースする。その次はパスワードBに対して再びユーザ名だけ変えながら試行する。とりあえず、大きめのユーザリストを使うなら`-u`を指定しておくといい。

# その他のHydraのオプション

- `-o ファイル名`：指定したファイルにhydraの実行結果を出力する
- `-e n`：パスワードを空にして試行する
- `-e s`：ユーザネームをパスワードとして試行する
- `-e r`：ユーザネームを逆に読んだ文字列をパスワードとして試行する

（この`-e nsr`のやつは単純にhydraコマンドの適当な場所に追記しておけば適用される）

# ワードリストについて

ブールートフォースするならパスワードリストは/usr/share/wordlists/rockyou.txtが無難。

あとは/usr/share/seclists/下のワードリストが有能。ここならパスワードのリスト、ユーザネームのリスト、その他のリストやペイロード等いろいろ揃ってる。

<br><br>

ちなみに、本物のシステムに対してブルートフォースしたことないから分からないけど、rockyouってリアルワールドのターゲットに対してどれくらい当たるんだろ？

Hack The Boxとか学習用に用意されたターゲットのパスワードはだいたいrockyouに載ってるパスワードで当たるように設定されてるけど、ガチのペンテスターの方って何のワードリスト使ってるのでしょう？