
Kestra Auth-Bypass Vulnerability Checker
Scanne les instances Kestra pour le contournement du filtre d'authentification endsWith("/configs"). Le AuthenticationFilter.java de Kestra vérifie request.getPath().endsWith("/configs") au lieu de correspondre au chemin exact /api/v1/configs. Comme Kestra adresse les ressources via des segments de chemin choisis par l'appelant (namespace, flow ID), tout chemin se terminant par /configs contourne l'authentification de base, permettant la création non authentifiée de workflows et l'exécution de code à distance (RCE). (CVSS 10.0)
Références :
GET /api/v1/configs (doit retourner 200 ; le corps de la réponse est analysé pour la version de Kestra)GET /api/v1/{tenant}/flows (doit retourner 401/403 si l'authentification est appliquée)/configs ; si l'une d'elles retourne autre chose que 401/403 alors que la vérification d'authentification est appliquée, l'instance est vulnérable--aggressive) envoie également des requêtes PUT pour confirmer la capacité de contournement en écriture--rce) chaîne complète : créer un workflow shell/python → déclencher l'exécution → récupérer les logs → confirmer l'exécution de code → nettoyer--ssrf) crée un workflow avec le http() de Pebble ciblant les métadonnées cloud AWS/GCP/Azure et les points de terminaison internes, puis vérifie les logs pour trouver des preuves--destructive) envoie des DELETE vers les chemins de contournement des flows, tableaux de bord et logs pour confirmer le contournement des opérations destructives| Sonde | Méthode | Chemin | Description |
|---|---|---|---|
| Configs publiques | GET | /api/v1/configs | Vérification de disponibilité + extraction de version |
| Normal protégé | GET | /api/v1/{tenant}/flows | Base de référence de l'application d'authentification |
| Contournement Flows | GET | /api/v1/{tenant}/flows/{namespace}/configs | Contournement de liste des flows |
| Contournement Exécutions | GET | /api/v1/{tenant}/executions/{namespace}/configs | Contournement d'exécutions |
| Contournement KV Store | GET | /api/v1/{tenant}/namespaces/{namespace}/kv/configs | Contournement de lecture KV |
| Contournement Tableaux de bord | GET | /api/v1/{tenant}/dashboards/configs | Contournement de tableaux de bord |
| Contournement Logs | GET | /api/v1/{tenant}/logs/{namespace}/configs | Contournement d'accès aux logs |
| Contournement Modèles | GET | /api/v1/{tenant}/templates/{namespace}/configs | Contournement de lecture des modèles |
--aggressive)| Sonde | Méthode | Chemin | Description |
|---|---|---|---|
| PUT Contournement Flows | PUT | identique au Contournement Flows | Crée un workflow minimal debug.Return |
| PUT Contournement KV | PUT | identique au Contournement KV | Crée une entrée KV {"scanned": true} |
--destructive)| Sonde | Méthode | Chemin | Description |
|---|---|---|---|
| DELETE Contournement Flows | DELETE | identique au Contournement Flows | Supprime une ressource nommée "configs" |
| DELETE Contournement Tableaux de bord | DELETE | identique au Contournement Tableaux de bord | Supprime un tableau de bord nommé "configs" |
| DELETE Contournement Logs | DELETE | identique au Contournement Logs | Détruit les logs d'audit |
--rce)S'exécute uniquement lorsque le contournement d'authentification est confirmé. La chaîne complète issue de l'avis :
| Étape | Méthode | Chemin | Description |
|---|---|---|---|
| 1. Créer un workflow RCE | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Déploie un workflow avec io.kestra.plugin.scripts.shell.Commands (echo <marker>, id, hostname). Recourt à io.kestra.plugin.scripts.python.Script en cas d'échec. |
| 2. Déclencher l'exécution | POST | /api/v1/{tenant}/executions/{namespace}/configs | Démarre le workflow via le chemin de contournement |
| 3. Interroger les logs | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Interroge jusqu'à --poll-retries fois (par défaut 10) toutes les --poll-interval secondes (par défaut 3) à la recherche du marqueur RCE unique |
| 4. Nettoyage | DELETE | identique à l'étape 1 | Supprime le workflow déployé |
--ssrf)S'exécute uniquement lorsque le contournement d'authentification est confirmé :
| Étape | Méthode | Chemin | Description |
|---|---|---|---|
| 1. Créer un workflow SSRF | PUT | /api/v1/{tenant}/flows/{namespace}/configs | Déploie une tâche debug.Return avec des appels http() Pebble vers AWS (169.254.169.254/latest/meta-data/ami-id), GCP (metadata.google.internal), Azure (169.254.169.254/metadata/instance) et interne (127.0.0.1:8080/api/v1/configs) |
| 2. Déclencher l'exécution | POST | identique à l'étape 2 RCE | Déclenche le workflow |
| 3. Interroger les logs | GET | /api/v1/{tenant}/logs/search?executionId=<id> | Vérifie la présence d'indicateurs de métadonnées cloud (ami-, i-, 169.254.169.254, metadata.google.internal, etc.) |
| 4. Nettoyage | DELETE | identique à l'étape 1 | Supprime le workflow déployé |
positionnel :
target URL cible unique (ex. http://localhost:8080)
options :
-f, --file Fichier contenant les cibles (une par ligne)
-t, --timeout Délai d'attente de la requête en secondes (par défaut : 10)
--verify-ssl Vérifier les certificats TLS
-j, --json Sortie JSON sur stdout
-o, --output Écrire le rapport JSON dans un fichier
--tenant Nom du locataire (par défaut : "main")
--namespace Espace de noms pour les chemins de contournement (par défaut : "tutorial")
-w, --workers Nombre de threads pour les scans en masse (par défaut : 10)
-a, --aggressive Envoyer des requêtes PUT pour confirmer le contournement en écriture
-P, --auto-ports Ports pour l'expansion automatique (par défaut : 8080 8081 8088 8091 80 443)
sondes avancées :
-r, --rce Activer la chaîne de vérification RCE (workflow shell + python,
déclenchement d'exécution, récupération des logs, nettoyage automatique)
-s, --ssrf Activer la détection SSRF (http() Pebble vers les points de terminaison
de métadonnées cloud, collecte de preuves basée sur les logs)
-d, --destructive Activer les sondes DELETE sur les flows, tableaux de bord et logs
(SUPPRIMERA des ressources sur les instances vulnérables)
--poll-interval Secondes entre les interrogations des logs pour les chaînes RCE/SSRF (par défaut : 3)
--poll-retries Nombre maximal de tentatives d'interrogation des logs pour les chaînes RCE/SSRF (par défaut : 10)
Détail complet par sonde avec enrichissement (version, état RCE/SSRF/DELETE) et verdict :