// 01
Resumen
Obsession es una máquina de dificultad muy fácil de la plataforma DockerLabs, creada por Juan el 25/06/2024. Corre sobre Linux Ubuntu 24.04 LTS y expone tres servicios: FTP (puerto 21) con acceso anónimo habilitado, SSH (puerto 22) y un servidor web HTTP (puerto 80) con Apache 2.4.58.
El vector de ataque es progresivo: primero se enumeran los archivos del servidor FTP
de forma anónima, encontrando archivos de texto con información sensible. Luego se
realiza fuzzing de directorios web con wfuzz, descubriendo un directorio
/backup que expone el nombre de usuario del sistema:
russoski. Con ese usuario se ejecuta fuerza bruta sobre SSH
con Hydra, obteniendo la contraseña iloveme.
Una vez dentro, la escalada a root se logra explotando el
bit SUID del binario /usr/bin/env,
idéntico al vector de Database pero llegando por un camino completamente distinto.
Como bonus, la máquina incluye un easter egg: un enlace a un video de YouTube oculto en un archivo dentro del directorio root, firmado por el creador.
| Fase | Técnica / Herramienta | Resultado |
|---|---|---|
| Despliegue | auto_deploy.sh + ping | Máquina activa en 172.17.0.2 |
| Reconocimiento | Nmap -sCV full scan + xsltproc | Puertos 21, 22, 80 abiertos; FTP anon habilitado |
| Enum. FTP | FTP login anónimo | chat-gonza.txt y pendientes.txt descargados |
| Enum. Web | wfuzz directory fuzzing | Directorios /backup e /important encontrados |
| Reconocimiento | backup.txt en /backup | Usuario: russoski |
| Acceso inicial | Hydra SSH brute force + rockyou.txt | Contraseña: iloveme |
| Acceso inicial | SSH + ssh-keygen -R | Shell como russoski |
| Privesc | sudo -l + SUID /usr/bin/env | Shell como root |
| Post-explot. | Exploración manual | Easter egg: YouTube link en /root |
// 02
Reconocimiento
El primer paso es siempre desplegar la máquina vulnerable. DockerLabs provee un script auto_deploy.sh que automatiza la creación del contenedor Docker a partir del archivo obsession.tar. El script construye la imagen, levanta el contenedor, asigna automáticamente una dirección IP dentro de la red Docker interna (172.17.0.x) y mantiene la máquina corriendo hasta que se presione Ctrl+C, momento en que el contenedor se destruye y limpia. Es importante ejecutarlo con sudo porque Docker requiere permisos de administrador para manipular interfaces de red e imágenes.
Antes de lanzar cualquier escaneo, es buena práctica verificar que la máquina objetivo está activa y responde a tráfico ICMP. El comando ping con la flag -c 3 envía exactamente 3 paquetes ICMP echo-request y espera su respuesta (echo-reply). Si el host responde, sabemos que la red Docker está correctamente configurada y podemos proceder. El valor de TTL=64 en la respuesta es característico de sistemas Linux, lo que nos da una pista temprana del sistema operativo objetivo antes incluso de usar Nmap.
// TTL COMO FINGERPRINT DE OS
El valor TTL (Time To Live) del paquete ICMP nos indica el sistema operativo aproximado sin necesidad de herramientas adicionales. TTL=64 → Linux/Unix. TTL=128 → Windows. TTL=255 → Cisco/Network devices. Aquí TTL=64 confirma que estamos ante un sistema Linux.
Realizamos un escaneo exhaustivo con Nmap sobre todos los puertos TCP. La flag -oX exporta el resultado en formato XML, que luego convertiremos a HTML con xsltproc para tener un reporte visual navegable. El escaneo descubre 3 puertos abiertos:
Puerto 21 — FTP corriendo vsftpd 3.0.5.
Nmap detecta automáticamente mediante el script ftp-anon
que el servidor tiene el login anónimo habilitado (FTP code 230),
y lista dos archivos en el directorio raíz del FTP:
chat-gonza.txt (667 bytes, Jun 18 2024) y
pendientes.txt (315 bytes, Jun 18 2024).
Puerto 22 — SSH con OpenSSH 9.6p1 sobre Ubuntu Linux (protocol 2.0). Este será nuestro vector de acceso una vez tengamos credenciales válidas.
Puerto 80 — HTTP con Apache 2.4.58 (Ubuntu). El título de la página es "Russoski Coaching", lo que ya nos anticipa un nombre de usuario potencial. El header del servidor confirma Apache sobre Ubuntu.
Con el XML generado por Nmap, aplicamos la hoja de estilos XSLT oficial que viene
incluida en Kali Linux en /usr/share/nmap/nmap.xsl.
Esta transformación convierte el XML estructurado en una tabla HTML navegable con
información de puertos, servicios, versiones y scripts NSE. El resultado es un archivo
obsession.html que podemos abrir directamente en el navegador para
revisar el reporte de forma visual, ideal para documentar evidencias en un pentest real.
// ¿POR QUÉ EXPORTAR A HTML?
En un pentest profesional, la documentación es tan importante como el ataque. El reporte HTML generado por xsltproc muestra puertos, servicios, versiones y resultados de scripts NSE en una tabla ordenada y filtrable. Es más legible que el XML crudo y puede adjuntarse directamente a un informe de auditoría. El comando xsltproc /usr/share/nmap/nmap.xsl scan.xml > reporte.html no requiere instalar nada adicional en Kali — todo ya está disponible.
// 03
Enumeración FTP — Acceso Anónimo
El escaneo Nmap ya nos alertó: el servidor FTP tiene el acceso anónimo
habilitado. Esto significa que podemos conectarnos sin necesidad de credenciales
reales usando el usuario anonymous (o simplemente
ftp) y cualquier string como contraseña
(por convención se usa un email vacío o simplemente Enter). Este es un
misconfiguration clásico en servidores FTP, ya que permite
que cualquier persona en la red acceda a los archivos compartidos sin autenticación.
Una vez dentro, Nmap ya nos había listado dos archivos:
chat-gonza.txt y pendientes.txt.
Los descargamos ambos con el comando get del
cliente FTP interactivo para analizarlos en nuestra máquina atacante.
// MISCONFIGURACIÓN — FTP ANÓNIMO
Permitir el acceso FTP anónimo en un servidor de producción es una vulnerabilidad de configuración crítica. Aunque en este CTF los archivos son inofensivos, en un entorno real podría exponer credenciales, backups, código fuente, configuraciones de bases de datos o cualquier archivo que el administrador haya dejado en el servidor FTP sin darse cuenta. vsftpd tiene el acceso anónimo deshabilitado por defecto — aquí fue habilitado intencionalmente para el laboratorio.
// 04
Enumeración Web
Accedemos a http://172.17.0.2/ y encontramos un sitio web de "The Aesthetic Dream", presentado como el sitio de un entrenador personal llamado Russoski. El sitio incluye una descripción del propietario como informático y entrenador personal con certificado de musculación y fitness. En el footer del sitio aparece un email: russoski@dockerlabs.es y el texto "Copyright Russoski © 2024".
Esta información ya es valiosa desde el punto de vista OSINT: el nombre russoski aparece tanto en el título del sitio detectado por Nmap ("Russoski Coaching") como en el email. Es un candidato fuerte para ser nombre de usuario en el sistema. Sin embargo, antes de lanzar fuerza bruta, necesitamos confirmar que el usuario existe, y para eso realizaremos fuzzing de directorios.
// 05
Fuzzing de Directorios — wfuzz
Con el puerto 80 abierto, la siguiente fase es enumerar directorios
y archivos ocultos del servidor web. Para ello usamos wfuzz,
una herramienta de fuzzing web que reemplaza la palabra clave FUZZ
en la URL con cada línea de un diccionario, analiza las respuestas HTTP y filtra según
los códigos de estado.
La flag --hc=404 (hide code) oculta todas las respuestas
con código 404 (Not Found), que son la mayoría — nos interesa solo lo que
existe. Con -t 200 lanzamos 200 hilos en paralelo
para maximizar la velocidad. Usamos el diccionario
directory-list-2.3-medium.txt de DirBuster,
que contiene ~220.000 palabras comunes de directorios web.
El resultado muestra tres hallazgos relevantes con código HTTP 301 (redirect) o 200: /backup, /important y /server-status (Apache status page).
Accedemos a http://172.17.0.2/backup/ y encontramos un
directory listing (el servidor lista el contenido del directorio
porque no tiene un index.html y la opción
Options Indexes de Apache está activa). Dentro hay un archivo:
backup.txt (2024-06-25, 61 bytes).
Al acceder a http://172.17.0.2/backup/backup.txt encontramos un mensaje que el administrador dejó descuidadamente: "Usuario para todos mis servicios: russoski (cambiar pronto!)". Esto es OSINT en texto plano: el administrador confirmó explícitamente que usa russoski como nombre de usuario en todos sus servicios — incluyendo SSH.
Accedemos también a http://172.17.0.2/important/, que contiene otro directory listing con el archivo important.md (2024-06-17, 2.4K). Su contenido resulta ser el famoso "Manifiesto Hacker — La Conciencia de un Hacker", un texto icónico de la cultura hacker escrito por The Mentor en 1986. Si bien no contiene información operacional para el ataque, es parte de la ambientación temática de la máquina. En un pentest real, cualquier archivo expuesto debe ser revisado — podría contener credenciales, rutas del sistema o información de configuración.
// DIRECTORY LISTING — VULNERABILIDAD WEB
El Directory Listing (o Directory Traversal) ocurre cuando Apache tiene configurado Options Indexes y no existe un archivo index.html/php en el directorio. Esto expone la estructura de archivos al visitante. En producción debe deshabilitarse añadiendo Options -Indexes en la configuración de Apache o en el archivo .htaccess.
// 06
Fuerza Bruta SSH — Hydra
Con el usuario russoski confirmado, procedemos a realizar un ataque de fuerza bruta por diccionario sobre el servicio SSH del puerto 22. Usamos Hydra, la herramienta de fuerza bruta de red más utilizada en pentesting, con el diccionario rockyou.txt — una wordlist de aproximadamente 14.3 millones de contraseñas reales filtradas de la brecha de datos de RockYou en 2009. Es el diccionario estándar para ataques de contraseñas en CTFs porque cubre la gran mayoría de contraseñas débiles y comunes.
La flag -f indica a Hydra que se detenga al encontrar la primera credencial válida, evitando continuar el ataque innecesariamente. -T 20 lanza 20 tareas paralelas para acelerar el proceso. -V muestra cada intento en pantalla (verbose), útil para ver el progreso en tiempo real.
Hydra encuentra la contraseña en el intento #121: iloveme. La contraseña es simple y predecible, lo que demuestra por qué las contraseñas cortas o basadas en palabras comunes son vulnerables a ataques de diccionario incluso sin GPUs.
// DEFENSA CONTRA BRUTE FORCE SSH
Para proteger SSH contra ataques de fuerza bruta existen varias medidas: (1) fail2ban — bloquea IPs tras N intentos fallidos. (2) Autenticación por clave pública — elimina completamente el uso de contraseñas. (3) Cambiar el puerto SSH de 22 a uno no estándar. (4) AllowUsers en sshd_config para restringir qué usuarios pueden conectarse. (5) Contraseñas fuertes de 16+ caracteres con caracteres especiales hacen que los ataques de diccionario sean inviables en tiempo práctico.
// 07
Acceso Inicial — SSH
Al intentar conectarnos por SSH, recibimos una advertencia de seguridad: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! Este error ocurre porque el cliente SSH recuerda la huella digital (fingerprint) de la clave pública del servidor SSH de la IP 172.17.0.2 de una sesión anterior (probablemente de una máquina DockerLabs diferente que usó la misma IP). El nuevo contenedor Docker tiene una clave SSH diferente, y el cliente SSH lo detecta como una potencial amenaza de tipo Man-in-the-Middle (MitM).
En un entorno real esta advertencia debería tomarse en serio. En nuestro caso sabemos
que la IP simplemente fue reutilizada por un contenedor diferente, por lo que la
solución es eliminar la entrada antigua del archivo
~/.ssh/known_hosts con el comando
ssh-keygen -R.
El propio mensaje de error nos indica el comando exacto para solucionar el problema.
ssh-keygen -R busca y elimina todas las líneas del archivo
known_hosts que correspondan a la IP
172.17.0.2 (en este caso, las líneas 15, 16 y 17). Una vez eliminadas,
SSH ya no tendrá conflicto con la nueva clave del servidor y nos permitirá conectarnos
aceptando la nueva huella digital.
Con el conocido_hosts limpio, volvemos a conectarnos. El cliente SSH nos pide confirmar la nueva huella digital del servidor — respondemos yes para guardarla en known_hosts. Ingresamos la contraseña iloveme y obtenemos acceso al sistema como el usuario russoski. El banner muestra Ubuntu 24.04 LTS (GNU/Linux 6.18.12+kali-amd64 x86_64), confirmando el SO objetivo.
// 08
Escalada de Privilegios
Una vez dentro del sistema, la primera acción en post-explotación es siempre enumerar
los vectores de escalada de privilegios disponibles. Comenzamos con
sudo -l, que lista los comandos que el usuario actual
puede ejecutar con privilegios de otro usuario (por defecto root) mediante
sudo.
El resultado revela que russoski puede ejecutar como root el binario /usr/bin/vim sin necesidad de contraseña (NOPASSWD). Vim es un editor de texto que, cuando se ejecuta con sudo, puede ser abusado para spawnear una shell root desde dentro del editor. Sin embargo, antes de explotar eso, verificamos también los binarios SUID.
Complementamos la enumeración buscando binarios con el bit SUID
activado. Los binarios SUID (Set User ID) se ejecutan con los permisos del
propietario del archivo — si el propietario es root y el binario
tiene SUID, cualquier usuario que lo ejecute obtendrá efectivamente privilegios de
root durante esa ejecución. El comando find / -perm -4000
busca en todo el sistema de archivos binarios con el bit 4000 (SUID) activo.
La redirección 2>/dev/null descarta los
errores de "Permission denied" que aparecen al intentar leer directorios
restringidos.
Entre los resultados encontramos /usr/bin/env, que según GTFOBins es explotable para escalar privilegios cuando tiene el bit SUID activo. Elegimos este vector por ser el más limpio y directo.
// ¿POR QUÉ /usr/bin/env CON SUID ES PELIGROSO?
env es un binario que ejecuta un comando en un entorno modificado. Normalmente es inofensivo. Pero cuando tiene el bit SUID activo y su propietario es root, al ejecutar env /bin/sh -p, el proceso hijo (/bin/sh) hereda el eUID=0 (root) del proceso padre. La flag -p de /bin/sh evita que la shell descarte el privilegio efectivo, dejándonos con una shell completa como root. GTFOBins documenta este y otros cientos de binarios abusables: gtfobins.github.io/gtfobins/env/
// 09
Root & Easter Egg
Ejecutamos el payload de GTFOBins para env con
SUID. El comando invoca /bin/sh con la flag
-p, que preserva el effective UID heredado del
binario SUID (eUID=0). La shell resultante corre como root,
confirmado con whoami.
Una vez como root, exploramos el sistema para ver qué encontramos. En el directorio
/home hay dos usuarios:
russoski y ubuntu. Navegando al directorio
/root (accesible solo como root), encontramos un
archivo llamado Video-Nagore-Fernandez.txt.
Su contenido es el easter egg de la máquina: un mensaje del creador ("Al fin lo terminé! es tan hermosa.. <3") acompañado de un enlace a un video de YouTube. En los comentarios del video, el propio creador (@russo.trickz) confirma: "Yo creo que es la mejor flag que te puedes encontrar en un CTF hahahah, felicidades por completar la máquina brother!" — una recompensa simpática para quienes exploran más allá de obtener root.
// 10
Referencia de Comandos
Descripción detallada de cada herramienta y comando utilizado en este writeup.
Escáner de redes y puertos. Detecta servicios abiertos, versiones de software y scripts NSE. Con -oX exporta el resultado en XML para post-procesamiento.
- -p- → escanea los 65535 puertos TCP
- -sS → SYN scan, no completa el handshake TCP
- -sC → ejecuta scripts NSE por defecto (ftp-anon, http-title, etc.)
- -sV → detecta versión de servicios
- -n → sin resolución DNS (más rápido)
- -Pn → skip host discovery, trata el host como activo
- --min-rate=5000 → mínimo 5000 paquetes/segundo
- --open → muestra solo puertos abiertos
- -oX archivo.xml → exporta resultado en formato XML
Procesador XSLT de línea de comandos. Aplica una hoja de estilos XSL a un archivo XML para transformarlo en otro formato. Se usa para convertir el XML de Nmap en un reporte HTML navegable y visualmente organizado.
- nmap.xsl → hoja de estilos oficial de Nmap (incluida en Kali)
- scan.xml → archivo XML generado por Nmap con -oX
- > reporte.html → redirige la salida a un archivo HTML
- xdg-open reporte.html → abre el HTML en el navegador de Kali
Cliente FTP de línea de comandos para transferencia de archivos. Cuando el servidor tiene el acceso anónimo habilitado, se puede conectar con el usuario anonymous sin contraseña real. Permite listar y descargar archivos del servidor.
- anonymous / ftp → usuarios para acceso anónimo
- ls → lista archivos del directorio actual
- get archivo → descarga un archivo al directorio local
- mget * → descarga todos los archivos del directorio
- bye / quit → cierra la conexión FTP
Herramienta de fuzzing web. Reemplaza la palabra clave FUZZ en la URL con cada línea del diccionario y analiza las respuestas HTTP. Permite descubrir directorios, archivos y parámetros ocultos en servidores web.
- -c → salida con colores para mejor legibilidad
- --hc=404 → oculta respuestas con código 404 (Not Found)
- --hc=301,302 → también puede ocultar redirects
- -t 200 → 200 hilos/tareas en paralelo
- -w wordlist → ruta al diccionario de palabras
- FUZZ → marcador que wfuzz reemplaza con cada palabra
Herramienta de fuerza bruta de red multi-protocolo. Soporta SSH, FTP, HTTP, SMB, RDP y decenas más. Realiza ataques de diccionario (wordlist) probando combinaciones de usuario/contraseña a alta velocidad con múltiples hilos paralelos.
- -l usuario → username fijo (minúscula l = login único)
- -L lista → lista de usernames (mayúscula L)
- -p pass → contraseña fija
- -P wordlist → diccionario de contraseñas (mayúscula P)
- -f → detener al encontrar la primera credencial válida
- ssh://IP → protocolo y objetivo
- -t 20 → número de tareas paralelas (threads)
- -V → verbose, muestra cada intento
Elimina todas las entradas de un host específico del archivo ~/.ssh/known_hosts. Necesario cuando la clave SSH del servidor cambia (contenedor Docker nuevo, reinstalación del SO) y el cliente SSH bloquea la conexión por seguridad.
- -R IP → elimina entradas de esa IP en known_hosts
- known_hosts → archivo que guarda fingerprints de servidores SSH conocidos
- -f ruta → especificar un known_hosts alternativo
- Alternativa manual → editar ~/.ssh/known_hosts y borrar la línea
Busca en todo el sistema de archivos binarios con el bit SUID activo (permisos 4000). Los binarios SUID se ejecutan con los privilegios de su propietario, frecuentemente root, lo que puede ser abusado para escalar privilegios.
- / → busca desde la raíz (recursivo)
- -perm -4000 → bit SUID activo (el guión = "al menos estos bits")
- 2>/dev/null → descarta errores "permission denied"
- -perm /4000 → variante alternativa (misma función)
env ejecuta programas en un entorno modificado. Con SUID activo y propietario root, puede spawnear una shell heredando eUID=0. La flag -p de /bin/sh impide que la shell descarte el privilegio efectivo heredado.
- SUID + root owner → hereda eUID=0 al ejecutar
- /bin/sh -p → shell que preserva el eUID (effective UID)
- -p flag → "privileged mode": no resetea eUID al rUID del invocador
- GTFOBins → gtfobins.github.io/gtfobins/env/
// 11
Glosario
Conceptos clave utilizados en este writeup, explicados en contexto de ciberseguridad ofensiva.
anonymous y cualquier contraseña (por convención, un email). Es una misconfiguración clásica que expone archivos del servidor a cualquier persona en la red. vsftpd lo tiene deshabilitado por defecto; habilitarlo en producción sin restricciones es una vulnerabilidad de configuración.Options Indexes está activa en Apache. Expone la estructura de archivos del servidor al visitante. Puede revelar backups, archivos de configuración, scripts no publicados o datos sensibles. Se mitiga deshabilitando la opción con Options -Indexes en la configuración de Apache.chmod u+s o chmod 4755), se ejecuta con los privilegios del propietario del archivo, no del usuario que lo invoca. Si el propietario es root, el proceso obtiene eUID=0 (root efectivo). Herramientas como GTFOBins documentan cómo explotar binarios legítimos con SUID para escalar privilegios. La búsqueda estándar es find / -perm -4000 2>/dev/null.-p de /bin/sh activa el "modo privilegiado", impidiendo que la shell resetee el eUID al rUID, preservando así los privilegios root heredados del binario SUID.env, vim, python, find, bash) cuando tienen permisos especiales (SUID, sudo, capabilities). Es una referencia indispensable en la fase de post-explotación y escalada de privilegios.~/.ssh/known_hosts. En conexiones posteriores, verifica que la clave del servidor coincide. Si no coincide (servidor reinstalado, nuevo contenedor Docker con misma IP, ataque MitM real), SSH bloquea la conexión. El comando ssh-keygen -R IP elimina la entrada antigua para permitir reconectar con la nueva clave.