Secciones
1. Introducción
La autenticación es la puerta de entrada a cualquier sistema digital. Sin embargo, incluso los mecanismos más comunes pueden tener vulnerabilidades críticas si no se implementan correctamente. En este blog, exploraremos los principales ataques contra sistemas de autenticación, con ejemplos prácticos y soluciones para protegerte. ¡Vamos allá!
2. Enumeración de Usuarios: ¿Cómo Descubrir Cuentas Válidas?
La enumeración de usuarios permite a un atacante identificar nombres de usuario válidos en una aplicación. Esto ocurre cuando el sistema responde de forma diferente ante credenciales válidas e inválidas.
Ejemplo Práctico:
Supongamos que al introducir un usuario incorrecto, el sistema muestra «Usuario no encontrado», pero con un usuario válido y contraseña incorrecta, dice «Contraseña incorrecta». Usando herramientas como ffuf
, podemos automatizar la búsqueda:
ffuf -w usuarios.txt -u http://ejemplo.com/login -X POST -d "username=FUZZ&password=test" -fr "Usuario no encontrado"
Explicación:
-w usuarios.txt
: Lista de posibles usuarios.-fr "Usuario no encontrado"
: Filtra respuestas que indican usuarios inválidos.
Consejo: Usa mensajes de error genéricos como «Credenciales incorrectas» para evitar filtraciones.
3. Fuerza Bruta de Contraseñas: Rompiendo la Primera Línea de Defensa
Las contraseñas débiles son un blanco fácil. Con herramientas como rockyou.txt
(14 millones de contraseñas filtradas), un atacante puede probar combinaciones rápidamente.
Ejemplo con ffuf
:
ffuf -w rockyou.txt -u http://ejemplo.com/login -X POST -d "username=admin&password=FUZZ" -fr "Contraseña incorrecta"
Optimización:
Filtra contraseñas que cumplan políticas específicas (ej: 10 caracteres, mayúsculas, números):
grep "[[:upper:]]" rockyou.txt | grep "[[:digit:]]" | grep -E ".{10}" > lista_personalizada.txt
4. Tokens de Restablecimiento Débiles: El Peligro de los Códigos Cortos
Si un token de restablecimiento de contraseña es numérico y de 4 dígitos (ej: 7351
), solo hay 10,000 combinaciones posibles. ¡Forzarlo es trivial!
Generación de Tokens:
seq -w 0 9999 > tokens.txt
Ataque:
ffuf -w tokens.txt -u http://ejemplo.com/reset?token=FUZZ -fr "Token inválido"
Solución: Usa tokens largos y aleatorios (ej: UUIDs) con tiempo de expiración corto.
5. Códigos 2FA Predecibles: Cuando 10,000 Intentos Son Suficientes
Un código 2FA de 4 dígitos también puede ser vulnerable a fuerza bruta si no hay límite de intentos.
Ejemplo:
ffuf -w tokens.txt -u http://ejemplo.com/2fa -X POST -H "Cookie: PHPSESSID=abc123" -d "codigo=FUZZ" -fr "Código incorrecto"
Mejor Práctica: Bloquear la cuenta tras 5 intentos fallidos y usar códigos de 6+ dígitos.
6. Omisión de Autenticación: Accediendo Directamente a Recursos
Si una página protegida (ej: /admin.php
) no verifica correctamente la sesión, un atacante podría acceder directamente.
Truco con Burp Suite:
- Intercepta la respuesta HTTP al acceder a
/admin.php
. - Cambia el código de estado de
302 Redirect
a200 OK
. - ¡La página protegida se muestra sin autenticación!
Solución: Asegúrate de incluir exit;
después de redireccionar en el código:
if (!$_SESSION['autenticado']) {
header("Location: login.php");
exit; // ¡Esto es crucial!
}
7. Secuestro de Sesiones: Tokens Predecibles o Débiles
Si los tokens de sesión son secuenciales (ej: 141233
, 141234
), un atacante puede adivinarlos.
Ejemplo de Token Base64 Manipulable:
echo 'user=admin;role=admin' | base64
# Resultado: dXNlcj1hZG1pbjtyb2xlPWFkbWlu
Ataque:
Envía la cookie falsificada para obtener privilegios de administrador.
Protección: Usa tokens aleatorios (ej: generados con openssl rand -hex 16
) y firma criptográfica.
8. Credenciales Predeterminadas: El Error Más Común
Dispositivos y aplicaciones suelen venir con credenciales como admin:admin
. Busca en bases de datos como CIRT.net o GitHub.
Ejemplo para BookStack:
Usuario: admin@admin.com
Contraseña: password
Solución: ¡Cambia siempre las credenciales predeterminadas!
9. Conclusión
La autenticación es un pilar de la seguridad, pero su implementación requiere atención a detalles críticos: tokens robustos, mensajes de error genéricos, límites de intentos y contraseñas complejas.