
Python-Exploit für CVE-2018-15133, der eine Remote-Codeausführung auf angreifbaren Laravel-Anwendungen durch unsichere Deserialisierung verschlüsselter Sitzungen unter Verwendung eines bekannten APP_KEY ermöglicht.
Dieses Python-Skript implementiert einen Exploit für die Remote-Codeausführung (RCE) bei anfälligen Laravel-Anwendungen durch unsichere Deserialisierung, basierend auf der Schwachstelle CVE-2018-15133.
Der Exploit nutzt eine Schwachstelle in Laravel (Versionen 5.5.40 und älter sowie 5.6.0 bis 5.6.29) aus, bei der verschlüsselte Sitzungen automatisch ohne ordnungsgemäße Validierung deserialisiert werden. Mit Zugriff auf den APP_KEY von Laravel kann ein Angreifer bösartige Payloads verschlüsseln, die auf dem Server deserialisiert und ausgeführt werden.
Laravel verwendet einen symmetrischen Verschlüsselungsmechanismus für Sitzungen mit drei Komponenten:
IV (Initialization Vector): Zufälliger Initialisierungsvektor, der für jede Sitzung generiert wird
Value: Mit AES-128-CBC oder AES-256-CBC verschlüsselter Wert
MAC: Nachrichtenauthentifizierungscode (HMAC-SHA256), berechnet über IV + Wert + APP_KEY
Empfängt drei Eingabeparameter: den Laravel APP_KEY im Base64-Format, den auszuführenden Befehl und die Ziel-Domain
Ruft das Tool PHPGGC mit der Gadget-Chain Laravel/RCE5 auf, um eine Kette bösartiger PHP-Objekte zu generieren
Erstellt den Betriebssystembefehl, der auf dem Opfer-Server ausgeführt wird (z.B. system('whoami');)
Generiert den serialisierten PHP-Payload, der die verketteten Gadgets enthält
Dekodiert den Payload von Base64 in das Binärformat
Verarbeitet den APP_KEY, indem das Präfix "base64:" entfernt wird, falls vorhanden
Fügt das erforderliche Padding hinzu, damit der Schlüssel gültiges Base64 ist
Dekodiert den Schlüssel von Base64 in Bytes
Generiert einen zufälligen Initialisierungsvektor (IV) von 16 Bytes
Verschlüsselt den Payload mit AES im CBC-Modus mit dem Schlüssel und dem IV
Wendet PKCS7-Padding auf den Payload vor der Verschlüsselung an
Kodiert den IV in Base64
Kodiert den Chiffretext (verschlüsselten Payload) in Base64
Verkettet IV und Value in Base64 als Nachricht für den HMAC
Berechnet den MAC mit HMAC-SHA256 über die verkettete Nachricht mit dem Schlüssel als Geheimnis
Erstellt ein JSON-Objekt mit drei Feldern: iv, value und mac
Kodiert das gesamte JSON in Base64
Erstellt eine HTTP-Anfrage mit curl und dem Payload im Cookie laravel_session
Sendet die Anfrage an die Ziel-Domain
Der Laravel-Server empfängt das Cookie und dekodiert das Base64
Laravel überprüft die Integrität des MAC gegenüber dem empfangenen IV und Value
Laravel entschlüsselt den Inhalt mit AES-CBC und seinem APP_KEY
Laravel deserialisiert automatisch den entschlüsselten Inhalt
PHP ruft die magischen Funktionen __destruct() oder __wakeup() der deserialisierten Objekte auf
Die Gadget-Chain wird ausgelöst, die in call_user_func() oder eval() gipfelt
Der Betriebssystembefehl wird auf dem Server ausgeführt
Der Exploit verwendet Gadget-Chains, die Aufrufe von magischen PHP-Funktionen verketten:
Während der Deserialisierung ruft PHP automatisch __destruct() oder __wakeup() auf, was die Kette startet, die in eval() gipfelt und beliebigen Code ausführt.
Voraussetzungen Damit der Exploit funktioniert, benötigt der Angreifer:
Den Laravel APP_KEY (erlangt durch Offenlegung von Umgebungsvariablen, exponierte S3-Buckets, Quellcode usw.)
Anfällige Laravel-Version mit standardmäßig aktivierter Deserialisierung
PHPGGC installiert im Verzeichnis ./phpggc/ https://github.com/ambionics/phpggc
Anwendungsbeispiel
python exploit.py "base64:dGhpc2lzYXNlY3JldGtleQ==" "whoami" "http://target.htb"
Dieser Befehl erzeugt einen serialisierten Payload, der whoami ausführt, wenn Laravel die Sitzung deserialisiert.