アイジア

CTF, 情報セキュリティの学んだことメモ

ksnctf 9 Digest is secure!

ksnctfの9問目を解いていきます。

ksnctf.sweetduet.info

ダイジェスト認証とは

Digest認証 - Wikipedia

Digest認証の挙動 - Qiita

ダイジェスト認証はベーシック認証と同じく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で開いて解析していきます。
f:id:favoritte15:20181114194638p:plain

1行目(No.7):クライアントがサーバにアクセスします。
2行目(No.9):サーバが401(要認証)レスポンスを返します。その際、www_authenticateヘッダを含めます。 3行目(No.14):クライアントがwww_authenticateヘッダを含めて再びサーバにアクセスします。
f:id:favoritte15:20181114195141p:plain

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のハッシュにします。 すると認証に選択し、フラグがブラウザに表示されます。