
CVE-2022-30600の概念実証
このリポジトリには、CVE-2022-30600 を悪用する概念実証のための 2 つの実装が含まれています。
CVE-2022-30600 は、攻撃者が moodle Web アプリケーション内のアカウントロックアウトしきい値をバイパスできるようにするセキュリティ脆弱性です。
3.9 - 3.9.13
3.10 - 3.10.10
3.11 - 3.11.6
この脆弱性を修正するために使用されたコミットで概説されているように、問題はデータベース内の login_failed_count 値にアクセスしてインクリメントするために使用されるロジックにあります。
2 つ以上の同時ログイン要求が発生した場合、moodle Web アプリケーションがアプリケーション内のログイン値を正しくチェックおよび更新できない可能性があります。その結果、2 回以上のログイン失敗が 1 回のログイン失敗としてのみカウントされます。
これをよりよく理解するために、以下の図は、クライアント、Web アプリ、およびデータベースの観点からの失敗したログイン要求の高レベルの内訳です。
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request
W->>D: Requests failed_login_attempt
D->>W: failed_login_attempt = 0
W->>W: local failed_login_attempt = 0
W->>W: local failed_login_attempt = 1
W->>D: failed_login_attempt = 1
W->>C: Login Failedその結果、データベース内の failed_login_attempt 値は正しくなり、後続のログイン試行は正しく値を更新します。
攻撃者が多数の同時ログイン要求を送信した場合、以下の問題が発生します。
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request (session 1)
C->>W: Login Request (session 2)
W->>D: Requests failed_login_attempt (session 1)
W->>D: Requests failed_login_attempt (session 2)
D->>W: failed_login_attempt = 0 (session 1)
D->>W: failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 0 (session 1)
W->>W: local failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 1 (session 1)
W->>W: local failed_login_attempt = 1 (session 2)
W->>D: failed_login_attempt = 1 (session 1)
W->>D: failed_login_attempt = 1 (session 2)
W->>C: Login Failed (session 1)
W->>C: Login Failed (session 2)この相互作用の結果、2 回のログイン失敗要求が発生したにもかかわらず、failed_login_attempt データベース値は 1 だけインクリメントされます。これは数百の要求に拡大でき、制限はクライアントが行える同時要求数と Web サーバーが同時に管理できる要求数です。
さらに、攻撃者が複数のクライアント(ボットネットなど)にアクセスでき、これらの要求が行われる時間を同期できる場合、攻撃者は 1 つのクライアントを使用する際の制限を克服し、攻撃をより緩和しにくくすることができます。
poc.py はこの攻撃の Python3 実装です。同時要求を実行するためにスレッドを使用します。この概念実証は機能しますが、Python3 に存在するグローバルインタプリタロック(GIL)により、この状況下で複数のスレッドを使用する利点が妨げられます。攻撃が単一のクライアントで実行される場合、C++ 実装の方が適切に動作するため、強くお勧めします。
poc.py [-h] -u USERNAME -url TARGET -w WORDLIST -t THREADS [-a ATTEMPTS] [-d DELAY]
オプション:
-h, --help
このヘルプメッセージを表示します
-u USERNAME, --username USERNAME
対象となるアカウントのユーザー名
-url TARGET, --target TARGET
対象となる moodle Web アプリケーションのベース URL
-w WORDLIST, --wordlist WORDLIST
使用するワードリストファイルへのパス
-t THREADS, --threads THREADS
各試行で作成されるスレッド数
-a ATTEMPTS, --attempts ATTEMPTS
実行する試行回数。デフォルトは 1 です
-d DELAY, --delay DELAY
各試行間の秒数。デフォルト値は 2 です
python3 poc.py -u admin -url https://moodle/ -w /usr/share/wordlists/rockyou.txt -t 15 -a 8
対象 : https://moodle/
アカウントユーザー名 : admin
ワードリスト : /usr/share/wordlists/rockyou.txt
スレッド : 各試行で 15 のログイン要求が行われます
試行 : 攻撃は合計 8 回繰り返されます
この例では、合計 120 回(8 * 15)のログイン要求が行われます。各試行間には 2 秒の遅延があります。
poc.cpp は攻撃の C++ 実装であり、攻撃を実行するために curl ライブラリを使用します。そのため、アプリケーションをコンパイルするにはいくつかのコンパイラフラグが必要です。全体として、この実装は Python3 バージョンよりも優れています。スレッドがクライアントデバイスのすべてのコアを使用できるため、より短い時間でより多くの同時接続が可能になるからです。これにより、エクスプロイトがより一貫して動作できるようになります。
g++ poc.cpp -o poc -lcurl
Usage:
poc [OPTION...]
-a, --attempts
攻撃が実行される回数
-t, --threads
各試行で使用するスレッド数
-n, --username
対象とするアカウントのユーザー名
-u, --URL
moodle Web アプリケーションのベース URL
-d, --delay
試行間の時間遅延。デフォルトは 5
-v, --version
バージョンを表示
-h, --help
ヘルプメッセージを表示
-w, --wordlist arg
パスワードのワードリスト
./poc -w /usr/share/wordlists/rockyou.txt -u https://moodle/ -n admin -a 3 -t 5 -d 2
ワードリスト : /usr/share/wordlists/rockyou.txt
URL : https://moodle/
アカウントユーザー名 : admin
試行 : 3 回の試行が行われます
スレッド : 各試行で 5 つのスレッドが使用されます
遅延 : 各試行間に 2 秒の遅延があります
これらのスクリプトを開発、テスト、デバッグするために、仮想マシンを作成しました。この仮想マシンは以下のソフトウェアとバージョンを使用しました。
Moodle 3.9.0 PHP 7.2.34 MySQL 8.0.30 Ubuntu 5.15.0-41-generic Apache 2.4.52
私のソースコードが違法行為に使用されることを容認しません。