PortSwigger Web Security Academyが提供しているLab: Broken brute-force protection, IP blockのWrite upです。
Labの概要
This lab is vulnerable due to a logic flaw in its password brute-force protection. To solve the lab, brute-force the victim's password, then log in and access their account page.
Your credentials: wiener:peter
Victim's username: carlos
Candidate passwords
Candidate passwordsでは下記のパスワードリストが提供されている。
123456
password
12345678
qwerty
123456789
12345
1234
111111
1234567
dragon
(省略)
My accountのリンクからログインページへ遷移できる。
目標はcarlosユーザーのクレデンシャル情報を取得しログインすること。
解法
まずは提供されているwiener:peterのアカウントでログインをしてみると302 Foundとsessionキーが返される。
wienerユーザーでログインできたことが分かる。
一度ログアウトし、今度は誤ったパスワードでログインを試してみるとIncorrect passwordという文字列が返される。
誤った情報でログインを3回試すとYou have made too many incorrect login attempts. Please try again in 1 minute(s).という文字列と共にリクエスト制限がかけられる。
ブルートフォース攻撃をする上でこの制限は非常に厄介なので回避したい。
この認証処理ではログインが成功するとログイン試行のカウンターがリセットされる欠陥がある。
「2回ログインに失敗し、3回目にwiener:peterでログインを成功させる」を繰り返すと無限にログインのリクエストを送ることができ、ブルートフォース攻撃が出来そうだ。
攻撃するにあたり、2つのファイルを用意する。
1つ目はLabで提供されているパスワードリストで1つおきにwienerを挿入したファイル。
pass-list.txtとして提供されているパスワードリストをファイルに保存し、pass-list-script.shを実行すれば作成できる。
#!/bin/bash
# 既存のテキストリストファイル名
input_file="pass-list.txt"
# 一時ファイル名
temp_file="temp.txt"
# 既存のファイルが存在しない場合はエラーメッセージを表示して終了
if [ ! -f "$input_file" ]; then
echo "エラー: $input_file が見つかりません。"
exit 1
fi
# 一時ファイルを作成して、`peter` を行間に挿入して書き込む
while IFS= read -r line; do
echo "peter" >> "$temp_file"
echo "$line" >> "$temp_file"
done < "$input_file"
# 一時ファイルを元のファイルに上書きする
mv "$temp_file" "$input_file"
echo "ファイル $input_file が更新されました。"
スクリプト実行前のpass-list.txt。
123456
password
12345678
qwerty
123456789
(省略)
スクリプトを実行し、peterが一行ずつ挿入されているファイルが作成された。
peter
123456
peter
password
peter
12345678
peter
qwerty
peter
123456789
2つ目は、wienerとcarlosが交互に記述されているファイル。
同じようにuser-list-script.shを実行すれば作成できる。
#!/bin/bash
# 出力するファイル名
output_file="user-list.txt"
# 行数
lines=100
# ファイルが既に存在する場合は削除して新規作成
if [ -e "$output_file" ]; then
rm "$output_file"
fi
# 100 行のテキストを生成
for ((i=1; i<=$lines; i++)); do
# 奇数行は wiener、偶数行は carlos を書き込む
if (( $i % 2 == 0 )); then
echo "carlos" >> "$output_file"
else
echo "wiener" >> "$output_file"
fi
done
echo "ファイル $output_file が作成されました。"
ユーザー名が交互に並んだリストが作成された。
wiener
carlos
wiener
carlos
wiener
carlos
wiener
carlos
ファイルの作成が終了したら、ログインのリクエストをIntruderに設定し、Attack typeをPitchforkに、usernameとpasswordのパラメータ部分をAdd§で囲む。
次にPayloadsタブに移動、Payload setを1にし、Payload settingsのLoadから作成したユーザーリストのファイルを選択する。
Payload setを2にし、Payload settingsのLoadから作成したパスワードリストのファイルを選択する。
Resource poolタブに移動し、Create new resource poolを選択、Maximum concurrent requestsを1に設定する。
上記の設定が完了したら、右上のStart Attackボタンをクリックして攻撃開始。
wiener:peterのログインとcarlos:<パスワードリスト>のログインが交互に試行される。
ログインが成功した場合ステータスコード302で返ってくるのでフィルタリングすると、carlosユーザーのパスワードを発見できた。
最後に特定できたユーザー情報でログインしてLabは完了です。









