Hacking Team事件已經過去1個星期,社會各界針對泄露數據的分析還在進行中。為了幫助安全技術從業者后續能夠有更多的人加入到分析隊伍中來,綠盟科技安全技術專家將Flash 0Day的分析方法開放出來跟大家共享,便于技術人員能夠入手Flash 0Day漏洞分析。
自7月5日晚,Hacking Team被Gamma Group Hacker 攻陷以來,其泄露的400GB數據包持續在業界傳播發酵,綠盟科技威脅響應中心持續跟蹤事態進展,給出系列分析報告 ,同時也將相關解決方案提供給合作伙伴及最終用戶,以便用戶能夠應對可能發生的攻擊,此次事件告一段落。今天綠盟科技安全技術人員將針對此次泄露的Flash 0Day漏洞,將分析方法、工具及相關知識分享出來,希望更多的安全行業從業者能夠從中有所獲益。
綠盟科技一直參與微軟MAPP計劃,該計劃里面也包含了Adobe公司爆出的漏洞,通過以往長期跟蹤分析的經驗來看,Adobe漏洞主要集中在兩款產品一個是Abode reader,另一個就是Adobe Flash。此次報告分析的漏洞就是關于后者的漏洞,該漏洞在綠盟科技漏洞庫中具有這些標識,CVE-2015-5119,Adobe Flash Player ActionScript 3 ByteArray釋放后重用遠程漏洞(CVE-2015-5119),BUGTRAQ ID: 75568 ,CVE(CAN) ID: CVE-2015-5119
為什么Hacking Team用了Flash漏洞,是因為Flash漏洞相比其他軟件,協議,服務的漏洞要更難分析和利用,一方面可以為黑產競爭者制造壁壘,同時也為分析和防護Flash 0Day提升難度。究其原因有以下幾個方面:
Flash軟件不是微軟提供的軟件,所以沒有提供標準的符號表,較難定位到具體的函數位置,目前做這方面分析的組織不多。
如今常見的Flash Player都集成了AVM2,將AS編譯的字節碼直接跑在虛擬機上,由AVM2來解釋執行。一方面方便了swf文件的移植,另一方面,相對于分析其他軟件的漏洞來說,無疑又是多了一層保護。
Flash安全模型使用安全域的沙箱來分離內容。Flash沙箱除了隔離內容外,還能避免名字沖突(有點類似命名空間)。沙箱系統中不同的安全域使得SWF文件在Flash播放時運作在自身的沙箱里。如果想要突破沙箱機制,需要對Flash沙箱原理要有比較透徹的理解。
現在的Flash一般都嵌入到網頁,如果想利用Flash漏洞來獲取權限,無疑受到IE等瀏覽器本身機制的保護,比如IE,Chrome的沙箱機制。這就要求對沙箱機制和如何繞過沙箱有個整體細致的了解,也就是說想通過Flash漏洞來獲取更高的權限還是要有更高的功底。
對于漏洞分析和利用如果沒有POC,那也只能靠自己去挖掘這個漏洞; 另一方面如果缺少完整的POC,攻擊者只能自己去寫代碼,所以業界及主管機構都是嚴格控制POC的傳播。
POC的基本功能就是驗證并觸發該漏洞或是Bug存在,但是能觸發漏洞,不代表就一定能利用漏洞;有些漏洞是不能利用,當然我們也可以不管這類漏洞叫漏洞,而只能稱之為Bug。但此次泄露出的Flash0day數據,是可以被觸發的。
那么此次的漏洞如果被觸發,會有什么樣的結果呢?先來看看漏洞觸發后的現象。通過分析,利用該漏洞可以在IE中穩定的執行系統可執行文件,比如在下圖中就彈出了計算器。
方法很簡單利用構造的test.html加載swf文件,在加載swf文件時IE會提示要加載ActiveX插件,運行就行。加載插件后點擊圖中的“run calc.exe”按鈕即可彈出計算器,漏洞利用成功。這個實驗中使用Win7 64位、IE11,能穩定觸發漏洞。
Adobe Flash Player存在一個嚴重的釋放后重利用內存破壞漏洞,攻擊者可能遠程獲得當前用戶的權限。此漏洞影響大量Flash Player版本,此漏洞影響大量Flash Player版本,目前已有可利用的攻擊代碼公開發布,強烈建議受影響用戶更新到當前廠商提供的最新版本。
1 觸發原理
該漏洞是一個典型的UAF釋放重利用的漏洞。用戶改寫字節數組大小,在原來字節數組釋放后,重新分配,導致該數值被寫入已經釋放的內存中,造成釋放重利用。
2 動態調試
由于Hacking Team泄露出的數據中暴露了Flash 0Day漏洞源碼,我們的得以使用CS進行動態調試。
利用CS裝載源文件中的fla原始檔,和其他as文件。生成SWF文件
可以看出先是調用了MyClass.as文件中的InitGui函數來初始化GUI元素并輸出一些系統相關信息,點擊swf文件中的button按鈕就會調用相應的處理函數如下圖所示:
處理函數btnClickHandler里面首先調用了TryExpl函數如下圖所示:
接下來就看看TryExp1函數里面是怎么樣做到漏洞利用的,進入該函數
從給出的源碼可以看出先是聲明了變量alen=90,然后聲明一個數組a,并將數組的各元素賦值,在AS中Array數組類型的變量不像C/C++數組一樣要求是同一類型的數據在可以放到數組里面,在AS中不同類型的變量對象可以放到同一數組里面。從源碼可以看出,a數組的90個元素是MyClass2對象和ByteArray類型數組交替出現,并且每分配兩個MyClass2元素才會分配一次BtyeArray類型數組,那么實際運行效果是怎么的呢,我們利用CS調試功能在for結束后的下一條語句下了斷點顯示如下圖:
從圖中看出我們在for(i=alen-5;i>=0;i-=3)
處下了斷點,在調試運行后,讓a數組填充完畢;左上部紫色的框給出了按鈕按下后堆棧中函數調用關系,btnClinckHandler->TryExp1
。左下方的紅框給出了a數組賦值完成后每個元素的實際值,從圖中看出,除了a[0]外,每出現一次ByteArray元素要出現兩次MyClass2元素,這和我們剛才通過靜態代碼分析的結果是一致的。
接下來就是一個for(i=alen-5;i>=0;i=3)
語句,前面知道alen=90那么在第一次循環時i=85
,通過源代碼中的賦值我們知道a[85]
的大小是0Xfa0
,源碼中將_ba=a[i],也就是第一次將a[85]
賦給_ba
(也就是_ba
大小為0xfa0
),同時將一個新的Myclass類賦給_ba的第四個字節_ba[3]
。如下圖所示
接下來就要動態跟蹤一下a[i]
是不是a[85]
,如果是a[85]
那么又是什么類型,為了能查看i的值到底是不是a[85]
,我在源碼中添加了一條調試語句trace(“the number of i =”)
看i的值打印多少,根據之前設置的斷點,單步執行源代碼,如下圖所示:
從圖中可以看出右下方打印出i的值是85,剛好我們分析的一致,從左邊圖可以看出a[85]
元素的類型是ByteArray類型。接下來代碼中會將MyClass對象賦值給_ba[3]
。由前面介紹的知識我們知道,在MyClass對象賦給一個基本類型時,會調用ValueOf函數,這里給對象MyClass定義了ValueOf函數,所以在賦值之前會調用該函數。
繼續單步跟進_ba[3]=new MyClass();
調用自定義的ValueOf函數
在我們單步跟蹤調試ValueOf函數,_gc
數組除了在TryExp1
中加入a數組元素外(_gc.push(a))
,又通過valueof函數,加入了-va
元素(_gc.push(_va))
,這樣_gc數組就有兩個元素,一個是a數組元素,一個是_va數組元素,每個元素又是數組類型,a數組有90個元素,前面已經介紹過了,_va有5個元素,如圖中左邊顯示的結果。在TryExp1中_ba=a[i]
大小為0xfa0,在valueof函數中_ba通過_ba.length=0x1100
會釋放調原來的空間而從新分配內存大小。同時通過后面的_va[i]=new Vector.<uint>(0x3f0)
來重新使用釋放的內存。前面我們介紹過,在分配vector類型的空間時其前四個字節是vector大小也就是說,在被釋放的空間的開始四個字節會寫入0x3f0
。
而在_ba[3]=new Myclass()中_ba[3]
實際指向的內存地址還是釋放后的內存地址所以在返回40后被釋放的內存的數據就是0x400003f0。
a. 通過a數組創建ByteArray類型元素數據,設置長度為0xfe0:
b.通過調用valueof函數中的_ba.length=0x1100,釋放該空間
c.調用分配vector<int>
來占據被釋放的內存,由前面的知識,我們知道Uint vector包含了8字節的頭部信息,其中開始的4字節是長度字段。
d.在valueof返回0x40后,寫入到之前_ba[3]
指向的地址中
在Myclass對象調用valueof之前空間內存是esi-3,如下圖所示
在調用length=0x1100后,內存空間被釋放,申請的vector<int>
利用釋放后的空間,從下圖可見vector前四個字節值是0x3f0
在valueof返回后_ba[3]
指向的第四個字節0x10a70003被賦值為0x40
此時vector的長度字段已經變成了0x400003f0
那么利用該漏洞是否可以達到提權的目的呢,讓我們來驗證一下。利用windows 7自帶的IIS服務搭建一個Web服務,將test.html和exp1.swf放在web服務目錄中同時將test.html中對exp1.swf引用改為絕對地址引用,這樣在訪問test.html時方便加載exp1.swf。設置IE啟動保護模式,同時需要啟動ProcessExplorer工具來監控IE進程和進程的權限等級。
從ProcessExplorer結果來看,進程ID為1792的iexplore是沙箱進程,產生的子進程6512是在訪問test.html是生成的一個Tab,如下圖
當然有多個IE Tab標簽時會有多個子進程,同時受到一個沙箱進程的保護,從圖中看出沙箱進程等級是Medium,屬于標準用戶權限等級,而子進程6512則是low等級,是沙箱中的IE TAB進程的默認等級,IE沙箱中的IE TAB進程默認等級就是低。從圖中可以看出,IE TAB子進程產生的calc子進程也是low。
由此上面的分析,我們可以看出利用該漏洞并未達到權限提升的效果,也就是說,攻擊者單獨使用這個Flash 0Day漏洞是無法獲得高權限的,它只是創建了一個低等級的進程,需要結合其他方法來提權,比如此次泄露數據中的windows內核字體權限漏洞,利用此內核漏洞是很容易提升權限的。
同時,結合之前我們對Hacking Team遠程控制軟件的分析 ,可以看到其代理有兩種安裝方式:
感染移動介質
與很多木馬、病毒及流氓軟件的傳播方式一樣,該軟件首先還是采取這種低成本的方式進行,感染一些能夠接觸目標的移動媒體,比如CD-ROM、USB等,即便是OS 或者BIOS設置了密碼也一樣可以感染,從而獲取一些環境數據,比如電腦是否可以上網等,為后續的動作提供參考依據。
代理攻擊
采用軟件或硬件的系統,能夠在網絡會話過程中修改和注入數據,在某些情況下,可以注入到系統并難以被檢測到。同時,也能夠感染Windows平臺上的可執行文件,如果目標電腦從網站上下載并執行這些可執行文件時,Agent將在后臺自動安裝,用戶不會知曉。
那么,我們這里可就可以畫出一張可能的入侵乃至實現監控目的鏈條:
萬變不離其宗,在上面的攻擊鏈條中,有很關鍵的一條,用戶需要執行惡意代碼,漏洞利用才能成功,那么從防護的角度來說至少需要有這些層面
值得一提的是,從下面的截圖中可以看到在大家四處下載400GB泄露數據包的時候,惡意swf就藏在這些網站頁面中,從這一點就可以看到其攻擊目標很明確,針對中間環節的攻擊從未停止。請下載這些數據包的人需要小心謹慎,不要四處傳播這些數據包。
在上次防護方案 中,我們也提出用Intrusion Kill Chain模型 來進行Flash 0Day乃至后續攻擊的防護方案的參考,具體的分析請參考那篇報告。
同時,從用戶的角度來說,建議您可以采取如下方式來防御Flash 0Day漏洞以及以后的類似漏洞