Máquina “HORIZONTALL” – HTB

Reconocimiento:

¡Bienvenidos nuevamente! Como ya vimos en los otros Write Ups, lo que primero debemos hacer es crear un directorio con el nombre de la máquina con la que trabajaremos, en este caso será HORIZONTALL:

Una vez creado nuestro directorio, vamos a crear los espacios (subdirectorios) con los que vamos a organizar toda la información que vamos a ir identificando. Para esto, personalmente, uso una función definida en la ZSHRC que se llama mkt. Esta función lo que hace es crear de manera rápida todos los directorios que posiblemente necesite para trabajar:

Una vez creado todo el espacio de trabajo, vamos a ingresar al directorio NMAP para iniciar con el escaneo de puertos y servicios, en el cual ejecutaremos una segunda función que uso, igual definida en una ruta absoluta, que se llama whichsystem.py. Esta función en Python nos permite identificar mediante el TTL el sistema operativo de nuestro objetivo.

“Recordemos que los sistemas Linux tienen un TTL de 64, mientras que los sistemas Windows tienen un TTL de 128”.

Esta función utiliza estos parámetros para identificar, por proximidad, el sistema operativo:

Una vez que tenemos el sistema identificado, comenzamos con el escaneo básico. Ejecutamos el siguiente comando de NMAP:

Y M4nDr4K3, qué son todos esos parámetros? Los explicamos en los anteriores Write Ups, pero acá te dejo nuevamente la explicación:

  • -p-, este parámetro indica que quiero que escanee todos los puertos por defecto (65535)
  • –open, esta parámetro indica que solo quiero que me reporte los puertos con estado OPEN
  • -sS, indica que haré un escaneo TCP Syn Port
  • –min-rate 5000, indica que mandaré 5000 paquetes por segundo durante el escaneo
  • -vvv, indica que me reporte la información ni bien la obtenga y así no esperamos a que termine todo el escaneo
  • -n, indica que no queremos que realice un escaneo con resolución DNS porque esto demoraría mucho el escaneo
  • -Pn, indica que no se ejecute un reconocimiento por ICMP (ping)
  • -oG, indica que exportará los resultados en formato “grepeable” al archivo “allPorts”

El escaneo nos devuelve el siguiente resultado:

En este punto, vamos a hacer uso de otra utilidad que está en la ZSHRC para parsear la información del archivo allPorts. Esta utilidad se llama extractPorts:

Esta función muestra un resumen de los puertos abiertos, el host y esta información de puertos la coloca en el clip-board para que puedas hacer un ctrl+shift+v directamente para el siguiente paso (muy útil cuando tienes muchos puertos abiertos)

Una vez con la información copiada en la clip-board, ejecutamos el siguiente comando nmap:

Acá una vez más, una breve explicación de los parámetros usados:

  • -p, a diferencia del anterior escaneo, este indica solo algunos puertos (los de la clip-board) que queremos que escanee
  • -sC, indica que queremos ejecutar una serie de scripts básicos de reconocimiento con los que cuenta NMAP
  • -sV, indica que queremos que nos obtenga la versión de los servicios que corren en ese puerto
  • -oN, indica que vamos a exportar estos resultados en un archivo en formato NMAP llamado “targeted”

El resultado que nos muestra este escaneo es el siguiente:

Podemos explorar este resultado con un batcat sobre el archivo targeted:

Podemos ver que se tiene los puertos 80 y 22 abiertos. Lo que procede entonces es hacer una revisión de qué es lo que está publicado en el puerto 80 desde el explorador:

Noten que en la URL no puse la dirección IP, esto debido a que se está aplicando Virtual Hosting. Esto lo podemos ver en el resultado del NMAP:

Esta vez lanzaremos un escaneo adicional sobre este Virtual Host para ver si podemos identificar algo más:

NOTA: Lo que hace el script “http-enum” es aplicar un pequeño fuzzing sobre la URL para ver si podemos identificar directorios con los que podamos trabajar más adelante.

El resultado es algo frustrante pues no nos devuelve nada de nada:

Cambiaremos de directorio ahora para trabajar en un fuzzing un poco más artesanal.

Luego de esperar pacientemente, el resultado sigue siendo igual de frustrante que hace un momento:

Podemos ver que solo listamos 3 directorios: img, css y js, de los cuales en ninguno tenemos permisos para poder explorar o hacer algo más.

Lo que podemos hacer en este punto es ver a nivel de código fuente qué podemos encontrar para explotar. Para eso utilizaremos una curl para mandar una petición GET y lo concatenaré con htmlq y batcat para que los resultados sean más entendibles:

Vemos que hay archivos con nombre “app…” que puede que nos sirvan. Para tener una mejor visibilidad de estos archivos vamos a hacer unos cuantos grep a nuestra sentencia curl.

Nos vamos a centrar en la revisión del archivo .js que encontramos.

Hacemos un nuevo curl pero agregamos la ruta donde está nuestro .js y vemos si es que tiene alguna conexión o algún parámetro que esté involucrando al Virtual Host:

El resultado asusta un poco pero acá es donde debemos tener ojo clínico para encontrar las coincidencias… O bien podemos afinar aún más nuestro curl y le mandamos otros parámetros grep para encontrar posibles configuraciones en el archivo que busquen establecer conexión mediante http:

Vemos que hay un subdominio que no lo habíamos tomando en cuenta antes: api-prod.horizontall.htb. Esto lo agregaremos en el /etc/hosts para ir haciendo revisiones adicionales.

En una revisión con el complemento de FireFox, Wappalyzer, vemos que se tiene un CMS instalado: STRAPI

Si hacemos una búsqueda rápida de exploits disponibles en nuestro Kali, vemos que tenemos lo siguiente relacionado a STRAPI:

Antes de avanzar con eso, podemos hacer una revisión con curl sobre la URL que obtuvimos con el subdominio donde vimos que tiene un directorio denominado “/reviews”:

Aparentemente lo que tenemos acá son potenciales nombres de usuarios.

Con un nuevo Fuzz sobre este subdominio veremos si encontramos algún directorio con el que podamos trabajar:

Tenemos el siguiente resultado, donde podemos ver que tiene un directorio llamado “admin” y uno bastante peculiar con un código de respuesta 403 llamado “Users”:

Al navegar en el directorio “admin” encontramos que es una pantalla de login para STRAPI:

Luego de hacer un fuzz al directorio “admin” encontramos que tiene un sub directorio llamado “init”. Al aplicar un curl sobre este subdirectorio podemos encontrar los siguiente:

Ganando acceso:

Si regresamos a unos pasos atrás, cuando ejecutamos el searchsploit vemos que la versión que hemos obtenido ahora es la que se muestra en dicha búsqueda.

Ahora vamos a cambiar de directorio para trabajar con los exploits que vayamos a necesitar, en este caso vamos a copiar el exploit que vimos en el paso de searchsploit:

Ahora que lo tenemos listo, solo queda ejecutar para ver si este scritp nos devuelva algo interesante:

Como podemos ver, la ejecución del script es exitosa y tenemos una ventana de ejecución remota de comandos. Si leemos a detalle lo que hace el scrip veremos que es una ejecución “blind”, es decir que no veremos ningún output de los comandos que ejecutemos. Pero para eso podemos hacer una captura de paquetes ICMP para ver si los comandos que ejecutamos funcionan correctamente:

Como podemos ver, nuestro Kali recibe una traza ICMP desde el servidor víctima, lo que confirma que podemos ejecutar comandos de manera remota. Pero para trabajar de forma más clara y efectiva, montaremos una shell reversa para que podamos ver los outputs de los comandos que lanzamos. Para eso, primero, nos ponemos en escucha por el puerto 443:

Posteriormente levantaremos un servidor web con Python por el puerto 80:

En la misma ruta donde montamos este servidor, vamos a crear un archivo que se llame index.html pero que en el código va a tener el bash para generar nuestra reverse shell:

Desde el servidor ejecutaremos un curl donde consultaremos este archivo html para que se ejecuta nuestra reverse shell:

Y el resultado es que tenemos un reverse shell montada:

NOTA: recuerde hacer un tratamiento de la shell para que la tengan totalmente interactiva.

  • script /dev/null -c bash
  • Ctrl+z
  • stty raw -echo ; fg
  • reset
  • xterm

Una vez que tenemos todo listo, ya podemos buscar la flag de usuario que necesitamos:

ESCALANDO DE PRIVILEGIOS:

Comenzaremos a revisar los permisos que tenemos y el directorio desde conseguimos tener acceso al servidor. Veremos que hay un directorio que se llama “config”:

Una vez dentro, vemos que existe otro directorio llamado “environments” que contiene lo siguiente:

Acá realizaremos una búsqueda por palabras para ver si encontramos alguna información que nos sea de utilidad:

Podemos leer uno delos archivos de configuración para ver la información que se tiene:

Acá podemos ver que contamos con las credenciales del usuario “developer” para la base de datos mysql. Podemos intentar acceder a la base de datos y ver la información de la misma:

Acá podremos listar las bases de datos que se tienen:

En este caso elegiremos usar la base de datos STRAPI y listaremos las tablas que tenga:

De las tablas que se lista, la que más llama la atención es la de “strapi_administrator”, para lo que haremos una consulta para ver qué información guarda:

Vemos que la contraseña se encuentra encriptada y en primera instancia sabríamos que es la contraseña que cambió el script en Python que lanzamos para la intrusión.

Mucho más no vamos a encontrar a nivel de base de datos, lo que quiere decir que tenemos que ver fuera de ella para intentar hacer la escalada de privilegios.

Para los que están al tanto de las vulnerabilidades que se publican, les sonará familiar el nombre “pwnkit”:

Ya que sabemo más de esta vulnerabilidad, vamos a clonarnos un repositorio en nuestro Kali, en la ruta donde está nuestro servidor HTTP:

Luego vamos a comprimir el archivo para luego transferirlo al servidor víctima:

En el servidor hacemos un wget para obtener el archivo y luego lo vamos a descomprimir:

Una vez que estamos entro del directorio, vamos a compilarlo y posteriormente a ejecutarlo con ./cve-2021-4034:

Una vez ejecuta verificamos quiénes somos:

Como vemos, hemos logrado escalar privilegios a nivel de “root” y con esto ya podremos leer la flag de root que necesitamos:

Y esto sería todo para la máquina Horizontall con un enfoque en la explotación de unavulnerabilidad publicada como “pwnkit”. Espero que les haya gustado!

HORIZONTALL PWNED!!