您好,登錄后才能下訂單哦!
本篇文章為大家展示了win32k內(nèi)核提權(quán)漏洞CVE-2021-1732實(shí)例分析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
CVE-2021-1732是今年二月份被披露的蔓靈花(BITTER)APT組織在某次攻擊行動(dòng)中使用的0Day漏洞。
該漏洞利用Windows操作系統(tǒng)win32k內(nèi)核模塊一處用戶(hù)態(tài)回調(diào)機(jī)會(huì),破壞函數(shù)正常執(zhí)行流程,造成窗口對(duì)象擴(kuò)展數(shù)據(jù)的屬性設(shè)置錯(cuò)誤,最終導(dǎo)致內(nèi)核空間的內(nèi)存越界讀寫(xiě)。當(dāng)受影響版本的Windows操作系統(tǒng)用戶(hù)執(zhí)行攻擊者構(gòu)造的利用樣本時(shí),將會(huì)觸發(fā)該漏洞,造成本地權(quán)限提升【4】。
CVE-2021-1732漏洞形成的根本原因是:
Windows窗口創(chuàng)建(CreateWindowEx)過(guò)程中,當(dāng)遇到窗口對(duì)象tagWND有擴(kuò)展數(shù)據(jù)時(shí)(tagWND.cbwndExtra != 0),會(huì)通過(guò)nt!KeUserModeCallback回調(diào)機(jī)制調(diào)用用戶(hù)態(tài)ntdll!_PEB.kernelCallbackTable(offset+0x58)里的函數(shù):user3(敏感詞)2!_xxxClientAllocWindowClassExtraBytes,從而在用戶(hù)態(tài)通過(guò)系統(tǒng)堆分配器申請(qǐng)(RtlAllocateHeap)擴(kuò)展數(shù)據(jù)的內(nèi)存。通過(guò)在用戶(hù)態(tài)hook user3(敏感詞)2!_xxxClientAllocWindowClassExtraBytes函數(shù),并在hook函數(shù)中手動(dòng)修改窗口對(duì)象擴(kuò)展數(shù)據(jù)的屬性,可以破壞內(nèi)核態(tài)為窗口對(duì)象擴(kuò)展數(shù)據(jù)申請(qǐng)內(nèi)存的原子操作,最終實(shí)現(xiàn)基于窗口對(duì)象擴(kuò)展數(shù)據(jù)內(nèi)存的越界讀寫(xiě)能力。
Windows窗口創(chuàng)建(CreateWindowEx)過(guò)程的正常流程如下圖(部分):
通過(guò)上圖可以知道:當(dāng)窗口的擴(kuò)展數(shù)據(jù)大小tagWND.cbWndExtra不為0時(shí),win32kfull!xxxCreateWindowEx 內(nèi)部通過(guò)內(nèi)核回調(diào)機(jī)制調(diào)用用戶(hù)態(tài)user3(敏感詞)2!_xxxClientAllocWindowClassExtraBytes函數(shù),在用戶(hù)空間申請(qǐng)窗口對(duì)象擴(kuò)展數(shù)據(jù)所需內(nèi)存,最終將指針?lè)祷亟o窗口對(duì)象的tagWND.pExtraBytes屬性:
內(nèi)核窗口對(duì)象tagWND的擴(kuò)展數(shù)據(jù)有兩種保存方式:
保存于用戶(hù)態(tài)系統(tǒng)堆:即上圖所示的正常流程,用戶(hù)態(tài)系統(tǒng)堆申請(qǐng)的擴(kuò)展數(shù)據(jù)內(nèi)存指針直接保存于pExtraBytes。
基于用戶(hù)態(tài)系統(tǒng)堆模式的一個(gè)tagWND內(nèi)存布局如下圖所示:
2)保存于內(nèi)核態(tài)桌面堆:函數(shù)NtUserConsoleControl調(diào)用會(huì)通過(guò)DesktopAlloc在內(nèi)核態(tài)桌面堆分配內(nèi)存,計(jì)算分配的擴(kuò)展數(shù)據(jù)內(nèi)存地址到桌面堆起始地址的偏移,保存在tagWND.pExtraBytes中,并修改tagWND.extraFlag |= 0x800:
基于內(nèi)核態(tài)桌面堆偏移模式的一個(gè)tagWND內(nèi)存布局如下圖所示:
因此可以通過(guò)hook回調(diào)user3(敏感詞)2!_xxxClientAllocWindowClassExtraBytes,在回調(diào)期間手動(dòng)調(diào)用NtUserConsoleControl修改tagWND的擴(kuò)展數(shù)據(jù)保存方式。然后在回調(diào)返回前手動(dòng)調(diào)用ntdll!NtCallbackReturn:
通過(guò)ntdll!NtCallbackReturn返回用戶(hù)態(tài)可控offset值至tagWND.pExtraBytes,最終實(shí)現(xiàn)基于內(nèi)核態(tài)桌面堆起始地址的可控offset越界讀寫(xiě)能力。
修改后可以觸發(fā)漏洞的流程如下:
根據(jù)上面修改的流程圖,漏洞觸發(fā)的關(guān)鍵步驟如下:
1)修改PEB.kernelCallbackTable中user3(敏感詞)2!_xxxClientAllocWindowClassExtraBytes函數(shù)指針為自定義hook函數(shù)。
2)創(chuàng)建一些普通窗口對(duì)象,通過(guò)user3(敏感詞)2!HMValidateHandle泄漏這些tagWND內(nèi)核對(duì)象在用戶(hù)態(tài)映射的內(nèi)存地址。
3)釋放2)中創(chuàng)建的部分普通窗口對(duì)象,再次創(chuàng)建指定tagWND.cbwndExtra大小的窗口對(duì)象hwndMagic。此時(shí)該窗口對(duì)象有一定幾率使用之前釋放的窗口對(duì)象內(nèi)存。因此在自定義hook函數(shù)中搜索之前泄漏的窗口對(duì)象用戶(hù)態(tài)映射內(nèi)存地址,通過(guò)比較tagWND.cbwndExtra,就可以在CreateWindowEx返回前找到hwndMagic。
4)hook函數(shù)中調(diào)用NtUserConsoleControl修改hwndMagic的extraFlag |= 0x800。
5)hook函數(shù)中調(diào)用NtCallbackReturn將偽造offset賦值給hwndMagic的pExtraBytes。
6)調(diào)用SetWindowLong,向內(nèi)核態(tài)桌面堆起始地址+指定offset越界寫(xiě)入數(shù)據(jù)。
hook函數(shù)一種實(shí)現(xiàn)如下:
BSOD現(xiàn)場(chǎng)堆棧情況:
由漏洞原理分析部分知道:
通過(guò)該漏洞,可以獲得”一次修改基于內(nèi)核態(tài)桌面堆起始地址+指定offset地址數(shù)據(jù)的機(jī)會(huì)“。對(duì)于內(nèi)核態(tài)的漏洞,攻擊目標(biāo)一般是獲得system權(quán)限,一種常用方法為:
利用漏洞獲得內(nèi)核態(tài)任意地址讀寫(xiě)權(quán)限
泄漏內(nèi)核對(duì)象地址,通過(guò)EPROCESS鏈查找system進(jìn)程
拷貝system進(jìn)程token至本進(jìn)程,完成提權(quán)工作
這里的難點(diǎn)為1):即如何利用”一次修改基于內(nèi)核態(tài)桌面堆起始地址+指定offset地址數(shù)據(jù)的機(jī)會(huì)“,實(shí)現(xiàn)內(nèi)核態(tài)任意地址讀寫(xiě)。一種利用思路如圖所示:
首先利用漏洞,tagWNDMagic的附加數(shù)據(jù)(wndMagic_extra_bytes)的offset可控,可以通過(guò)SetWindowLong實(shí)現(xiàn)從桌面堆基址+可控offset的指定地址數(shù)據(jù)修改。
利用漏洞能力修改pExtraBytes為tagWND0對(duì)象的offset (tagWND0的offset 由tagWND0+0x8獲得),調(diào)用SetWindowLong修改tagWND0.cbWndExtra = 0x0fffffff,從而獲得一個(gè)可越界讀寫(xiě)的tagWND0.pExtraBytes。
計(jì)算pExtraBytes到tagWND1的offset,利用2)中獲得的可越界讀寫(xiě)的tagWND0.pExtraBytes,調(diào)用SetWindowLongPtr修改tagWND1的spMenu指向偽造的spMenu,從而借助偽造的spMenu和GetMenuBarInfo實(shí)現(xiàn)任意地址讀能力。
GetMenuBarInfo讀取指定地址數(shù)據(jù)的邏輯如下,讀取的16字節(jié)數(shù)據(jù)被保存在MENUBARINFO.rcBar結(jié)構(gòu)體中:
利用3)中獲得的可越界讀寫(xiě)的tagWND0.pExtraBytes,修改tagWND1.pExtraBytes到指定地址,借助tagWND1的SetWindowLongPtr,獲得任意地址寫(xiě)入能力。
獲得任意地址讀寫(xiě)權(quán)限后,需要泄漏一個(gè)桌面堆上的內(nèi)核對(duì)象地址來(lái)定位EPROCESS,這里步驟3)中為tagWND1設(shè)置偽造spMenu時(shí)SetWindowLongPtr返回值就是原spMenu的內(nèi)核地址,可以直接利用。最后通過(guò)遍歷EPROCESS鏈查找system進(jìn)程,并拷貝system進(jìn)程token至本進(jìn)程完成提權(quán),此類(lèi)方法比較常見(jiàn),不再詳述。
最終完整的提權(quán)演示:
上述內(nèi)容就是win32k內(nèi)核提權(quán)漏洞CVE-2021-1732實(shí)例分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。