Obsession

DockerLabs — Linux · FTP Anonymous → wfuzz → Hydra SSH → SUID env

● MUY FÁCIL DOCKERLABS LINUX FTP ANON HYDRA BRUTE FORCE 📅 Abril 2026 · By Brandeiks

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.

FaseTécnica / HerramientaResultado
Despliegueauto_deploy.sh + pingMáquina activa en 172.17.0.2
ReconocimientoNmap -sCV full scan + xsltprocPuertos 21, 22, 80 abiertos; FTP anon habilitado
Enum. FTPFTP login anónimochat-gonza.txt y pendientes.txt descargados
Enum. Webwfuzz directory fuzzingDirectorios /backup e /important encontrados
Reconocimientobackup.txt en /backupUsuario: russoski
Acceso inicialHydra SSH brute force + rockyou.txtContraseña: iloveme
Acceso inicialSSH + ssh-keygen -RShell como russoski
Privescsudo -l + SUID /usr/bin/envShell como root
Post-explot.Exploración manualEaster egg: YouTube link en /root

Reconocimiento

1
DESPLIEGUE DE LA MÁQUINA

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.

DEPLOY
$ sudo bash auto_deploy.sh obsession.tar
Estamos desplegando la máquina vulnerable, espere un momento.
 
Máquina desplegada, su dirección IP es ——> 172.17.0.2
Presiona Ctrl+C cuando termines con la máquina para eliminarla
2
VERIFICACIÓN DE CONECTIVIDAD — PING

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.

PING
$ ping 172.17.0.2 -c 3
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.071 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.142 ms
 
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.067/0.093/0.142/0.034 ms

// 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.

3
ESCANEO DE PUERTOS CON NMAP Y EXPORTACIÓN XML

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.

NMAP
$ sudo nmap -p- -sSCV -n -Pn --min-rate=5000 --open 172.17.0.2 -oX obsession.xml
Starting Nmap 7.99 — Nmap scan report for 172.17.0.2
Host is up (0.0000090s latency).
 
PORT    STATE SERVICE  VERSION
21/tcp  open   ftp      vsftpd 3.0.5
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -rw-r--r-- 1 0 0 667 Jun 18 2024 chat-gonza.txt
| -rw-r--r-- 1 0 0 315 Jun 18 2024 pendientes.txt
22/tcp  open   ssh      OpenSSH 9.6p1 Ubuntu 3ubuntu13
80/tcp  open   http     Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Russoski Coaching
 
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
4
CONVERSIÓN DEL REPORTE NMAP A HTML CON XSLTPROC

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.

XSLTPROC
$ xsltproc /usr/share/nmap/nmap.xsl obsession.xml > obsession.html

// ¿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.


Enumeración FTP — Acceso Anónimo

5
CONEXIÓN FTP CON USUARIO 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.

FTP
$ ftp 172.17.0.2
Name: anonymous
Password: [Enter]
ftp> ls
ftp> get chat-gonza.txt
ftp> get pendientes.txt
ftp> bye
Connected to 172.17.0.2.
230 Login successful.
 
-rw-r--r-- 1 0 0 667 Jun 18 2024 chat-gonza.txt
-rw-r--r-- 1 0 0 315 Jun 18 2024 pendientes.txt
 
226 Transfer complete. chat-gonza.txt
226 Transfer complete. pendientes.txt

// 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.


Enumeración Web

6
ANÁLISIS DEL SITIO WEB EN PUERTO 80

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.


Fuzzing de Directorios — wfuzz

7
FUZZING CON 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).

WFUZZ
$ wfuzz -c --hc=404 -t 200 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://172.17.0.2/FUZZ
* Wfuzz 3.1.0 - The Web Fuzzer *
 
Target: http://172.17.0.2/FUZZ
Total requests: 220560
 
ID          Response  Lines  Word  Chars  Payload
───────────────────────────────────────────────────────
000001105  301       9 L    28 W  312 Ch  "important"
000002348  301       9 L    28 W  275 Ch  "backup"
000095524  403       9 L    28 W  275 Ch  "server-status"
8
EXPLORACIÓN DE /backup — USUARIO ENCONTRADO

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.

http://172.17.0.2/backup/backup.txt
 
Usuario para todos mis servicios: russoski (cambiar pronto!)
9
EXPLORACIÓN DE /important — MANIFIESTO HACKER

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.


Fuerza Bruta SSH — Hydra

10
ATAQUE DE DICCIONARIO CON HYDRA SOBRE SSH

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.

HYDRA
$ hydra -l russoski -P /home/kali/Desktop/diccionarios/rockyou.txt -f ssh://172.17.0.2 -t 20 -V
[ATTEMPT] target 172.17.0.2 - login "russoski" - pass "alexander" - 116 of 14344401
[ATTEMPT] target 172.17.0.2 - login "russoski" - pass "destiny" - 117 of 14344401
[ATTEMPT] target 172.17.0.2 - login "russoski" - pass "christian" - 118 of 14344401
[ATTEMPT] target 172.17.0.2 - login "russoski" - pass "sayang" - 120 of 14344401
[ATTEMPT] target 172.17.0.2 - login "russoski" - pass "america" - 121 of 14344401
 
[22][ssh] host: 172.17.0.2 login: russoski password: iloveme
[STATUS] attack finished for 172.17.0.2 (valid pair found)
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2026-04-29 17:32:51
USUARIO
russoski
CONTRASEÑA
iloveme
SERVICIO
SSH — puerto 22
FUENTE
rockyou.txt

// 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.


Acceso Inicial — SSH

11
PROBLEMA DE HOST KEY — REMOTE HOST IDENTIFICATION HAS CHANGED

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.

SSH — PRIMER INTENTO
$ ssh russoski@172.17.0.2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
Offending ECDSA key in /home/kali/.ssh/known_hosts:17
remove with: ssh-keygen -f '/home/kali/.ssh/known_hosts' -R '172.17.0.2'
Host key verification failed.
12
SOLUCIÓN — ELIMINAR ENTRADA ANTIGUA DE KNOWN_HOSTS

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.

SSH-KEYGEN
$ ssh-keygen -R 172.17.0.2
# Host 172.17.0.2 found: line 15
# Host 172.17.0.2 found: line 16
# Host 172.17.0.2 found: line 17
/home/kali/.ssh/known_hosts updated.
Original contents retained as /home/kali/.ssh/known_hosts.old
13
CONEXIÓN SSH EXITOSA COMO RUSSOSKI

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.

SSH — ACCESO EXITOSO
$ ssh russoski@172.17.0.2
Are you sure you want to continue connecting (yes/no)? yes
russoski@172.17.0.2's password: iloveme
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.18.12+kali-amd64 x86_64)
 
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
 
Last login: Tue Jun 18 04:38:10 2024 from 172.17.0.1
russoski@5396f9ec75cc:~$

Escalada de Privilegios

14
ENUMERACIÓN DE PERMISOS SUDO

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.

SUDO
russoski@5396f9ec75cc:~$ sudo -l
Matching Defaults entries for russoski on 5396f9ec75cc:
    env_reset, mail_badpass, secure_path=...
 
User russoski may run the following commands on 5396f9ec75cc:
    (root) NOPASSWD: /usr/bin/vim
15
BÚSQUEDA DE 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.

FIND SUID
russoski@5396f9ec75cc:~$ find / -perm -4000 2>/dev/null
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/su
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/umount
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/env
/usr/bin/chsh
/usr/bin/sudo

// ¿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/


Root & Easter Egg

16
EXPLOTACIÓN SUID — OBTENEMOS ROOT

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.

PRIVESC → ROOT
russoski@5396f9ec75cc:~$ /usr/bin/env /bin/sh -p
# whoami
root
17
EXPLORACIÓN POST-ROOT — EASTER EGG

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.

POST-ROOT
# ls /home
russoski  ubuntu
# cd /root && ls
Video-Nagore-Fernandez.txt
# cat Video-Nagore-Fernandez.txt
Al fin lo terminé! es tan hermosa.. <3
 
https://www.youtube.com/shorts/_v8GzGReTAk
✓ PWNED
MÁQUINA OBSESSION — DOCKERLABS — COMPLETADA

Referencia de Comandos

Descripción detallada de cada herramienta y comando utilizado en este writeup.

Nmap
nmap -p- -sSCV -n -Pn --min-rate=5000 --open -oX <IP>

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
xsltproc
xsltproc /usr/share/nmap/nmap.xsl scan.xml > reporte.html

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
FTP (cliente)
ftp <IP> → login anonymous

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
wfuzz
wfuzz -c --hc=404 -t 200 -w wordlist URL/FUZZ

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
Hydra
hydra -l user -P wordlist -f ssh://IP -t N -V

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
ssh-keygen -R
ssh-keygen -R <IP o hostname>

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
find (SUID)
find / -perm -4000 2>/dev/null

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)
/usr/bin/env (SUID)
/usr/bin/env /bin/sh -p

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/

Glosario

Conceptos clave utilizados en este writeup, explicados en contexto de ciberseguridad ofensiva.

FTP Anónimo (Anonymous FTP)
El protocolo FTP (File Transfer Protocol) permite acceso sin credenciales reales cuando el servidor tiene habilitado el login anónimo. El usuario se conecta con el nombre 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.
TTL (Time To Live)
Campo de los paquetes IP que indica cuántos "saltos" (routers) puede atravesar el paquete antes de ser descartado. Cada router decrementa el TTL en 1. En ciberseguridad, el valor inicial del TTL en la respuesta ping revela el sistema operativo del objetivo: TTL=64 → Linux/Unix, TTL=128 → Windows, TTL=255 → dispositivos de red Cisco. Es una técnica de OS fingerprinting pasivo que no requiere herramientas especiales.
Fuzzing Web (Directory Fuzzing)
Técnica que consiste en probar automáticamente miles de nombres de directorios y archivos en un servidor web para descubrir recursos no enlazados públicamente. Herramientas como wfuzz, gobuster o ffuf reemplazan un marcador en la URL con palabras de un diccionario y analizan el código de respuesta HTTP: 200 (existe), 301/302 (redirect), 403 (existe pero prohibido), 404 (no existe). Es fundamental en la fase de enumeración web de cualquier pentest.
Directory Listing
Vulnerabilidad de configuración web donde el servidor muestra el contenido de un directorio cuando no existe un archivo índice (index.html, index.php) y la opció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.
Ataque de Fuerza Bruta / Diccionario
Un ataque de fuerza bruta pura prueba todas las combinaciones posibles de caracteres. Un ataque de diccionario (más eficiente) prueba palabras reales de una lista precompilada. rockyou.txt (14.3M contraseñas filtradas de la brecha RockYou 2009) es el estándar en CTFs porque refleja contraseñas reales usadas por personas reales. Herramientas como Hydra, Medusa o Burp Intruder automatizan estos ataques contra servicios de red (SSH, FTP, HTTP, etc.).
SUID (Set User ID)
Bit de permiso especial en sistemas Unix/Linux. Cuando un archivo ejecutable tiene el bit SUID activo (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.
eUID vs rUID (Effective vs Real User ID)
En Linux, cada proceso tiene dos identidades de usuario. El rUID (Real User ID) es el usuario que realmente ejecutó el proceso. El eUID (Effective User ID) es el que determina los permisos de acceso durante la ejecución. En condiciones normales son iguales. Con SUID, el eUID se convierte en el del propietario del binario. La flag -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.
GTFOBins
GTFOBins (gtfobins.github.io) es un proyecto de referencia que cataloga binarios Unix/Linux que pueden ser usados por atacantes para escapar de entornos restringidos, escalar privilegios, transferir archivos o ejecutar código arbitrario. Documenta el abuso de binarios legítimos del sistema (como 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 y Host Key Verification
SSH protege contra ataques Man-in-the-Middle almacenando la huella digital (fingerprint) de la clave pública de cada servidor al que te conectas por primera vez, en el archivo ~/.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.
OSINT (Open Source Intelligence)
OSINT es la recolección de información de fuentes públicas o accesibles sin autenticación para apoyar un ataque o investigación. En este writeup, el nombre de usuario russoski se obtuvo por OSINT pasivo: del título HTTP detectado por Nmap ("Russoski Coaching"), del email en el footer del sitio (russoski@dockerlabs.es), y finalmente confirmado en el archivo backup.txt. La fase de OSINT/reconocimiento es crítica porque reduce el espacio de búsqueda para ataques subsecuentes.
Post-Explotación
Fase posterior a obtener acceso inicial a un sistema comprometido. Incluye: enumeración del sistema (usuarios, grupos, servicios corriendo), búsqueda de credenciales (archivos de configuración, historiales de bash, bases de datos locales), escalada de privilegios (de usuario estándar a root), movimiento lateral (hacia otros sistemas en la red), y persistencia (backdoors, cron jobs maliciosos). En CTFs, la post-explotación generalmente termina al obtener root y leer la flag.
vsftpd (Very Secure FTP Daemon)
vsftpd es uno de los servidores FTP más utilizados en sistemas Linux, especialmente Ubuntu. Se caracteriza por su enfoque en seguridad: por defecto tiene el acceso anónimo deshabilitado, chroot de usuarios (confinamiento al directorio home), y soporte para SSL/TLS. La versión 3.0.5 (usada en esta máquina) es estable y segura en su configuración por defecto — la vulnerabilidad aquí fue una decisión de configuración (habilitar anonymous login) y no un fallo del software.