ksnctf #9 “Digest is secure!”をPythonで解読する

プログラミング

ksnctf #9 “Digest is secure!”をPythonで解読する

Problem

q9.pcapが与えられていて, そこからFlagを得る。

Solution

タイトルから予測して、前回がBasic認証だったのに対し、今回はDigest認証に関する問題だと分かる。

今回もksnctf#8と同じように、とりあえずq9.pcapを開けてみてみると

前回同様Digest認証のパスワードがFlagとなっていることがわかる。

2回目のGETの内容を確認してみると、

Authorizationのところに、

Digest username="q9"
realm="secret"
nonce="HHj57RG8BQA=4714c627c5195786fc112b67eca599d675d5454b"
uri="/q9/"
algorithm=MD5
response="26c8019eb6f7f41b9c14b4cbda48ab2e"
qop=auth
nc=00000002
cnonce="656335d78cef6e86"

realm : 認証ダイアログに表示されるメッセージ。

nonce : サーバ側が生成するランダムな文字列。アクセスするたびに毎回変わる。

uri : リクエストを行うURI

algorithm : ダイジェスト文字列を生成するためのアルゴリズム。ここではMD5。

response : パスワードを含む文字列のダイジェスト文字列(16進数)。

qoq : 保証レベル。quality of protectionの略。authは認証のみ。

nc : nonce-countのこと。リクエスト時に特定のnounce値を使ってクライアントが送ったリクエスト数(16進数)

conce : クライアント側が生成するランダムな文字列。

上の情報からDigest認証のresponseを解読すればFlagを手に入れられる。

responseの生成方法はWikipediaを参考にすると

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

となる。

MD5逆変換ツールでresponseを変換すると

c627e19450db746b739f41b64097d449:HHj57RG8BQA=4714c627c5195786fc112b67eca599d675d5454b:
00000002:656335d78cef6e86:auth:adea3748da59405c1f4c1650442607a1

となる。

Pyhtonでresponseを作成して、ログインする。

import requests
from hashlib import md5

url = "http://ctfq.u1tramarine.blue/q9/flag.html"

username = "q9"
realm = "secret"
nonce = ""
uri = "/q9/flag.html"
algorithm = "MD5"
response =""
qop = "auth"
nc = "00000001"
cnonce = "656335d78cef6e86"
md5_a1 = "c627e19450db746b739f41b64097d449"
a2 = "GET:" + uri

def main():
    digest_cracker()

def digest_cracker():
    # urlにアクセスする
    res = requests.get(url)
    
    # headerからnonceを取得
    nonce = res.headers["WWW-Authenticate"].split(", ")[1]
    nonce = nonce.replace('nonce=','').replace('"', '')
    
    # responseを作成
    md5_a2 = md5(a2.encode('utf-8')).hexdigest()
    plain_response = f"{md5_a1}:{nonce}:{nc}:{cnonce}:{qop}:{md5_a2}"
    response = md5(plain_response.encode('utf-8')).hexdigest()

    auth = 'Digest username="' + username + '", realm="' + realm + '", nonce="' + nonce + '",uri="' + uri + '", algorithm=' + algorithm + ', response="' + response + '", qop=' + qop + ', nc=' + nc + ', cnonce="' + cnonce + '"'
    headers = {'Authorization' : auth}
    req = requests.get(url, headers = headers)
    print(req.text)


if __name__ == '__main__':
    main()

実行結果は

% python digest*
<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
    <title>Q9</title>
  </head>
  <body>
    <p>FLAG_************</p>
  </body>
</html>

となりFlagを手に入れることができた!

CTF, セキュリティの参考資料

Udemy

個人的にUdemyが動画で分かりやすいし、値段も安いのでおすすめです。

実践的なものが特に役立ちます。

ホワイトハッカー入門

ハッキング技術入門

サイバーセキュリティ~ハッキングと防御 ビギナー編

ホワイトハッカー養成講座(ハッキングツール、Webアプリ攻略、不正侵入検知)

ホワイトハッカー養成講座 (インシデントハンドリング&Windowsアタック編)

サイバー攻撃:侵入から権限昇格まで

書籍

  • セキュリティコンテストチャレンジブック CTFで学ぼう!情報を守るための戦い方
  • セキュリティコンテストのためのCTF問題集
  • デバッガによるx86プログラム解析入門
  • リバースエンジニアリングバイブル
  • 大熱血アセンブラ入門
  • 楽しいバイナリの歩き方
  • Reverse Engineering for Beginners
  • HACKING: 美しき策謀
  • 秘密の国のアリス
  • 暗号解読
  • 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 第2版

コメント

タイトルとURLをコピーしました