標籤:style blog http color io os 使用 ar strong
今日爆出一個Bash的RCE漏洞,威力巨大。看了看老外的分析,覺得有必要寫一寫自己對這個漏洞的理解。
首先,問題起因於一個命令ENV。
原型:
env [OPTION]... [NAME=VALUE]... [COMMAND [ARGS]...]
Man是這麼說的:
Display, set, or remove environment variables,Run a command in a modified environment.
我的理解是使用env命令的key=value,首先會改變環境變數key,如果沒有會臨時建立,注意,這裡是臨時的改變環境變數。然後就把value後面的內容當做命令執行,類似於PHP中的eval。
測試如下:
可以看到,這個命令可以達到的作用是:在臨時修改環境變數的同時,也可以執行命令。
網上流傳的EXP通常會帶有一個User-Agent欄位然後後面跟一個字串。嚴格意義上來說,這裡的User-Agent完全可以使用其他的HTTP欄位進行替換。
注意到,ENV本身不是漏洞的成因,漏洞的本質是代碼注入。
在bash源碼中的處理參數的程式碼片段中:
這段代碼是解析匿名函數的時候使用的,使用匿名函數我們才能達到執行的目的:parse_and_execute。這裡的string是環境變數的value,name是環境變數的鍵值。由於沒有進行過濾就直接傳給temp_string,然後送到parse_and_execute中進行執行了。
也就是說,匿名函數執行完後面本應該結束掉,但是在bash中卻又繼續執行後面的參數了。
比如:TEST=() { :;}; /bin/cat /etc/passwd
在環境變數匯入到bash的同時,也會執行/bin/cat /etc/passwd。
這和CGI的關係是:
對於CGI指令碼來說,HTTP協議中的“key-value”都會變為shell中的“環境變數=值”。
-
Host (“www.example.com”,as REMOTE_HOST)
-
Header value (“custom-header-value”, as HTTP_CUSTOM in this example)
-
Server protocol (“HTTP/1.1”, as SERVER_PROTOCOL)
而將用戶端資訊匯入到系統內容變數的時候就會用到ENV了。那麼這樣一來,我們就可以通過在用戶端構造攻擊向量去攻擊伺服器了。從CGI對HTTP參數的處理上看,使用哪個欄位都是可以的。
本地測試過程如下:
構造有漏洞的CGI:
訪問:http://10.10.10.132/cgi-bin/test
這裡我也使用User-Agent進行測試:
結果如下,發送請求之後,伺服器會爆出500出錯:
但是這時候echo aaa > /tmp/test確實執行了。
驗證下:
可以看到,伺服器隨便報錯,但是我們的代碼成功執行了。
EXP:
使用nc做個反彈shell就行了,威力挺大吧。
不過這個漏洞可是不好做批量,一種思路就是爬蟲+掃描進行CGI連結的擷取。當然,還有一種比較無腦的,就是------------------------------------直接抓搜尋引擎的。
以上為個人理解,歡迎討論與錯誤指正。
Bash遠程代碼執行漏洞分析