Broken brute-force protection, multiple credentials per request
SUMMARY
Debemos encontrar la contraseña del usuario Carlos para autenticarnos exitosamente en el login del sitio web. Para ello primero analizo la lógica implementada en el login, obteniendo un mensaje de error genérico en las respuestas HTTP, independiente de si me autentique con un username valido o no. Además, si intento autenticarme fallidamente muchas veces seguidas con el username valido Carlos, obtengo un mensaje de error indicándome que no puedo autenticarme por un minuto. Además, si intento omitir esta restricción con la cabecera X-Forwarded-For, no tendré éxito ya que el servidor web no admite su uso. Luego, analizando el cuerpo de la solicitud HTTP, me doy cuenta de que los datos son transmitidos en un formato JSON., permitiéndome realizar una solicitud HTTP con múltiples contraseñas en el parámetro asociado al password del login. De esta manera logre autenticarme exitosamente. Luego, para obtener el password de Carlos elabore un script en Python teniendo en cuenta el mensaje de error de la restricción y el genérico, y el tiempo de bloqueo.
RESOLUCION
En este laboratorio tenemos que encontrar el password del usuario Carlos 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-broken-brute-force-protection-multiple-credentials-per-request ) nos afirman que se ha implementado un bloqueo de la dirección IP después de un cierto número de intentos fallidos de iniciar 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. Ademas, observamos que si realizamos varios intentos fallidos en un periodo corto de tiempo,, obtenemos un mensaje de error que nos indica que no podemos autenticarnos por un minuto. Ademas, si intetamos omiti esta restriccion utilizando la cabecera HTTP X-Forwarded-For, nos daremos con la sorpresa de que el servidor web no admite el uso de esta cabecera. Ademas, podemos observar que los datos enviados en el cuerpo de la solicitud HTTP estan en formato JSON.
Ahora teniendo en cuentta que los datos se envian en formato JSON, podemos enviar multiples contraseñas en una misma solicitud HTTP con el fin de omitir la autenticacion. Para ello modificaremos el wordlists que contiiene la lista de posibles contraseñas con el fin de poder adaptarlo a formato JSON.
Podemos observar que logramos autenticarnos en el login del sitio web, y logramos resolver el laboratorio, pero el problema de este metodo es que no sabremos cual es la contraseña del usuario carlos. Por lo que crearemos un script en Python para saber cual es la contraseña de carlos.
Para ello tendremos en cuenta el mensaje de error que obtenemos cuando sobrepasamos la tasa permitida de envios de solicitudes HTTP, y el mensaje de error generico.
Podemos observar que el script logro obtener la contraseña del usuario carlos.
De esta manera logramos resolver el laboratorio. Además, los scripts utilizados lo puedes encontrar en mi repositorio Github.