診断員見習いのセキュログ

自分用のメモとかWrite-up

#9 Digest is secure!

問題

ksnctf.sweetduet.info

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認証を扱っていて、盗聴に弱いことが分かる。

swime.hatenablog.jp

それで、Digest認証のアルゴリズムは以下の通り。

A1 = ユーザ名 ":" realm ":" パスワード
A2 = HTTPのメソッド ":" コンテンツのURI
response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )

A1とA2を作成し、それぞれハッシュ化する。その後、ハッシュ化したA1, A2とnonce等の値を用いてresponseを作成する。
このresponseの値が正しければ認証成功になるらしい。

解法の続き

ここで問題の方に戻る。
パケットを見てみると、実はパスワード以外の情報が分かっている。

f:id:swime:20180819180715j:plain

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等の情報がある。

f:id:swime:20180819183501j:plain

それらを利用してresponse値を計算し、認証情報を含めたリクエストを作成する。

f:id:swime:20180819183528j:plain

これで認証に成功してflag.htmlにアクセスでき、FLAGをゲットできる。

感想

まさかパスワードを知らなくても認証を突破できるとは思わなかったな…。
実際はA1の値を取得するのは簡単ではないと思うので、ここまでアッサリと不正に認証が通ることはないと思うけど、Digest認証が完全に安全だとは言えないね…(そもそも使ってるハッシュ関数MD5だし)
いやー面白かったし勉強になった!