Hacking Team系列 Flash 0Day分析

wyzsk發表於2020-08-19
作者: 綠盟科技 · 2015/07/16 10:27

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沙箱原理要有比較透徹的理解。

  • IE保護機制

現在的Flash一般都嵌入到網頁,如果想利用Flash漏洞來獲取許可權,無疑受到IE等瀏覽器本身機制的保護,比如IE,Chrome的沙箱機制。這就要求對沙箱機制和如何繞過沙箱有個整體細緻的瞭解,也就是說想透過Flash漏洞來獲取更高的許可權還是要有更高的功底。

  • 沒有完整的POC

對於漏洞分析和利用如果沒有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版本,目前已有可利用的攻擊程式碼公開發布,強烈建議受影響使用者更新到當前廠商提供的最新版本。

  • Adobe Flash Player <= 18.0.0.194
  • Adobe Flash Player <= 18.0.0.194
  • Adobe Flash Player Extended Support Release 13.x
  • Adobe Flash Player Extended Support Release 13.0.0.296
  • Adobe Flash Player for Linux 11.x
  • Adobe Flash Player for Linux 11.2.202.468

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外掛
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章