欢迎进入UG环球官网(环球UG)!

usdt法币交易(www.payusdt.vip):[CVE-2021-1732] win32k内核提权破绽剖析

admin7天前6

FlaCoin交易所

IPFS官网(www.FLaCoin.vip)是Filecoin致力服务于使用Filecoin存储和检索数据的官方权威平台。IPFS官网实时更新FlaCoin(FIL)行情、当前FlaCoin(FIL)矿池、FlaCoin(FIL)收益数据、各类FlaCoin(FIL)矿机出售信息。并开放FlaCoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

CVE-2021-1732是今年二月份被披露的蔓灵花(BITTER)APT组织在某次攻击行动中使用的0Day破绽【1】【2】【3】。该破绽行使Windows操作系统win32k内核模块一处用户态回调时机,损坏函数正常执行流程,造成窗口工具扩展数据的属性设置错误,最终导致内核空间的内存越界读写。当受影响版本的Windows操作系统用户执行攻击者组织的行使样本时,将会触发该破绽,造成内陆权限提升【4】。

1. 破绽原理剖析

CVE-2021-1732破绽形成的基本缘故原由是:

Windows窗口确立(CreateWindowEx)历程中,当遇到窗口工具tagWND有扩展数据时(tagWND.cbwndExtra != 0),会通过nt!KeUserModeCallback回调机制挪用用户态ntdll!_PEB.kernelCallbackTable(offset+0x58)里的函数:user32!_xxxClientAllocWindowClassExtraBytes,从而在用户态通过系统堆分配器申请(RtlAllocateHeap)扩展数据的内存。通过在用户态hook user32!_xxxClientAllocWindowClassExtraBytes函数,并在hook函数中手动修改窗口工具扩展数据的属性,可以损坏内核态为窗口工具扩展数据申请内存的原子操作,最终实现基于窗口工具扩展数据内存的越界读写能力。


Windows窗口确立(CreateWindowEx)历程的正常流程如下图(部门):

通过上图可以知道:当窗口的扩展数据巨细tagWND.cbWndExtra不为0时,win32kfull!xxxCreateWindowEx 内部通过内核回调机制挪用用户态user32!_xxxClientAllocWindowClassExtraBytes函数,在用户空间申请窗口工具扩展数据所需内存,最终将指针返回给窗口工具的tagWND.pExtraBytes属性:

内核窗口工具tagWND的扩展数据有两种保留方式:

1.保留于用户态系统堆:即上图所示的正常流程,用户态系统堆申请的扩展数据内存指针直接保留于tagWND.pExtraBytes。

基于用户态系统堆模式的一个tagWND内存结构如下图所示:

2.保留于内核态桌面堆:函数NtUserConsoleControl挪用会通过DesktopAlloc在内核态桌面堆分配内存,盘算分配的扩展数据内存地址到桌面堆起始地址的偏移,保留在tagWND.pExtraBytes中,并修改tagWND.extraFlag |= 0x800:


基于内核态桌面堆偏移模式的一个tagWND内存结构如下图所示:

因此可以通过hook回调user32!_xxxClientAllocWindowClassExtraBytes,在回调时代手动挪用NtUserConsoleControl修改tagWND的扩展数据保留方式。然后在回调返回前手动挪用ntdll!NtCallbackReturn:

通过ntdll!NtCallbackReturn返回用户态可控offset值至tagWND.pExtraBytes,最终实现基于内核态桌面堆起始地址的可控offset越界读写能力。

修改后可以触发破绽的流程如下:

凭证上面修改的流程图,破绽触发的要害步骤如下:

1)修改PEB.kernelCallbackTable中user32!_xxxClientAllocWindowClassExtraBytes函数指针为自界说hook函数。

2)确立一些通俗窗口工具,通过user32!HMValidateHandle泄露这些tagWND内核工具在用户态映射的内存地址。

3)释放2)中确立的部门通俗窗口工具,再次确立指定tagWND.cbwndExtra巨细的窗口工具hwndMagic。此时该窗口工具有一定几率使用之前释放的窗口工具内存。因此在自界说hook函数中搜索之前泄露的窗口工具用户态映射内存地址,通过对照tagWND.cbwndExtra,就可以在CreateWindowEx返回前找到hwndMagic。

4)hook函数中挪用NtUserConsoleControl修改hwndMagic的extraFlag |= 0x800。

5)hook函数中挪用NtCallbackReturn将伪造offset赋值给hwndMagic的pExtraBytes。

,

USDT线上交易

U交所(www.payusdt.vip),全球頂尖的USDT場外擔保交易平臺。

,

6)挪用SetWindowLong,向内核态桌面堆起始地址+指定offset越界写入数据。

hook函数一种实现如下:

BSOD现场客栈情形:


2、破绽行使剖析

由破绽原理剖析部门知道:

通过该破绽,可以获得”一次修改基于内核态桌面堆起始地址+指定offset地址数据的时机“。对于内核态的破绽,攻击目的一样平常是获得system权限,一种常用方式为:

1.行使破绽获得内核态随便地址读写权限

2.泄露内核工具地址,通过EPROCESS链查找system历程

3.拷贝system历程token至本历程,完成提权事情

这里的难点为1):即若何行使”一次修改基于内核态桌面堆起始地址+指定offset地址数据的时机“,实现内核态随便地址读写。一种行使思绪如图所示:

  1. 首先行使破绽,tagWNDMagic的附加数据(wndMagic_extra_bytes)的offset可控,可以通过SetWindowLong实现从桌面堆基址+可控offset的指定地址数据修改。

  2. 行使破绽能力修改tagWNDMagic.pExtraBytes为tagWND0工具的offset (tagWND0的offset 由tagWND0+0x8获得),挪用SetWindowLong修改tagWND0.cbWndExtra = 0x0fffffff,从而获得一个可越界读写的tagWND0.pExtraBytes。

  3. 盘算tagWND0.pExtraBytes到tagWND1的offset,行使2)中获得的可越界读写的tagWND0.pExtraBytes,挪用SetWindowLongPtr修改tagWND1的spMenu指向伪造的spMenu,从而借助伪造的spMenu和GetMenuBarInfo实现随便地址读能力。

GetMenuBarInfo读取指定地址数据的逻辑如下,读取的16字节数据被保留在MENUBARINFO.rcBar结构体中:

  1. 行使3)中获得的可越界读写的tagWND0.pExtraBytes,修改tagWND1.pExtraBytes到指定地址,借助tagWND1的SetWindowLongPtr,获得随便地址写入能力。

  2. 获得随便地址读写权限后,需要泄露一个桌面堆上的内核工具地址来定位EPROCESS,这里步骤3)中为tagWND1设置伪造spMenu时SetWindowLongPtr返回值就是原spMenu的内核地址,可以直接行使。最后通过遍历EPROCESS链查找system历程,并拷贝system历程token至本历程完成提权,此类方式对照常见,不再详述。

最终完整的提权演示:

3. 参考文献

[1]https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1732

[2]https://ti.dbappsecurity.com.cn/blog/index.php/2021/02/10/windows-kernel-zero-day-exploit-is-used-by-bitter-apt-in-targeted-attack-cn/

[3]https://www.virustotal.com/gui/file/914b6125f6e39168805fdf57be61cf20dd11acd708d7db7fa37ff75bf1abfc29/detection

[4]https://en.wikipedia.org/wiki/Privilege_escalation


上一篇 下一篇

猜你喜欢

网友评论

随机文章
热门文章
热评文章
热门标签