Username enumeration via account lock

SUMMARY

Debemos encontrar la contraseña de un usuario valido para poder autenticarnos en el login del sitio web. Además, el enunciado del laboratorio, nos indica que se ha implementado como medida de seguridad un bloqueo de las cuentas valida después de ciertos intentos fallidos de iniciar sesión en ellas. Teniendo en cuenta este detalle, elabore un script en Python que me realizara una enumeración de usernames donde supuse que el limite de intentos fallidos es igual a 4, logrando obtener un username valido. Luego, para el ataque de fuerza bruta de contraseñas, elabore otro script en Python donde tome en cuenta el mensaje de error emitido en el bloqueo de la cuenta, y el tiempo que iba a ser bloqueada la cuenta después de exceder el limite de intentos fallidos.

RESOLUCION

En este laboratorio tenemos que encontrar unas credenciales validas para poder autenticarnos en un login de un sitio web. Para ello la plataforma de PortSwigger (https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-account-lock ) nos afirma que se ha implementado un bloqueo de la cuentas después de un cierto número de intentos fallidos de inciair sesión. Además, nos proveen de dos wordlists que contienen una lista de usernames y passwords.

Podemos observar que recibimos un mensaje de error generico en la respuesta HTTP del sitio web, independientemente de si el username es valido y el password invalido, o si el username es invalido y el password es invalido.

Ahora crearemos un script en Python con el fin de encontrar algunos usernames validos a partir de cuando recibamos el mensaje de error de bloqueo de la cuenta. Para ello supondremos que el numero limite de intentos fallidos es 4 antes de se bloque la cuenta valido del usuario. Ademas, supondremos que el mensaje de error que recibiremos al momento de que se bloque la cuenta es diferente al mensaje generico “Invalid username or password”.

Podemos observar que acertamos en el numero limite de intentos fallidos de iniciar sesion. Ademas, la cuenta valida que se bloqueo viene a ser asterix, y la duracion del bloqueo de la cuenta es por un minuto. Otro detalle que me di cuenta es que si realizamos 3 intentos fallidos de autenticacion con la cuenta valida, y si intentamos autenticarnos con otra cuenta con el fin de reinicar el conteo de intentos fallidos, nos damos cuenta que no se reinicie el conteo de intentos fallidos, por lo que no podemos vulnerar la logica implementada. y solo debemos esperar un minuto para volvernos a autenticar.

Ahora crearemos un script en Python para automatizar el ataque de fuerza bruta de contraseña teniendo en cuentas las rcondiciones anteriormente planteadas.

Otro detalle que nos damos cuenta es en el tiempo de respuesta. Podemos observar en las siguientes imagene, que intentamos autenticarnos con un username wiener y con un password invalido largo, el tiempo de respuesta es 1,460 millis, en cambio, si intentamos autenticarnos con un username invalido y con un password invalido largo, el tiempo de respuesta es de 367 millis. Esta diferencia en el tiempo de respuesta, lo podemos utilizar para realizar una enumeracion de usernames, y encontrar un username valido.

Podemos observar que el script logro obtener la contraseña del usuario asterix

De esta manera logramos resolver el laboratorio. Además, los scripts utilizados lo puedes encontrar en mi repositorio Github.