O pote de ouro do FortiGate SSL-VPN. CVE-2024-21762 e CVE-2023-27997. 79 clientes de exploit funcionais. 53 SKUs de hardware. 55 builds do FortiOS.
Arquivo de pesquisa. Recuperado como encontrado. Eu não escrevi estes arquivos.
Lançado: 1 de setembro de 2026
Este repositório é o orquestrador, payloads de segundo estágio e listeners do operador que ficam por cima de um catálogo de exploits FortiGate SSL-VPN por SKU. A história completa, contagens e notas de caça vivem na série The SSL-VPN pot of gold no Abraxas Labs.
Não execute este material contra nenhum host a menos que você tenha permissão escrita explícita tanto da parte que hospeda este repositório quanto do proprietário dos sistemas alvo. Os CVEs relacionados eram públicos e corrigidos antes deste lançamento. Esta árvore é para pesquisa, detecção e análise histórica.
Encontrei um kit privado FortiGate SSL-VPN na natureza. O primeiro lote era um diretório de clientes funcionais: nomes como exp/exp_60E-v6.4.7.py e exp/exp_1000D-v7.4.0.py. Cada arquivo é um cliente de corrupção de memória por SKU, por FortiOS. Dois n-days públicos, reestampados através de hardware e firmware até a pasta parecer um catálogo de peças.
O ouro é a matriz de offsets, não um novo bug. Esse argumento está na Fase 0 da série. A Fase 1 cobre as duas primitivas como comportamento. A Fase 2 é o mapa pesquisável de SKU / train / CPU. A Fase 3 é a caça.
Este repositório é o resto do mesmo kit, não uma segunda família de exploits.
exp/ são os clientes por imagem já descritos na série.shellcode/ são o launcher, busca de implante e listeners de roubo de configuração que esses clientes foram escritos para chamar.exp_*.py nunca continham o implante. Eles apenas sabiam (1) puxar bytes brutos de um "servidor de shellcode" ou (2) fazer GET /s.js e eval. Essas peças que faltavam estão aqui.As primitivas:
| Família | CVE | Aviso da Fortinet | Cor pública |
|---|---|---|---|
| A | CVE-2024-21762 | FG-IR-24-015 | Assetnote — Two Bytes is Plenty |
| B | CVE-2023-27997 | FG-IR-23-097 | Lexfo — XORtigate, Bishop Fox |
Ambos estão no catálogo de Vulnerabilidades Exploradas Conhecidas da CISA. poc.py não implementa nenhum dos CVEs. Ele seleciona e envolve as duas famílias já classificadas (escrita em blocos 21762; overflow de heap enc= 27997).
.
├── poc.py # launcher pocsuite3 / fingerprint / gerenciador de processos
├── s.js # segundo estágio Node (roubador de configuração)
├── send_cmd.py # manipulador de callback para o caminho do stager
├── init.sh # instalação de pacotes da estação de trabalho do operador
├── requirements.txt # pwntools
├── exp/
│ └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
├── shellcode_server.py # bomba de blob com prefixo de comprimento
├── shellcode_arm # ~2,0 MB de segundo estágio bruto
└── shellcode_amd64 # ~2,7 MB de segundo estágio bruto
exp/index.html e shellcode/index.html são listagens de diretório comuns do http.server do Python. Elas apenas mostram que esta árvore foi hospedada como raiz web em algum momento.
Esta cópia de exp/ é o catálogo anterior mais quatro clientes extras: exp_30E-v6.2.4.py, exp_30E-v6.2.12.py, exp_30E-v6.2.14.py, exp_40F-v7.0.5.py.
poc.py orquestrador (pocsuite3)
│
├─ fingerprint do portal ──── VERSION_LIBS (hash → SKU + FortiOS)
├─ escolher arquivo ───────── exp/exp_<SKU>-v<ver>.py
│
├─ se o cliente for do tipo "stager" (Família A ARM / alguns amd64)
│ iniciar shellcode/shellcode_server.py
│ lê shellcode/shellcode_arm ou shellcode_amd64
│ iniciar send_cmd.py (aguardar callback)
│ iniciar receptor de configuração em :9999
│ executar exp_*.py escolhido
│
└─ se o cliente for do tipo "Node /s.js" (maioria da Família B + muitas Família A)
servir s.js via HTTP
iniciar receptor de configuração em :9999
executar exp_*.py escolhido
→ firewall GET /s.js → eval → exfiltração
Pipeline em uma linha: identificar → escolher arquivo de offset → corromper sslvpnd → puxar implante → exfiltrar /data/config/*.gz → arquivar no lado do operador.
Esse último passo é o ponto. Um acerto é execução de código não autenticada em sslvpnd no próprio firewall — terminador TLS, política de roteamento, sessões VPN, frequentemente bindings LDAP/RADIUS. O FortiOS não oferece um /bin/sh útil. Pesquisa pública e este kit ambos passam por um auxiliar de comando interno e/ou /bin/node, que o FortiOS realmente inclui. Trate um acerto confirmado como comprometimento da borda da rede, não um daemon travado. Veja O que um acerto significa.
poc.py — launcherFront end do operador (pocsuite3 POCBase). Não implementa CVE-2024-21762 ou CVE-2023-27997.