Le pot d'or SSL-VPN FortiGate. CVE-2024-21762 et CVE-2023-27997. 79 clients d'exploitation fonctionnels. 53 références matérielles. 55 builds FortiOS.
Archive de recherche. Récupéré tel quel. Je n'ai pas écrit ces fichiers.
Publié : 1er septembre 2026
Ce dépôt contient l'orchestrateur, les charges utiles de deuxième étape et les écouteurs opérateur qui se superposent à un catalogue d'exploits FortiGate SSL-VPN par SKU. L'histoire complète, les comptages et les notes de chasse se trouvent dans la série The SSL-VPN pot of gold sur Abraxas Labs.
N'exécutez pas ce matériel contre un hôte sans autorisation écrite explicite de la partie hébergeant ce dépôt et du propriétaire des systèmes cibles. Les CVE associées étaient publiques et corrigées avant cette publication. Cette arborescence est destinée à la recherche, à la détection et à l'analyse historique.
J'ai trouvé un kit privé FortiGate SSL-VPN dans la nature. Le premier dépôt était un répertoire de clients fonctionnels : des noms comme exp/exp_60E-v6.4.7.py et exp/exp_1000D-v7.4.0.py. Chaque fichier est un client de corruption mémoire par SKU, par FortiOS. Deux n-days publics, réestampillés sur du matériel et des firmwares jusqu'à ce que le dossier ressemble à un catalogue de pièces détachées.
L'or est la matrice d'offsets, pas un nouveau bug. Cet argument est développé dans Phase 0 de la série. Phase 1 couvre les deux primitives en tant que comportement. Phase 2 est la carte SKU / train / CPU consultable. Phase 3 est la chasse.
Ce dépôt est le reste du même kit, pas une deuxième famille d'exploits.
exp/ sont les clients par image déjà décrits dans la série.shellcode/ sont le lanceur, la récupération d'implant et les écouteurs de vol de configuration que ces clients étaient conçus pour appeler.exp_*.py ne contenaient jamais l'implant. Ils savaient seulement (1) récupérer des octets bruts depuis un « serveur de shellcode » ou (2) faire GET /s.js et l'eval. Ces pièces manquantes sont ici.Les primitives :
| Famille | CVE | Avis Fortinet | Couleur publique |
|---|---|---|---|
| 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 |
Les deux figurent dans le catalogue des vulnérabilités exploitées connues de la CISA. poc.py n'implémente pas l'une ou l'autre de ces CVE. Il sélectionne et encapsule les deux familles déjà classifiées (écriture par blocs 21762 ; débordement de tas enc= 27997).
.
├── poc.py # lanceur pocsuite3 / empreinte / gestionnaire de processus
├── s.js # deuxième étape Node (voleur de configuration)
├── send_cmd.py # gestionnaire de rappel pour le chemin stager
├── init.sh # installation des paquets du poste opérateur
├── requirements.txt # pwntools
├── exp/
│ └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
├── shellcode_server.py # pompe de blobs préfixés par longueur
├── shellcode_arm # ~2,0 Mo de deuxième étape brute
└── shellcode_amd64 # ~2,7 Mo de deuxième étape brute
exp/index.html et shellcode/index.html sont des listes de répertoires Python http.server ordinaires. Elles montrent seulement que cette arborescence a été hébergée comme racine web à un moment donné.
Cette copie de exp/ est le catalogue antérieur plus quatre clients supplémentaires : 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 orchestrateur (pocsuite3)
│
├─ portail d'empreinte ────── VERSION_LIBS (hash → SKU + FortiOS)
├─ sélection du fichier ───── exp/exp_<SKU>-v<ver>.py
│
├─ si le client est de type "stager" (Famille A ARM / certains amd64)
│ démarrer shellcode/shellcode_server.py
│ lit shellcode/shellcode_arm ou shellcode_amd64
│ démarrer send_cmd.py (attente du rappel)
│ démarrer le récepteur de configuration sur :9999
│ exécuter le exp_*.py choisi
│
└─ si le client est de type "Node /s.js" (plupart Famille B + beaucoup Famille A)
servir s.js via HTTP
démarrer le récepteur de configuration sur :9999
exécuter le exp_*.py choisi
→ pare-feu GET /s.js → eval → exfiltration
Pipeline en une ligne : identifier → sélectionner le fichier d'offsets → corrompre sslvpnd → récupérer l'implant → exfiltrer /data/config/*.gz → archiver côté opérateur.
Cette dernière étape est le point crucial. Une réussite est une exécution de code non authentifiée dans sslvpnd sur le pare-feu lui-même — terminateur TLS, politique de routage, sessions VPN, souvent des liaisons LDAP/RADIUS. FortiOS n'offre pas de /bin/sh utile. La recherche publique et ce kit passent tous deux par un assistant de commande interne et/ou /bin/node, que FortiOS fournit effectivement. Considérez une réussite confirmée comme une compromission de la périphérie réseau, pas un démon planté. Voir Ce que signifie une réussite.
poc.py — lanceurInterface opérateur (pocsuite3 POCBase). Il n'implémente pas CVE-2024-21762 ni CVE-2023-27997.