Skip to main content
HackTheBox machines – ouija WriteUp

HackTheBox machines – ouija WriteUp

Ouija es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox basada en Linux

Ouija es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Insane (en un principio salió como Hard pero fue cambiada debido a su dificultad).

En este caso se trata de una máquina basada en el Sistema Operativo Linux.

 

Escaneo de puertos

Como de costumbre, agregamos la IP de la máquina Ouija 10.129.176.29 a /etc/hosts como ouija.htb y comenzamos con el escaneo de puertos nmap.

Una vez detectados los puertos abiertos lanzamos un segundo escaneo contra los mismos

 

Enumeración

Si accedemos a través de la ip al portal web del puerto 80 nos lleva a la página por defecto de apache, así que accedemos a través del nombre de dominio ouija.htb y vemos la siguiente página web

HackTheBox machines – ouija WriteUp

 

Revisamos la página a fondo pero no conseguimos ver gran cosa así que enumeramos subdominios y descubrimos lo siguiente

 

Descubrimos el subdominio de gitea.ouija.htb así que lo añadimos al fichero de hosts y accedemos

HackTheBox machines – ouija WriteUp

 

Como no disponemos de credenciales nos creamos una cuenta y entramos, y si miramos los repositorios vemos uno público del usuario leila

HackTheBox machines – ouija WriteUp

 

Accedemos y revisamos el repositorio

Revisión del repositorio

 

Explotación de LFI

Revisando a fondo el repositorio encontramos las versiones del software utilizado y nos centramos en el software HA-Proxy

Si buscamos en google encontramos una vulnerabilidad de Request Smuggling

Y si buscamos un poco más encontramos una poc en github de la vulnerabilidad CVE-2021-40346

Así que siguiendo la poc y conociendo como funciona la vulnerabilidad vamos a lanzar una primera petición para sacar la uri de /admin

Y descubrimos con la misma un dominio nuevo, dev.ouija.htb, así que ahora lanzamos una petición contra dicho dominio

Explotando la vulnerabilidad

 

Siguiendo el ejemplo vemos dos ficheros que procederemos a descargar, el fichero app.js cuyo código es el siguiente

 

Y el fichero init.sh

 

Además si hacemos algunas pruebas conseguimos explotar un LFI, y con ello sacar el fichero passwd

Explotando un LFI

 

Explotando la API Rest

Llegados a este punto no podemos hacer mucho más por aquí así que vamos a ver la api del puerto 3000.

En la misma encontramos tres endpoints, así que vamos a probar los mismos.

Si vamos al endpoint de login nos pide unos parámetros

Aunque cuando le pasamos los mismos nos muestra un mensaje indicando que se encuentra en desarrollo

Si tiramos contra register nos indica directamente que el mismo está deshabilitado

Y si tiramos contra users, nos pide una cabecera y cuando la pasamos un token, el cual desconocemos

Pero todo apunta de que el camino va por este último.

Si volvemos al script de init.sh vemos el id del bot que utiliza para la autenticación

Y el hash utilizado

 

Si volvemos al fichero app.js que obtuvimos antes del portal de dev vemos los diferentes endpoint que hemos ido visitando, el token que si nos fijamos en la siguiente parte necesitamos que tenga permisos de admin

Y, una vez lo consigamos, si nos fijamos en la siguiente parte, podemos leer ficheros del sistema siempre y cuando no utilicemos los caracteres .. y ../

 

Conocida toda esta parte, vamos a necesitar generar ese token y para ello vamos a utilizar la herramienta hash_extender

Pero antes de poder hacer nada vamos a necesitar conocer la longitud del token. Para ello generamos un listado de posibles hashes y lo guardamos en un fichero

Una vez generados, en mi caso, he hecho un pequeño script que compruebe contra el portal hasta dar con el adecuado

 

Y ejecutamos para obtener la longitud y el token

 

Ahora que ya sabemos la longitud vamos a leer ficheros del sistema, no podemos utilizar los caracteres .. y ../ mencionados antes pero si nos fijamos en el script init.sh no nos hace falta ya que crea un enlace contra /proc

Así que lanzamos de nuevo el anterior script (esta vez con un fichero más pequeño de posibilidades) y obtenemos las variables de entorno, descubriendo, que estamos en la home del usuario leila

 

Así que el siguiente paso será obtener la clave ssh del usuario leila

 

Obteniendo la flag de user

Ahora que tenemos la clave del usuario, formateamos correctamente la misma, accedemos y cogemos la flag

 

Escalado de privilegios

Ahora, enumeramos para escalar a root y vemos un directorio en la raíz que sirve varias aplicaciones

Revisamos a fondo cada uno de los directorios y encontramos un fichero index.php con una parte interesante de código

 

En el mismo, vemos que realiza la validación de credenciales con una función que no conocemos llamada say_lverifier, además si revisamos bien, vemos un directorio oculto, .debug, en el cual hay un fichero maps con las direcciones de memoria, en concreto nos fijamos en las de la librería desconocida

Obteniendo con ello la ruta en la cual se encuentra

 

Revisamos los puertos abiertos en la máquina y vemos el puerto 9999 en local

Así que nos mandamos el mismo con una tunelización por ssh y accedemos al navegador viendo el siguiente formulario de login

Análisis de la aplicación web interna

 

Descubrimiento del buffer overflow

Para ver como podemos explotarlo vamos a descargarnos la librería y vamos a analizarla con ida

Revisando el código de la librería Revisando el código de la librería

 

Nos fijaremos principalmente en dos funciones, event_recorder y validating_userinput, la primera es la encargada de llevar a cabo el registro de eventos y por lo tanto la que finalmente leerá nuestro fichero y se encargará de su ejecución.

Por otro lado, la función validating_userinput, será la que aprovechemos para provocar el desbordamiento y llevar a cabo nuestro ataque. En esta, si nos fijamos, la variable username tiene un tamaño asignado de 800 bytes pero la entrada está limitada. Por otra parte se utiliza el tipo size_t para almacenar el tamaño del nombre de usuario, el cual tiene un tamaño máximo de 65535 bytes, por lo que el desbordamiento de enteros se encuentra aquí.

 

Explotación del BOF

Para probarlo creo un contenedor en docker muy simple con el siguiente Dockerfile

 

Generamos la imagen y levantamos el contenedor

 

Una vez dentro hacemos los pasos para aplicar la librería

Y lanzaremos gdb

Una vez ejecutado, vamos a forzar el crash para encontrar el punto donde atacarlo

Debugeando el bof

 

Y ya tenemos el crash, ahora veamos donde y cuanto podemos escribir, así que hacemos varias pruebas y detectamos que el primer parámetro de la función event_recorder se escribe en el nombre de usuario 16:800, y que el segundo se escribe en el nombre de usuario del archivo de registro 128:800 por lo que vamos a hacer otra prueba.

Generamos el siguiente payload

Y lanzamos

Verificación del desbordamiento

 

Con las pruebas realizadas vemos que podemos controlar la ruta del archivo de registro y el contenido del mismo, por lo que podemos utilizarlo para obtener una revshell con root.

Para ello vamos a crear un directorio cuyo nombre sea codigo php, despues modificar l aentrada y saltar para finalmente escribir el archivo php en el directorio del portal web.

 

Así que vamos a crear el directorio

 

Ahora creamos el payload

 

Y lanzamos con burp la petición

Ejecutando el payload

 

Si vamos al servidor vemos como se ha creado el fichero test.php con el contenido de nuestro payload

Verificando el ataque exitoso

 

Verificamos que funciona

Verificando el ataque exitoso

Y lanzaremos la siguiente revshell

Así que url encodeamos y mandamos la petición

Y somos root

 

Obteniendo la flag de root

Como último paso ya siendo root, cogemos la flag

Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.

 

Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace

 

1 thoughts on “HackTheBox machines – ouija WriteUp

  1. No estoy consiguiendo ejecutar el buffer overflow de esa manera, a lo mejor me estoy dejando algo pero no caigo, muy buen write up de todas <3
    Buen trabajo ^^

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *