ksnctf #9 “Digest is secure!”をPythonで解読する
Problem
q9.pcapが与えられていて, そこからFlagを得る。
Solution
タイトルから予測して、前回がBasic認証だったのに対し、今回はDigest認証に関する問題だと分かる。
今回もksnctf#8と同じように、とりあえずq9.pcapを開けてみてみると
前回同様Digest認証のパスワードがFlagとなっていることがわかる。
2回目のGETの内容を確認してみると、
Authorizationのところに、
Digest username="q9"
realm="secret"
nonce="HHj57RG8BQA=4714c627c5195786fc112b67eca599d675d5454b"
uri="/q9/"
algorithm=MD5
response="26c8019eb6f7f41b9c14b4cbda48ab2e"
qop=auth
nc=00000002
cnonce="656335d78cef6e86"
realm : 認証ダイアログに表示されるメッセージ。
nonce : サーバ側が生成するランダムな文字列。アクセスするたびに毎回変わる。
uri : リクエストを行うURI
algorithm : ダイジェスト文字列を生成するためのアルゴリズム。ここではMD5。
response : パスワードを含む文字列のダイジェスト文字列(16進数)。
qoq : 保証レベル。quality of protectionの略。authは認証のみ。
nc : nonce-countのこと。リクエスト時に特定のnounce値を使ってクライアントが送ったリクエスト数(16進数)
conce : クライアント側が生成するランダムな文字列。
上の情報からDigest認証のresponseを解読すればFlagを手に入れられる。
responseの生成方法はWikipediaを参考にすると
A1 = ユーザ名 ":" realm ":" パスワード
A2 = HTTPのメソッド ":" コンテンツのURI
response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )
となる。
MD5逆変換ツールでresponseを変換すると
c627e19450db746b739f41b64097d449:HHj57RG8BQA=4714c627c5195786fc112b67eca599d675d5454b:
00000002:656335d78cef6e86:auth:adea3748da59405c1f4c1650442607a1
となる。
Pyhtonでresponseを作成して、ログインする。
import requests
from hashlib import md5
url = "http://ctfq.u1tramarine.blue/q9/flag.html"
username = "q9"
realm = "secret"
nonce = ""
uri = "/q9/flag.html"
algorithm = "MD5"
response =""
qop = "auth"
nc = "00000001"
cnonce = "656335d78cef6e86"
md5_a1 = "c627e19450db746b739f41b64097d449"
a2 = "GET:" + uri
def main():
digest_cracker()
def digest_cracker():
# urlにアクセスする
res = requests.get(url)
# headerからnonceを取得
nonce = res.headers["WWW-Authenticate"].split(", ")[1]
nonce = nonce.replace('nonce=','').replace('"', '')
# responseを作成
md5_a2 = md5(a2.encode('utf-8')).hexdigest()
plain_response = f"{md5_a1}:{nonce}:{nc}:{cnonce}:{qop}:{md5_a2}"
response = md5(plain_response.encode('utf-8')).hexdigest()
auth = 'Digest username="' + username + '", realm="' + realm + '", nonce="' + nonce + '",uri="' + uri + '", algorithm=' + algorithm + ', response="' + response + '", qop=' + qop + ', nc=' + nc + ', cnonce="' + cnonce + '"'
headers = {'Authorization' : auth}
req = requests.get(url, headers = headers)
print(req.text)
if __name__ == '__main__':
main()
実行結果は
% python digest*
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Q9</title>
</head>
<body>
<p>FLAG_************</p>
</body>
</html>
となりFlagを手に入れることができた!
CTF, セキュリティの参考資料
Udemy
個人的にUdemyが動画で分かりやすいし、値段も安いのでおすすめです。
実践的なものが特に役立ちます。
ホワイトハッカー養成講座(ハッキングツール、Webアプリ攻略、不正侵入検知)
ホワイトハッカー養成講座 (インシデントハンドリング&Windowsアタック編)
書籍
- セキュリティコンテストチャレンジブック CTFで学ぼう!情報を守るための戦い方
- セキュリティコンテストのためのCTF問題集
- デバッガによるx86プログラム解析入門
- リバースエンジニアリングバイブル
- 大熱血アセンブラ入門
- 楽しいバイナリの歩き方
- Reverse Engineering for Beginners
- HACKING: 美しき策謀
- 秘密の国のアリス
- 暗号解読
- 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 第2版
コメント