Drupal RCE
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Con il modulo PHP Filter
Nelle versioni precedenti 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
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-33b0cd0a5bf70946deb6bc5c2dc0e6904642af9b%252Fimage%2520%28247%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=8c800d2&sv=1)
Poi clicca su Aggiungi contenuto -> Seleziona Pagina base o Articolo -> Scrivi php shellcode nel corpo -> Seleziona PHP code in Text format -> Seleziona Anteprima
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-607d764091f974226ff1baac853144a317fc5838%252Fimage%2520%28338%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=3eba36f4&sv=1)
Infine accedi semplicemente al nodo appena creato:
Installa il modulo PHP Filter
Nelle versioni attuali non è più possibile installare plugin avendo accesso solo al web dopo l'installazione predefinita.
Dalla versione 8 in poi, 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 suInstalla
.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 selezionareCodice PHP
dal menu a discesaFormato testo
.
Modulo con backdoor
Nelle versioni attuali non è più possibile installare plugin avendo accesso solo al web dopo l'installazione predefinita.
Un modulo con backdoor 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 suEstendi
nella barra laterale. Successivamente, clicca sul pulsante+ Installa nuovo modulo
, e verremo portati alla pagina di installazione, comehttp://drupal-site.local/admin/modules/install
. Naviga fino all'archivio del Captcha backdoored e clicca suInstalla
.Una volta completata l'installazione, naviga su
/modules/captcha/shell.php
per eseguire comandi.
Backdooring Drupal con sincronizzazione della configurazione
Post condiviso da Coiffeur0x90
Parte 1 (attivazione di Media e Libreria Media)
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:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-4c7c93f136e5cef5e20e7ede64b22028ca72648a%252Fimage%2520%284%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=cf9641bf&sv=1)
Dopo l'attivazione:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-1ec78aebd66cd90a926937e9afef92bee1bbd873%252Fimage%2520%281%29%2520%281%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=42865228&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-176e28e260ced93a729f3ca6f493c54de2ca3325%252Fimage%2520%282%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=a41cd505&sv=1)
Parte 2 (sfruttare la funzionalità Sincronizzazione della configurazione)
Sfrutteremo la funzionalità Sincronizzazione della configurazione per scaricare (esportare) e caricare (importare) 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
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-17acb7d7e32d50321420fc6980081693ff3c2488%252Fimage%2520%283%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=d7dd75b4&sv=1)
A:
File: system.file.yml
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-92ceed74582786045e9b3021748efcdf10eaab62%252Fimage%2520%284%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=542bbeca&sv=1)
Patch field.field.media.document.field_media_document.yml
Quindi, applica la patch alla seconda voce file_extensions
da:
File: field.field.media.document.field_media_document.yml
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-e7f03abf85835acd9c32e403c7957baddf76124c%252Fimage%2520%285%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=64f336bc&sv=1)
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).
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-e5ab74cb813cf4b74bf72e0029bab9303fa0ba0d%252Fimage%2520%286%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=633d9cee&sv=1)
Parte 3 (sfruttando la funzionalità Aggiungi Documento)
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 legittima richiesta GET 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).
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-511d745288778e33bd8a1eaa02cb3ec9a9484b6b%252Fimage%2520%287%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=51dfd67b&sv=1)
File: Patched LICENSE.txt
Parte 3.1 (carica file .htaccess)
Per prima cosa, sfruttiamo la funzione Aggiungi Documento (/media/add/document) per caricare il nostro file contenente le direttive Apache (.htaccess).
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-4464dc17125af4ce4ff46ef4c85ba124775fd892%252Fimage%2520%288%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=45e5652b&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-a3d5f99f09936ab255513583290236e3edf2fb64%252Fimage%2520%289%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b12b0f5e&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-210d7bd3fb7f095bb7e92b210d91e63f12968897%252Fimage%2520%2810%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e4fd7e7&sv=1)
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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-277c44d2cad5775066e0429dbda5f22b6f66f554%252Fimage%2520%2811%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=bcecb665&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-fd5fec3d9950b64fd4989eaf686df6f7966029b3%252Fimage%2520%2812%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=71242bda&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-4c2c4ab67b3633aad28099287e4c1d48dc337689%252Fimage%2520%2813%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=3ac0e84&sv=1)
Parte 4 (interazione con il Webshell)
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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-f5207ab5b112e3b9da915193f7f2e73db318399e%252Fimage%2520%2814%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=6c42cacd&sv=1)
Quando l'attaccante imposta il cookie, può interagire con il Webshell ed eseguire qualsiasi comando desideri.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-11fd861cfefe62fd4421623f34499ce77ad1e142%252Fimage%2520%2815%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=98851be7&sv=1)
E come puoi vedere nei log, sembra che sia stato richiesto solo un file txt.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F197708944-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FE5VfhVAq0qYsgU9deMR8%252Fuploads%252Fgit-blob-5d7f744a6dab44d590135b108e5eb9e3e2f118e9%252Fimage%2520%2816%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=eeb84595&sv=1)
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)
Last updated