Username Enumeration

Chúng ta có thể tận dụng chức năng báo trùng username khi đăng ký tài khoản để tìm ra danh sách username của người dùng.

Tool sử dụng là Ffuf, cách dùng như sau:

ffuf -w /path/to/usernames/names.txt -X POST -d "username=FUZZ&password=x" -H "Content-Type: application/x-www-form-urlencoded" -u <URL> -mr "username already exists" > usernames.txt

Với:

  • -X là để khai báo phương thức HTTP. Trong câu lệnh trên thì phương thức cần phải là POST vì ta đang đăng ký tài khoản.
  • -d là để khai báo payload cho request, thường có dạng query string. Chuỗi FUZZ đóng vai trò như là placeholder cho các từ ở trong wordlist.
  • -H ở trong câu lệnh trên giúp thiết lập định dạng payload là www-form-urlencoded.
  • -mr là viết tắt của cụm từ match regex, giúp match chuỗi username already exists có trong response trả về từ server (response trả về là một trang web).

Chúng ta xuất danh sách các usernames tìm được ra file usernames.txt.

Password Brute Forcing

Sau khi có danh sách các username thì ta có thể tiến hành brute force password bằng cách sử dụng thêm một wordlist có chứa các passwords phổ biến như sau:

ffuf -w usernames.txt:W1,/path/to/passwords/common-passwords.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u <URL> -mc 200

Do sử dụng hai wordlists, ta sẽ tự định nghĩa hai placeholder khác là W1W2 ở trong payload. Với W1 tương ứng với usernames.txtW2 tương ứng với common-passwords.txt.

Ngoài ra, ta còn sử dụng thêm option -mc giúp lọc ra các responses và chỉ giữ lại response nào có status code là 200.

Logic Flaw

Gửi request đến website thông qua chương trình curl:

curl 'http://domain.com' -H 'Content-Type: application/x-www-form-urlencoded' -d 'parameter=value'

Với:

  • -H là dùng để thêm/chỉnh sửa header trong gói tin HTTP truyền đi.
  • -d là để liệt kê các query parameters.

Plain Text

Nội dung của cookie có thể có dạng plain text.

Ví dụ, hai dòng dưới đây là cookie sau khi đăng nhập thành công.

Set-Cookie: logged_in=true; Max-Age=3600; Path=/
Set-Cookie: admin=false; Max-Age=3600; Path=/

Dễ thấy, để có thể có các đặc quyền cao hơn, ta có thể sửa trường admin trong cookie thành true và gửi đến server thông qua một HTTP request như sau:

curl http://domain.com/cookie-test -H "Cookie: logged_in=true; admin=true" 

Hashing

Có thể sử dụng hàm hash lên cookie để biến đổi giá trị thành một dạng mã không thể đọc được và irreversible.

Các thuật toán thường dùng là MD5, SHA1, SHA256 hoặc SHA512.

Tuy nhiên, hash là hàm tất định. Với một đầu vào thì sẽ luôn cho ra một đầu ra. Do đó mà ta có thể sử dụng các cơ sở dữ liệu hashes, chẳng hạn như CrackStation, có chứa các hashes phổ biến để tìm plaintext.

Encoding

Tương tự như hashing nhưng có thể dịch ngược lại thành plaintext. Việc encoding chỉ đơn thuần là chuyển đổi dạng biểu diễn của dữ liệu. Có thể là từ nhị phân sang dạng human-readable chẳng hạn như hệ cơ số 32 (bao gồm các ký tự A-Z, 2-7) hoặc hệ cơ số 64 (bao gồm các ký tự a-Z, 0-9, /, +).

Cookie có thể được encoded trước khi được gửi đi cho server.