當前位置:
首頁 > 新聞 > 深入研究VBScript—CVE-2018-8174利用分析

深入研究VBScript—CVE-2018-8174利用分析

4月下旬,我們在沙箱中發現了一個新的Internet Explorer 0 day漏洞CVE-2018-8174並寫了一篇描述文章。該漏洞使用了CVE-2014-6332 poc中一種眾所周知的技術,它基本上「破壞」了兩個內存對象,並將一個對象的類型更改為Array(用於對地址空間的讀/寫訪問),另一個對象更改為為Integer用於獲取任意對象的地址。

CVE-2014-6332是針對寫入任意內存位置的整數溢出利用,但我的興趣在於如何調整此技術以利用use-after-free漏洞。要回答這個問題,讓我們考慮一下VBScript解釋器的內部結構。

無文檔記錄的平台

調試VBScript可執行文件是一項繁瑣的工作。在腳本執行之前,它被編譯成p代碼,然後由虛擬機解釋。沒有找到關於此虛擬機的內部結構及其說明的開源信息。我花了很多精力來追蹤幾個網頁,其中包含1999年和2004年的微軟工程師報告,這些報告與p代碼相關。那裡有足夠的信息讓我完全逆向所有VM指令並寫一個反彙編程序!在我們的Github存儲庫中可以找到用於在IDA Pro和WinDBG調試器的內存中反彙編VBScript p代碼的最終腳本。

通過理解解釋的代碼,我們可以精確地監視腳本的執行:可以獲得任何給定時刻執行代碼的完整信息,並且可以觀察腳本創建和引用的所有對象。所有這些都有利於分析。

運行反彙編腳本的最佳位置是CScriptRuntime :: RunNoEH函數,它直接解釋p代碼。

CScriptRuntime類中的重要欄位

CScriptRuntime類包含有關解釋器狀態的所有信息:局部變數,函數參數,指向堆棧頂部和當前指令的指針,以及編譯腳本的地址。

VBScript虛擬機是面向堆棧的,包含100多條指令。

所有變數(本地參數和堆棧上的變數)都表示為16個位元組的VARIANT結構,其中高位字表示數據類型。某些類型值在相關的MSDN頁面上給出。

CVE-2018-8174 利用

下面是類"Class1"的代碼和反彙編的p代碼:

函數34是類"Class1"的構造函數。

OP_CreateClass指令調用VBScriptClass :: Create函數來創建VBScriptClass對象。

OP_FnBindEx和OP_CreateVar指令嘗試獲取參數中傳遞的變數,這些參數尚不存在,它們由VBScriptClass :: CreateVar函數創建。

此圖顯示了如何從VBScriptClass對象獲取變數。變數的值存儲在VVAL結構中:

要了解利用,非常重要的一點是,了解變數在VBScriptClass結構中的表示方式。

當在function 36 ("SetProp")中執行OP_NamedSt"mem"指令時,它調用先前堆疊的類的實例的默認屬性Getter,然後將返回的值存儲在變數"mem"中。

***BOS(8292,8301)*** mem=Value *****

0000OP_Bos1 0

0002OP_LocalAdr -1

0005OP_NamedSt 『mem』

下面是function 30 (p)的代碼和反彙編的p代碼,在執行OP_NamedSt指令期間調用它:

該函數的第一個基本塊是:

***BOS(8626,8656)*** P=CDbl(「174088534690791e-324」) *****

0000OP_Bos1 0

0002OP_StrConst 『174088534690791e-324』

0007OP_CallNmdAdr』CDbl』 1

000EOP_LocalSt 0

設置好返回值但返回之前,此函數執行:

For IIIl=0 To 6

IIIlI(IIIl)=0

Next

這會調用「Class1」實例的garbage collector,並導致懸空指針引用,就是我們之前討論過的Class_Terminate()中的use-after-free漏洞。

***BOS(8855,8874)*** Set llII=New Class2 *****

0047OP_Bos1 4

0049OP_InitClass 『Class2』

004EOP_LocalSet 1

OP_InitClass"Class2"指令在先前釋放的VBScriptClass的位置創建類"Class1"的「evil twin」實例,該實例仍由function 36 ("SetProp")中的OP_NamedSt "mem"指令引用。

「Class2」類是「Class1」類的「evil twin」:

內存中變數的位置是可預測的。VVAL結構佔用的數據量等於0x32 + UTF-16變數名的長度。

下面的圖表顯示了在分配"Class2"代替"Class1"時,"Class1"變數相對於"Class2"變數的位置。

當function 36 ("SetProp")中的OP_NamedSt "mem"指令執行完成時,function 30 (p)返回的值通過Class1中VVAL "mem"的懸空指針寫入存儲器,覆蓋 Class2中的VVAL "mem"。

因此,String類型的對象被轉換為Array類型的對象,之前被認為是字元串的數據被視為Array控制項結構,允許訪問進程的整個地址空間。

總結

我們的腳本將VBScript編譯成p代碼,在位元組碼級別啟用VBScript調試,這有助於分析漏洞利用並了解VBScript的運行方式。此腳本位於我們的Github存儲庫。

CVE-2018-8174的案例表明,當內存分配具有高度可預測性時,use-after-free漏洞很容易被利用。野外攻擊針對舊版Windows。在Windows 7和Windows 8.1中最有可能發生其利用所需的內存中對象的位置。

自動漏洞利用保護(Automatic Exploit Protection (AEP))是卡巴斯基實驗室產品的一部分,它通過以下判決阻止漏洞利用的各個階段:

· HEUR:Exploit.MSOffice.Generic

· HEUR:Exploit.Script.CVE-2018-8174.a

· HEUR:Exploit.Script.Generic

· HEUR:Trojan.Win32.Generic

· PDM:Exploit.Win32.Generic


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

如何利用Pspy監控沒有Root許可權的Linux進程
針對間諜軟體InvisiMole的RC2CL模塊分析

TAG:嘶吼RoarTalk |