El tesoro de FortiGate SSL-VPN. CVE-2024-21762 y CVE-2023-27997. 79 clientes de exploit funcionales. 53 SKUs de hardware. 55 compilaciones de FortiOS.
Archivo de investigación. Recuperado tal como se encontró. Yo no escribí estos archivos.
Publicado: 1 de septiembre de 2026
Este repositorio es el orquestador, los payloads de segunda etapa y los listeners de operador que se sitúan sobre un catálogo de exploits de FortiGate SSL-VPN por SKU. La historia completa, los recuentos y las notas de caza viven en la serie The SSL-VPN pot of gold en Abraxas Labs.
No ejecute este material contra ningún host a menos que tenga permiso explícito por escrito tanto de la parte que aloja este repositorio como del propietario de los sistemas objetivo. Los CVE relacionados eran públicos y parcheados antes de esta publicación. Este árbol es para investigación, detección y análisis histórico.
Encontré un kit privado de FortiGate SSL-VPN en la naturaleza. La primera entrega era un directorio de clientes funcionales: nombres como exp/exp_60E-v6.4.7.py y exp/exp_1000D-v7.4.0.py. Cada archivo es un cliente de corrupción de memoria por SKU, por FortiOS. Dos n-days públicos, reestampados a través de hardware y firmware hasta que la carpeta parecía un catálogo de piezas.
El oro está en la matriz de offsets, no en un bug nuevo. Ese argumento está en Fase 0 de la serie. Fase 1 cubre las dos primitivas como comportamiento. Fase 2 es el mapa de SKU / train / CPU buscable. Fase 3 es la caza.
Este repositorio es el resto del mismo kit, no una segunda familia de exploits.
exp/ son los clientes por imagen ya descritos en la serie.shellcode/ son los lanzadores, la descarga de implantes y los listeners de robo de configuración para los que esos clientes fueron escritos.exp_*.py nunca contuvieron el implante. Solo sabían (1) extraer bytes crudos de un "servidor de shellcode" o (2) hacer GET /s.js y eval. Esas piezas faltantes están aquí.Las primitivas:
| Familia | CVE | Aviso de Fortinet | Color público |
|---|---|---|---|
| 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án en el catálogo de vulnerabilidades explotadas conocidas de CISA. poc.py no implementa ninguno de los dos CVE. Selecciona y envuelve las dos familias ya clasificadas (escritura fragmentada 21762; desbordamiento de heap enc= 27997).
.
├── poc.py # lanzador de pocsuite3 / fingerprint / gestor de procesos
├── s.js # segunda etapa de Node (ladrón de configuración)
├── send_cmd.py # manejador de callback para la ruta del stager
├── init.sh # instalación de paquetes del puesto de trabajo del operador
├── requirements.txt # pwntools
├── exp/
│ └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
├── shellcode_server.py # bomba de blobs con prefijo de longitud
├── shellcode_arm # ~2.0 MB de segunda etapa cruda
└── shellcode_amd64 # ~2.7 MB de segunda etapa cruda
exp/index.html y shellcode/index.html son listados de directorio ordinarios de http.server de Python. Solo muestran que este árbol fue alojado como raíz web en algún momento.
Esta copia de exp/ es el catálogo anterior más cuatro clientes extra: 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 orquestador (pocsuite3)
│
├─ portal de fingerprint ──── VERSION_LIBS (hash → SKU + FortiOS)
├─ elegir archivo ─────────── exp/exp_<SKU>-v<ver>.py
│
├─ si el cliente es de tipo "stager" (Familia A ARM / algunos amd64)
│ iniciar shellcode/shellcode_server.py
│ lee shellcode/shellcode_arm o shellcode_amd64
│ iniciar send_cmd.py (esperar callback)
│ iniciar receptor de configuración en :9999
│ ejecutar el exp_*.py elegido
│
└─ si el cliente es de tipo "Node /s.js" (la mayoría de Familia B + muchas Familia A)
servir s.js sobre HTTP
iniciar receptor de configuración en :9999
ejecutar el exp_*.py elegido
→ firewall GET /s.js → eval → exfiltración
Pipeline en una línea: identificar → elegir archivo de offsets → corromper sslvpnd → extraer implante → exfiltrar /data/config/*.gz → archivar en el lado del operador.
Ese último paso es el punto. Un acierto es ejecución de código no autenticada en sslvpnd en el propio firewall — terminador TLS, política de enrutamiento, sesiones VPN, a menudo enlaces LDAP/RADIUS. FortiOS no ofrece un /bin/sh útil. La investigación pública y este kit pasan ambos por un ayudante de comandos interno y/o /bin/node, que FortiOS realmente incluye. Trate un acierto confirmado como compromiso del borde de la red, no un demonio bloqueado. Ver Qué significa un acierto.
poc.py — lanzadorInterfaz de operador (pocsuite3 POCBase). No implementa CVE-2024-21762 ni CVE-2023-27997.