PortSwigger-2FA bypass using a brute-force attack

単純なやり方ではクリアできない問題でした。
まず、以下の仕様が問題になりました。
- ユーザ名とパスワードの入力後に、セキュリティコードを入力する必要があります。
セキュリティコードを2回間違えると、ユーザ名とパスワードを入力しなおす必要があります。 - ログイン時のユーザ名とパスワード及びMFAコード以外にCSRFトークンの発行が行われています。
hiddenでinputタグとして渡しているので、submitをクリックすると、ユーザが知らないところで情報が送信されます。
この課題をクリアするには、CSRFトークンを適切に発行させながら、MFAコードの試行回数によるユーザ名とパスワードの入力リセットも考慮する必要があります。
このやり方がわかりませんでしたので、存在する解法を参考にやりました。
BurpSuite
BurpSuiteの機能を使って自動化します。
https://portswigger.net/burp/documentation/desktop/settings/sessions#macros
設定画面を表示します。
最初のユーザ+パスワード入力でもCSRFトークンが求められるので、その前の段階からマクロを組む必要があります。Ctrl+クリックで複数選択をします。
Test macroを実行して、このように結果が返ってくればリクエストに成功しています。
Targetからマクロに登録した、先の処理の/login2へのPOSTをIntruderに送信します。
Intruderの画面から、mfa-codeの値をペイロードに登録します。
これを以下のように変更します。
これで2FAのブルートフォース攻撃を成功させることができます。
※BurpSuiteのCommunityEditionだと、リクエスト数の制限によって、時間がかかります。
OWASP ZAP
複数選択します。
右クリックをして、「新しいZestスクリプト」をクリックします。
チェックを外します。
Titleをつけます。
保存を押すと、スクリプトコンソールが表示されます。
クリックをして、表示を拡張します。
MFAトークンを送信する/login2をクリックします。
リクエストタブに切り替えます。MFAコードは自分が入力した値になっています。
MFAコードのブルートフォース攻撃をしたいため、その設定を行います。
ダブルクリックします。
ウィンドウが追加されるので、設定を書き換えます。
以下のようにします。
ループ対象をすべてを選択して、右クリックします。
変数名と各ループで渡す値をペーストします。
停止をさせる時の条件を決めます。
※手順をはさんでいませんが、Assign csrf3 = (Form…の列は削除することを推奨します。
スクリプトコンソールを選択し、実行をクリックします。
※時間がかかるので、成功するには何度もやらないといけません。