
Riscrittura CLI del PoC di Drupalgeddon2 (CVE-2018-7600) — per test ed educazione autorizzati
Una riscrittura da riga di comando del proof-of-concept di Drupalgeddon2 (CVE-2018-7600), realizzata come esercizio di studio mentre completavo il modulo Attacking Common Applications della Hack The Box Academy.
[!WARNING] Solo per test di sicurezza autorizzati e a scopo didattico. Eseguire questo strumento contro sistemi che non possiedi o per cui non hai esplicita autorizzazione scritta è illegale nella maggior parte delle giurisdizioni. Vedi Uso legale e responsabile.
[!NOTE] Implementazione scritta con assistenza AI. Vedi Nota sulla paternità.
Drupal è una delle "applicazioni comuni" trattate nel modulo Attacking Common Applications di HTB Academy, e CVE-2018-7600 ("Drupalgeddon2") è il classico esempio di RCE non autenticata per questo contesto. Invece di copiare e incollare uno script usa-e-getta, volevo capire davvero l'iniezione nella Form API che rende possibile la vulnerabilità — così ho ricostruito da zero il PoC pubblico come esercizio di apprendimento.
L'originale ampiamente citato, a2u/CVE-2018-7600 di Vitalii Rudnykh, è ottimo per dimostrare il bug, ma richiede di modificare il payload direttamente nel codice a ogni esecuzione. In un flusso di lavoro da lab/CTF — rilanciando contro target diversi e volendo un punto d'appoggio riutilizzabile — tutto questo diventa noioso. Questa versione lo trasforma invece in un vero strumento CLI:
cmd= prevedibileÈ volutamente limitato a una vulnerabilità nota e corretta da tempo (divulgata nel 2018). L'obiettivo era capire la tecnica e produrre un'implementazione di riferimento pulita e documentata — non una capacità offensiva inedita.
Il codice in questo repository è stato scritto con assistenza AI (Claude di Anthropic) mentre completavo il modulo HTB. Ho definito io gli obiettivi e i requisiti di design — ergonomia CLI, deploy automatico della web shell, modalità interattiva, nome della shell e parametro randomizzati — e ho revisionato e testato il risultato. Lo dichiaro perché è la cosa onesta da fare, e perché il valore qui sta nella comprensione e nelle decisioni ingegneristiche, non nella paternità di ogni singola riga.
--cmd, oppure di entrare in una pseudo-shell interattiva con --shell.CVE-2018-7600 colpisce:
Questa implementazione mira al vettore della Form API di Drupal 8 (l'endpoint AJAX user/register). Drupal 7 è sfruttabile tramite un endpoint/payload diverso e non è gestito qui.
Le release corrette (7.58 / 8.5.1 e successive) non sono vulnerabili.
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
CVE-2018-7600 è un difetto di sanitizzazione degli input nella Form API di Drupal. Drupal rappresenta i moduli come array renderizzabili annidati, e le chiavi dell'array che iniziano con # vengono trattate come speciali proprietà di rendering, non come dati utente. La patch (SA-CORE-2018-002) ha aggiunto una sanitizzazione per rimuovere queste chiavi con prefisso # dagli input forniti dall'utente.
Prima della patch, un attaccante non autenticato poteva iniettare proprietà di rendering in un elemento di modulo elaborato dal gestore AJAX di Drupal. Inviare proprietà come:
#post_render — un elenco di callable che Drupal invoca dopo il rendering, e#markup — l'argomento passato a tali callablecontro l'elemento mail del modulo di registrazione utente fa sì che Drupal chiami una funzione PHP arbitraria (qui, exec) con input controllato dall'attaccante durante la fase di rendering — cioè esecuzione di codice remoto, senza richiedere autenticazione.
Questo PoC usa quella primitiva per codificare in base64 una shell PHP di una sola riga in locale, far sì che il server la decodifichi in un file nella webroot, e poi interagire con quel file tramite normali richieste GET.
Se sei dalla parte di chi difende:
Rimedio
Idee per il rilevamento
#post_render, #markup, #type, #lazy_builder, ecc. Le sottomissioni legittime di moduli non le contengono.…/user/register?element_parents=…&_wrapper_format=drupal_ajax con parametri sospetti..php di nuova creazione nella webroot.system($_GET[...])).Questo strumento è pubblicato per scopi didattici e per test di sicurezza autorizzati — i tuoi ambienti di lab, target HTB/CTF o sistemi per cui hai esplicito permesso scritto di valutazione. L'accesso non autorizzato a sistemi informatici è un reato ai sensi di leggi come il Computer Misuse Act 1990 del Regno Unito, il Computer Fraud and Abuse Act degli Stati Uniti e leggi equivalenti in altri paesi. Sei l'unico responsabile dell'uso che ne fai. L'autore non si assume alcuna responsabilità per usi impropri o per danni causati.
MIT
| Flag | Descrizione |
|---|
-u, --url | (obbligatorio) URL base del target, es. http://target/ |
-c, --cmd | Singolo comando da eseguire sul target |
--shell | Entra in una pseudo-shell interattiva |
--deploy-only | Installa solo la web shell, non esegue nulla |
--shell-name | Nome del file per la shell installata (default: .php casuale) |
--param | Nome del parametro GET per la shell (default: md5 casuale) |
--proxy | URL del proxy, es. http://127.0.0.1:8080 |
-k, --insecure | Disabilita la verifica TLS (per certificati proxy self-signed) |
--timeout | Timeout per singola richiesta in secondi (default: 15) |