<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/7199

            0x00 導讀


            Hacking Team事件已經過去1個星期,社會各界針對泄露數據的分析還在進行中。為了幫助安全技術從業者后續能夠有更多的人加入到分析隊伍中來,綠盟科技安全技術專家將Flash 0Day的分析方法開放出來跟大家共享,便于技術人員能夠入手Flash 0Day漏洞分析。

            0x01 漏洞:Flash 0Day


            自7月5日晚,Hacking Team被Gamma Group Hacker 攻陷以來,其泄露的400GB數據包持續在業界傳播發酵,綠盟科技威脅響應中心持續跟蹤事態進展,給出系列分析報告 ,同時也將相關解決方案提供給合作伙伴及最終用戶,以便用戶能夠應對可能發生的攻擊,此次事件告一段落。今天綠盟科技安全技術人員將針對此次泄露的Flash 0Day漏洞,將分析方法、工具及相關知識分享出來,希望更多的安全行業從業者能夠從中有所獲益。

            1 為什么是Flash 0Dday

            綠盟科技一直參與微軟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數據,是可以被觸發的。

            2 漏洞觸發

            那么此次的漏洞如果被觸發,會有什么樣的結果呢?先來看看漏洞觸發后的現象。通過分析,利用該漏洞可以在IE中穩定的執行系統可執行文件,比如在下圖中就彈出了計算器。

            enter image description here

            方法很簡單利用構造的test.html加載swf文件,在加載swf文件時IE會提示要加載ActiveX插件,運行就行。加載插件后點擊圖中的“run calc.exe”按鈕即可彈出計算器,漏洞利用成功。這個實驗中使用Win7 64位、IE11,能穩定觸發漏洞。

            3 受影響系統

            Adobe Flash Player存在一個嚴重的釋放后重利用內存破壞漏洞,攻擊者可能遠程獲得當前用戶的權限。此漏洞影響大量Flash Player版本,此漏洞影響大量Flash Player版本,目前已有可利用的攻擊代碼公開發布,強烈建議受影響用戶更新到當前廠商提供的最新版本。

            0x02 攻擊:漏洞利用

            1 觸發原理

            該漏洞是一個典型的UAF釋放重利用的漏洞。用戶改寫字節數組大小,在原來字節數組釋放后,重新分配,導致該數值被寫入已經釋放的內存中,造成釋放重利用。

            2 動態調試

            由于Hacking Team泄露出的數據中暴露了Flash 0Day漏洞源碼,我們的得以使用CS進行動態調試。

            源碼級調試分析

            利用CS裝載源文件中的fla原始檔,和其他as文件。生成SWF文件

            enter image description here

            可以看出先是調用了MyClass.as文件中的InitGui函數來初始化GUI元素并輸出一些系統相關信息,點擊swf文件中的button按鈕就會調用相應的處理函數如下圖所示:

            enter image description here

            處理函數btnClickHandler里面首先調用了TryExpl函數如下圖所示:

            enter image description here

            接下來就看看TryExp1函數里面是怎么樣做到漏洞利用的,進入該函數

            enter image description here

            從給出的源碼可以看出先是聲明了變量alen=90,然后聲明一個數組a,并將數組的各元素賦值,在AS中Array數組類型的變量不像C/C++數組一樣要求是同一類型的數據在可以放到數組里面,在AS中不同類型的變量對象可以放到同一數組里面。從源碼可以看出,a數組的90個元素是MyClass2對象和ByteArray類型數組交替出現,并且每分配兩個MyClass2元素才會分配一次BtyeArray類型數組,那么實際運行效果是怎么的呢,我們利用CS調試功能在for結束后的下一條語句下了斷點顯示如下圖:

            enter image description here

            從圖中看出我們在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]。如下圖所示

            enter image description here

            接下來就要動態跟蹤一下a[i]是不是a[85],如果是a[85] 那么又是什么類型,為了能查看i的值到底是不是a[85],我在源碼中添加了一條調試語句trace(“the number of i =”)看i的值打印多少,根據之前設置的斷點,單步執行源代碼,如下圖所示:

            enter image description here

            從圖中可以看出右下方打印出i的值是85,剛好我們分析的一致,從左邊圖可以看出a[85]元素的類型是ByteArray類型。接下來代碼中會將MyClass對象賦值給_ba[3]。由前面介紹的知識我們知道,在MyClass對象賦給一個基本類型時,會調用ValueOf函數,這里給對象MyClass定義了ValueOf函數,所以在賦值之前會調用該函數。

            繼續單步跟進_ba[3]=new MyClass();調用自定義的ValueOf函數

            enter image description here

            在我們單步跟蹤調試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。

            UAF漏洞圖解

            a. 通過a數組創建ByteArray類型元素數據,設置長度為0xfe0:

            enter image description here

            b.通過調用valueof函數中的_ba.length=0x1100,釋放該空間

            enter image description here

            c.調用分配vector<int>來占據被釋放的內存,由前面的知識,我們知道Uint vector包含了8字節的頭部信息,其中開始的4字節是長度字段。

            enter image description here

            d.在valueof返回0x40后,寫入到之前_ba[3]指向的地址中

            enter image description here

            動態跟蹤查看結果

            在Myclass對象調用valueof之前空間內存是esi-3,如下圖所示

            enter image description here

            在調用length=0x1100后,內存空間被釋放,申請的vector<int>利用釋放后的空間,從下圖可見vector前四個字節值是0x3f0

            enter image description here

            在valueof返回后_ba[3]指向的第四個字節0x10a70003被賦值為0x40

            enter image description here

            此時vector的長度字段已經變成了0x400003f0

            3 提權驗證

            那么利用該漏洞是否可以達到提權的目的呢,讓我們來驗證一下。利用windows 7自帶的IIS服務搭建一個Web服務,將test.html和exp1.swf放在web服務目錄中同時將test.html中對exp1.swf引用改為絕對地址引用,這樣在訪問test.html時方便加載exp1.swf。設置IE啟動保護模式,同時需要啟動ProcessExplorer工具來監控IE進程和進程的權限等級。

            enter image description here

            從ProcessExplorer結果來看,進程ID為1792的iexplore是沙箱進程,產生的子進程6512是在訪問test.html是生成的一個Tab,如下圖

            enter image description here

            當然有多個IE Tab標簽時會有多個子進程,同時受到一個沙箱進程的保護,從圖中看出沙箱進程等級是Medium,屬于標準用戶權限等級,而子進程6512則是low等級,是沙箱中的IE TAB進程的默認等級,IE沙箱中的IE TAB進程默認等級就是低。從圖中可以看出,IE TAB子進程產生的calc子進程也是low。

            4 利用形式

            由此上面的分析,我們可以看出利用該漏洞并未達到權限提升的效果,也就是說,攻擊者單獨使用這個Flash 0Day漏洞是無法獲得高權限的,它只是創建了一個低等級的進程,需要結合其他方法來提權,比如此次泄露數據中的windows內核字體權限漏洞,利用此內核漏洞是很容易提升權限的。

            同時,結合之前我們對Hacking Team遠程控制軟件的分析 ,可以看到其代理有兩種安裝方式:

            感染移動介質

            與很多木馬、病毒及流氓軟件的傳播方式一樣,該軟件首先還是采取這種低成本的方式進行,感染一些能夠接觸目標的移動媒體,比如CD-ROM、USB等,即便是OS 或者BIOS設置了密碼也一樣可以感染,從而獲取一些環境數據,比如電腦是否可以上網等,為后續的動作提供參考依據。

            代理攻擊

            采用軟件或硬件的系統,能夠在網絡會話過程中修改和注入數據,在某些情況下,可以注入到系統并難以被檢測到。同時,也能夠感染Windows平臺上的可執行文件,如果目標電腦從網站上下載并執行這些可執行文件時,Agent將在后臺自動安裝,用戶不會知曉。

            那么,我們這里可就可以畫出一張可能的入侵乃至實現監控目的鏈條:

            enter image description here

            0x03 防護:思路及建議


            思路

            萬變不離其宗,在上面的攻擊鏈條中,有很關鍵的一條,用戶需要執行惡意代碼,漏洞利用才能成功,那么從防護的角度來說至少需要有這些層面

            1. 要能夠偵測到惡意的Flash腳本;
            2. 要能夠阻斷Flash腳本的執行;
            3. 即便在執行后能夠查殺惡意進程。

            值得一提的是,從下面的截圖中可以看到在大家四處下載400GB泄露數據包的時候,惡意swf就藏在這些網站頁面中,從這一點就可以看到其攻擊目標很明確,針對中間環節的攻擊從未停止。請下載這些數據包的人需要小心謹慎,不要四處傳播這些數據包。

            enter image description here

            在上次防護方案 中,我們也提出用Intrusion Kill Chain模型 來進行Flash 0Day乃至后續攻擊的防護方案的參考,具體的分析請參考那篇報告。

            建議

            同時,從用戶的角度來說,建議您可以采取如下方式來防御Flash 0Day漏洞以及以后的類似漏洞

            1. 建議您升級最新的Flash Player,具體請訪問:https://get.adobe.com/flashplayer/?loc=cn
            2. 建議您升級最新的安全產品規則庫,具體請訪問:http://update.nsfocus.com/
            3. 建議您安裝or升級最新殺毒軟件,比如使用安全級別更高的獵豹, FireFox瀏覽器
            4. 如果上面的措施實施需要一定時間,建議您暫時禁用Flash插件

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线