Hacemos el escaneo de nmap:
Y vemos que esto es lo que corre sobre el puerto 80:
Y si hacemos fuzzing a esto vemos que nos encuentra el directorio /docs, donde nos pone algo de que no tenemos acceso, así como el directorio /api que nos muestra como la versión de la API:
En este punto, es fácil pensar que si ponemos /v1 en la dirección, nos va a acceder a un endpoint:
Y al poner admin, vemos que existe pero que no tenemos acceso:
Y probamos en hacer fuzzing de la dirección de /user y nos encuentra muchos usuarios con valores numéricos, pero nos fijamos en el tamaño de las respuestas, donde para el usuario 01 vemos algo raro:
dirb http://10.10.11.161/api/v1/user/
Lo pegamos en el navegador y vemos algo raro:
En este punto, también podemos hacer peticiones dentro de esta url pero usando POST, por lo que podemos hacerlo con wfuzz de la siguiente forma:
wfuzz -c -X POST -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt http://10.10.11.161/api/v1/user/FUZZ
Aunque con esto nos saca muchas respuestas:
Quitamos las respuestas 405 y nos encuentra estos dos directorios:
wfuzz -c -X POST --hc=405 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt http://10.10.11.161/api/v1/user/FUZZ
Este es el directorio /login:
Y este el /signup:
Una vez descubiertos estos directorios, podemos intentar autenticarnos con curl de la siguiente forma:
curl -X POST http://10.10.11.161/api/v1/user/login -d 'username=admin&password=admin'
Y si intentamos registrarnos con el directorio signup, nos encontramos con un error .dict:
Por lo que lmandamos la data en formato json pero nos sigue saliendo otro error, donde falta el campo email:
curl -X POST http://10.10.11.161/api/v1/user/signup -H "Content-Type: application/json" -d '{"username": "pinguino", "password": "pinguino"}'
Por lo que vamos a hacerlo igual mandando un correo:
curl -X POST http://10.10.11.161/api/v1/user/signup -H "Content-Type: application/json" -d '{"username": "pinguino", "password": "pinguino", "email": "pinguino@example.com"}'
Y ahora sí funciona:
Y al enviar otra vez esta petición vemos que ya hemos registrado el usuario en el sistema:
Y ahora si probamos en iniciar sesión con estas credenciales, nos encontramos con un token de acceso de sesión:
curl -X POST http://10.10.11.161/api/v1/user/login -d 'username=pinguino@example.com&password=pinguino'
Ahora que tenemos forma de autenticarnos, podemos intentar acceder al directorio /docs, que como estamos viendo, tenemos acceso a él:
Por lo que accedemos a este directorio de forma autenticada, pero vemos que tampoco nos muestra nada:
curl -X POST http://10.10.11.161/docs/ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWNjZXNzX3Rva2VuIiwiZXhwIjoxNzAzNTQxOTE2LCJpYXQiOjE3MDI4NTA3MTYsInN1YiI6IjIiLCJpc19zdXBlcnVzZXIiOmZhbHNlLCJndWlkIjoiNTczYmUwOTItM2YwZS00MGM4LThkNTMtOWI2OGU0YjRkNDNlIn0.ClkgxdsukuTsyrFkX-UzZh43v_JBij4PzWMbCrVaWwI"
Y si usamos el parámetro -I podemos ver las cabeceras de esta respuesta, donde podemos ver que se está aplicando un redirect:
Viendo esto, vamos a interceptar la petición con burp suite:
Y debemos de ir a esta parte para hacer que en el redirect se esté aplicando en todo momento el web token que tenemos y así poder acceder al directorio /docs/:
Y aquí pegamos lo mismo que habíamos enviado antes con curl:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWNjZXNzX3Rva2VuIiwiZXhwIjoxNzAzNTQxOTE2LCJpYXQiOjE3MDI4NTA3MTYsInN1YiI6IjIiLCJpc19zdXBlcnVzZXIiOmZhbHNlLCJndWlkIjoiNTczYmUwOTItM2YwZS00MGM4LThkNTMtOWI2OGU0YjRkNDNlIn0.ClkgxdsukuTsyrFkX-UzZh43v_JBij4PzWMbCrVaWwI
Y ahora, al recargar, vemos que burpsuite añade la cabecera de autenticación:
Y accedemos:
Y hay un apartado donde vemos que nos están dando la flag de user:
Vemos que si tramitamos esto por terminal, nos devuelve también la flag:
Si seguimos enumerando esta API, veremos que no tenemos permisos para hacer gran cosa, pero hay un apartado de updatepass, donde nos piden el guid del usuario que queramos cambiarle la contraseña, por ejemplo de admin:
Y en esta parte podemos detectar el guid del usuario admin al pasarle su id, que ya sabemos que es el 1:
Y se la cambiamos:
Vemos que funciona correctamente:
Y ahora en la parte de arriba a la derecha tenemos un panel de autenticación, que podemos probar a entrar como el usuario admin:
Y estamos dentro:
Y ahora sí podemos listar archivos internos de la máquina:
Y esto mismo podemos listarlo desde consola también, ya que la web nos muestra la petición:
Y también podemos visualizar la flag, que está dentro del usuario htb que vemos que ya existe dentro de la máquina:











































