
Comprobador de vulnerabilidades de bypass de autenticación en Kestra
Escanea instancias de Kestra para detectar la omisión del filtro de autenticación endsWith("/configs"). El AuthenticationFilter.java de Kestra verifica request.getPath().endsWith("/configs") en lugar de coincidir con la ruta exacta /api/v1/configs. Dado que Kestra direcciona los recursos mediante segmentos de ruta elegidos por el llamante (namespace, ID de flujo), cualquier ruta que termine en /configs omite la autenticación básica permitiendo la creación de flujos no autenticada y RCE. (CVSS 10.0)
Referencias:
GET /api/v1/configs (debe devolver 200; el cuerpo de la respuesta se analiza para obtener la versión de Kestra)GET /api/v1/{tenant}/flows (debería devolver 401/403 si la autenticación está aplicada)/configs; si alguna devuelve un código distinto de 401/403 mientras la comprobación de autenticación aplica, la instancia es vulnerable--aggressive) también envía solicitudes PUT para confirmar la capacidad de omisión de escritura--rce) cadena completa: crear flujo shell/python → desencadenar ejecución → recuperar registros → confirmar ejecución de código → limpiar--ssrf) crea un flujo con http() de Pebble dirigido a metadatos en la nube de AWS/GCP/Azure y puntos finales internos, luego verifica los registros en busca de evidencia--destructive) envía DELETE a flujos, paneles y rutas de omisión de registros para confirmar la omisión de operaciones destructivas| Sonda | Método | Ruta | Descripción |
|---|---|---|---|
| Configs públicos | GET | /api/v1/configs | Comprobación de actividad + extracción de versión |
| Normal protegido | GET | /api/v1/{tenant}/flows | Línea base de aplicación de autenticación |
| Omisión de flujos | GET | /api/v1/{tenant}/flows/{namespace}/configs | Omisión de listado de flujos |
| Omisión de ejecuciones | GET | /api/v1/{tenant}/executions/{namespace}/configs | Omisión de ejecuciones |
| Omisión de KV Store | GET | /api/v1/{tenant}/namespaces/{namespace}/kv/configs | Omisión de lectura de KV |
| Omisión de paneles | GET | /api/v1/{tenant}/dashboards/configs | Omisión de paneles |
| Omisión de registros | GET | /api/v1/{tenant}/logs/{namespace}/configs | Omisión de acceso a registros |
| Omisión de plantillas | GET | /api/v1/{tenant}/templates/{namespace}/configs | Omisión de lectura de plantillas |
--aggressive)| Sonda | Método | Ruta | Descripción |
|---|---|---|---|
| Omisión PUT de flujos | PUT | misma que Omisión de flujos | Crea un flujo mínimo debug.Return |
| Omisión PUT de KV | PUT | misma que Omisión de KV | Crea una entrada KV {"scanned": true} |
--destructive)| Sonda | Método | Ruta | Descripción |
|---|---|---|---|
| Omisión DELETE de flujos | DELETE | misma que Omisión de flujos | Elimina un recurso llamado "configs" |
| Omisión DELETE de paneles | DELETE | misma que Omisión de paneles | Elimina un panel llamado "configs" |
| Omisión DELETE de registros | DELETE | misma que Omisión de registros | Destruye registros de auditoría |
--rce)Se ejecuta solo cuando se confirma la omisión de autenticación. La cadena completa según el aviso:
| Paso | Método | Ruta | Descripción |
|---|---|---|---|
| 1. Crear flujo RCE | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Despliega un flujo con io.kestra.plugin.scripts.shell.Commands (echo <marcador>, id, hostname). Recurre a io.kestra.plugin.scripts.python.Script en caso de fallo. |
| 2. Desencadenar ejecución | POST | /api/v1/{tenant}/executions/{namespace}/configs | Inicia el flujo mediante la ruta de omisión |
| 3. Consultar registros | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Consulta hasta --poll-retries veces (predeterminado 10) cada --poll-interval segundos (predeterminado 3) buscando el marcador RCE único |
| 4. Limpiar | DELETE | misma que paso 1 | Elimina el flujo desplegado |
--ssrf)Se ejecuta solo cuando se confirma la omisión de autenticación:
| Paso | Método | Ruta | Descripción |
|---|---|---|---|
| 1. Crear flujo SSRF | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Despliega una tarea debug.Return con llamadas http() de Pebble a AWS (169.254.169.254/latest/meta-data/ami-id), GCP (metadata.google.internal), Azure (169.254.169.254/metadata/instance) e interno (127.0.0.1:8080/api/v1/configs) |
| 2. Desencadenar ejecución | POST | misma que paso 2 de RCE | Desencadena el flujo |
| 3. Consultar registros | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Verifica indicadores de metadatos en la nube (ami-, i-, 169.254.169.254, metadata.google.internal, etc.) |
| 4. Limpiar | DELETE | misma que paso 1 | Elimina el flujo desplegado |
posicional:
target URL de destino única (ej. http://localhost:8080)
opciones:
-f, --file Archivo con destinos (uno por línea)
-t, --timeout Tiempo de espera de solicitud en segundos (predeterminado: 10)
--verify-ssl Verificar certificados TLS
-j, --json Salida JSON a stdout
-o, --output Escribir informe JSON a un archivo
--tenant Nombre del inquilino (predeterminado: "main")
--namespace Espacio de nombres para rutas de omisión (predeterminado: "tutorial")
-w, --workers Número de hilos para escaneos masivos (predeterminado: 10)
-a, --aggressive Enviar solicitudes PUT para confirmar omisión de escritura
-P, --auto-ports Puertos para expansión automática (predeterminado: 8080 8081 8088 8091 80 443)
sondas avanzadas:
-r, --rce Habilitar cadena de verificación RCE (flujo shell + python,
desencadenamiento de ejecución, recuperación de registros, limpieza automática)
-s, --ssrf Habilitar detección SSRF (http() de Pebble a puntos finales
de metadatos en la nube, recolección de evidencia basada en registros)
-d, --destructive Habilitar sondas DELETE en flujos, paneles y registros
(ELIMINARÁ recursos en instancias vulnerables)
--poll-interval Segundos entre consultas de registros para cadenas RCE/SSRF (predeterminado: 3)
--poll-retries Intentos máximos de consulta de registros para cadenas RCE/SSRF (predeterminado: 10)
Desglose completo por sonda con enriquecimiento (versión, RCE, SSRF, estado DELETE) y veredicto:
====================================================================
Destino: http://10.0.0.1:8080
Marca de tiempo: 2026-06-30T12:00:00+00:00
====================================================================