Drupal RCE
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nelle versioni più vecchie di Drupal (prima della versione 8), era possibile accedere come admin e abilitare il modulo PHP filter
, che "Consente di valutare codice/snippet PHP incorporati." Ma dalla versione 8 questo modulo non è installato per impostazione predefinita.
È necessario che il plugin php sia installato (controlla accedendo a /modules/php e se restituisce un 403 allora, esiste, se non trovato, allora il plugin php non è installato)
Vai su Modules -> (Controlla) PHP Filter -> Salva configurazione
Poi clicca su Aggiungi contenuto -> Seleziona Pagina base o Articolo -> Scrivi php shellcode nel corpo -> Seleziona Codice PHP in Formato testo -> Seleziona Anteprima
Infine accedi semplicemente al nodo appena creato:
Nelle versioni attuali non è più possibile installare plugin avendo accesso solo al web dopo l'installazione predefinita.
A partire dalla versione 8, il PHP Filter modulo non è installato di default. Per sfruttare questa funzionalità, dovremmo installare il modulo noi stessi.
Scarica l'ultima versione del modulo dal sito di Drupal.
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
Una volta scaricato, vai su Amministrazione
> Report
> Aggiornamenti disponibili
.
Clicca su Sfoglia
, seleziona il file dalla directory in cui lo abbiamo scaricato e poi clicca su Installa
.
Una volta installato il modulo, possiamo cliccare su Contenuto
e creare una nuova pagina base, simile a come abbiamo fatto nell'esempio di Drupal 7. Ancora una volta, assicurati di selezionare Codice PHP
dal menu a discesa Formato testo
.
Nelle versioni attuali non è più possibile installare plugin avendo accesso solo al web dopo l'installazione predefinita.
Un modulo backdoored può essere creato aggiungendo una shell a un modulo esistente. I moduli possono essere trovati sul sito drupal.org. Scegliamo un modulo come CAPTCHA. Scorri verso il basso e copia il link per l'archivio tar.gz archive.
Scarica l'archivio ed estrai il suo contenuto.
Crea un PHP web shell con i contenuti:
Successivamente, dobbiamo creare un .htaccess
file per darci accesso alla cartella. Questo è necessario poiché Drupal nega l'accesso diretto alla cartella /modules
.
La configurazione sopra applicherà regole per la cartella / quando richiediamo un file in /modules. Copia entrambi questi file nella cartella captcha e crea un archivio.
Assumendo di avere accesso amministrativo al sito web, clicca su Gestisci
e poi su Estendi
nella barra laterale. Successivamente, clicca sul pulsante + Installa nuovo modulo
, e verremo portati alla pagina di installazione, come http://drupal-site.local/admin/modules/install
. Naviga fino all'archivio del Captcha backdoored e clicca su Installa
.
Una volta completata l'installazione, naviga su /modules/captcha/shell.php
per eseguire comandi.
Post condiviso da Coiffeur0x90
Nel menu Estendi (/admin/modules), puoi attivare quelli che sembrano essere plugin già installati. Per impostazione predefinita, i plugin Media e Libreria Media non sembrano essere attivati, quindi attiviamoli.
Prima dell'attivazione:
Dopo l'attivazione:
Sfrutteremo la funzionalità Sincronizzazione della configurazione per esportare (dump) e caricare (import) le voci di configurazione di Drupal:
/admin/config/development/configuration/single/export
/admin/config/development/configuration/single/import
Patch system.file.yml
Iniziamo patchando la prima voce allow_insecure_uploads
da:
File: system.file.yml
A:
File: system.file.yml
Patch field.field.media.document.field_media_document.yml
Poi, patcha la seconda voce file_extensions
da:
File: field.field.media.document.field_media_document.yml
A:
File: field.field.media.document.field_media_document.yml
Non lo uso in questo post del blog, ma è importante notare che è possibile definire l'entry
file_directory
in modo arbitrario e che è vulnerabile a un attacco di path traversal (quindi possiamo risalire all'interno dell'albero del filesystem di Drupal).
L'ultimo passaggio è il più semplice e si suddivide in due sotto-passaggi. Il primo è caricare un file in formato .htaccess per sfruttare le direttive di Apache e consentire ai file .txt di essere interpretati dal motore PHP. Il secondo è caricare un file .txt contenente il nostro payload.
File: .htaccess
Perché questo trucco è interessante?
Perché una volta che il Webshell (che chiameremo LICENSE.txt) è stato caricato sul server Web, possiamo trasmettere i nostri comandi tramite $_COOKIE
e nei log del server Web, questo apparirà come una richiesta GET legittima a un file di testo.
Perché chiamare il nostro Webshell LICENSE.txt?
Semplicemente perché se prendiamo il seguente file, ad esempio core/LICENSE.txt (che è già presente nel core di Drupal), abbiamo un file di 339 righe e 17,6 KB di dimensione, che è perfetto per aggiungere un piccolo frammento di codice PHP nel mezzo (dato che il file è abbastanza grande).
File: LICENSE.txt patchato
Prima, sfruttiamo la funzione Aggiungi Documento (/media/add/document) per caricare il nostro file contenente le direttive Apache (.htaccess).
Parte 3.2 (carica file LICENSE.txt)
Poi, sfruttiamo di nuovo la funzione Aggiungi Documento (/media/add/document) per caricare un Webshell nascosto all'interno di un file di licenza.
L'ultima parte consiste nell'interagire con il Webshell.
Come mostrato nello screenshot seguente, se il cookie previsto dal nostro Webshell non è definito, otteniamo il risultato successivo quando consultiamo il file tramite un browser Web.
Quando l'attaccante imposta il cookie, può interagire con il Webshell ed eseguire qualsiasi comando desideri.
E come puoi vedere nei log, sembra che sia stato richiesto solo un file txt.
Grazie per aver dedicato del tempo a leggere questo articolo, spero che ti aiuti a ottenere alcune shell.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)