問題
pcapファイルが渡されるだけ。
問題名からして、パケットファイルを解析してDigest認証を突破しろという問題だと予想。
解法
pcapを見ると、まず ctfq.sweetduet.info:10080/~q9/
にアクセスしていることが分かる。
その際のリクエストではDigest認証を行っており、レスポンスでは <p>The flag is <a href="flag.html">here</a>.</p>
という文章が書いてあった。
どうやら /~q9/flag.html
にアクセスすることがゴールらしい。しかし、このサイトにアクセスするにはDigest認証を通過する必要がある。
ここでDigest認証について勉強 → Digest認証 - Wikipedia
Digest認証
Digest認証とは、パスワード等の情報をMD5でハッシュ化して送信することで、Basic認証よりも少しだけセキュアになった認証方式らしい。
ちなみに、#8の問題はBasic認証を扱っていて、盗聴に弱いことが分かる。
それで、Digest認証のアルゴリズムは以下の通り。
A1 = ユーザ名 ":" realm ":" パスワード A2 = HTTPのメソッド ":" コンテンツのURI response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )
A1とA2を作成し、それぞれハッシュ化する。その後、ハッシュ化したA1, A2とnonce等の値を用いてresponse
を作成する。
このresponse
の値が正しければ認証成功になるらしい。
解法の続き
ここで問題の方に戻る。
パケットを見てみると、実はパスワード以外の情報が分かっている。
username = q9
realm = secret
となっており、nonce, nc, cnonce, qop はアクセスする際にサーバから教えられるので知っていなくても大丈夫。
また、今回の場合、A2はGET:/~q9/flag.html
となる。
しかし、このままではパスワードが分からないのでA1を作成できない・・・と思いきや、pcapファイル内の/~q9/htdigest
にアクセスした際の通信データにヒントがあった。
このサイトにアクセスした際のレスポンスに、q9:secret:c627e19450db746b739f41b64097d449
と記述されていた。
どうやらc627e19450db746b739f41b64097d449
がA1の値になると考えられる。(さすがにパスワードがこんなに長いとは思わないし…)
よく調べていないが、htdigestというLinuxのコマンドや、digest認証用の.htdigestファイルがあるみたいで、それと関係があると思う。
さて、これで必要な情報が揃ったので、あとはFiddler等を使って認証を突破するだけ。
まずはブラウザでflag.html
にアクセスし、401エラーが返ってくる。
そのレスポンス内にnonce等の情報がある。
それらを利用してresponse値を計算し、認証情報を含めたリクエストを作成する。
これで認証に成功してflag.htmlにアクセスでき、FLAGをゲットできる。
感想
まさかパスワードを知らなくても認証を突破できるとは思わなかったな…。
実際はA1の値を取得するのは簡単ではないと思うので、ここまでアッサリと不正に認証が通ることはないと思うけど、Digest認証が完全に安全だとは言えないね…(そもそも使ってるハッシュ関数がMD5だし)
いやー面白かったし勉強になった!