DockerLabs Muy Fácil Linux Debian

Vacaciones

DockerLabs · Information Disclosure → Hydra SSH → Lateral Movement → sudo ruby PrivEsc

// ruta Nmap curl (HTML comment) Hydra camilo SSH camilo correo.txt → juan sudo ruby ROOT ✓
01

// Planificación & objetivo

paso 01
Objetivo del ejercicio
Vacaciones es una máquina de la plataforma DockerLabs con dificultad Muy Fácil, basada en Linux Debian. Expone SSH en el puerto 22 y un servidor web Apache en el puerto 80.

A diferencia de Trust, esta máquina introduce un concepto nuevo: el movimiento lateral — comprometer un usuario sin privilegios para desde ahí pivotar a otro usuario que sí los tiene. La cadena completa pasa por un comentario HTML oculto en el código fuente, fuerza bruta SSH, navegación de directorios en busca de información sensible y abuso de sudo con ruby.
paso 02
Resumen de fases
FaseTécnica / HerramientaResultado
Despliegueauto_deploy.shMáquina activa 172.25.0.2
ReconocimientoNmap -sCPuertos 22 y 80
Enum. Webcurl (código fuente)Comentario HTML → usuario camilo
Acceso inicialHydra + rockyou.txtcamilo : password1
Post-explotaciónNavegación + cat correo.txtContraseña de juan: 2k84dicb
Lateral movementsu juanShell como juan
Escaladasudo ruby -e 'exec "/bin/sh"'Shell root ✓
02

// Reconocimiento & despliegue

paso 03
Despliegue de la máquina
Desplegamos la máquina con el script auto_deploy.sh de DockerLabs. Levanta el contenedor, configura la red interna y nos sitúa dentro del entorno kali-pentesting listo para atacar. La IP asignada es 172.25.0.2.
Deploy
$ sudo bash auto_deploy.sh vacaciones.tar Máquina desplegada, su dirección IP es ——> 172.25.0.2 Presiona Ctrl+C cuando termines para eliminar la máquina
captura — despliegue● ● ●
Despliegue máquina Vacaciones
03

// Escaneo & análisis

paso 04
Escaneo de puertos — Nmap
Lanzamos Nmap con scripts NSE (-sC) para detección de servicios y fingerprinting. El resultado confirma dos servicios: SSH en el 22 (OpenSSH, Debian) y HTTP en el 80 (Apache 2.4.57, Debian). El título HTTP devuelve 400 Bad Request — señal de que el servidor web no responde a peticiones directas por IP sin host header correcto, pero el servicio está activo.
Nmap
# nmap -sC 172.25.0.2 PORT STATE SERVICE 22/tcp open ssh | ssh-hostkey: 2048 RSA / 256 ECDSA / 256 ED25519 80/tcp open http |_http-title: 400 Bad Request
captura — nmap output● ● ●
Output de nmap sobre Vacaciones
// puertos descubiertos
Puerto 22 (SSH) y 80 (HTTP). El 400 en el título web no significa que esté caído — hay que acceder directamente y revisar el código fuente.
paso 05
Inspección web — página vacía y código fuente
Accedemos al puerto 80. La página se muestra completamente en blanco — sin contenido visible, sin formularios, sin links. Este es un escenario típico donde la información está oculta en el código fuente HTML como comentarios. Inspeccionamos con las DevTools del navegador y confirmamos la pista: hay un comentario HTML que menciona a dos usuarios.
captura — web en blanco● ● ●
Web completamente en blanco
captura — inspector devtools (comentario HTML)● ● ●
Inspector DevTools mostrando comentario HTML
paso 06
Extracción del comentario — curl
Confirmamos el hallazgo con curl para ver el HTML crudo en terminal. El código fuente revela el comentario: "De: Juan Para: Camilo, te he dejado un correo es importante..." — dos nombres de usuario del sistema expuestos directamente: juan y camilo. El atacante sabe ahora con qué usuarios intentar acceso SSH.
curl
# curl 172.25.0.2 <!-- De : Juan Para: Camilo , te he dejado un correo es importante... -->
captura — curl revelando comentario HTML● ● ●
curl mostrando comentario HTML con usuarios
// hallazgo crítico
Comentario HTML expone dos usuarios del sistema: juan y camilo. Empezamos el ataque de diccionario por camilo ya que es el destinatario del mensaje — más probable que tenga credenciales débiles.
04

// Explotación & acceso inicial

paso 07
Fuerza bruta SSH — Hydra sobre camilo
Con el usuario camilo identificado, lanzamos Hydra con rockyou.txt contra SSH. En menos de un minuto Hydra encuentra las credenciales: la contraseña password1 — una de las más comunes en cualquier wordlist, lo que evidencia una política de contraseñas inexistente.
Hydra
# hydra -l camilo -P /usr/share/wordlists/rockyou.txt ssh://172.25.0.2 -t 4 [22][ssh] host: 172.25.0.2 login: camilo password: password1 1 of 1 target successfully completed, 1 valid password found
captura — hydra encontrando credenciales● ● ●
Hydra encontrando credenciales de camilo
Usuariocamilo
Contraseñapassword1
ServicioSSH / 22
paso 08
Conexión SSH — Acceso como camilo
Nos conectamos por SSH con las credenciales de camilo. El servidor emite una advertencia sobre algoritmos de intercambio de claves post-cuánticos — es un aviso informativo de OpenSSH moderno, no un error que impida la conexión. Obtenemos shell como camilo.

Primer intento: sudo -l — el sistema responde que camilo no tiene permisos sudo. Necesitamos otro vector: explorar el sistema en busca de información que nos permita pivotar a otro usuario.
SSH
# ssh camilo@172.25.0.2 camilo@172.25.0.2's password: password1 camilo@bf82ed37e7a7:~$ camilo@bf82ed37e7a7:~$ sudo -l Sorry, user camilo may not run sudo on bf82ed37e7a7.
captura — SSH + sudo -l sin permisos● ● ●
Shell SSH como camilo y sudo -l sin permisos
// sin permisos sudo
camilo no puede ejecutar sudo. Vector de escalada directa bloqueado — hay que explorar el sistema y buscar credenciales o información de otros usuarios.
05

// Post-Explotación & lateral movement

paso 09
Enumeración de directorios y correo interno
Recordando el comentario HTML — "Juan le dejó un correo a Camilo" — buscamos en /var/mail/, el directorio estándar de correo en sistemas Unix. Listamos el contenido: existe un directorio camilo/ con un archivo correo.txt. Además, cd .. y ls desde el home revela los usuarios del sistema: camilo, juan y pedro.

El contenido del correo es oro: Juan le avisa a Camilo que no terminó el trabajo del jefe y le deja su contraseña por si acaso: 2k84dicb.
Enumeración
camilo@host:~$ ls -a . .. .bash_logout .bashrc .cache .profile camilo@host:~$ cd .. && ls camilo juan pedro camilo@host:~$ ls /var/mail/camilo/ correo.txt camilo@host:~$ cat /var/mail/camilo/correo.txt Hola Camilo, Me voy de vacaciones y no he terminado el trabajo que me dio el jefe. Por si acaso lo pide, aqui tienes la contraseña: 2k84dicb
captura — navegación directorios + correo.txt● ● ●
Navegación de directorios y lectura de correo.txt
// credenciales encontradas
El correo interno expone la contraseña de juan: 2k84dicb. Pivotamos al usuario juan.
paso 10
Movimiento lateral — su juan
Usamos su juan para cambiar de usuario dentro de la misma sesión SSH. Con la contraseña del correo accedemos a la shell de juan. Ejecutamos sudo -l inmediatamente — esta vez el resultado es muy diferente: juan puede ejecutar /usr/bin/ruby como root sin contraseña (flag NOPASSWD).
Lateral movement
camilo@host:~$ su juan Password: 2k84dicb juan@host:/home/camilo$ sudo -l User juan may run the following commands: (ALL) NOPASSWD: /usr/bin/ruby
captura — su juan + sudo -l ruby● ● ●
su juan y sudo -l mostrando ruby NOPASSWD
// vector identificado
ruby ejecutable como root via sudo sin contraseña → escalada via GTFOBins.
paso 11
Consulta GTFOBins — ruby sudo
Consultamos GTFOBins para la entrada de ruby con permisos sudo. A diferencia de la máquina Trust donde la sección Shell de vim aparecía incompleta, aquí la documentación de ruby está perfectamente completa y clara. GTFOBins documenta que ruby permite ejecutar comandos del sistema con el método exec. El comando ruby -e 'exec "/bin/sh"' lanza una shell directamente. Como se ejecuta con sudo, la shell heredada tiene privilegios de root.
captura — gtfobins ruby sudo shell● ● ●
GTFOBins entrada ruby sudo shell
paso 12
Escalada de privilegios — sudo ruby
Ejecutamos el comando de GTFOBins con sudo. Ruby invoca exec "/bin/sh" — reemplaza el proceso actual por una shell /bin/sh. Como ruby corre con sudo, la shell resultante tiene uid=0 (root). Verificamos con whoami.
PrivEsc
juan@host:~$ sudo ruby -e 'exec "/bin/sh"' # whoami root
captura — shell root obtenida● ● ●
Shell root obtenida via sudo ruby
// root obtenido ✓
Escalada completada. Shell como root obtenida via sudo ruby -e 'exec "/bin/sh"'.
06

// Reporte & conclusiones

vulnerabilidades
Vectores explotados
VulnerabilidadImpactoMitigación
Comentario HTML con nombres de usuarioUsuarios del sistema expuestosNunca dejar información sensible en comentarios del código fuente
Contraseña débil SSH (password1)Acceso inicial via fuerza brutaPolítica de contraseñas fuertes + deshabilitar autenticación por password
Contraseña en texto plano en correo internoMovimiento lateral a usuario juanNunca compartir contraseñas por mensajes internos sin cifrar
sudo ruby NOPASSWD sin restriccionesEscalada completa a rootAuditar /etc/sudoers, eliminar permisos innecesarios
lecciones
Lecciones aprendidas
Vacaciones introduce el concepto de movimiento lateral — una técnica clave en pentesting real donde el acceso inicial no lleva directamente a root, sino que requiere pivotar entre usuarios del sistema. El hallazgo más valioso fue el correo interno en /var/mail/: una pista que el propio código fuente HTML había anticipado. Esta máquina refuerza la importancia de revisar todos los vectores de información disponibles antes de asumir que un usuario no tiene valor, y de nunca compartir credenciales en texto plano aunque sea en un sistema interno.
07

// Glosario

Information Disclosure (comentario HTML)
Vulnerabilidad por la cual el código fuente de una web expone información sensible — en este caso nombres de usuarios del sistema en un comentario HTML. Los comentarios son visibles para cualquiera que inspeccione el código fuente con DevTools o curl, aunque no aparezcan en la página renderizada. Nunca deben contener datos de usuarios, rutas internas, contraseñas ni mensajes privados.
Movimiento lateral (Lateral Movement)
Técnica de post-explotación en la que el atacante, tras obtener acceso como un usuario sin privilegios, utiliza información o credenciales encontradas en el sistema para acceder a otro usuario con más permisos. En este caso: camilo → juan via contraseña en texto plano. Es una fase crítica en ataques reales donde el objetivo final (root/admin) no es directamente accesible desde el primer punto de entrada.
GTFOBins — ruby
GTFOBins documenta que ruby puede escalar privilegios cuando tiene permisos sudo mediante el método exec, que reemplaza el proceso actual por el comando especificado. sudo ruby -e 'exec "/bin/sh"' lanza una shell /bin/sh con los privilegios del usuario que ejecuta sudo — en este caso root. A diferencia de vim (que usa el modo Ex), ruby ejecuta el exploit directamente desde la línea de comandos sin necesidad de entrar en ningún editor.
NOPASSWD en sudoers
La directiva NOPASSWD en /etc/sudoers permite a un usuario ejecutar un comando con sudo sin introducir contraseña. Aunque puede parecer conveniente en entornos automatizados, es un riesgo de seguridad grave: si el usuario es comprometido, el atacante obtiene acceso root instantáneo sin necesitar ninguna credencial adicional.
su — Switch User
Comando Unix que permite cambiar de usuario dentro de una sesión activa. su juan solicita la contraseña de juan y abre una shell en su contexto. A diferencia de SSH (que requiere conexión de red), su funciona localmente dentro de la misma sesión — ideal para movimiento lateral una vez dentro del sistema.
/var/mail — Buzón de correo Unix
Directorio estándar en sistemas Unix/Linux donde se almacena el correo local entre usuarios del sistema. No es correo de internet — es un mecanismo interno para que procesos y usuarios se envíen mensajes. En pentesting es uno de los primeros sitios a revisar tras obtener acceso, ya que puede contener información sensible como contraseñas, avisos internos o pistas sobre otros usuarios.