VBScript引擎中的漏洞會影響Internet Explorer運行Shellcode區(qū)塊鏈
7月11日的時候發(fā)現(xiàn)了一個高風(fēng)險的InternetExplorer(IE)漏洞,就在微軟7月補丁周二的第二天。
在7月11日的時候發(fā)現(xiàn)了一個高風(fēng)險的Internet Explorer(IE)漏洞,就在微軟7月補丁周二的第二天。雖然此漏洞(現(xiàn)在指定為CVE-2018-8373)會影響最新版Windows中的VBScript引擎,但Internet Explorer 11并不容易受到攻擊,因為默認(rèn)情況下Windows 10 Redstone 3(RS3)中的VBScript已被有效禁用。
然后發(fā)現(xiàn)了惡意網(wǎng)絡(luò)流量中的漏洞。URL如下所示:
圖1.使用的惡意URL
發(fā)現(xiàn)了這種漏洞之后,從而進行了更深入的分析。有趣的是,發(fā)現(xiàn)此漏洞利用示例使用與CVE-2018-8174相同的混淆技術(shù),CVE-2018-8174是5月份修補的VBScript引擎遠程執(zhí)行代碼漏洞。
圖2. CVE-2018-8373(左側(cè))和CVE-2018-8174(右側(cè))的比較
此外,這是用于運行shellcode的示例exploit的方法:
圖3. CVE-2018-8373(左側(cè))和CVE-2018-8174(右側(cè))如何運行shellcode的比較
經(jīng)過調(diào)查懷疑這個漏洞利用樣本來自同一個創(chuàng)建者。因為經(jīng)過分析顯示它在vbscript.dll中使用了一個新的use-after-free(UAF)漏洞。
漏洞根本原因分析
現(xiàn)在詳細介紹對此漏洞的分析,該漏洞已在微軟周二的八月補丁中得到解決。由于原始漏洞被嚴(yán)重混淆,就進行演示了一個概念驗證(PoC)來解釋如何利用此漏洞:
圖4. IE漏洞PoC
這個PoC定義了一個名為MyClass的類,它有一個名為array的成員變量和兩個名為Class_Initialize和Default Property Get P的成員函數(shù)。Class_Initialize是一個不推薦使用的方法,現(xiàn)在由New過程替換。首次實例化對象時會自動調(diào)用它。在該PoC中,Class_Initialize函數(shù)被重載,以及何時呼叫VBScriptClass::InitializeClass后,它會被分派到重載函數(shù)。
默認(rèn)屬性是一個類屬性,可以在不指定的情況下訪問它。在此PoC中,Default Property Get函數(shù)重載MyClass的默認(rèn)屬性。當(dāng)調(diào)用訪問cls時,它將被調(diào)度到重載函數(shù)。
漏洞的觸發(fā)流程可以簡化為以下三個步驟:
1.設(shè)置cls = New MyClass
這將調(diào)用重載函數(shù)Class_Initialize。在Class_Initialize中,ReDim數(shù)組(2)將調(diào)用vbscript!RedimPreserveArray來創(chuàng)建一個元素的計數(shù)為3的數(shù)組:
圖5.內(nèi)存中的ReDim數(shù)組
2. cls.array(2)
它將調(diào)用vbscript!AccessArray來獲取數(shù)組元素的地址。在vbscript!AccessArray中,它將首先檢查數(shù)組元素的索引是否超出邊界:
圖6.在vbscript中檢查元素索引!AccessArray
然后計算元素的地址,將其保存在堆棧中,并返回以下內(nèi)容:
圖7.在堆棧上保存元素地址
3. cls.array(2)= cls
這將調(diào)用vbscript!AssignVar將MyClass默認(rèn)屬性值設(shè)置為cls.array(2)。獲取MyClass默認(rèn)屬性值時,調(diào)用公共默認(rèn)屬性Get P并在公共默認(rèn)屬性Get P中執(zhí)行腳本ReDim數(shù)組(1),這將導(dǎo)致原始array.pvData被釋放:
圖8.釋放原始pvData
但是,如第二步所述,數(shù)組(2)的地址仍保存在堆棧中。公共默認(rèn)屬性Get P的返回值將訪問釋放的內(nèi)存,從而觸發(fā)vbscript中的use-after-free(UAF)漏洞!AssignVar:
圖9. vbscript中的崩潰!AssignVar
如前所述,vbscript!AccessArray檢查數(shù)組元素的索引是否超出邊界。但是當(dāng)獲取類的默認(rèn)屬性值時,它將觸發(fā)腳本回調(diào)函數(shù)Default Property獲取修改數(shù)組的長度,而不是在vbscript!AssignVar中訪問時再次檢查數(shù)組的元素。
剝削分析
可以通過以下三個步驟簡化利用:
使用此漏洞將二維數(shù)組的長度修改為0x0FFFFFFF。
實現(xiàn)讀/寫原語。
偽造CONTEXT結(jié)構(gòu)并執(zhí)行shellcode。
讓我們詳細談?wù)劺茫?/p>
1.修改二維數(shù)組的長度
首先,漏洞定義了兩個數(shù)組,在下圖中將其標(biāo)記為array1和array2的數(shù)組1是先前在PoC中描述的陣列,且數(shù)組2是一個二維陣列,其中每個元素的值是3。
圖10. array2的定義
然后它使用腳本回調(diào)函數(shù)Default Property Get釋放原始array1.pvData并將array2設(shè)置為new array1.pvData。因為原來的大小array1.pvData,這是的0x30字節(jié)在存儲器中,相同array2.SAFEARRAY結(jié)構(gòu),一些的array2.SAFEARRAY結(jié)構(gòu)將重用在原釋放的內(nèi)存array1.pvData。同時,Default Property Get的返回值0x0FFFFFFFF將覆蓋array2.SAFEARRAY的SAFEARRAYBOUND結(jié)構(gòu),并將二維數(shù)組的長度修改為0x0FFFFFFF。
圖11.默認(rèn)屬性Get的定義
圖12.修改數(shù)組長度的步驟
2. RW原語
這里得到一個數(shù)組,array1(index_vuln)(0x0FFFFFFE,2),其長度由UAF調(diào)節(jié)。通過搜索array1的元素,可以在以下腳本中找到index_vuln:
圖13.搜索array1(index_vuln)(0x0FFFFFFE,2)
然后它使用array1(index_vuln)(0x0FFFFFFE,2)來實現(xiàn)越界(OOB)并找到兩個數(shù)組元素混淆的元素。
圖14.搜索第一個數(shù)組的元素
圖15.搜索第二個數(shù)組的元素
這里漏洞獲取兩個數(shù)組的元素:array1(index_B)(0,0)和array1(index_vuln)(index_A,0),它們在內(nèi)存中的距離為8字節(jié)。在內(nèi)存中搜索的充分利用如下所示:
圖16.在內(nèi)存中搜索方式的演示
最后,它使用兩個數(shù)組的元素來實現(xiàn)類型混淆的讀寫原語:
圖17. RW基元的實現(xiàn)
3.運行shellcode
它使用read原語來泄漏模塊的地址:
圖18.泄漏模塊的地址
通過將一些VARIANT的VarType修改為0x4d并將值修改為0,將調(diào)用vbscript!VAR :: Clear,然后將調(diào)用堆棧返回地址修改為NtContinue的地址并偽造CONTEXT結(jié)構(gòu)以運行shellcode:
圖19.修改VARIANT
圖20.運行shellcode
經(jīng)過一系列的分析,可以穩(wěn)定地利用此漏洞。此外,由于它是今年在野外發(fā)現(xiàn)的第二個VB引擎漏洞利用,因此預(yù)計未來VB引擎中的其他漏洞發(fā)現(xiàn)并非遙不可及。
總結(jié)
作為第一道防線,區(qū)塊鏈安全公司W(wǎng)F曲速未來建議在可用時應(yīng)用最新的安全補丁以防止漏洞利用。用戶還可以使用可以抵御可能漏洞攻擊的解決方案。主動,多層次的安全方法是利用漏洞(來自網(wǎng)關(guān),端點,網(wǎng)絡(luò)和服務(wù)器)的威脅的關(guān)鍵。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補充。