ksnctf 9 Digest is secure! 150pt

#問題

https://ksnctf.sweetduet.info/problem/9

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2507202a-9fda-b281-cb29-082de607329e.png)

#解いてみた

- まずはファイルをダウンロード。pcapファイルです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f8b8cbd3-bf9d-4ac9-6868-4685545d17b4.png)

- 最初のHTTPの戻り値を見てみると以下のことがわかります。
    - WWW-Authenticate: Digest　から　Digest認証
- Digest認証には何が必要なんでしょう。
- 最後成功しているパケットを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/29aa9cba-bae1-b4de-bf52-52a0398d1154.png)

- Authorizationというところを見ると以下が必要そうです。
    - Digest username="q9"
    - realm="secret"
    - nonce="bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b"
    - uri="/~q9/"
    - algorithm=MD5
    - response="c3077454ecf09ecef1d6c1201038cfaf"
    - qop=auth
    - nc=00000001
    - cnonce="9691c249745d94fc"
- このまま使えるものとそうでないものにわけます。
- 調べた結果。
    - Digest username : "q9"で固定
    - realm : 直前にサーバから返却される
    - nonce : 直前にサーバから返却される
    - uri="/~q9/"で固定
    - algorithm : 直前にサーバから返却される
    - response : いろいろな値を計算して生成する
    - qop : 直前にサーバから返却される
    - nc : nonceの値を使った回数
    - cnonce : ユーザが生成する文字列
- 必要なことはresponseとcnonceを計算することだけということがわかった。
    - cnonceについては勝手に作ってくれるのでそれをそのまま使う。
- とりあえずresponseの計算方法を調べます。wikipediaから。

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

- と書いていました。
- ではさっそくA1を作ろうと思ったらパスワードが分からないので作れません。逆からいくしかなさそうです。
- responseはc3077454ecf09ecef1d6c1201038cfafとわかっているのでMD5を逆に戻してみます。
    - 何度か書いていますが、普通は戻せません。
        - https://qiita.com/CTFman/items/238158cf923658d35696
    - Hash Toolkit https://hashtoolkit.com/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f504847c-e58f-c398-ef33-7cab164f146d.png)

- 要素ごとにわけると以下ということがわかりました。
    - MD5(A1) : c627e19450db746b739f41b64097d449
    - nonce : bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b
    - nc : 00000001
    - cnonce : 9691c249745d94fc
    - qop : auth
    - MD5(A2) : 31e101310bcd7fae974b921eb148099c
- ここで重要なのはパスワードが分からなくてもMD5(A1)が導き出せたということです。パスワードはA1を作るための道具にすぎない。
- nonceはサーバから送られてくるので気にしなくて良い。
- nc、cnonce、qopはそのままでいいでしょう。（cnonceは良くわかってないけど一旦そのまま。）
- MD5(A2)は接続先のURLから導き出すんですが、そういえば私はどこにアクセスしたかったんでしょう。。。
- 成功したパケットを再度見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fb803e08-4bb4-de40-7946-23fa31f6b775.png)

- あぁflag.htmlにアクセスすればそれで終了だったということでしょうか。
- 一応アクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a7dab64f-a052-860a-1305-a11f220f8283.png)


- ほっと一安心ですよ。
- もしこれで認証とかなくアクセスできてしまったらこれまでの下準備が水の泡ですからね。
- 気を取り直してMD5(A2)を導き出します。
- A2 = HTTPのメソッド ":" コンテンツのURIなので以下となります。
    - GET:/~q9/flag.html
    - MD5変換にはCyberChef（https://gchq.github.io/CyberChef/ ）使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/dfbd3b09-c536-2076-620c-e7145758f7fb.png)

- まとめると以下です。
    - MD5(A1) : c627e19450db746b739f41b64097d449
    - nonce : サーバからくる
    - nc : 00000001
    - cnonce : 勝手に生成される
    - qop : auth
    - MD5(A2) : ffffdd8b8029499600f95a69beb239c2
- さて、fiddlerを使って通信してみます。通信途中でいったん止めて値を書き換える作戦です。
    - ここで気づいたのですが、GET通信の場合、パラメータがないとFiddlerでは通信を止めることができないことが判明しました。
    - なので急遽URIを/~q9/flag.htmlから/~q9/flag.html?a=1に変更します。
それに伴ってMD5(A2)が8f5e1a4d6db7ec8ea947c0bc05196fd2に変わりました。。。
- 気を取り直して認証パケットの送信。ここではユーザ名q9でパスワードはわからないので適当に入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f1206451-76b0-4ced-9e4b-19274da4eb9a.png)


- このパケットからresponseを生成するのに必要な値を抽出します。
    - MD5(A1) : c627e19450db746b739f41b64097d449
    - nonce : pAD0zCN+BQA=dfc0a8a3866916f661e0b3a0f66f2cbeadcb9bfe
    - nc : 00000001
    - cnonce : 11943ca2450031be
    - qop : auth
    - MD5(A2) : 8f5e1a4d6db7ec8ea947c0bc05196fd2
- 上記の値からresponseを生成すると498bd181015436182fd837cb7675ab07であることがわかりました。
- これらの値で通信を行ったところ成功しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a57dc7fd-c5e9-6de6-2fdc-28058616e654.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/94bda063-c5b3-a5b0-40cb-3b6babbcf368.png)