ksnctf 9 Digest is secure!
ksnctfの9問目を解いていきます。
ダイジェスト認証とは
ダイジェスト認証はベーシック認証と同じくHTTP認証方式の一つです。ベーシック認証がBase64を使用するのに対して、ダイジェスト認証はMD5というハッシュ関数を使うことでよりセキュアな認証を実現できます。ベーシック認証と違って、ダイジェスト認証はパスワードをネットワーク上に流しません。その代わり、responseという値をサーバに送ります。responseを求めるための式は以下の通りです。
A1 = ユーザ名 : realm : パスワード A2 = HTTPのメソッド : コンテンツのURI response = MD5( MD5(A1) : nonce : nc : cnonce : qop : MD5(A2) )
名称 | 意味 |
---|---|
realm | 認証が必要なサーバ側のエリア名 |
nonce | サーバ側で生成するランダムな値(1回の認証ごとに発行) |
nc | カウンタ |
cnonce | クライアント側で生成するランダムな値(1回の認証ごとに発行) |
qop | 認証のセキュリティレベルの設定(基本はauth、auth-intで最高レベルの保護) |
このMD5(A1), nonce, nc, cnonce, qop, MD5(A2)が分かれば認証は成功することになります。
パケット解析
MD5(A1), nonce, nc, cnonce, qop, MD5(A2)を見つけるためにq9.pcapをWiresharkで開いて解析していきます。
1行目(No.7):クライアントがサーバにアクセスします。
2行目(No.9):サーバが401(要認証)レスポンスを返します。その際、www_authenticateヘッダを含めます。
3行目(No.14):クライアントがwww_authenticateヘッダを含めて再びサーバにアクセスします。
response="c3077454ecf09ecef1d6c1201038cfaf"
このresponseの値は通常逆変換できないのですがそれだと問題が解けないのでMD5の逆変換サイトを使って復元できるようになっています。
Best MD5 Decrypter - Hash Toolkit
response=MD5(c627e19450db746b739f41b64097d449:bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b:00000001:9691c249745d94fc:auth:31e101310bcd7fae974b921eb148099c)
ここまでの情報を用いて認証を突破します。nonceとcnonceはアクセスするごとに変化するのでその値をキャプチャしてresponseを改変します。
①ブラウザでhttp://ctfq.sweetduet.info/~q9/flag.htmlへアクセスします。 ②Fiddlerを起動して、[Rules]->[Automatic Breakpoints]->[Before Requests]をクリックしてブレークポイントを設置。 ③ブラウザでユーザ名をq9にしてログインを行います。
今、nonce=UXEeI616BQA=4a74de17d9620e922002f5f50008b601cb1241c8, cnonce=0e898e984de43bb4なので、
response=MD5(c627e19450db746b739f41b64097d449:UXEeI616BQA=4a74de17d9620e922002f5f50008b601cb1241c8:00000001:0e898e984de43bb4:auth:31e101310bcd7fae974b921eb148099c)=da79f06e4e32e16499e380a84456cbed
Request HeadersウィンドウのSecurityヘッダのAuthorizationを右クリック->[Edit Header]でresponseを求めたMD5のハッシュにします。 すると認証に選択し、フラグがブラウザに表示されます。