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.
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
| Fase | Técnica / Herramienta | Resultado |
|---|---|---|
| Despliegue | auto_deploy.sh | Máquina activa 172.25.0.2 |
| Reconocimiento | Nmap -sC | Puertos 22 y 80 |
| Enum. Web | curl (código fuente) | Comentario HTML → usuario camilo |
| Acceso inicial | Hydra + rockyou.txt | camilo : password1 |
| Post-explotación | Navegación + cat correo.txt | Contraseña de juan: 2k84dicb |
| Lateral movement | su juan | Shell como juan |
| Escalada | sudo 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● ● ●
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● ● ●
// 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● ● ●
captura — inspector devtools (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● ● ●
// 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● ● ●
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:
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● ● ●
// 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
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.
/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● ● ●
// 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● ● ●
// 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● ● ●
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● ● ●
// root obtenido ✓
Escalada completada. Shell como root obtenida via sudo ruby -e 'exec "/bin/sh"'.
06
// Reporte & conclusiones
vulnerabilidades
Vectores explotados
| Vulnerabilidad | Impacto | Mitigación |
|---|---|---|
| Comentario HTML con nombres de usuario | Usuarios del sistema expuestos | Nunca dejar información sensible en comentarios del código fuente |
| Contraseña débil SSH (password1) | Acceso inicial via fuerza bruta | Política de contraseñas fuertes + deshabilitar autenticación por password |
| Contraseña en texto plano en correo interno | Movimiento lateral a usuario juan | Nunca compartir contraseñas por mensajes internos sin cifrar |
| sudo ruby NOPASSWD sin restricciones | Escalada completa a root | Auditar /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.