LoginSignup
0
0

【Write up】Lab: Broken brute-force protection, IP block @ PortSwigger Academy

Posted at

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ユーザーのクレデンシャル情報を取得しログインすること。

login form.png

解法

まずは提供されているwiener:peterのアカウントでログインをしてみると302 Foundとsessionキーが返される。

wiener peter 302.png

wienerユーザーでログインできたことが分かる。

wienerログイン後.png

一度ログアウトし、今度は誤ったパスワードでログインを試してみると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を実行すれば作成できる。

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

pass-list.txt
123456
password
12345678
qwerty
123456789
(省略)

スクリプトを実行し、peterが一行ずつ挿入されているファイルが作成された。

pass-list.txt
peter
123456
peter
password
peter
12345678
peter
qwerty
peter
123456789

2つ目は、wienercarlosが交互に記述されているファイル。
同じようにuser-list-script.shを実行すれば作成できる。

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 が作成されました。"

ユーザー名が交互に並んだリストが作成された。

user-list.txt
wiener
carlos
wiener
carlos
wiener
carlos
wiener
carlos

ファイルの作成が終了したら、ログインのリクエストをIntruderに設定し、Attack typePitchforkに、usernamepasswordのパラメータ部分をAdd§で囲む。

pitchfork.png

次にPayloadsタブに移動、Payload set1にし、Payload settingsLoadから作成したユーザーリストのファイルを選択する。

payload1.png

Payload set2にし、Payload settingsLoadから作成したパスワードリストのファイルを選択する。

payload2.png

Resource poolタブに移動し、Create new resource poolを選択、Maximum concurrent requests1に設定する。

Resource pool.png

上記の設定が完了したら、右上のStart Attackボタンをクリックして攻撃開始。

wiener:peterのログインとcarlos:<パスワードリスト>のログインが交互に試行される。

ログイン試行.png

ログインが成功した場合ステータスコード302で返ってくるのでフィルタリングすると、carlosユーザーのパスワードを発見できた。

finish.png

最後に特定できたユーザー情報でログインしてLabは完了です。

login success.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0