2FA bypass using a brute-force attack
SUMMARY
Debemos lograr omitir el segundo factor de autenticación, que viene a ser un código de verificación de 4 dígitos asignado a la cuenta del usuario carlos, de un sitio web. Además, el enunciado del laboratorio nos provee las credenciales del usuario Carlos para lograr autenticarnos en el primer factor. Luego, analicé la lógica implementada en el segundo factor donde me di cuenta de que luego de 2 dos intentos fallidos se cerraba automáticamente la sesión, y tenía que autenticarme de nuevo en el primer factor, de esta manera ralentizaba el ataque de fuerza bruta sobre el código de verificación. Ademas, se agregaba un token CSRF variable en las solicitudes POST realizadas en los dos factos. Además, una nota en el enunciado del laboratorio nos dice que después de los dos intentos fallidos, el código de verificación se reiniciara. Luego, teniendo en cuenta toda las restricciones cree un script en Python para automatizar el ataque de fuerza bruta, y ejecute el script varias veces simultáneamente aunque con cierto retraso para evitar omitir el valor cambiante del código de verificación.
RESOLUCION
En este laboratorio tenemos que autenticarnos exitosamente con el usuario carlos en el mecanismo de doble autenticacion implementada en el 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 el mecanismo de autenticación de dos factores o 2FA. Además, nos proveen las credenciales de un usuario valido. (carlos:montoya).
Podemos observar que luego de autenticarnos con las credenciales de carlos, nos redirigen a una pagina web donde nos solicitan ingresar un codigo de verificacion de 4 digitos. Ademas, nos damos cuenta de que se han implemetando medidas de seguridad para evitar un ataque automatizado de fuerza bruta sobre el codigo de verificacion debido a que luego de dos ataques nos cerraba la sesion obligandonos a volver ingresar las credenciales, pero no hemos obtenido ningun mensaje de restriccion, ni bloqueado nuestra dirrecion IP.
Luego, si analizamos la respuesta HTTP del servidor web, encontraremos la razon del porque nos redirige a otra pagina web, esto es debido a que el codigo de estado HTTP de la respuesta HTTP es 302 y la cabecera Location contiene la ruta hacia donde seremos redirigido. Ademas, otra cosa interesante es que el servidor web establece una cookie de sesion en la respuesta HTTP, pero no representa un vector de ataque ya que tiene un valor aleatorio que es bastante impredecible. Ademas, otra cosa interesante viene a ser le token CSRF que se agrega en el cuerpo de las solicitudes HTTP, y cuyo valor va variar en cada solicutud POST HTTP que hagamos. Aunque, su valor lo podemos extraer realizando una solicitud GET HTTP, y obteniendo el atributo value del elemento HTML que hace referencia al token CSRF.
Ahora crearemos un script en Python para automatizar el ataque de fuerza bruta sobre el codigo de verificacion asociada a la cuenta del usuario carlos teniendo en cuenta el mensaje de error y el cierre de sesion y el valor cambiante del token csrf indicado en un campo oculto del formulario HTML del login y del codigo de verficiacion. Ademas, crearemos un wordlist con todos los numeros de 4 cifras para utilizarlo en el ataque de fuerza bruta.
Por ultimo, hay que tener en cuenta la nota que hay en el enunaciado del laboratorio donde nos dice que el codigo de verificacion despues de los dos intentos fallidos, a parte de que se cierra automaticamente la sesion, el codigo de verificacion se resetea o cambia de valor, por lo deberemos realizar la ejecucion de nuestro script varias veces simultaneamente para evitar omitir el codigo de verificacion de correcto.
Podemos observar que el script logro obtener el código de verificación de 4 dígitos de Carlos. De esta manera podremos omitir el segundo factor de autenticación del 2FA a pesar de las medidas utilizadas para ralentizar o evitar el ataque de fuerza bruta sobre el codigo de verificacion.
De esta manera logramos resolver el laboratorio. Además, el script utilizado en el desarrollo del laboratorio lo puedes encontrar en mi repositorio Github.