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は完了です。