Il vaso d'oro SSL-VPN di FortiGate. CVE-2024-21762 e CVE-2023-27997. 79 client exploit funzionanti. 53 SKU hardware. 55 build FortiOS.
Archivio di ricerca. Recuperato così com'era. Non ho scritto io questi file.
Rilasciato: 1 settembre 2026
Questo repository è l'orchestratore, i payload di secondo stadio e i listener per l'operatore che si trovano sopra un catalogo di exploit FortiGate SSL-VPN per singolo SKU. La storia completa, i conteggi e le note di caccia sono nella serie The SSL-VPN pot of gold su Abraxas Labs.
Non eseguire questo materiale contro alcun host senza esplicita autorizzazione scritta sia dalla parte che ospita questo repository sia dal proprietario dei sistemi target. Le CVE correlate erano pubbliche e corrette prima di questo rilascio. Questo albero è per ricerca, rilevamento e analisi storica.
Ho trovato in natura un kit privato FortiGate SSL-VPN. Il primo rilascio era una directory di client funzionanti: nomi come exp/exp_60E-v6.4.7.py e exp/exp_1000D-v7.4.0.py. Ogni file è un client di corruzione della memoria per-SKU, per-FortiOS. Due n-day pubbliche, ri-timbrate su hardware e firmware finché la cartella non sembrava un catalogo di ricambi.
L'oro è la matrice di offset, non un nuovo bug. Questa tesi è in Fase 0 della serie. La Fase 1 copre le due primitive come comportamento. La Fase 2 è la mappa SKU / train / CPU ricercabile. La Fase 3 è la caccia.
Questo repository è il resto dello stesso kit, non una seconda famiglia di exploit.
exp/ sono i client per-immagine già descritti nella serie.shellcode/ sono il launcher, il recupero dell'impianto e i listener per il furto di configurazione che quei client erano stati scritti per chiamare.exp_*.py non hanno mai contenuto l'impianto. Sapevano solo (1) recuperare byte grezzi da un "server di shellcode" o (2) fare GET /s.js e eval. Quei pezzi mancanti sono qui.Le primitive:
| Famiglia | CVE | Advisory Fortinet | Colore pubblico |
|---|---|---|---|
| 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 |
Entrambe sono nel catalogo delle vulnerabilità note sfruttate di CISA. poc.py non implementa nessuna delle due CVE. Seleziona e avvolge le due famiglie già classificate (scrittura a blocchi 21762; overflow dell'heap enc= 27997).
.
├── poc.py # launcher pocsuite3 / fingerprint / gestore processi
├── s.js # secondo stadio Node (ladro di configurazione)
├── send_cmd.py # gestore callback per il percorso stager
├── init.sh # installazione pacchetti workstation operatore
├── requirements.txt # pwntools
├── exp/
│ └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
├── shellcode_server.py # pompa blob con prefisso di lunghezza
├── shellcode_arm # ~2.0 MB secondo stadio grezzo
└── shellcode_amd64 # ~2.7 MB secondo stadio grezzo
exp/index.html e shellcode/index.html sono normali elenchi di directory di http.server Python. Mostrano solo che questo albero è stato ospitato come root web a un certo punto.
Questa copia di exp/ è il catalogo precedente più quattro client 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 orchestratore (pocsuite3)
│
├─ fingerprint portal ─────── VERSION_LIBS (hash → SKU + FortiOS)
├─ scegli file ────────────── exp/exp_<SKU>-v<ver>.py
│
├─ se il client è del tipo "stager" (Famiglia A ARM / alcuni amd64)
│ avvia shellcode/shellcode_server.py
│ legge shellcode/shellcode_arm o shellcode_amd64
│ avvia send_cmd.py (attende callback)
│ avvia ricevitore configurazione su :9999
│ esegui exp_*.py scelto
│
└─ se il client è del tipo "Node /s.js" (maggior parte Famiglia B + molte Famiglia A)
servi s.js su HTTP
avvia ricevitore configurazione su :9999
esegui exp_*.py scelto
→ firewall GET /s.js → eval → esfiltrazione
Pipeline in una riga: identifica → scegli file offset → corrompi sslvpnd → recupera impianto → esfiltra /data/config/*.gz → archivia sul lato operatore.
Quell'ultimo passaggio è il punto. Un successo è esecuzione di codice non autenticata in sslvpnd sul firewall stesso — terminatore TLS, policy di routing, sessioni VPN, spesso binding LDAP/RADIUS. FortiOS non offre una /bin/sh utile. La ricerca pubblica e questo kit passano entrambi attraverso un helper di comando interno e/o /bin/node, che FortiOS include effettivamente. Tratta un successo confermato come compromissione del perimetro di rete, non un demone crashato. Vedi Cosa significa un successo.
poc.py — launcherFront-end per l'operatore (pocsuite3 POCBase). Non implementa CVE-2024-21762 o CVE-2023-27997.