HackTheBox - Planning


Creado
HackTheBox - Planning

Entorno Linux nivel fácil. Subdominios perdidos, monitoreo y ejecución de cositas con Grafana, credenciales volando y Crontab UI bien escondido internamente y ejecución de tareas automáticas pa romper todo.

💥 Laboratorio creado por: d00msl4y3r & FisMatHack.

TL;DR (Spanish writeup)

Debajo del tapete también hay que buscar.

Llegaremos a una plataforma de cursos, pero con poco que extraerle. Nos enfocaremos en buscar posibles subdominios, con eso llegaremos al servicio Grafana. Con credenciales previamente obtenidas, accederemos y encontraremos que la versión usada es vulnerable a una lectura de archivos y ejecución remota de comandos, la aprovecharemos para generar una sesión como el usuario root en un contenedor de Docker.

En las variables de entorno encontraremos cositas, con ello generaremos otra sesión, esta vez en el host de la máquina como el usuario enzo.

Internamente, se está ejecutando el servicio Crontab UI, realizaremos un redireccionamiento de puertos para interactuar con la aplicación. Jugaremos con ella para crear tareas programadas en el sistema y ejecutar comandos maliciosos. Así, obtendremos una terminal como el usuario root en el sistema host.

Clasificación de la máquina según la gentesita

Muuucha enumeración y vulns reales.

La idea inicial de esta locura es tener mis “notas” por si algun día se me olvida todo (lo que es muuuy probable), leer esto y reencontrarme (o talvez no) 😄 La segunda idea surgio con el tiempo, ya que me di cuenta que esta es una puerta para personitas que como yo al inicio (o simplemente a veces) nos estancamos en este mundo de la seguridad, por lo que si tengo la oportunidad de ayudarlos ¿por qué no hacerlo?

Un detalle es que si ves mucho texto, es por que me gusta mostrar tanto errores como exitos y tambien plasmar todo desde una perspectiva más de enseñanza que de solo pasos a seguir. Sin menos, muchas gracias <3

Juguete.

  1. Reconocimiento
  2. Enumeración
  3. Explotación
  4. Movimiento lateral: root (docker) -> enzo (host)
  5. Escalada de privilegios
  6. Post-Explotación

Reconocimiento #

Con ayuda de la herramienta nmap, vamos a descubrir que servicios (puertos) están siendo alojados en la máquina:

nmap -p- --open -v 10.10.11.68 -oA tcp-all-htb_planning
Parámetro Descripción
-p- Escanea todos los 65535 puertos
–open Devuelve solo los puertos que estén abiertos
-v Permite ver en consola lo que va encontrando
-oA Guarda el output en diferentes formatos, entre ellos uno “grepeable”. Lo usaremos junto a la función extractPorts de S4vitar para copiar los puertos en la clipboard rápidamente

El escaneo nos devuelve los servicios:

Puerto Descripción
22 SSH: Servicio que permite la obtención de una terminal de forma segura
80 HTTP: Servicio para interactuar con un servidor web

Usando la función extractPorts (referenciada antes) podemos tener rápidamente los puertos en la clipboard, en este caso no es necesario ya que tenemos pocos puertos, pero si tuviéramos varios evitamos tener que escribirlos uno a uno:

extractPorts tcp-all-htb_planning.gnmap

Con los puertos a la mano, le volveremos a pedir ayuda a nmap, esta vez para que intente extraernos la versión de cada servicio y que le lance algunos scripts nativos a ver si logra obtener más info:

nmap -sCV -p 22,80 10.10.11.68 -oA tcp-port-htb_planning
Parámetro Descripción
-p Indicamos a qué puertos queremos realizar el escaneo
-sC Ejecuta scripts predefinidos contra cada servicio
-sV Intenta extraer la versión del servicio

Obtenemos:

Puerto Servicio Versión
22 SSH OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
80 HTTP nginx 1.24.0 (Ubuntu)

También el puerto 80 nos indica que está realizando una redirección a un dominio, o sea, intentando traducir el contenido de un dominio hacia una dirección IP, pero como no tenemos definido eso, el sistema no entiende y no realiza la redirección. Ya veremos que significa esto.

Sigamos pues…

Enumeración #


Dando vueltas por el puerto 80 📌

Como ya vimos, el sitio web está realizando una redirección a un dominio. Para que nuestro sistema entienda eso de “redirección”, debemos apoyarnos del archivo /etc/hosts en nuestro sistema, él se va a encargar de hablar con el sistema y decirle “toma el contenido alojado en un sub/dominio y resuélvelo contra esta dirección IP por favor”:

➧ tail -n 1 /etc/hosts
10.10.11.68     planning.htb

Así que cuando visitemos planning.htb, va a ir a buscar el contenido alojado de ese dominio en la dirección IP 10.10.11.68.

Y si ahora visitamos el sitio web:

Nos encontramos una plataforma para estudiar, nos brindan algunos cursos y demás cositas así, de todo logramos rescatar esta info:

  • Este siendo ejecutado por nginx 1.24.0
  • Hay un correo con un posible usuario: info@planning.htb

Pero por ahora nada llamativo…

Encontrando servicios ocultos sobre el puerto 80 📌

Enumerando y enumerando, nos tiramos a descubrir posibles subdominios alojados sobre la misma IP (lo que ya hablamos sobre el /etc/hosts), para eso nos podemos apoyar en la herramienta ffuf:

Acá duré LA DE TI EM PO, todo por no variar mi lista de palabras, así que recuerden, siempre prueben varias wordlists antes de desechar el ataque 😘

ffuf -c -w /opt/seclists/Discovery/DNS/n0kovo_subdomains.txt -u http://10.10.11.68 -H 'Host: FUZZ.planning.htb' -fs 178

Lo único que le decimos es, “toma cada línea de un diccionario de palabras (en este caso n0kovo...) y reemplaza esa palabra en la cabecera Host, formando algo tal que HOLA.planning.htb, si la respuesta es distinta a 178 (básicamente quitamos falsos positivos), muéstrame por fa” (y ya sabríamos que existe un subdominio válido).

Upa, encontramos unooooo y al parecer relacionado con Grafana, lo agregamos al /etc/hosts y lo visitamos:

➧ tail -n 1 /etc/hosts
10.10.11.68     planning.htb grafana.planning.htb

¡Efectivamente, encontramos el servicio Grafana!!

👁️ Es una herramienta que permite el analisis y monitoreo de información.

Y si vemos un login, ¿qué se nos ocurre? JA, pues probar las credenciales que nos dieron como parte de las pruebas:

Funcionaleeeeees! Recorramos esta vuelta…

Nos encontramos la versión de Grafana que está siendo ejecutada:

Esta nos sirve para buscar posibles vulnerabilidades en la web.

Explotación #


Monitoreando archivos del sistema con Grafana 📌

Y sí, filtrando en internet sobre esa versión, nos encontramos el CVE CVE-2024-9264, el cual se ve prometedor para nuestro entorno.

Es una vuln relacionada con una característica “experimental” que se implementó y permite procesar expresiones como consultas SQL. Todo esto mediante la base de datos interna DuckDB. El tema es que en ese proceso, las expresiones no están correctamente sanitizadas y pueden permitir la lectura de archivos del sistema YYY la ejecución remota de comandos 😲

Y las guía de las cuales extraeremos que hacer (y en las cuales hay muuucha más info sobre la vuln si te interesa explorar):

Así que veamos.

Lo primero que debemos hacer es ir al home (después de loguearnos) y crear un Dashboard para asignar las expresiones y después jugar con la petición para intentar leer archivos y posiblemente ejecutar comandos remotamente:

Damos clic en Create Dashboard, después en Add visualization y despueeees en Mixed, llegamos a:

Le agregamos una expresión matemática, por ejemplo 1+1:

Revisando nuestro Burp Suite, debería habernos interceptado la petición en crudo:

Tenemos el resultado de la expresión, así que todo funcionando. Nos llevamos esa petición al Repeater y seguimos jugando.

Según la guía, debemos modificar el tipo de expresión de math a sql e inyectar como expresión una sentencia (usando la función read_csv_auto de DuckDB) para leer un archivo del sistema (en este caso /etc/passwd, el archivo con información de usuarios):

AYYYY! Podemos leer archivos del sistemaaaaaa, listo listo…

Ejecutando comandos en el sistema con Grafana 📌

Antes de volvernos locos enumerando archivos, recordemos que posiblemente también se pueda ejecutar comandos, por lo que con eso en mente, encontramos este script hecho en Python que automatiza ese proceso:

Lo que cambia de la expresión es el uso de la extensión shellfs, la cual permite enviar comandos al sistema.

Intentamos ejecutar el comando id:

FUNCIONAAAAAAAAAAAAA! Levantemos un puerto (nc -lvp 4450) e indiquémosle al servidor que nos envíe una terminal remota:

¡Listones, tamos que tamos!

Variabilidad: root (docker) -> enzo (host) #

Algo que notamos es que estamos en un contenedor de Docker, esto debido a que nuestro hostname tiene el ID del contenedor o que si listamos nuestra IP, nos va a mostrar una dentro del rango 172.17.0.0/16.

Por lo cual, necesitamos “escaparnos” de ahí y llegar al host, que es el que está alojando el contenedor (y si existen más, pues los contenedores).

En busca de credenciales, buscamos archivos de configuración relacionados con Grafana y encontramos este recurso, en él se nos indica que pueden existir datos en las variables de entorno.

Si revisamos, efectivamente tenemos info:

Estas variables de entorno tienen unas credenciales:

GF_SECURITY_ADMIN_PASSWORD
GF_SECURITY_ADMIN_USER

¿Y si son funcionales no solo en Grafana, sino que en el sistema? Pues probemos:

ssh enzo@planning.htb

🤪 😳 😜

Escalada de privilegios #

Nos ponemos a enumerar y encontramos cositas.

Backups guardando credenciales 📌

Tenemos un archivo de base de datos en el directorio /opt/crontabs:

Las crontabs son los archivos en los cuales se listan las cronjobs, ¿y qué es una cronjob? Es una tarea que se programa para que sea ejecutada de forma automática sobre el paso del tiempo.

En este caso hay una llamativa: está realizando un backup yyyy colocaron una contraseña para la creación del comprimido:

/usr/bin/docker save root_grafana -o /var/backups/grafana.tar
/usr/bin/gzip /var/backups/grafana.tar
zip -P P4ssw0rdS0pRi0T3c /var/backups/grafana.tar.gz.zip /var/backups/grafana.tar.gz
rm /var/backups/grafana.tar.gz

Pero no tenemos control sobre ningún comando, así que esto va a ser meramente informativo, nos guardamos la contraseña y el nombre del contenedor por sí algo:

root_grafana
P4ssw0rdS0pRi0T3c

Puertos en la profundidad 📌

Revisando si existen servicios internamente, encontramos el de Grafana sobre el puerto 3000 y otro sobre el puerto 5000:

Jmmm, está solicitando credenciales para acceder, tenemos varias, probando y probandoooo, al usar las recientemente descubiertas:

Tenemos accesoooooo :P

Crontab UYYY 📌

Tenemos como parte de la respuesta un título curioso: Crontab UI, si buscamos en la web, llegamos a este repo:

💼 Una forma grafica y sencilla de manejar tooodas las cronjobs del sistema.

Lindo lindo, buena herramienta.

¿Pero y cómo hacemos para interactuar correctamente con ella de forma gráfica? Jugando con un concepto llamado reenvío de puertos, el cual permite enviar el contenido alojado en un puerto (ya sea interno o externo) a otro puerto (también interno o externo).

En este caso nos va a servir para: tomar el contenido del puerto 8000 (el servicio Crontab UI internamente) y enviarlo por ejemplo al puerto 8000 de nuestra máquina, por lo tanto, es un reenvío de puertos local.

Con ayuda de SSH podemos hacerlo:

ssh enzo@planning.htb -L 8000:127.0.0.1:8000

Y si ahora visitamos el puerto 8000 de nuestra máquina local:

Nos solicita credenciales (tal y como hicimos con la petición mediante curl), las colocamos:

Y tamos dentro!

Tenemos acceso a la creación de tareas automatizadas, hagamos que nos ejecute una reverse shell:

Levantamos el puerto en nuestra máquina nc -lvp 4450 y ahora si, con ayuda de Crontab UI generamos la tarea cron para que sea ejecutada a cada minuto:

Guardamos y obtenemos:

Pa no esperar, damos clic en Run now yyyyyy:

Contamos con acceso completo al sistema como el usuario root!! Y listones :P

Post-Explotación #


Flags 📌

Listones, buena máquina, nos puso a prueba en términos de enumeración (y recordó el uso de varios diccionarios para ataques de fuerza bruta). También recordamos el concepto del reenvío de puertos, me gustó.

Por ahora no es más, muchas gracias por tomarte el tiempo de leer y nos seguiremos encontrando por ahí, abrazos :3

Lanz

Lanz

Holap, simplemente quiero compartir contigo mis notas y que quizás, las tomes como apoyo. Este mundo es un camino raro, complicado a veces, pero divertido, diviertete (: (y entiende que estas haciendo :P)

Comments

comments powered by Disqus