sekai013's blog

JavaScriptとかを勉強する

KSNCTF #9 Digest is secure!

問題

ksnctf - 9 Digest is secure!

考えたこと

だいたい #8 と同じような感じだけど、認証のところが Digest になってて、データのやりとりとか難しそうなことをしてる。

仕組みは wikipedia 読んでだいたい分かった。

Digest認証 - Wikipedia

Base64エンコードみたいなガバガバな通信じゃなくて MD5 方式で暗号化されている。
wikipedia の言葉をそのまま使うと、とりあえずパケットから

Authorization: Digest
username="q9"
realm="secret"
nonce="bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b"
uri="/~q9/"
algorithm=MD5
response="c3077454ecf09ecef1d6c1201038cfaf"
qop=auth
nc=00000001
cnonce="9691c249745d94fc"

MD5 はそんなに強くない暗号らしい。とりあえずレスポンスが c3077454ecf09ecef1d6c1201038cfaf だということは分かったので、これを decrypt しないといけないっぽい。
md5 decrypt とかでググって上から順番に試してやっと解いてくれた。

MD5 Decryption: Encrypt & Decrypt MD5 Hashes

c627e19450db746b739f41b64097d449:bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b:00000001:9691c249745d94fc:auth:31e101310bcd7fae974b921eb148099c

レスポンスは hash1:nonce:nc:cnonce:qop:hash2 という文字列を暗号化したものらしいのでちゃんと解読できてそう。

この hash1 は ユーザ名:realm:パスワード を暗号化したものなので、これを decrypt すればよさそうだけど、 google 先生の2ページまでの decrypter 全部試したけどだめだった。助けてくれ!!!!

ここまで書こうとしたけど、 hash1 は 分かってるし、 hash2 は httpmethod:uriMD5 encrypt すればいいので、サーバから送られてきた nonce に対して適当に cnonce を生成して response 作って投げれば認証成功する気がする。コード書いた。

https://github.com/sekai013/ksnctf/blob/master/digest/digest.rb

通った。やったぜ。

思ったこととか

hash1 だけじゃなくて 2 もそのまま使えるやんと思ってたけど、パケットでは /~q9/ にリクエストしてるけど、旗のある場所は /~q9/flag.html なので hash2 も変えないといけないということに気づくのに1時間くらいかかった。
最初は MD5 decrypter に投げるだけかよおいおいって感じになったけどそんなことはなかった。
1回目で解けなくて投げたけどブログ書いてる間に思いついて解けた。やっぱり復習というかしばらくしてから見直すのも良さそう。