騰訊禦見威脅情報中心近日監控到一例使用Adobe Flash 0day漏洞(CVE-2018-5002)的APT攻擊,攻擊者疑通過即時聊天工具和郵箱等把惡意Excel文檔發送給目标人員,誘騙目标人員打開文檔。實際上,該惡意Excel文檔經過特别構造,被嵌入了flash對象,使用者一旦打開文檔電腦就會中毒。
CVE-2018-5002影響Adobe Flash Player 29.0.0.171及所有之前的版本。Adobe官方于6月7日下午釋出安全公告(公告ID:APSB18-19),Adobe Flash Player的版本已更新到30.0.0.113。具體可參考Adobe 官方安全公告:
https://helpx.adobe.com/security/products/flash-player/apsb18-19.html 我們及時向Adobe官方上報了漏洞利用樣本,并獲得了Adobe官方确認和緻謝。
0×2 攻擊流程分析
1. 漏洞文檔行為分析
此次攻擊時使用的誘餌文檔檔案名為《basic_salary.xlsx》,主要内容為阿拉伯語言撰寫的外交部官員基本工資情況。誘餌文檔嵌入了一個線上的Flash對象,使用者打開文檔後,就會自動加載Flash檔案。
(google翻譯後的文檔内容)
(誘餌文檔内容)
2. SWF1行為分析
SWF1檔案中的代碼高度混淆,後續圖檔中的源碼,均是對混淆代碼進行一定優化後截取的。
(混淆後的SWF1代碼)
誘餌文檔中嵌入了一個線上swf對象,當打開帶漏洞的excel表格時,會加載“Movie”字段所指向的線上Flash檔案,這裡取名為SWF1。
Excel會将FlashVars指向的文本會以參數的形式傳遞給SWF1,這裡存放的是漏洞利用樣本(SWF2檔案) 和 ShellCode等URL資訊,分别被标記為了stabUrl、encKeyUrl、downloadUrl、imageUrl。
(SWF1運作時取參數)
SWF1運作後,會以post方式從參數encKeyUrl 指向的WEB伺服器得到解密key及加密的swf。使用aes算法解密後,得到漏洞swf檔案,取名為SWF2。
(SWF1以post方式下載下傳加密的SWF2)
(SWF1使用aes解密SWF2)
SWF1通過LoadBytes将解密後的漏洞利用檔案SWF2加載執行,并将downloadUrl等參數傳給SWF2。
(SWF1加載SWF2)
3. SWF2(0day漏洞)行為分析
CVE-2018-5002是由于Flash未能正确處理包含特殊位元組碼序列的SWF檔案時産生的棧越界讀寫漏洞。該漏洞同之前的CVE-2017-11292類似,都需要修改SWF檔案的位元組碼來觸發漏洞。同時該漏洞的利用隻需要簡單的記憶體布局,不需要複雜的堆噴,一個樣本同時在32位和64位系統中穩定運作。
1) 漏洞原理分析
a. 漏洞代碼
ASC2(ActionScript 2)引入了一組用于快速操作記憶體的函數,如li8, si8等等。該組函數的具體含義如下:
樣本代碼經過了惡意混淆,下面是清除混淆後的觸發漏洞代碼。
其中包含li8的靜态初始化(Static Initializer)代碼并沒有被完全反編譯,下圖是根據其位元組碼得出的僞碼:
實際調試發現,執行li8指令時會觸發異常,同時異常會交由目前的catch塊來處理。而catch部分的代碼可以越界将其調用者的棧上的兩個對象指針(local_448, local_449)互換,進而實作類型混淆。
這裡就産生兩個重要的問題:
I li8指令并不在try塊中,為什麼産生的異常能被目前的catch塊捕獲?
II catch塊正常情況下隻能通路local_0和local_1,為什麼這裡能越界讀寫?
b. 異常處理
Flash的虛拟機AVM在執行可能會觸發異常的位元組碼前,會記錄目前執行的位置previous_bytecode_offset,當發生異常後則根據記錄的執行位置從異常處理例程表ExceptionHandlerTable中查找對應的異常處理函數,即AS腳本或位元組碼中的catch塊。
Flash在建立domainMemory時,會為其初始化一個大小為0×400的記憶體。
Flash在執行li8(123456)指令時,首先會檢查偏移123456是否超過了domainMemory的大小。由于偏移123456超過了domainMemory的範圍0-1023,是以Flash會抛出一個Range Error的異常,如下圖所示,其中0×34為li8的位元組碼0×35 – 1。
在執行該段代碼前,previous_bytecode_offset被初始化為0。此後一共執行了三個位元組碼,分别是:jump,push,li8,這三個位元組碼的執行都沒有儲存目前執行的位置到previous_bytecode_offset。
這樣Flash在處理li8位元組碼觸發的異常時,認為異常發生的位置為0,接下來FindExceptionHandler函數根據異常發生的位置查找對應的異常處理函數,由于異常位置0位于目前的Try塊内,FindExceptionHandler函數就認為該異常應該交給目前的catch塊來處理。
下圖就是調試該過程的截圖,FindExceptionHandler的第二個參數就是出現異常的偏移即previous_bytecode_offset,值為0。
c. 棧越界讀寫
棧越界讀寫主要是通過繞過Flash對Catch代碼塊的檢查(Verify)實作的。
Flash在對Try代碼塊進行檢查時,發現目前代碼塊隻有一條jump指令,而jump指令不會抛出異常。
同時,由于jump目标區域的位元組碼序列不在Try代碼塊内, Flash AVM認為整段代碼不會發生異常,對應的catch代碼不會被執行到,是以略過了對catch代碼塊的檢查,進而可以在catch代碼塊内實作越界讀寫。
越界讀寫前:
觸發越界讀寫,交換local_448和local_449:
2) 行為分析
SWF2運作後會從downloadUrl指向的WEB伺服器下載下傳加密的資料,以得到shellcode。
(SWF2 取shellcode下載下傳連結)
(SWF2下載下傳shellcode)
取加密資料的前16個位元組作為解密的Key,通過AES解密ShellCode。
(SWF2解壓縮并執行shellcode)
再借助0day漏洞将shellcode執行起來。由于ShellCode伺服器已經關閉,已經無法擷取ShellCode的具體内容。
(執行32位或64位shellcode)
(執行shellcode)
0×3 總結
該APT組織使用0day漏洞攻擊政府相關部門,利用純shellcode在宿主程序excel中幹壞事。而這種0day漏洞加純shellcode的攻擊方式對安全軟體的檢測和防護能力是一個挑戰。
騰訊禦見威脅情報中心判斷在此0day漏洞利用方法未被廣泛傳播之前,該漏洞仍将主要被技術實力強勁的APT組織所掌握。而鑒于Adobe Flash Player幾乎安裝在每一台電腦上,且有大量使用者未能及時修補安全漏洞,當該漏洞的利用方法被病毒木馬黑色産業掌握時,或将會帶來大面積的網頁挂馬威脅。
騰訊安全專家提醒政府機關、相關企業使用者切勿随意打開來曆不明的文檔,安裝安全軟體防禦攻擊。此外,及時更新Adobe Flash Player到最新版本(30.0.0.113)以防禦可能的漏洞攻擊威脅,下載下傳位址:
https://get.adobe.com/cn/flashplayer/目前,騰訊禦界進階威脅檢測系統已經可以檢測并阻斷該輪攻擊的連接配接行為。企業使用者通過部署禦界進階威脅檢測系統,可以及時感覺惡意流量,檢測釣魚網址和遠控伺服器位址在企業網絡中的通路情況,保護企業網絡安全。(詳情見連結
https://s.tencent.com/product/gjwxjc/index.html)
附錄(IOCs):
專注于安全領域 解決網站安全 解決網站被黑 網站被挂馬 網站被篡改
網站安全、伺服器安全提供商-www.sinesafe.com --專門解決其他人解決不了的網站安全問題.