ksnctfを使ってHTTP通信について学ぶ②(ksnctf-9)

ksnctfを解きながら、パケット解析について学ぶ。
今回はksnctfの問9を題材にして引き続き、HTTP通信について学ぶ。
ksnctf - 9 Digest is secure!


下記は今回のpcapファイルから得られたTCPストリームである。

GET /~q9/ HTTP/1.1
Host: ctfq.sweetduet.info:10080
Connection: keep-alive
Authorization: Digest username="q9", realm="secret", nonce="bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b", uri="/~q9/", algorithm=MD5, response="c3077454ecf09ecef1d6c1201038cfaf", qop=auth, nc=00000001, cnonce="9691c249745d94fc"
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:45 GMT
Server: Apache/2.2.15 (CentOS)
Authentication-Info: rspauth="42b425bdd3ad27086858915611646f7c", cnonce="9691c249745d94fc", nc=00000001, qop=auth
Last-Modified: Sat, 26 May 2012 12:28:32 GMT
ETag: "422e2-c0-4c0ef9f82a6c7"
Accept-Ranges: bytes
Content-Length: 192
Connection: close
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
    <title>Q9</title>
  </head>
  <body>
    <p>Congratulations!</p>
    <p>The flag is <a href="flag.html">here</a>.</p>
  </body>
</html>

・前回と異なる部分は下記のDigest認証の部分である。

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

それぞれの値の意味を整理する。
username ... ユーザー名
realm ... 認証に表示される文字列
nonce ... ランダム値
uri ... 認証ページのアドレス
algorithm ... アルゴリズム
response ... パスワードをもとに算出された値
qop ... コンテンツ保護の品質
nc ... nouce値の数
cnonce ... ランダム値


Digest認証を用いているのでパスワード部分は暗号化されている。ただし、通信自体は暗号化されないので、おそらくこの通信内容にflagが隠されているのだろう。


やはり、ほかのTCPストリームにヒントが隠されていた。

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


(間違い等あればコメントよろしくお願いいたします。)