shellshock破殼遠程命令執行漏洞復現通過web的方式進行web執行遠程代碼

1、漏洞描述
GNU Bash 4.3及之前版本在評估某些構造的環境變量時存在安全漏洞,向環境變量值內的函數定義後添加多餘的字符串會觸發此漏洞,攻擊者可利用此漏洞改變或繞過環境限制,以執行Shell命令。某些服務和應用允許未經身份驗證的遠程攻擊者提供環境變量以利用此漏洞。此漏洞源於在調用Bash Shell之前可以用構造的值創建環境變量。這些變量可以包含代碼,在Shell被調用後會被立即執行,造成任意命令執行漏洞。
該漏洞於2014年9月中旬被法國GNU/Linux愛好者Stéphane Chazelas發現,之後CVSS將該漏洞的嚴重性定義爲了10級(最高),而上半年4月份爆發的心臟出血漏洞才被定義爲5級。目前該漏洞會影響主流的Linux和Mac OSX操作系統平臺,包括但不限於Redhat、CentOS、Ubuntu、Debian、Fedora、Amazon Linux、OS X 10.10等平臺。可以通過構造環境變量的值來執行想要執行的攻擊代碼腳本,漏洞會影響到與Bash交互的多種應用,包括HTTP、OpenSSH、DHCP等。根據目前的漏洞驗證情況以及已經流傳POC情況,這個漏洞將嚴重影響網絡基礎設施的安全,包括但不限於網絡設備、網絡安全設備、雲和大數據中心等。特別是Bash廣泛地分佈和存在於設備中,其消除過程將非常長尾,且易於利用其編寫蠕蟲進行自動化傳播,同時也將導致殭屍網絡的發展。
2、什麼是bash
Bourne Again Shell(簡稱BASH)是在GNU/Linux上最流行的SHELL實現,於1980年誕生,經過了幾十年的進化從一個簡單的終端命令行解釋器演變成了和GNU系統深度整合的多功能接口。現如今bash是大多數Linux系統以及Mac OS X默認的shell,它能運行於大多數類Unix風格的操作系統之上,甚至被移植到了Microsoft Windows上的Cygwin系統中,以實現Windows的POSIX虛擬接口。此外,它也被DJGPP項目移植到了MS-DOS上。
3、漏洞驗證
準備一臺操作系統爲centos5.4的虛擬機,在本地上驗證是否存在shellshock破殼漏洞,env x=’() { :;}; echo vulnerable’ bash -c “echo this is a test”,如果出現vulnerable this is a test表示存在該漏洞。
在這裏插入圖片描述
更多詳情可以參考 https://www.freebuf.com/news/48331.html
4、漏洞利用
1)實現利用的關鍵在於web服務使用了CGI(通用網關接口),CGI處理文檔請求的時候,使用環境變量處理請 求,如果處理使用bash腳本,或者使用了系統調用,bash將接受系統變量並進行處理。從而到達遠程命令執行的效果
2) 搭建web服務,命令 yum -y install httpd,然後啓動httpd服務。
3)確認httpd.conf文件中的ScriptAlias /cgi-bin/ “/var/www/cgi-bin/” 行是否被註釋,如果被註釋將註釋去掉。在需要執行CGI文件的目錄配置中的Options 後面加入+ExecCGI(這裏在web根目錄下加入+ExecCGI)。如圖:
在這裏插入圖片描述
此外還需要將http.conf文件中的“AddHandler cgi-script .cgi”前的註釋去掉同時將需要使用CGI解析的文件後綴寫在cgi-script 參數後面,該操作是用來指定那些文件需要使用CGI解析。如圖:
在這裏插入圖片描述
4)在/var/www/html(Appache默認web目錄)下創建一個.cgi文件名字可以自定義,在此我們創建一個名字爲rr.cgi的文件.注意:這裏需要給其相應的權限否則無法訪問。
在這裏插入圖片描述
5)使用bp進行抓包,修改包查看/etc/passwd.
在這裏插入圖片描述
5、漏洞分析
Shell裏可以定義變量,測試命令中定義了一個命名爲x的變量,內容是一個字符串:”() { :;}; echo vulnerable”, 而根據漏洞信息得知,這個漏洞產生於Shell在處理函數定義時,執行了函數體之後的命令。但這裏x的值是個字符串,它是怎麼轉變成函數的呢。實際這個和Bash實現有關,在Bash中定義一個函數,格式爲:function function_name() {
body;}
當Bash在初始化環境變量時,語法解析器發現小括號和大括號的時候,就認爲它是一個函數定義:
在這裏插入圖片描述
其實Bash本身其實是想在啓動時初始環境變量以及定義一些函數,而初始的方式就是去把 變量名=值 這樣的賦值語句用eval去執行一次,如果出現了函數定義,就把它轉變成函數,除此之外就不想讓它幹其他的了,可偏偏它在掃描到函數定義時,把它轉變成函數的過程中不小心執行了後面的命令,這其實不是eval的錯,這是做語法解析時沒考慮嚴格,本質上說這個漏洞是傳入命令的邊界沒有控制好,導致定義完函數繼續執行後續指令。

6、修復意見
建議升級bash,命令yum update bash,修復完成後可以poc:env x=’() { :;}; echo vulnerable’ bash -c "echo this is a test"驗證是否成功。如果顯示this is a test ,則表示成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章