Bash 破殼漏洞Shellshock (CVE-2014-6271)復現分析


漏洞簡介

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

查看apache2error.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/passwdpayload

() { :; }; 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-agentConnection等信息

所以這里我們通過修改User-Agent來修改CGI環境變量

漏洞利用場景

  1. 程序在某一時刻使用 bash 作為腳本解釋器處理環境變量賦值
  2. 環境變量的賦值字符串來源於用戶輸入 , 且沒有通過有效的過濾

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM