Der FortiGate SSL-VPN-Topf voller Gold. CVE-2024-21762 und CVE-2023-27997. 79 funktionierende Exploit-Clients. 53 Hardware-SKUs. 55 FortiOS-Builds.
Forschungsarchiv. Wie vorgefunden geborgen. Ich habe diese Dateien nicht geschrieben.
Veröffentlicht: 1. September 2026
Dieses Repository ist der Orchestrator, die Second-Stage-Payloads und die Operator-Listener, die auf einem pro-SKU-FortiGate-SSL-VPN-Exploit-Katalog aufsetzen. Die ausführliche Geschichte, Zahlen und Jagd-Notizen finden sich in der Serie The SSL-VPN pot of gold auf Abraxas Labs.
Führen Sie dieses Material nicht gegen einen Host aus, es sei denn, Sie haben die ausdrückliche schriftliche Genehmigung sowohl der Partei, die dieses Repository hostet, als auch des Eigentümers der Zielsysteme. Die zugehörigen CVEs waren öffentlich und gepatcht, bevor diese Veröffentlichung erfolgte. Dieser Baum dient der Forschung, Erkennung und historischen Analyse.
Ich habe ein privates FortiGate-SSL-VPN-Kit in freier Wildbahn gefunden. Der erste Abwurf war ein Verzeichnis mit funktionierenden Clients: Namen wie exp/exp_60E-v6.4.7.py und exp/exp_1000D-v7.4.0.py. Jede Datei ist ein pro-SKU-, pro-FortiOS-Speicherkorruptions-Client. Zwei öffentliche N-Days, über Hardware und Firmware neu gestempelt, bis der Ordner wie ein Ersatzteilkatalog aussah.
Das Gold ist die Offset-Matrix, nicht ein neuer Bug. Dieses Argument wird in Phase 0 der Serie geführt. Phase 1 behandelt die beiden Primitiven als Verhalten. Phase 2 ist die durchsuchbare SKU-/Train-/CPU-Karte. Phase 3 ist die Jagd.
Dieses Repository ist der Rest desselben Kits, keine zweite Exploit-Familie.
exp/ sind die bereits in der Serie beschriebenen pro-Image-Clients.shellcode/ sind die Launcher-, Implant-Abruf- und Config-Diebstahl-Listener, die diese Clients aufrufen sollten.exp_*.py-Dateien enthielten nie das Implant. Sie wussten nur, (1) rohe Bytes von einem „Shellcode-Server“ zu ziehen oder (2) GET /s.js auszuführen und zu evalen. Diese fehlenden Teile sind hier.Die Primitiven:
| Familie | CVE | Fortinet-Advisory | Öffentliche Farbe |
|---|---|---|---|
| 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 |
Beide stehen im Katalog bekannter ausgenutzter Schwachstellen von CISA. poc.py implementiert keinen der beiden CVEs. Es wählt aus und umhüllt die beiden bereits klassifizierten Familien (Chunked-Write 21762; enc=-Heap-Overflow 27997).
.
├── poc.py # pocsuite3-Launcher / Fingerprint / Prozessmanager
├── s.js # Node-Second-Stage (Config-Dieb)
├── send_cmd.py # Callback-Handler für den Stager-Pfad
├── init.sh # Paketinstallation für die Operator-Workstation
├── requirements.txt # pwntools
├── exp/
│ └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
├── shellcode_server.py # Längenpräfix-Blob-Pumpe
├── shellcode_arm # ~2,0 MB rohe Second Stage
└── shellcode_amd64 # ~2,7 MB rohe Second Stage
exp/index.html und shellcode/index.html sind gewöhnliche Python-http.server-Verzeichnislisten. Sie zeigen nur, dass dieser Baum zu einem bestimmten Zeitpunkt als Web-Root gehostet wurde.
Diese Kopie von exp/ ist der frühere Katalog plus vier zusätzliche Clients: 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 Orchestrator (pocsuite3)
│
├─ Fingerprint-Portal ─────── VERSION_LIBS (Hash → SKU + FortiOS)
├─ Datei auswählen ────────── exp/exp_<SKU>-v<ver>.py
│
├─ wenn Client vom Typ "Stager" (Familie A ARM / einige amd64)
│ starte shellcode/shellcode_server.py
│ liest shellcode/shellcode_arm oder shellcode_amd64
│ starte send_cmd.py (warte auf Callback)
│ starte Config-Empfänger auf :9999
│ führe gewähltes exp_*.py aus
│
└─ wenn Client vom Typ "Node /s.js" (die meisten Familie B + viele Familie A)
serviere s.js über HTTP
starte Config-Empfänger auf :9999
führe gewähltes exp_*.py aus
→ Firewall GET /s.js → eval → Exfiltration
Pipeline in einer Zeile: identifizieren → Offset-Datei auswählen → sslvpnd korrumpieren → Implant ziehen → /data/config/*.gz exfiltrieren → auf der Operator-Seite archivieren.
Dieser letzte Schritt ist der Punkt. Ein Treffer ist nicht authentifizierte Codeausführung in sslvpnd auf der Firewall selbst — TLS-Terminator, Routing-Policy, VPN-Sitzungen, oft LDAP/RADIUS-Bindungen. FortiOS bietet keine brauchbare /bin/sh. Öffentliche Forschung und dieses Kit gehen beide über einen internen Befehlshelfer und/oder /bin/node, das FortiOS tatsächlich mitliefert. Behandeln Sie einen bestätigten Treffer als Kompromittierung der Netzwerkgrenze, nicht als abgestürzten Daemon. Siehe Was ein Treffer bedeutet.
poc.py — LauncherOperator-Frontend (pocsuite3 POCBase). Es implementiert CVE-2024-21762 oder CVE-2023-27997 nicht.