Mentor

Publicado: 23 de Mayo de 2025 Autor: Josรฉ Miguel Romero aKa x3m1Sec Dificultad: โญ Medium
๐ Descripciรณn
Mentor es una mรกquina Linux de dificultad media que presenta mรบltiples vectores de ataque y tรฉcnicas de enumeraciรณn. La mรกquina aloja una aplicaciรณn web Flask que permite a los usuarios escribir citas motivadoras, complementada con una API REST documentada.
La explotaciรณn inicial requiere una enumeraciรณn exhaustiva que incluye el descubrimiento de servicios SNMP en el puerto 161/UDP, donde mediante fuerza bruta se obtienen credenciales vรกlidas almacenadas en strings de comunidad. Paralelamente, el fuzzing de virtual hosts revela un subdominio API (api.mentorquotes.htb) que expone endpoints administrativos protegidos por autenticaciรณn JWT.
El vector de ataque principal involucra la autenticaciรณn en la API utilizando credenciales obtenidas via SNMP, seguido del abuso de una funcionalidad de backup vulnerable a inyecciรณn de comandos. Esta vulnerabilidad permite ejecutar cรณdigo remoto y obtener acceso inicial al sistema, aunque se descubre que el acceso es a un contenedor Docker.
La escalada de privilegios requiere tรฉcnicas de pivoting mediante port forwarding (utilizando ligolo-ng) para acceder a una base de datos PostgreSQL interna. Las credenciales extraรญdas de la base de datos permiten el acceso SSH al host real, y la escalada final se logra mediante el descubrimiento de credenciales adicionales en archivos de configuraciรณn SNMP y el abuso de permisos sudo mal configurados.
Vectores de ataque principales:
Enumeraciรณn SNMP y fuerza bruta de community strings
Fuzzing de virtual hosts y descubrimiento de APIs
Inyecciรณn de comandos en endpoint de backup
Pivoting desde contenedor Docker al host principal
Escalada mediante credenciales en archivos de configuraciรณn
Abuso de permisos sudo
๐ญ Reconocimiento
Ping para verificaciรณn en base a TTL
๐ก Nota: El TTL cercano a 64 sugiere que probablemente sea una mรกquina Linux.
Escaneo de puertos TCP
Enumeraciรณn de servicios
Escaneo de puertos UDP
โ ๏ธ Importante: Detectamos durante la fase de enumeraciรณn con nmap que se estรก realizando virtual hosting. Debemos aรฑadir el siguiente vhost a nuestro fichero /etc/hosts
161 SNMP (UDP)
En primer lugar podemos hacer fuerza bruta para descubrir distintos strings de comunidades

Nos genera un fichero bastante extenso con todas las strings pero tras una enumeraciรณn profunda descubrimos algo que podrรญa sernos รบtil y que podrรญa ser una credencial porque se estรก usando con un script en python llamado login.py:

๐ Enumeraciรณn Web
80 HTTP
Enumerando el servicio web del puerto 80 de forma manual, no vemos gran cosa aparte de un portal donde los usuarios escriben citas motivadoras:

Enumeramos las tecnologรญas usando wappalyzer y vemos que estรก construida con python 3 y Flask:

Interceptamos la peticiรณn con Burpsuite y encontramos en la respuesta que el server es Werkzeug 2.0.3

Fuzzing de directorios (mentorquotes.htb)
No hallamos ningรบn recurso realizando fuzzing de directorios con gobuster y feroxbuster.
Fuzzing de vhosts (mentorquotes.htb)
Durante la realizaciรณn del fuzzing de vhost, es importante destacar que tuve que ajustar el comando usando varios diccionarios y aรฑadiendo finalmente la opciรณn -mc all, la cual fue clave para que obtenga cualquier tipo de cรณdigo de respuesta:
Hallรณ un recureso api con un cรณdigo de respuesta 404

Aรฑadimos este nuevo vhost api.mentorquotes.htb al fichero /etc/hosts
Volvemos a realizar fuzzing de directorios sobre el nuevo vhost descubierto:
Fuzzing directorios (api.mentorquotes.htb)

Encontramos varios recursos:
http://api.mentorquotes.htb/admin/

http://api.mentorquotes.htb/users/

http://api.mentorquotes.htb/docs
Uno de los recursos descubiertos contiene documentaciรณn sobre la API:
http://api.mentorquotes.htb/docs


Apuntamos este usuario por si pudiese sernos de utilidad.
๐ป Explotaciรณn
Vamos a jugar con la API para ver si podemos encontrar un vector de ataque. Atacamos el endpoint de login usando el usuario que hemos obtenido "james" y usamos como contraseรฑa el valor encontrado en la string de snmp:
Vemos que el servicio nos responde con lo que podrรญa ser un token:

Existe otro endpoint /users que requiere de especificar una cadena de autorizaciรณn para poder usarlo, probemos con el token que hemos obtenido:

Construimos la peticiรณn GET con curl especificando el token en la cabecera de autorizaciรณn y hacemos un pipe de jq para formatear la salida a formato JSON para una mejor visualizaciรณn de la salida:
![[Pasted image 20250523141535.png]]
Por otro lado, si vamos al endpoint /admin e interceptamos la peticiรณn con burp y aรฑadimos la cabecera de autorizaciรณn con el token obtenido:

Vemos en la respuesta que parece que hay un par de funciones de administraciรณn:
Repetimos la misma operaciรณn con cada uno de ellos:
/check

Parece que esta funciรณn aรบn no ha sido implementada y nos sirve de utilidad.
/backup

Esta nos indica que el tipo de peticiรณn no estรก permitida, cambiemos el GET por un POST:

Ahora nos falla porque el servicio espera que le enviemos como parรกmetro un JSON que tenga esa estructura con un body.
Aรฑadimos primeo la cabecera content-type: application/json y metemos un json vacรญo

Ahora que ya sabemos la estructura que espera el servicio, la pasamos en la llamada:

Vemos que el servicio devuelve un DONE!, por lo que a priori parece haber ido bien.
Initial foothold
Podemos abusar de esta peticiรณn para intentar ejecutar un RCE . Veamos primero si el parรกmetro path es vulnerable a inyecciรณn de comandos
Iniciamos la captura de trรกfico de protocolo icmp
Usamos el siguiente payload mediante el uso del carรกcter ; para ejecutar la inyecciรณn de comandos:
Interceptamos la peticiรณn ping a nuestro host, luego la inyecciรณn funciona y validamos la prueba de concepto.

Iniciamos un listener
Veamos ahora como podrรญa llevar a cabo esto con una shell one liner para llevar a cabo un RCE:


Ganamos acceso a la mรกquina. Al principio parece que nuestro objetivo es doble, porque somo root, pero pronto nos damos cuenta de que estamos dentro de un contenedor de docker
Obtenemos la primera flag en el directorio /home/svc

๐ Escalada de privilegios
Enumeramos la mรกquina y descubrimos un archivo db.py en el directorio /app/app:

Para ganar acceso a la base de datos, necesitamos realizar port forwading, en este caso no podemos usar ssh porque no tenemos ninguna clave privada con la que podes conectarnos usando este protocolo, lo haremos usando ligolo-ng
Descargamos ligolo tanto el proxy como el cliente
Definimos una interfaz para ligolo
Levantamos la interfaz
Iniciamos el proxy en el host de ataque
Transferimos el agente al host destino, le damos permisos de ejecuciรณn y lo ejecutamos
Ahora aรฑadimos un listener para realizar el redireccionamiento
A continuaciรณn usamos el siguiente comando para conectarnos a la base de datos
El hash estรก en md5, obtenemos la contraseรฑa:

Ahora nos conectamos a travรฉs del protocolo ssh usando el usuario svc y la contraseรฑa obtenida:
Escalada a usuario james
Buscamos ahora la escalada de privilegios
Transferimos la herramienta linpeas.sh al directorio /tmp de la mรกquina objetivo, le damos permisos de ejecuciรณn y ejecutamos.

Revisando el archivo /etc/snmp/snmpd.conf encontramos una credencial:

Escalada a root
Nos autenticamos como james usando la contraseรฑa obtenida en el fichero snmpd.conf y logramos escalar a este usuario. A continuaciรณn, verificamos si puede ejecutar algรบn comando como root:
En este caso, vemos que james puede ejecutar una shell como root, por lo que la escalada es muy sencilla y basta con hacer lo siguiente:
Last updated