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