[ksnctf] Digest is secure!
投稿日: 更新日:
問題
q9.pcapというパケットキャプチャファイルが与えられました。
解法
WiresharkでTCPストリームを一部に<p>The flag is <a href="flag.html">here</a>.</p>
、と書いている部分がありました。
リンクが貼られているのでそこにアクセスすればFLAGがゲットできそうです!
ヘッダー部分の情報を整理します。使うところだけ抜き出しています。
GET /q9/ HTTP/1.1 部分
ヘッダー | 内容 | |
---|---|---|
Host | ctfq.u1tramarine.blue | |
Authorization:Digest | username | "q9" |
nonce | HHj57R...(省略) | |
response | 26c801...(省略) | |
algorithm | MD5 | |
qop | auth |
MD5でハッシュ値が取られているのでHashToolkitを使い解読してみます。
Digest認証のフォーマットを元にまとめます。 (参考)wikipedia-Digest認証
A1 | c627e19450db746b739f41b64097d449 |
nonce | HHj57R...(省略) |
nc | 00000002 |
conce | 656335d78cef6e86 |
qop | auth |
A2 | adea3748da59405c1f4c1650442607a1 |
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のあるページへアクセスします。
conce
、nc
の値は適当です。
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が出力されました!