Hoy en día, la mayoría de aplicaciones web cuenta con medidas de autenticación multi-factor (MFA), como por ejemplo el envío de un código a tu teléfono móvil. Si bien estas medidas pueden llegar a ser muy efectivas para defendernos ante ataques de fuerza bruta o una filtración de credenciales, si no se implementan correctamente pueden ser completamente inútiles. En esta sección veremos algunos ejemplos de malas implementaciones de sistemas de autenticación multi-factor.
Uno de los ejemplos más simples de una mala implementación de un sistema de autenticación multi-factor es aquel en el que podemos saltarnos directamente esta verificación. Imagina el siguiente escenario.
/dashboard, si es incorrecto, invalida nuestro token de sesión y nos redirige a /login.En este escenario de ejemplo encontramos una falla muy grave en la implementación, y es que cuando ingresamos unas credenciales válidas, ya se nos otorga un token de sesión válido que solo se invalida si enviamos un código de verificación incorrecto. En este punto, saltarnos validación del código resulta trivial. Bastaría con hacer lo siguiente:
/dashboard directamente. Como nuestro token de sesión es válido y no se ha invalidado porque no hemos ingresado ningún código incorrecto, podríamos acceder al dashboard del usuario como si hubiéramos iniciado sesión correctamente.Uno de los métodos más habituales de implementar MFA es mediante el envío de códigos numéricos de 4 dígitos enviados a nuestro teléfono. El problema de estos códigos es la cantidad de combinaciones posibles, “tan solo” 9999 posibilidades. Sin un mecanisamo de prevención de ataques de fuerza bruta (un rate-limit), encontrar la combinación correcta resultaría trivial.
Supongamos el escenario en el que hemos ingresado unas credenciales válidas y se nos ha redirigido a una página para ingresar un código de 4 dígitos enviado a nuestro teléfono. El servidor no tiene ningún sistema de rate-limit ni cancela el proceso si se introduce de forma incorrecta múltiples veces. Un simple script que envíe múltiples solicitudes hasta encontrar el código correcto sería tan trivial como realizar algo similar al siguiente código. Supondremos que si ingresamos un código correcto seremos redirigidos (código 302), pero en caso contrario permanecemos en la página recibiendo un código 200.
# Creamos la lista de números de 0000 a 9999, para agregar ceros a la izquierda usamos -w
seq -w 0000 9999 > codes.txt
# Usamos la wordlist anterior para enviar todas las combinaciones de código posibles
ffuf -X POST -u http://10.10.10.10/login-verify \
-H "Cookie: verify=pepe" \
-d "mfa-code=FUZZ" \
-w codes.txt \
-mc 302
NOTA: Siempre debes analizar el tipo de request que realiza la web, ya que es posible que se pasen parámetros adicionales, como un token csrf, o que los parámetros se pasen de forma distinta.
Algunos sitios web pueden no vincular el token de verificación a la sesisón a la que se intenta acceder. Simplemente generan un token y lo registran en una base de datos de tokens válidos hasta que son utilizados y entonces se eliminan. Este mecanismo defectuoso puede permitir a un atacante conseguir un token iniciando sesión con su cuenta de usuario, pero usarlo en el inicio de sesión de otro usuario. Veamos el procedimiento.
pepe inicia sesión en su cuenta.pepe.pepe.Algunas otras webs deciden implementar medidas propietarias de verificación en lugar de utilizar librerías estándar y bien probadas. En estos casos podemos llegar a encontrarnos situaciones como las siguientes:
base64 que al decodearlo en plataformas como CyberChef nos permitirán conocer la estructura de los mismos y generar nuestros propios tokens válidos.