読者です 読者をやめる 読者になる 読者になる

つけじょにーのすぱげていコード

主に、競技プログラミング、セキュリティのお勉強の際に書いたすぱげていコードを書き込みます

ksnctf Digest is secure!

CTF

ダイジェスト認証の問題。
かなり勉強になった(ダイジェスト認証についてのみ)
Authorizedヘッダに書かれている値をこねくり回して解くんだけど、単純なやり方ではダメ。
responseの作り方は以下を参照してもらえばわかると思うwww.wikiwand.com

A1は
A1 = ユーザ名:realm:パスワード
で生成される。A1で使用される情報は固定なのでこれは流用していい。

A2は
A2 = HTTPメソッド:コンテンツURI
で生成される。
ksnctfから配布されたpcapファイルにあるやりとりだと、/~q9/flag.html(フラッグが書いてあるhtmlファイル)じゃなくて、/~/q9/となっているので、URIは変更しなくてはならない。
まぁ、HTTPメソッドはGETであることがわかっているのでそこまで手間じゃない

最後にレスポンスは
response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )
で生成される。
A1、A2は解決したとして、nc, qopについてはq9.pcapのやりとりに書いてあるものを流用。
nonce, cnonceはDigest認証でユーザー名とパスワード要求の都度流用する。

こういった処理を助けてくれるpythonコードを書いてみた
といっても、すごく雑だし、汎用性皆無だけど

from hashlib import*

#ask nonce
print 'Please input nonce:'
nonce = raw_input()

#ask cnonce
print 'Please input cnonce:'
cnonce = raw_input()

#hashed data
hashed_a1 = 'c627e19450db746b739f41b64097d449'
uri = '/~q9/flag.html'
a2 = 'GET:' + uri

hashed_a2 = md5(a2).hexdigest()

#client side information
qop = 'auth'
nc = '00000001'

print '\n---------------------------result-----------------------------\n'

#construct response
#response = md5(  md5(a1):nonce:nc:cnonce:qop:md5(a2)  )

seed = hashed_a1 + ':' + nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + hashed_a2
response = md5(seed).hexdigest()

print 'Use this seed : ' + seed + '\n'
print 'Use this response : ' + response + '\n'

nonce, cnonceは都度必要なので入力するようにした。
Fiddlerなどでresponseを書き換えてやればいける

いやー、md5逆変換できねー!!ってなって苦しんでたけどこういう方法ならいけるのね
時間かかった・・・泣