PortSwigger Uncategorized WritesUp セキュリティ

PortSwigger-2FA bypass using a brute-force attack

writesupIimage

単純なやり方ではクリアできない問題でした。
まず、以下の仕様が問題になりました。

  • ユーザ名とパスワードの入力後に、セキュリティコードを入力する必要があります。
    セキュリティコードを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…の列は削除することを推奨します。

スクリプトコンソールを選択し、実行をクリックします。

※時間がかかるので、成功するには何度もやらないといけません。