SAU
Descripción
- Nivel: Fácil.
- Temas a tratar: Enumeracion, SSRF, Command Injection.
- OS: Linux.
- Plataforma: HackTheBox.
- Fecha de retiro: 11/02/2023.
- IP victima: 10.10.11.224
- IP atacante: 10.10.14.36
Enumeración
Empezamos enumerando los puertos bajo el protocolo TCP abiertos con nmap.
1 | sudo nmap -p- -sS --min-rate 5000 -vv 10.10.11.224 -oN ports |
En este caso, encontramos puertos con el estado de filtrado (filtered). Esto puede deberse a que solo estén disponibles dentro de la red interna de la máquina, ya que pueden estar protegidos por algún Firewall u otro sistema de protección de acceso a la red. Descartamos estos puertos de momento y continuamos con un escaneo hacia los que están en estado de abierto (open).
22: Referente a una conexión ssh55555: De momento no me suena este puerto, así que puede que sea un servicio con el puerto cambiado
1 | sudo nmap -p22,55555 -sS -sV -oN scan 10.10.11.224 |
El puerto 22 no tiene una versión vulnerable para realizar enumeración de usuarios, así que solo nos queda el puerto 5555 y los puertos filtrados. El resultado que nos devuelve Nmap no identifica qué servicio está corriendo, pero vemos que está recibiendo información por el protocolo HTTP, lo cual puede ser un indicio de un sitio web. Veamos qué nos muestra nuestro navegador:
Ahora tenemos el sitio existente, y en la parte inferior tenemos información sobre el sitio: request-baskets y la versión 1.2.1. Busquemos si existe alguna vulnerabilidad sobre esta versión. Para esto suelo utilizar el buscador de Google o Sploitus.
En este caso encontramos un CVE asociado con esta versión, CVE-2023-27163. Verificando la vulnerabilidad en la plataforma del NIST, vemos que este CVE está asociado a un Server-Side Request Forgery (SSRF).
Server-Side Request Forgery
Esta es una vulnerabilidad que permite a un atacante poder realizar solicitudes HTTP a través de una funcionalidad vulnerable del lado del servidor.
Esto puede derivar a un acceso no autorizado a recursos en red interna que pueden ser vulnerables.
Un fallo típico de empresas es tener algún servicio vulnerable corriendo en su red interna, bajo la premisa de que como este servicio no se encuentra expuesto a internet, no hay necesidad de parchearlo.
Esta vulnerabilidad puede escalarse a muchas más implicaciones y peligros. Para esto, recomiendo leer el siguiente artículo del OWASP sobre esta vulnerabilidad.
Prueba de concepto
Anteriormente, en la etapa de enumeración, encontramos 2 puertos filtrados. El más importante a simple vista es el del puerto 80 (puerto comúnmente utilizado para sitios web). Ya tenemos a dónde queremos apuntar, ahora veamos cómo se aplica este SSRF.
En el artículo del NIST mencionado anteriormente, encontramos un enlace externo sobre cómo realizar esta explotación: request-baskets SSRF details. El redactor del artículo utiliza la herramienta Postman, pero para peticiones web prefiero utilizar la herramienta Insomnia (esto es por simple cuestión de gustos, incluso pueden utilizar Burpsuite para esto).
El articulo nos indica que se realiza una petición HTTP de tipo POST hacia la dirección /api/baskets/{name} del sitio, enviándole en el cuerpo de la petición la siguiente información en formato JSON:
1 | { |
Para recibir el sitio interno en el puerto 80 solamente retiramos solamente el texto /test ya que no conocemos si existe alguna dirección dentro del sitio con ese nombre.
Si no funciona, cambiamos el parametro “proxy_response” a true.
Al final tenemos así nuestra petición lista para enviar.
En el articulo de este CVE menciona que ahora hay que entrar a la URL que se mando en este caso /poc (URL completa http://10.10.11.224:55555/poc).
Entrando a la URL en la parte inferior nos encontramos el nombre de la aplicación y la versión:
- Powered by Maltrail (v0.53)
Busquemos si existe alguna vulnerabilidad para esta versión de Maltrail.
Busquemos si existe alguna vulnerabilidad para esta versión de Maltrail. Encontramos un exploit en Github que proporciona un RCE (Remote Command Execution). Analizando el código escrito en Python, vemos que inyecta una reverse shell en base64 a través de una petición HTTP. Esta reverse shell se aprovecha de la existencia de Python en el sistema para permitirnos realizar la conexión con la máquina víctima (voy a optar por utilizar la herramienta RevShells).
Adjuntamos la reverse shell al SSRF y al RCE encontrado en Github, nos ponemos en escucha con NetCat en el puerto 9001 (en mi caso el seleccionado):
Ahora ajustemos la shell a una interactiva para poder trabajar de manera mas cómoda:
1 | puma@sau:/opt/maltrail$ ^Z |
Escalada de privilegios
Ya que estamos como usuario, veamos cómo escalar los privilegios. En mi caso, tengo la costumbre de ver si tenemos algún permiso de ejecución como sudo:
1 | puma@sau:~$ sudo -l |
Muy bien tenemos systemctl veamos en GTFOBins si existe algo de sudo:
Listo existe pero en nuestro caso solo podemos utilizarlo para ver el estado del servicio trail.service probemos si funciona igual con el comando:
1 | puma@sau:~$ sudo /usr/bin/systemctl status trail.service |








