ダイジェスト認証 #1 Apache設定~動作確認に続きまして。
HA1(「ユーザ名:レルム:パスワード」のハッシュ値)が何らかの形で漏洩しているという前提で、ブラウザにユーザ・パスワードを入力することなく、response="XXX" の部分を算出、Webプロキシでリクエストを編集して認証を突破しよう、という「CTFの練習問題」的な文脈から本件検証・確認を行っております。
実機での確認動作
前回記載の通り、要「ダイジェスト認証」パスへの初回リクエストに対して、サーバから以下のレスポンス(改行を入れています)。
WWW-Authenticate:
Digest realm="digest",
nonce="jeqPGvfFBQA=9e2e2d4c04ea2ad4758a1129484608c9e8abea85",
algorithm=MD5,
stale=true,
qop="auth"
こちらに対してブラウザで正しいユーザ・パスを入れることで生成されたリクエスト(同上)。
Authorization:
Digest username="digest_user",
realm="digest",
nonce="jeqPGvfFBQA=9e2e2d4c04ea2ad4758a1129484608c9e8abea85",
uri="/digest/",
algorithm=MD5,
response="e6af4f81fa87ccde2bc4769ee237eea2",
qop=auth,
nc=00000001,
cnonce="10057899296509bc"
response="XXX" 導出仕様
Digest access authenticationから読み取るに(algorithm=MD5,qps=authの場合)
HA1 = MD5(username:realm:password)
HA2 = MD5(method:digestURI)
response = MD5(HA1:nonce:nonceCount:cnonce:qop:HA2)
前回の記載の通り、
ユーザ:レルム:パスワード=digest_user:digest:password
ですので、HA1は
# echo -n "digest_user:digest:password" | md5sum
46328f2142603a1d167a1a19de5210bf
HA2は
# echo -n "GET:/digest/" | md5sum
9942091bc79111e32fecde3962416017
そうすると上掲のnonce,cnonce,qop,ncと合わせて
# HA1=46328f2142603a1d167a1a19de5210bf
# HA2=9942091bc79111e32fecde3962416017
# nonce=jeqPGvfFBQA=9e2e2d4c04ea2ad4758a1129484608c9e8abea85
# cnonce=10057899296509bc
# qop=auth
# nc=00000001
response="XXX"は
# echo -n "${HA1}:${nonce}:${nc}:${cnonce}:${qop}:${HA2}" | md5sum
e6af4f81fa87ccde2bc4769ee237eea2 -
ブラウザが導出した(=認証OKとなった)response="XXX"と同値を導出することができました。
HA1がわかる(何らかの形で漏洩した)という前提では、サーバから返されたnonce等の値により認証をパスできるresponse="XXX"を導出できることを改めて確認しました。
いったん完了とはしますが、
- 認証パス後のリクエスト、レスポンスヘッダ
- サーバがレスポンスしたnonceの扱い
- nonceCount? qop?
- httpサーバ実装による差異
等、可能であれば追記をしたいと考えております。
2021年06月30日 初版