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.
| PUERTO | ESTADO | SERVICIO |
|---|---|---|
| 22/tcp | CLOSED | ssh |
| 80/tcp | OPEN | http |
| 443/tcp | OPEN | https |
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.
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:
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:
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 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.
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".
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.
Con estas credenciales se accede al panel de administración completo de WordPress.
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:
Se pone Netcat en escucha y se accede a una URL inexistente para activar el 404:
Shell obtenida como usuario daemon. Se estabiliza con Python para tener una TTY interactiva:
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:
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:
Se usa John the Ripper con el diccionario rockyou.txt para crackear el hash:
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:
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:
/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.
--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.
Shell de root obtenida. La última key se encuentra en el directorio /root:
CADENA DE ATAQUE
fsocity.dic y Key 1/3 expuestos en robots.txt sin autenticación/wp-login.php permiten confirmar usuario válido: Elliotfsocity.dic vía Burp Intruder → contraseña: ER28-0652 → acceso admin a WordPress404.php del tema activo → reverse shell PHP → acceso como usuario daemonpassword.raw-md5 legible por todos → John the Ripper descifra la contraseña → Key 2/3 obtenidanmap --interactive con SUID root → !bash -p → shell como root → Key 3/3 en /root/key-3-of-3.txt