「CTFの練習問題」的な文脈で「ダイジェスト認証」に触れる機会がありました。復習兼ね関連する要素(Webサーバ側設定/サーバ・クライアント挙動/ローカルプロキシツール・・・)について確認・検証をしたいと思います。
Apacheでの設定
Docker、わかっているかわかっていないかでいえば、わかっていないですがとりあえずイメージを落として起動してみたところ、2.4.46というバージョンでした。
httpd.conf
「auth_digest_module」というものが必要とのこと、デフォルトコメントですのでコメント外して有効化しました。
また、この後.htaccessでディレクトリに対してダイジェスト認証設定をするため、ドキュメントルートは以下を「AllowOverride All」としています。
htdigest
ダイジェスト認証用のユーザを作成するコマンドです。
# htdigest
Usage: htdigest [-c] passwordfile realm username
The -c flag create a new file.
とのことですので
# htdigest -c ../conf/passwords digest digest_user
Adding password for digest_user in realm digest.
New password:
Re-type new password:
ここでパスワードを「password」とした場合、生成されるpasswordsファイルには以下の1行が登録されます。
digest_user:digest:46328f2142603a1d167a1a19de5210bf
「:」区切りの3つ目の要素が後述のHA1となりますが、これは以下のコマンドで取得できるハッシュ値と一致します。
$ echo -n "digest_user:digest:password" | md5sum
46328f2142603a1d167a1a19de5210bf
ダイジェスト認証を要求するディレクトリの設定
htdocs/digest ディレクトリをダイジェスト認証必要と位置付け、.htaccessでダイジェスト認証の設定を行いました。
AuthType Digest
AuthName "digest"
AuthUserFile /path_to_passwords_file/passwords
Require valid-user
動作確認
当該パスをリクエストすると、以下がレスポンスされ
ブラウザ側では例のユーザ・パスワードを求めるダイアログが表示されます。
上記で登録したユーザ・パスワードを入力して「ログイン」を押下すると、以下がリクエストされ、接続許可(200 OK)されました。
response="XXX" の部分がサーバ側から与えられたnonce等の値と、ブラウザでユーザにより入力されたユーザ、パスワード等から生成された値であり、サーバ側でも同じ情報・アルゴリズムで生成して値を比較、認証OK/NGを返すという流れと理解。
続編にてこのresponse="XXX"の算出手順を検証・確認します。
2021年06月30日 初版