Penetration Testing Step 3 – Authorization và những ngả đường của vertical privilege escalation

Kết thúc nội dung Penetration Testing Step 3 – Bypass hệ thống xác thực với chức năng reset password, tôi xin tạm gác lại câu chuyện về Authentication (xác thực). Và như tôi đề cập trong nội dung Penetration Testing Step 3 – Tấn công vào Authentication mechanisms liệu có khả thi?, sau khi qua ải Authentication, người dùng sẽ được cấp các quyền hạn phù hợp dựa vào kết quả của quá trình Authorization (thật ra sẽ có một phần đệm là Session Management để quản lý phiên “mần ăn” của người dùng đã vượt qua bước xác thực với hệ thống).

Authorization (phân quyền) hay Access control (kiểm soát truy cập) có thể hiểu (kiểu mì ăn liền) là quá trình kiểm soát hành động hoặc khả năng truy cập của các đối tượng vào tài nguyên của hệ thống. Và Access control có thể được phân chia thành các thể loại:

  • Vertical access controls: Với dạng này, các loại người dùng khác nhau sẽ có khả năng truy cập vào chức năng khác nhau của ứng dụng. Ví dụ admin có quyền trảm user thường nếu thấy ngứa mắt và user thường có quyền chửi admin (bằng mồm) sau đó chấp nhận số phận;
  • Horizontal access controls: Với dạng này, các người dùng khác nhau sẽ có quyền truy cập vào một tập con của một loại tài nguyên hệ thống nhất định. Ví dụ bạn có thể đăng nhập vào ứng dụng ngân hàng và xem chi tiết các giao dịch của mình nhưng (hiển nhiên) không được phép xem thông tin của người dùng khác;
  • Context-dependent access controls: Dạng này tương đối phức tạp hơn vì tùy thuộc vào tình trạng của ứng dụng hoặc hành động của người dùng. Ví dụ dễ hình dung nhất của dạng này là với các ứng dụng shopping, bạn sẽ bị khóa khả năng chỉnh sửa đơn hàng một khi đã chốt đơn và thanh toán.

Như bạn thấy ở trên, câu chuyện về Authorization hay Access control khá dài. Do vậy, trong nội dung kỳ này, tôi sẽ chỉ tập vào phần thứ nhất của câu chuyện – các chiêu trò đâm thọc vào giải pháp Vertical access controls – nhằm đạt ý đồ vertical privilege escalation (tạm dịch là “leo thang đặc quyền theo phương thẳng đứng”).

Lưu ý:

#1. Câu chuyện thứ 1 – Chủ nhà quên khóa cửa

#1.1 Khóa cửa chính mà quên cửa hậu

Kịch bản thô bỉ nhất của tình huống này là ứng dụng cho phép người dùng sử dụng các chức năng nhạy cảm của hệ thống (ví dụ chức năng quản lý người dùng của admin) chỉ bằng cách truy cập vào URL tương ứng (ví dụ dummytip.com/admin).

Cũng cần nói rõ thêm, việc bảo vệ các chức năng nhạy cảm bằng cách giấu đi URL liên quan cũng không phải là phương pháp an toàn vì attacker có thể triển khai các giải pháp dò tìm (cái này kiểu như trổ cửa ra vị trí bất thường và hi vọng kẻ trộm chỉ cắm đầu phá cửa chính mà không đi vài vòng để tìm cửa hậu).

Ngoài ra, một số nguồn (như file robots.txt) cũng có thể tiết lộ các URL thú vị khác. Ví dụ với tình huống minh họa sau, bạn có thể thấy file robots.txt tiết lộ vị trí admin panel.

Robots file
Robots file

Và với thông tin này, tôi dễ dàng truy cập vào để “tạm” chiếm quyền admin và ra tay hạ sát các user khác.

Admin function
Admin function

#1.2 Đào hầm trổ cửa hậu lên núi nhưng vẫn quên khóa

Nếu cho rằng cái admin URL ở trên quá lộ liễu và bạn có thể tăng độ ngẫu nhiên cho nó để gia cố bảo vệ thì cũng nên suy nghĩ lại. Với phương án này, attacker vẫn có thể dò tìm thông tin ví dụ soi kèo page source để xác định admin URL kiểu như sau.

Inspect page source
Inspect page source

Và công việc sau đó chỉ mang tính thủ tục.

Admin function
Admin function

#2. Câu chuyện thứ 2 – Chủ nhà khóa cửa nhưng quên rút chìa

Sau khi nhận thấy các phương án trên méo ổn, bạn có thể thử chuyển sang sử dụng giải pháp parameter-based access control. Về cơ bản, giải pháp này sẽ lưu trữ thông tin xác định quyền hạn của người dùng vào các vị trí như hidden fields (các trường thông tin ẩn), cookie, query string parameter thiết lập trước. Và nếu người dùng có thể kiểm soát thông tin ở các vị trí nói trên thì cách này thật ra cũng tệ không thua gì các phương án ở Mục 1.  Tình huống này cũng tương tự như khi bạn khóa cửa xong rồi cứ cắm chìa ở đó và cắp đít bỏ đi. Và lúc này hiển nhiên không có cách gì bảo đảm người khác không “ngứa tay” mở thử xem bên trong có gì hot!

#2.1 Thao túng cookie để mạo danh chủ nhà

Trong kịch bản này, khi tôi thử truy cập vào vị trí của nhạy cảm (/admin) thì nhận được thông báo yêu cầu login với administrator credential.

Restrict admin function
Restrict admin function

Đến đây mọi việc vẫn ổn. Nhưng nếu tôi thử thực hiện việc login đồng thời bật Burp Suite Interception và kích hoạt response interception như bên dưới thì bắt đầu có chuyện.

Intercept response
Intercept response

Lúc này con hàng response sẽ xuất hiện Set-Cookie. Và tôi có thể táy máy thử thay đổi Admin=false sang Admin=true.

Change cookie
Change cookie

Và chuyện lại đâu vào đấy khi tôi có thể ung dung truy cập vào trang của ông admin với các đặc quyền ác chiến.

Admin function
Admin function

#2.2 Thao túng roleid để mạo danh chủ nhà

Tiếp tục chuyển sang một kịch bản khác. Lần này tôi triển khai việc đăng nhập với credential chính chủ như mọi khi (wiener:peter).

Login
Login

Mọi việc cũng có vẻ bình thường cho đến khi tôi sử dụng chức năng Update email ở trên (tất nhiên với Burp Suite Interception đang bật). Lúc này, từ Burp Suite History, quan sát respone, bỗng đâu tôi thấy phọt ra cái thằng roleid với giá trị “1”.

Change email request
Change email request

Như lẽ thường tình, có “1” thì chắc phải có “2”, “3” và …Tay nhanh hơn não, tôi đẩy hàng sang Burp Suite Repeater và đút thêm roleid với giá trị “2” vào resquest rồi send thử. Và ngạc nhiên chưa, lúc này phía respone, tôi thấy cái roleid của tôi đã được cập nhật tương ứng mà không có lỗi lầm gì sất.

Change roleid
Change roleid

Với thay đổi này, khi duyệt lại vị trí /admin ban đầu, tôi đã thấy các tùy chọn đặc quyền của admin với đám user thường tội nghiệp.

Admin function
Admin function

#3. Câu chuyện thứ 3 – Chủ nhà xài khóa vân tay cho nhà vách lá

Sau khi nhận thấy 2 phương án đầu đều đổ bể, bạn có thể thử chuyển sang giải pháp khá khẩm hơn là sử dụng rule để kiểm soát. Với giải pháp này, việc truy cập vào các URLHTTP method cụ thể có thể bị kiểm soát dựa vào user role và triển khai thông qua rule kiểu như:

DENY: POST, /admin/deleteUser, managers (Rule từ chối việc sử dụng POST method và truy cập vào URL /admindeleteUser để xóa các user thuộc manager group)

Cách này trông có vẻ chuẩn mực nhưng thực tế cũng có thể phát sinh vấn đề nếu không triển khai giải pháp bảo vệ đồng bộ trên cả phần front-end (tương tác phía client) và back-end (tương tác phía server). Kịch bản này tương tự như khi bạn chơi sang xài khóa bảo mật vân tay cực gắt cho phần cửa (tương ứng việc thiết lập rule kiểm soát truy cập chặt chẽ phí front-end) nhưng lại quên mất nhà bạn vẫn chơi vách lá (tương ứng phần back-end thả trôi nổi không kiểm soát).

Rồi tôi đi vào phần demo cụ thể. Trong tình huống này, tôi bật Burp Suite interception lên và thử truy cập vào vị trí /admin. Hiển nhiên, tôi nhận ngay cái kết đắng “Access denied”.

Restrict admin function
Restrict admin function

Với phương châm còn thở còn gỡ, tôi đâu dễ dàng gì từ bỏ. Tôi thử đẩy con hàng request sau qua Burp Suite Repeater.

Get admin request
Get admin request

Tại đây, tôi đổi thử /admin thành / (vị trí / tương ứng với trang chủ nên trong đại đa số trường hợp sẽ không bị khóa truy cập như /admin) và đút thêm HTTP header “X-Original-URL: /invalid” (cái URL /invalid là ví dụ page vớ vẩn không tồn tại để tôi minh họa thôi). Điểm thú vị nằm ở cái response “Not found” trả về. Điều này cho thấy ứng dụng đã “ăn” cái X-Original-URL tôi đút vào.

Get request with X-Original-URL
Get request with X-Original-URL

Lưu ý: Với ứng dụng sử dụng các framework hỗ trợ non-standard HTTP header (ví dụ X-Original-URL, X-Rewrite-URL,…) có khả năng ghi đè URL trong request gốc, việc triển khai giải pháp kiểm soát từ front-end để chặn truy cập vào URL cụ thể sẽ có thể mất hiệu lực

Với logic đó, tôi cập nhật lại “X-Original-URL: /admin” và thử lại.

Get admin request with X-Original-URL
Get admin request with X-Original-URL

Và búm chíu, cái thông báo “Access denied” đã “chim cút” ra khỏi tầm mắt của tôi. Lúc này tôi hoàn toàn nắm quyền bính trong tay để thao túng các user thường tùy thích (ví dụ trảm user carlos tội nghiệp như bên dưới).

Delete user request
Delete user request

Câu chuyện về vertical privilege escalation tất nhiên còn rất dài (ví dụ vấn đề thao túng request method) nhưng thời gian có hạn nên tôi xin phép tạm dừng vấn đề này ở đây. Kỳ tới tôi sẽ chuyển sang phần kế tiếp – Horizontal access controls.

1 thought on “Penetration Testing Step 3 – Authorization và những ngả đường của vertical privilege escalation”

Leave a Reply

Your email address will not be published. Required fields are marked *