Username enumeration via account lock
Laboratorio de Portswigger sobre Authentication Vulnerabilities
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio es vulnerable a la enumeración de nombres de usuario. Utiliza bloqueo de cuentas, pero contiene un fallo lógico. Para resolver el laboratorio, debemos enumerar un nombre de usuario válido, realizar un ataque de fuerza bruta para obtener la contraseña de este usuario y luego acceder a la página de su cuenta. Tenemos a nuestra disposición un diccionario de usuarios Candidate usernames https://portswigger.net/web-security/authentication/auth-lab-usernames y el diccionario de contraseñas Candidate passwords https://portswigger.net/web-security/authentication/auth-lab-passwords
Guía de authentication vulnerabilities
Antes de completar este laboratorio es recomendable leerse esta guía de authentication vulnerabilities https://justice-reaper.github.io/posts/Authentication-Vulnerabilities-Guide/
Resolución
Al acceder a la web nos sale esto
En el login de My account si introducimos varias veces un usuario válido con contraseña incorrecta nos bloqueará la cuenta, de esta forma podemos validar si el usuario existe
Con este script crearemos un nuevo diccionario a partir del diccionario Candidate usernames https://portswigger.net/web-security/authentication/auth-lab-usernames el cual tenga nombres de usuarios repetidos 5 veces
1
2
3
4
5
6
7
8
9
10
11
12
13
input_path = "usernames.txt"
output_path = "modified_usernames.txt"
with open(input_path, "r") as input_file:
words = input_file.readlines()
result = ""
for word in words:
word = word.strip()
result += f"{word}\n" + (f"{word}\n" * 4)
with open(output_path, "w") as output_file:
output_file.write(result)
El siguiente paso es capturar la petición de inicio de sesión con Burpsuite, mandarla al Intruder y marcar el campo username para bruteforcearlo
Cargamos como payload el diccionario nuevo que hemos creado
En el apartado Resource pool creamos una nueva pool para enviar las peticiones de una en una, de esto modo nos aseguramos de que las peticiones vayan en orden
Hacemos el ataque, filtramos por Length y nos damos cuenta que el usuario info existe debido a que el servidor nos ha devuelto una repuesta con una longitud diferente
Ahora debemos hacer lo mismo para bruteforcear la contraseña
En la parte de Payloads pegamos las contraseñas del diccionario Candidate passwords https://portswigger.net/web-security/authentication/auth-lab-passwords
En Resource pool configuramos las peticiones para enviarlas de una en una
En Settings vamos a añadir una expresión regular para que nos reporte los errores
Hacemos el ataque y vemos que hay un petición con un Length diferente, lo cual quiere decir que no ha devuelto ningún error
El ataque de fuerza bruta funciona porque al loguearnos nosotros con un usuario existente y una contraseña inválida nos devuelve este mensaje Invalid username or password. o este otro You have made too many incorrect login attempts. Please try again in 1 minute(s)., sin embargo, aunque nosotros hayamos agotado el número de intentos para iniciar sesión si introducimos la contraseña adecuada, la web no nos devolverá ningún mensaje pero no nos dejará iniciar sesión hasta que pase el minuto. De esta forma podemos saber si nuestra contraseña es la correcta. Una vez ha pasado el minuto ya nos podemos loguear con las credenciales info:robert












