
CLI-Neuschreibung des Drupalgeddon2 (CVE-2018-7600) PoC — für autorisiertes Testen/Ausbildung
Eine Befehlszeilen-Neuimplementierung des Drupalgeddon2 (CVE-2018-7600) Proof-of-Concept, erstellt als Übungsaufgabe während der Bearbeitung des Hack The Box Academy Attacking Common Applications Moduls.
[!WARNING] Nur für autorisierte Sicherheitstests und zu Bildungszwecken. Die Ausführung gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben, ist in den meisten Rechtsordnungen illegal. Siehe Legal & responsible use.
[!NOTE] Implementierung mit KI-Unterstützung geschrieben. Siehe A note on authorship.
Drupal ist eine der „häufigen Anwendungen“, die im Modul Attacking Common Applications der HTB Academy behandelt werden, und CVE-2018-7600 („Drupalgeddon2“) ist das kanonische Beispiel für eine nicht authentifizierte RCE. Anstatt ein Einmal-Skript zu kopieren und weiterzumachen, wollte ich die Form-API-Injektion, die den Fehler verursacht, tatsächlich verstehen – und habe daher das öffentliche PoC als Lernübung von Grund auf neu aufgebaut.
Das viel zitierte Original, a2u/CVE-2018-7600 von Vitalii Rudnykh, ist großartig, um den Fehler zu demonstrieren, erwartet aber, dass man die Nutzlast vor jeder Ausführung bearbeitet. In einem Labor-/CTF-Workflow – bei dem man es gegen verschiedene Ziele erneut ausführt und einen wiederholbaren Zugang haben möchte – wird das mühsam. Diese Version macht daraus stattdessen ein ordentliches CLI-Tool:
cmd=-Tür hinterlassen.Es ist bewusst auf eine bekannte, längst gepatchte Schwachstelle (2018 offengelegt) beschränkt. Das Ziel war, die Technik zu verstehen und eine saubere, dokumentierte Referenzimplementierung zu erstellen – nicht neue offensive Fähigkeiten.
Der Code in diesem Repository wurde mit KI-Unterstützung (Anthropics Claude) geschrieben, während ich das HTB-Modul bearbeitete. Ich habe die Designziele und -anforderungen festgelegt – CLI-Ergonomie, automatisches Bereitstellen der Webshell, interaktiver Modus, zufälliger Shell-Name und -Parameter – und das Ergebnis überprüft und getestet. Ich gebe dies offen zu, weil es der ehrliche Weg ist, und weil der Wert hier im Verständnis und den technischen Entscheidungen liegt, nicht in der Autorenschaft jeder Zeile.
--cmd oder den Wechsel in eine interaktive Pseudo-Shell mit --shell.CVE-2018-7600 betrifft:
Diese Implementierung zielt auf den Drupal 8 Form-API-Vektor (den user/register AJAX-Endpunkt). Drupal 7 ist über einen anderen Endpunkt/Payload ausnutzbar und wird hier nicht behandelt.
Gepatchte Versionen (7.58 / 8.5.1 und später) sind nicht betroffen.
requestspip install requests
# one-off command
python3 drupalgeddon2.py -u http://target/ -c id
# interactive pseudo-shell
python3 drupalgeddon2.py -u http://target/ --shell
# just plant the shell, run nothing
python3 drupalgeddon2.py -u http://target/ --deploy-only
# route through Burp, ignore the proxy's self-signed cert
python3 drupalgeddon2.py -u http://target/ -c id --proxy http://127.0.0.1:8080 -k
| Flag | Beschreibung |
|---|---|
-u, --url | (erforderlich) Ziel-Basis-URL, z.B. http://target/ |
-c, --cmd | Einzelner Befehl, der auf dem Ziel ausgeführt werden soll |
--shell | In eine interaktive Pseudo-Shell wechseln |
--deploy-only | Nur die Webshell ablegen, nichts ausführen |
--shell-name | Dateiname für die abgelegte Shell (Standard: zufällig .php) |
--param | GET-Parametername für die Shell (Standard: zufälliges md5) |
--proxy | Proxy-URL, z.B. http://127.0.0.1:8080 |
-k, --insecure | TLS-Überprüfung deaktivieren (für selbstsignierte Proxy-Zertifikate) |
--timeout | Timeout pro Anfrage in Sekunden (Standard: 15) |
CVE-2018-7600 ist ein Fehler in der Eingabebereinigung von Drupals Form API. Drupal stellt Formulare als verschachtelte Renderbare Arrays dar, und Array-Schlüssel, die mit # beginnen, werden als spezielle Render-Eigenschaften und nicht als Benutzerdaten behandelt. Der Patch (SA-CORE-2018-002) fügte eine Bereinigung hinzu, um diese #-präfixierten Schlüssel aus Benutzereingaben zu entfernen.
Vor dem Patch konnte ein nicht authentifizierter Angreifer Render-Eigenschaften in ein Formularelement injizieren, das vom AJAX-Handler von Drupal verarbeitet wird. Das Übergeben von Eigenschaften wie:
#post_render – eine Liste von Callables, die Drupal nach dem Rendern aufruft, und#markup – das an sie übergebene Argumentgegen das mail-Element des Benutzerregistrierungsformulars führt dazu, dass Drupal während des Render-Schritts eine beliebige PHP-Funktion (hier exec) mit vom Angreifer kontrollierten Eingaben aufruft – also Remote-Code-Ausführung ohne Authentifizierung.
Dieses PoC verwendet diese Grundlage, um eine einzeilige PHP-Shell lokal base64-kodiert zu haben, die der Server in eine Datei im Webroot dekodiert, und dann mit dieser Datei über normale GET-Anfragen zu interagieren.
Wenn Sie auf der verteidigenden Seite stehen:
Behebung
Erkennungsideen
#post_render, #markup, #type, #lazy_builder usw. Legitime Formularübermittlungen enthalten diese nicht..../user/register?element_parents=...&_wrapper_format=drupal_ajax, die verdächtige Parameter enthalten..php-Datei im Webroot.system($_GET[...])-Shells).Dieses Tool wird für Bildungszwecke und für autorisierte Sicherheitstests veröffentlicht – Ihre eigenen Laborumgebungen, HTB/CTF-Ziele oder Systeme, für die Sie eine ausdrückliche schriftliche Genehmigung zur Bewertung haben. Unautorisierter Zugriff auf Computersysteme ist eine Straftat gemäß Gesetzen wie dem UK Computer Misuse Act 1990, dem US Computer Fraud and Abuse Act und entsprechenden Gesetzen in anderen Ländern. Sie sind allein für die Nutzung verantwortlich. Der Autor übernimmt keine Haftung für Missbrauch oder verursachte Schäden.
MIT