[ksnctf] Digest is secure!

投稿日: 更新日:

問題

q9.pcapというパケットキャプチャファイルが与えられました。

解法

WiresharkでTCPストリームを一部に<p>The flag is <a href="flag.html">here</a>.</p>、と書いている部分がありました。
リンクが貼られているのでそこにアクセスすればFLAGがゲットできそうです!
ヘッダー部分の情報を整理します。使うところだけ抜き出しています。

WiresharkのTCPストリーム

GET /q9/ HTTP/1.1 部分

ヘッダー内容
Hostctfq.u1tramarine.blue
Authorization:Digestusername "q9"
           nonceHHj57R...(省略)
response26c801...(省略)
algorithmMD5
qopauth

MD5でハッシュ値が取られているのでHashToolkitを使い解読してみます。

求めたハッシュ値

Digest認証のフォーマットを元にまとめます。 (参考)wikipedia-Digest認証

A1c627e19450db746b739f41b64097d449
nonceHHj57R...(省略)
nc00000002
conce656335d78cef6e86
qopauth
A2adea3748da59405c1f4c1650442607a1

nonceの値が始めのヘッダー部分と同じなので正しく解読できています 😄
A1の部分のハッシュ値にユーザー名とパスワードがあるので同様にして解読しようとしましたが上手く行きませんでした><

上手くいかない

ユーザー名とパスワードのハッシュ値(A1)は分かっているのでそれをもとにしてダイジェスト認証のパラメーターを作成し送信します。
まずはnonceを取得します。

import requests

url = "http://ctfq.u1tramarine.blue/q9/flag.html"
resu = requests.get(url).headers
print(resu["WWW-Authenticate"])

出力された内容です。nonceが取得できました!

Digest realm="secret", nonce="IJ+8Vp3ZBQA=1e9b8ab3f96498712d1b509469ef94893d044af2", algorithm=MD5, qop="auth"

得られたnonceを使って認証情報を作成しFLAGのあるページへアクセスします。
concencの値は適当です。

import requests
from hashlib import md5

url = "http://ctfq.u1tramarine.blue/q9/flag.html"
h1 = "c627e19450db746b739f41b64097d449"
h2 = md5(b"GET:/q9/flag.html").hexdigest()
nonce = "IJ+8Vp3ZBQA=1e9b8ab3f96498712d1b509469ef94893d044af2"
conce = "abcd"
qop = "auth"
nc = "00000005"
digest = md5(f"{h1}:{nonce}:{nc}:{conce}:{qop}:{h2}".encode()).hexdigest()
auth = f'Digest username="q9", realm="secret", nonce="{nonce}", uri="/q9/flag.html", algorithm=MD5, response="{digest}", qop={qop}, nc={nc}, cnonce="{conce}"'

res = requests.get(url, headers={"Authorization":auth})
print(res.text)

結果としてFLAGの書かれたHTMLが出力されました!

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人