Authentication Writeup
PortSwigger
Last updated
PortSwigger
Last updated
Pham Quoc Trung
BurpSuite
This lab is vulnerable to username enumeration and password brute-force attacks. It has an account with a predictable username and password, which can be found in the following wordlists:
To solve the lab, enumerate a valid username, brute-force this user's password, then access their account page.
Giao diện login
Bài này yêu cầu mình phải tìm ra tài khoản có thể đăng nhập được dựa trên 2 list tài khoản password mà đề bài đã cho. Đầu tiên thì mình sẽ nhập bừa username và password để lấy được request đăng nhập cho BurpSuite. Đây là request mình thu được
Danh sách thử ở đây sẽ là list các username mà đề bài đã cho
Tiến hành tấn công
Tiến hành tấn công
Ở đây mình thấy với password là mom
, response trả về là 302. Mình sẽ thử lấy password này để đăng nhập cùng username puppet
.
Và mình đã hoàn thành bài lab.
This lab is subtly vulnerable to username enumeration and password brute-force attacks. It has an account with a predictable username and password, which can be found in the following wordlists:
To solve the lab, enumerate a valid username, brute-force this user's password, then access their account page.
Tương tự bài trên, mình bắt request đăng nhập.
Tiến hành tấn công, mình thấy tại username là arlington
, mã lỗi trả về không có dấu ".". Có thể nó sẽ là username. Thử dò password cho nó xem sao
Tiến hành tấn công
Tại password 159753
, response trả về 302. Có vẻ mình đã tìm ra username và password. Thử đăng nhập và mình đã hoàn thành bài lab.
This lab is vulnerable to username enumeration using its response times. To solve the lab, enumerate a valid username, brute-force this user's password, then access their account page.
Your credentials: wiener:peter
Ở lab này khi mình thử dò username thì thấy chương trình đã chặn việc thực hiện login quá nhiều lần
Tiến hành tấn công
Tuy nhiên lần này không có sai khác gì trong mã lỗi trả về. Mình sẽ thử dùng tài khoản đã được cung cấp để kiểm tra sự khác biệt trong các request có gì không.
Với username password chuẩn
Với username đúng password sai
Với username sai password đúng
Với username sai password sai
Có thể thấy, khi username sai thì trong cả 2 trường hợp của password thời gian response đều gần như nhau. Mình có thể đoán rằng nếu username sai thì chương trình sẽ không check password nữa. Để phỏng đoán thì mình sẽ test như sau
Với username đúng, password siêu dài
Với username sai, password siêu dài
Khi username đúng, chương trình đã phải xử lí đoạn password siêu dài kia dẫn tới response trả về chậm hơn rất nhiều. Từ đây, mình có thể sử dụng nó để tìm ra username
Tiến hành tấn công
Với username là agenda
, mất hơn 4000ms để response. Có thể đoán nó chính là username hợp lệ. Giờ chỉ cần dò password nữa thôi.
Tiến hành tấn công
Response đã trả về 302 với password là sunshine
. Thử đăng nhập và mình đã hoàn thành bài lab
This lab is vulnerable due to a logic flaw in its password brute-force protection. To solve the lab, brute-force the victim's password, then log in and access their account page.
Your credentials: wiener:peter
Victim's username: carlos
Nhận thấy nhập sai khoảng 3 lần sẽ bị khóa IP trong 1 phút, dựa trên những kiến thức đã học, mình thử login vào tài khoản wiener
mỗi khi sắp bị khóa để xem số lần login có được reset hay không. Và kết quả là có, mình có thể thoải mái thử mà không sợ bị khóa IP trong 1 phút miễn là mình đăng nhập đúng sau mỗi 2 lần thử.
Để có thể bruteforce thì mình phải dựng lại danh sách username và password đôi chút. Danh sách username sẽ có dạng "carlos, carlos, wiener, carlos, ...", danh sách password sẽ có dạng "abc, xyz, peter, mnop, ..."
Code để in ra danh sách username:
Code để in ra danh sách password:
Tiến hành tấn công
Ta thấy ứng với password là mobilemail
thì response trả về là 302 cho username carlos
. Thử đăng nhập và mình đã hoàn thành bài lab
This lab is vulnerable to username enumeration. It uses account locking, but this contains a logic flaw. To solve the lab, enumerate a valid username, brute-force this user's password, then access their account page.
Ở bài này, khi mình thử thực hiện đăng nhập bằng vài username thì dù có thử bao nhiêu lần cũng không bị chặn. Theo như đề bài thì có vẻ nó sử dụng cơ chế khóa tài khoản trong một thời gian nhất định, và thường các hệ thống như này chỉ khóa được tài khoản tồn tại trong cơ sở dữ liệu. Mình sẽ lợi dụng điều này để tìm ra username hợp lệ
Mình sẽ thử từng username với 5 mật khẩu ngẫu nhiên mà mình gen ra. Ngoài ra thì các bạn có thể sử dụng "Null Payload" để thêm các kí tự null vào sau password cũng oke.
Tiến hành tấn công
Ở đây mình thấy username acceso
bị khóa sau khi thử mật khẩu nhiều lần nên khả năng cao đây chính là username tồn tại trong cơ sở dữ liệu. Giờ thì mình chỉ cần bruteforce password của nó
Tiến hành tấn công
Nhận thấy với password là master
thì không có mã lỗi trả về. Thử đăng nhập và mình đã hoàn thành được bài lab này
Note: Tính ra bài này chức năng khóa chỉ ghi là khóa 1 phút chứ thực chất nó không khóa :v
This lab is vulnerable due to a logic flaw in its brute-force protection. To solve the lab, brute-force Carlos's password, then access his account page.
Victim's username: carlos
Ở đây mình thấy request gửi lên để login có dạng JSON để chứa username password
Khi tấn công bruteforce password như bình thường, ta sẽ bị chặn 1 phút do gửi quá nhiều request trong 1 thời gian ngắn
Mình thử dùng các cách như các lab trên thì có vẻ là không được. Tuy nhiên, để ý là vì username password được truyền vào bằng JSON. Sẽ thế nào nếu thay vì truyền 1 giá trị của password, mình truyền vào 1 mảng chứa các password nhỉ? Nếu server xử lí JSON không đúng cách, có khả năng mình sẽ vượt được cơ chế bảo mật này
Copy url và dán vào trình duyệt
Và mình đã hoàn thành bài lab
This lab's two-factor authentication can be bypassed. You have already obtained a valid username and password, but do not have access to the user's 2FA verification code. To solve the lab, access Carlos's account page.
Your credentials: wiener:peter
Victim's credentials carlos:montoya
Mục đích của bài này là truy cập được vào account page của carlos
. Do đã biết password của carlos
nên mình sẽ thử đăng nhập luôn. Tuy nhiên sau khi đăng nhập thành công thì ta còn phải nhập một mật mã 4 kí tự nữa.
This lab's two-factor authentication is vulnerable due to its flawed logic. To solve the lab, access Carlos's account page.
Your credentials: wiener:peter
Victim's username: carlos
You also have access to the email server to receive your 2FA verification code.
Tiến hành đăng nhập vào account wiener
được cho sẵn. Sau khi đăng nhập mình thấy được giao diện 2FA
Giao diện sau khi đăng nhập thành công
Chuyển sang BurpSuite, mình thử nhìn vào request gửi đi lúc xác thực 2FA xem có gì hay ho không
Có thể thấy được trong request này có username được chứa trong cookie và trường mfa-code dùng để xác định mã 2FA. Vậy nếu mình sửa username thành carlos
thì sao nhỉ?
Có vẻ trang web không check session xem có đúng là carlos
đang đăng nhập và đang tiến hành nhập 2FA. Mình sẽ thử bruteforce mã 2FA để xem có đăng nhập được không. Vẫn như cách bình thường, mình sẽ dùng Intruder
Tiến hành tấn công
Mình sẽ sửa lại username thành carlos
và gửi đi
Có vẻ không có lỗi gì xảy ra. Thử tấn công bruteforce lại lần nữa xem có được không
Lần này thì mình đã thấy có một response trả về mã 302. Thử copy link response paste vào trình duyệt
Vậy là mình đã hoàn thành bài lab này
This lab's two-factor authentication is vulnerable to brute-forcing. You have already obtained a valid username and password, but do not have access to the user's 2FA verification code. To solve the lab, brute-force the 2FA code and access Carlos's account page.
Victim's credentials: carlos:montoya
Note
As the verification code will reset while you're running your attack, you may need to repeat this attack several times before you succeed. This is because the new code may be a number that your current Intruder attack has already attempted.
Ở bài này, sau khi đăng nhập và tiến hành nhập mã 2FA, chỉ cần mình nhập sai 2 lần là trang web sẽ tự động logout khỏi tài khoản. Mình bắt buộc phải đăng nhập lại để tiến hành thử nhập 2FA nếu không sẽ xảy ra lỗi như sau
Mỗi lần bị logout ra và login lại, mã 2FA sẽ được làm mới. Nếu bruteforce thì mỗi lần login lại mình sẽ phải chạy lại từ 0000. Cơ mà phải làm kiểu gì nếu cứ chạy tới 0001 là nó đã bị logout rồi nhỉ?
Mình sẽ tạo 1 rule mới
Thêm một macro vào rule mới
Thêm 3 request sau vào macro. Nó sẽ là vào trang login, tiến hành login và vào trang nhập 2FA
Tiến hành tấn công, ta thấy mỗi request đều có mã csrf khác nhau nên sẽ không bị logout.
Tuy nhiên vấn đề cần giải quyết nốt ở đây là vì ta đã login lại nên mã 2FA sẽ thay đổi liên tục. Để có thể giải quyết việc này thì mình sẽ thử chỉ gửi 1 mã duy nhất bất kì và cho chạy rất nhiều lần. Việc này tương đối là mò kim đáy bể cơ mà với một mã 4 chữ số thì mình nghĩ vẫn sẽ có khả năng thành công :v Mình sẽ gen ra một list 100.000 dòng mã "2706" để thực hiện điều này. Code gen cũng khá cơ bản
Tiến hành tấn công thôi. Để cho tăng tỉ lệ thành công thì mình còn chạy luôn 4 tab
Sau khi gen ra rất nhiều mã 2FA thì mình nhận ra chúng chỉ bắt đầu bằng 1 hoặc 0. Vậy giờ mình sẽ gen ra 2 list "0720.txt" và "1412.txt" để tiến hành tấn công lại coi sao
May mắn là lần này mình chỉ phải chờ hơn 200 request để thấy được một response trả về 302
Thử mở nó trên trình duyệt và mình đã hoàn thành bài lab
Note: Hàng chuyên để bruteforce: Hydra
This lab allows users to stay logged in even after they close their browser session. The cookie used to provide this functionality is vulnerable to brute-forcing.
To solve the lab, brute-force Carlos's cookie to gain access to his "My account" page.
Your credentials: wiener:peter
Victim's username: carlos
Đối với việc bruteforce thẳng password của user carlos
thì ta sẽ bị chặn 1 phút nếu thử sai nhiều lần, và các cách bypass từ các lab trên đã bị chặn.
Nhìn chuỗi đằng sau mình trông khá giống md5 nên mình đã thử một tool trên mạng là CrackStation để crack đoạn mã này coi sao.
Payload mình sẽ cho list password vào và thực hiện payload proccessing như đã phân tích ở phía trên
Tiến hành tấn công
Mở response trên trình duyệt và mình đã hoàn thành bài lab
Note: Chưa rõ tại sao cơ mà mình mở response nào cũng oke
This lab stores the user's password hash in a cookie. The lab also contains an XSS vulnerability in the comment functionality. To solve the lab, obtain Carlos's stay-logged-in cookie and use it to crack his password. Then, log in as carlos and delete his account from the "My account" page.
Your credentials: wiener:peter
Victim's username: carlos
Ở bài này thì mình được cung cấp một exploit server phục vụ cho việc tấn công XSS.
Giờ ta sẽ ngồi chờ user carlos
truy cập vào bài viết trên. Khi đó trong access log của exploit server sẽ có cookie của carlos
.
Nếu format của cookie này giống bài trước thì nó sẽ là mã base64 của username + ":" + password hash md5. Mình sẽ thử decode Base64
Có vẻ format vẫn giống như các bài trước. Giờ mình sẽ cho đoạn md5 kia vào CrackStation để tìm ra password
This lab's password reset functionality is vulnerable. To solve the lab, reset Carlos's password then log in and access his "My account" page.
Your credentials: wiener:peter
Victim's username: carlos
Mình thử nhập user wiener
là user mình có quyền truy cập vào coi sao
Hệ thống sẽ gửi một link để reset password vào trong email của người dùng mình vừa nhập vào.
Sau khi ấn vào link thì mình sẽ được chuyển tới trang cho phép mình đổi password mà không cần nhập password cũ
Sau khi đổi xong mật khẩu, mình thử vào lại trang ban nãy lần nữa để xem có khai thác được gì không thì không được vì token có vẻ đã bị expired sau khi mình đổi password
Có vẻ khá là bảo mật ta. Mình sẽ thử nhìn vào các request gửi đi ở trong BurpSuite xem có gì hay không. Đây là request lúc mình thực hiện đổi password
Có thể thấy những thứ được gửi đi bao gồm temp token được ghi trong URL, username và hai lần password mới. Mình thử thay username thành carlos
và gửi đi
Token mới sẽ là chuỗi vigd3052mym9opzkiev8ed7jbu77sr43
. Thử thay vào trong request BurpSuite và gửi đi
Cơ mà có vẻ là không được. Sau một hồi chọc ngoáy thì mình thử để token thành rỗng và gửi đi
Kết quả trả về 302, có vẻ mình đã thành công. Thử đăng nhập vào user carlos
với password như mình vừa đặt
Vậy là mình đã hoàn thành lab này
This lab is vulnerable to password reset poisoning. The user carlos
will carelessly click on any links in emails that he receives. To solve the lab, log in to Carlos's account. You can log in to your own account using the following credentials: wiener:peter
. Any emails sent to this account can be read via the email client on the exploit server.
Kĩ thuật password reset poisoning: https://cookiearena.org/hoc-pentester/password-reset-poisoning/
Hệ thống sẽ gửi cho mình một mail reset password như này. Sử dụng token nên có vẻ khá khó để khai thác
Tuy nhiên, ở bài này thì ta sở hữu một exploit server. Sẽ thế nào nếu mình chuyển hướng để thay vì gửi về mail server thì nó sẽ gửi link reset password tới exploit server của mình nhỉ? Mình sẽ thử bắt request khi ấn forgot password với username là carlos
Khi checklog, mình thấy có một link reset password như sau
Truy cập vào nó, mình ra được giao diện đổi mật khẩu. Nếu đúng thì nó sẽ là của carlos
. Mình sẽ thử đặt mật khẩu và đăng nhập vào carlos
bằng mật khẩu đó xem sao
Và mình đã hoàn thành được bài lab
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
Ở bài này khi đăng nhập mình thấy có thêm form để cho người dùng đổi mật khẩu
Thử đổi mật khẩu và xem request trên BurpSuite
Trông cái request như này thì khá là nguy hiểm rồi. Mình sẽ thay username thành carlos
và brute-force current-password để xem có tùy ý đổi được password của carlos
không. Mình sẽ sử dụng Intruder
Tiến hành tấn công và mình thấy mọi request trả về đều là 302. Mình cũng thử đăng nhập cơ mà không được. Có vẻ mình đã làm sai gì đó. Mình cần tìm một request mà response trả về dạng 200
Ở đây khi mình thử nhập sai password hiện tại, kết quả là chương trình đã logout account của mình ra. Mình thử lại bằng cách nhập cả 3 trường đều sai và đây là kết quả
Có một thông báo trả về cho thấy mình đã nhập sai password hiện tại. Mình sẽ thử nhập đúng xem có mã lỗi gì không
Tiến hành tấn công
© 2024,Pham Quoc Trung. All rights reserved.
Để tìm ra đăng nhập hợp lệ thì mình sẽ chuyển nó sang Intruder. Ở đây, mình có thể set 2 payload tại username và password và cho chạy Cluster Bomb để Brute Force. Tuy nhiên, nó sẽ mất kha khá thời gian do số lượng tổ hợp là tương đối lớn (>10000 requests). Vì vậy, mình sẽ đặt payload tại username trước để tìm ra username hợp lệ, sau đó tiến hành thử password sau. Nếu mã nguồn của chương trình không đảm bảo bảo mật, khi tài khoản đúng mã lỗi in ra sẽ khác .
Rất nhanh, ta đã tìm ra được username hợp lệ là puppet
do mã lỗi trả về là . Tiếp theo, mình sẽ để đúng username và tiến hành thử password với list đề bài đã cho.
Có thể thấy ta không thể check username bằng cách đơn giản như lab trước được do dù cho username đúng thì lỗi trả về vẫn sẽ là Nhưng nếu thế thì chả nhẽ phải bruteforce hơn 10000 trường hợp ư? Vì vậy, ở đây mình vẫn sẽ làm như lab trước tuy nhiên sẽ grep vào mã lỗi được trả về để xem có sai sót nhỏ gì trong chương trình không.
Có vẻ nó đã chặn IP của mình. Mình sẽ sử dụng HTTP Header để thay đổi địa chỉ IP gửi tới server. Để làm điều này mình cần một list các IP nữa. Tuy nhiên, khi mình thử nhập bừa vào thì response trả về vẫn bình thường
Vậy là không nhất thiết phải điền IP, chỉ cần điền khác nhau mỗi request là ta có thể tránh được việc bị block IP. Mình sẽ check mật khẩu bằng cách đặt payload như sau và cho trường chạy từ 1 và tới hết số lượng request. Mình cần mỗi IP ứng với một username nên sẽ sử dụng Pitchfork attack.
Ở đây thì đề bài đã cho sẵn chúng ta username là carlos
, chỉ cần tìm ra password của nó. Khi thực hiện bruteforce thì vẫn sẽ bị chặn IP, tuy nhiên cách bypass sử dụng đã không còn tác dụng.
Setup Intruder, nhớ chỉnh về 1 để kết quả chính xác nhất
Response trả về 302, vậy là mình hoàn toàn có thể đăng nhập bằng cách này. Chuột phải vào trường response và chọn
Mình thử quay về trang chủ rồi ấn lại vào nút . Có vẻ trang web không check việc mình đã nhập 2FA hay chưa nên mình đã vào được account page của carlos
và hoàn thành bài lab
Security code sẽ được gửi vào email của mình. Ấn vào để mở hộp thư và lấy mã.
Sau khi tấn công thì mình không thấy có kết quả nào thành công cả @@. Một hồi tìm hiểu thì mình nghĩ rằng có thể do chưa tiến hành đăng nhập, nên carlos
sẽ không có mã 2FA nào để so sánh với cái mình nhập cả. Để ý thì trong BurpSuite có một request
Đầu tiên thì cứ phải xử lí việc logout login lại đã. Để tự động hóa quá trình này, mình sẽ chỉnh sửa cài đặt đôi chút
Ấn vào request và chọn . Add thêm parameter và bôi đen vào mã csrf. Chọn OK.
Tương tự với
Lưu lại. Quay sang tab và chọn
Bây giờ, mỗi khi ta gửi một request bất kì, các request kia sẽ tự động được thực hiện trước. csrf cũng sẽ tự động được thay bằng csrf mới. Thử test bằng Intruder, nhớ phải chỉnh về 1
Cơ mà sau khi mình chờ mất cả ngày thì vẫn không ra. Vì vậy mình đã thử mở ở lab trước ra để xem có gì đặc biệt trong mã code không
Để ý lại bài này thì form đăng nhập đã có thêm chức năng
Sau khi thử đăng nhập và có tick vào mục , request và response trả về có dạng như sau
Có thể thấy rằng một cookie có tên là đã được thêm vào HTTP Header. Nhìn trông cookie này khá giống Base64. Mình đã thử copy và paste nó vào CyberChef và thử decode bằng Base64
Không khó để nhận ra đây chính là password của chúng ta. Vậy là cookie được tạo ra bằng cách nối username với password đã được mã hóa md5, ngăn cách nhau bởi dấu ":" và mã hóa cả chuỗi bằng Base64. Chỉ cần dựng lại cookie này đối với user carlos
là ta hoàn toàn có thể truy cập vào được account page. Mình sẽ sử dụng Intruder như sau:
Đổi thành carlos
và đặt payload vào trường cookie
Để ý thì sau khi mình đăng nhập và chọn thì sẽ có cookie sinh ra như mấy lab trên. Mục tiêu là mình phải tiến hành khai thác XSS để có thể lấy được cookie này từ user carlos
. Sau một hồi thì mình thấy có chức năng comment trong các bài viết là có triển vọng để tấn công Stored XSS. Mình sẽ thử comment một payload như sau
Vậy là mình đã tìm được password là onceuponatime
. Đăng nhập vào carlos
, nhấn , nhập password để xác nhận và mình đã hoàn thành bài lab
Ở lab này thì trong form đăng nhập sẽ có nút . Nó sẽ yêu cầu người dùng nhập email hoặc username vào
Kết quả trả về do mình đã đổi password thành công rồi. Sẽ ra sao nếu mình lấy một token mới từ chức năng và cho vào request này nhỉ?
Ở đây thì mình lại có chức năng
Dựa trên hướng dẫn của Cookie Hân Hoan, mình sẽ thử thêm header trỏ tới exploit server của mình và gửi đi xem sao
Và trang web đã trả về lỗi rằng mình đã nhập không trùng khớp 2 password mới. Giờ thì dễ rồi, mình sẽ cho request này vào Intruder để bruteforce password của carlos
. Nếu password đúng thì trong response trả về sẽ có trả về lỗi
Ở đây với password là master
thì response trả về đã có chuỗi . Thử đăng nhập và mình đã hoàn thành bài lab