
Python-Skript zur Erkennung von CVE-2024-23113, einer Format-String-Sicherheitslücke im FortiGate FGFM-Dienst über TCP/541, unter Verwendung einer SSL-Verbindung und eines manipulierten Payloads zur Auslösung einer Speicherkorruption.
Das Skript wurde entwickelt, um CVE-2024-23113 zu erkennen, eine Format-String-Sicherheitslücke im FortiGate FGFM-Dienst (FortiGate-to-FortiManager-Protokoll), der auf TCP-Port 541 läuft. Die Schwachstelle tritt auf, weil ein Angreifer einen Format-String kontrollieren kann, was zu Remote Code Execution (RCE) oder anderen unbeabsichtigten Verhaltensweisen führen könnte. Der FGFM-Dienst ermöglicht die Kommunikation zwischen FortiGate-Geräten und FortiManager zur Konfigurationsverwaltung, und eine nicht gepatchte Version weist eine unsachgemäße Verarbeitung von Eingaben auf, was sie anfällig für einen Format-String-Exploit macht. So funktioniert das Skript
Netzwerkverbindungsaufbau:
Das Skript stellt zunächst eine SSL/TLS-Verbindung zum Ziel auf Port 541 her.
Es verwendet das ssl.SSLContext-Objekt mit deaktivierter Zertifikatsüberprüfung, um die Verbindung herzustellen, da das Gerät selbstsignierte Zertifikate haben könnte.
Payload-Konstruktion:
Sobald die Verbindung hergestellt ist, erstellt das Skript eine schädliche Nutzlast mithilfe eines Format-String-Exploits (authip=%n). Die %n-Direktive weist das System an, die Anzahl der bisher ausgegebenen Bytes in eine Variable zu schreiben, was potenziell zu Speicherkorruption führen kann.
Die erstellte Nutzlast wird über die bestehende Verbindung an das Ziel gesendet.
Erkennungslogik:
Das Skript überprüft dann das Verhalten des Ziels als Reaktion auf die Nutzlast.
Wenn die Verbindung abrupt beendet wird und ein SSL-Alarm ausgelöst wird, deutet dies darauf hin, dass das Ziel anfällig ist, da es die Schutzmechanismen für Format-String-Sicherheitslücken ausgelöst hat (z. B. _FORTIFY_SOURCE in glibc).
Wenn die Verbindung offen bleibt, ist das Ziel wahrscheinlich gepatcht.
Verwendungshinweise
Skript ausführen:
Führen Sie das Skript mit Python 3 aus, indem Sie Folgendes eingeben:
sh
python check_vulnerability.py
Hostname/IP eingeben:
Sie werden aufgefordert, einen Hostnamen oder eine IP-Adresse einzugeben, um zu überprüfen, ob diese anfällig ist.
Wenn Sie aufhören möchten, geben Sie exit ein.
Ausgabe:
Wenn das Ziel anfällig ist, gibt das Skript Folgendes aus:
[!] Warning: is vulnerable!
Wenn das Ziel gepatcht ist, gibt es Folgendes aus:
[+] <hostname> appears to be patched.
Anforderungen
Python 3, installiert auf dem Rechner, der das Skript ausführt.
Netzwerkzugriff auf das Zielgerät, wobei Port 541 geöffnet sein muss.
Der FGFM-Dienst muss auf dem Zielgerät ausgeführt werden.