ciberseguridad
pentesting
red team
owasp top 10
En octubre de 2013, Adobe sufrió una gran violación de datos que expuso las contraseñas cifradas y la información de las tarjetas de crédito de millones de usuarios. La brecha, que afectó a aproximadamente 38 millones de usuarios activos, fue el resultado de mecanismos de autenticación rotos. Los hackers pudieron acceder a los sistemas de Adobe y robar datos de los usuarios, incluidas contraseñas mal cifradas. Este incidente destaca la importancia crítica de los sistemas de autenticación robustos y las graves consecuencias de la Autenticación Rota, una vulnerabilidad que sigue afectando a muchas aplicaciones web hoy en día y por eso forma parte del OWASP top 10.
La Autenticación Rota es una vulnerabilidad grave de seguridad que ocurre cuando las aplicaciones web implementan incorrectamente la autenticación y la gestión de sesiones. Este fallo puede llevar a accesos no autorizados, brechas de datos y cuentas de usuario comprometidas, como lo demostró el incidente de Adobe. En esta lección, exploraremos el concepto de Autenticación Rota, su impacto y cómo prevenir tales fallas de seguridad devastadoras.
Veamos un ejemplo concreto de autenticación rota en una aplicación web. Consideremos el siguiente escenario que involucra un mecanismo defectuoso de restablecimiento de contraseña:
Imagina una aplicación web que permite a los usuarios restablecer sus contraseñas. El proceso funciona de la siguiente manera:
Aquí está por qué este proceso de inicio de sesión es potencialmente problemático:
Generación de Token Débil: Si el token de restablecimiento de contraseña es predecible o no es lo suficientemente aleatorio, un atacante podría adivinar o generar tokens válidos.
Token en la URL: Enviar el token como un parámetro de la URL lo expone a varios riesgos:
Falta de Expiración del Token: Si el token no expira después de un corto período o después de su uso, un atacante que acceda al token podría utilizarlo indefinidamente.
No Verificación del Usuario: La página de restablecimiento no verifica que el usuario que solicita el cambio de contraseña sea el mismo que inició el proceso de restablecimiento.
Posibilidad de Enumeración: Si la aplicación se comporta de manera diferente cuando se ingresa un correo válido vs. inválido, podría permitir a los atacantes enumerar cuentas de usuario válidas.
Comunicación Insegura: Si alguna parte de este proceso ocurre a través de HTTP en lugar de HTTPS, el token y la nueva contraseña podrían ser interceptados.
Sin Limitación de Intentos: Sin límites en los intentos de restablecimiento de contraseña, un atacante podría abusar de esta funcionalidad para denegación de servicio o para forzar tokens de restablecimiento.
Estas vulnerabilidades podrían permitir que un atacante tome el control de cuentas de usuario explotando la funcionalidad de restablecimiento de contraseña, demostrando un claro caso de autenticación rota.
Supongamos que este es el enlace que se envía para restablecer la contraseña:
1https:/reset-password?token=1234567890&user_id=42
Este enlace es vulnerable por varias razones:
Un enlace más seguro de restablecimiento de contraseña podría verse así:
1https:/reset-password?token=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
Esta versión mejorada:
Recuerda, la seguridad del proceso de restablecimiento de contraseña no solo depende del enlace en sí, sino también de cómo se genera, almacena y procesa en el servidor.
Políticas de contraseña débiles Ejemplo: Un sistema que permite contraseñas como "123456" o "password"
Relleno de credenciales Ejemplo: Un atacante utiliza una lista de combinaciones de correo/contraseña de una violación de datos en el Sitio A para intentar inicios de sesión en el Sitio B
Ataques de fuerza bruta Ejemplo: Un atacante utiliza un script para probar miles de contraseñas comunes en una sola cuenta de usuario
Fijación de sesión Ejemplo: Un atacante configura una ID de sesión en el navegador de un usuario, espera a que el usuario inicie sesión, y luego usa esa misma ID de sesión para secuestrar la sesión autenticada.
Para elaborar:
Gestión insegura de sesiones Ejemplo: Un sitio web que almacena tokens de sesión en cookies fácilmente accesibles sin cifrado o expiración adecuada
Falta de autenticación multifactor Ejemplo: Un sitio web bancario que solo requiere un nombre de usuario y contraseña para iniciar sesión, sin ningún paso de verificación adicional
Existen varias herramientas que pueden ser utilizadas para identificar y probar vulnerabilidades de autenticación rota:
Burp Suite
# Usa el Intruder de Burp Suite para realizar un ataque de fuerza bruta
1. Intercepta una solicitud de inicio de sesión
2. Envíalo a Intruder
3. Establece posiciones de payload para los campos de usuario y contraseña
4. Carga listas de palabras para credenciales comunes
5. Inicia el ataque y analiza los resultados
**OWASP ZAP (Zed Attack Proxy
)**
# Usa el Escaneo Activo de ZAP para probar vulnerabilidades de autenticación
1. Configura ZAP como proxy para tu navegador
2. Navega a través de la aplicación objetivo, incluyendo el proceso de inicio de sesión
3. Haz clic derecho en una URL en ZAP y selecciona "Atacar" -> "Escaneo Activo"
4. Revisa la pestaña "Alertas" para cualquier hallazgo relacionado con autenticación
Hydra
1# Realiza un ataque de fuerza bruta contra un formulario web 2hydra -l admin -P /ruta/a/lista_de_palabras.txt example.com http-post-form "/login.php:username=^USER^&password=^PASS^:Login failed"
Nmap
1# Usa el script http-brute de Nmap para probar credenciales débiles 2nmap -p80 --script http-brute --script-args 'http-brute.path=/login.php,userdb=users.txt,passdb=passwords.txt' example.com
Metasploit
1# Usa el módulo auxiliary/scanner/http/http_login de Metasploit 2use auxiliary/scanner/http/http_login 3set RHOSTS example.com 4set RPORT 80 5set USERNAME admin 6set PASS_FILE /ruta/a/lista_de_palabras.txt 7set TARGETURI /login.php 8run
Scripts Personalizados
1import requests 2 3def test_session_fixation(url): 4 # Crear una sesión y obtener una ID de sesión 5 session = requests.Session() 6 response = session.get(url) 7 initial_session_id = session.cookies.get('session_id') 8 9 # Realizar el inicio de sesión (reemplazar con el proceso de inicio de sesión real) 10 login_data = {'username': 'testuser', 'password': 'testpass'} 11 response = session.post(url + '/login', data=login_data) 12 13 # Comprobar si la ID de sesión cambió después del inicio de sesión 14 post_login_session_id = session.cookies.get('session_id') 15 16 if initial_session_id == post_login_session_id: 17 print("¡Posible vulnerabilidad de fijación de sesión detectada!") 18 else: 19 print("La ID de sesión cambió después del inicio de sesión. Se observó buena práctica.") 20 21# Uso 22test_session_fixation('https://example.com')
Al usar estas herramientas, asegúrate de tener la autorización adecuada para probar los sistemas objetivo y cumplir con todas las leyes y regulaciones relevantes.