問題
解法
問題文から分かるようにdigest認証の問題。 basic認証がガバガバだったのと違い、digest認証はもう少し安全。
wikipedia曰く以下のように認証する。
A1 = ユーザ名 “:” realm “:” パスワード
A2 = HTTPのメソッド “:” コンテンツのURI
response = MD5( MD5(A1) “:” nonce “:” nc “:” cnonce “:” qop “:” MD5(A2) )
ユーザーはサーバーからnonce、nc、conce、qopが与えられてresponseを作る。 サーバーはA1を持っているので、responseを作って照合する。
なるほど確かに逆ハッシュが出来ないと厳しそう。
hydraというツールがあるくらいなので出来ないことは無いのだろうが…
と思ってpcapファイルを眺めていると、なんとhtdigestを覗いているではないか!
GET /~q9/htdigest HTTP/1.1
Host: ctfq.sweetduet.info:10080
Connection: keep-alive
Authorization: Digest username="q9", realm="secret", nonce="bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b", uri="/~q9/htdigest", algorithm=MD5, response="d9f18946e5587401c303b34e00a059eb", qop=auth, nc=00000002, cnonce="6945eb2a7ba8cf7f"
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.3
HTTP/1.1 200 OK
Date: Sat, 26 May 2012 20:54:53 GMT
Server: Apache/2.2.15 (CentOS)
Authentication-Info: rspauth="022023eac9b9e023d50cca5eef69c287", cnonce="6945eb2a7ba8cf7f", nc=00000002, qop=auth
Last-Modified: Sat, 26 May 2012 12:30:54 GMT
ETag: "422e4-2b-4c0efa7f441cf"
Accept-Ranges: bytes
Content-Length: 43
Connection: close
Content-Type: text/plain; charset=UTF-8
q9:secret:c627e19450db746b739f41b64097d449
つまりA1
がc627e19450db746b739f41b64097d449と分かった。
ここでdigest認証のレスポンスの作り方をもう一度見ると、
response = MD5( MD5(A1) “:” nonce “:” nc “:” cnonce “:” qop “:” MD5(A2) )
- A1 ← 分かった
- A2 ← 分かる
- nonce,nc,cnonce,qop ← 相手から与えられる
というわけでレスポンスが作れる! (http://ksnctf.sweetduet.info:10080/~q9 がアクセス可能だと気づくのにしばらく時間がかかったが…)
responseの書き換えにはburpSuiteを使用する。これはproxyを立てることでhttp通信を覗き見、書き換えすることが出来るツールだ。 セットアップの仕方はここらへん参考に。
nonceなどをコピーしてレスポンスを生成して書き換えるとflagが手に入った。
おまけ htdigest
やったことがなかったので、htdigestを試してみる。
❯ htdigest -c htdigest_test secret vinter
Adding password for vinter in realm secret.
New password: # vinterと入力
Re-type new password:
~/Projects/CodeSite/CTF/ksnctf/09_digest_is_secure
❯ cat htdigest_test
vinter:secret:98ef267645a2168773d7b944345ecf47
~/Projects/CodeSite/CTF/ksnctf/09_digest_is_secure
❯ md5 -s vinter:secret:vinter
MD5 ("vinter:secret:vinter") = 98ef267645a2168773d7b944345ecf47
確かにhashが一致している。
point
1031