CVE-2019-1132详细分析
一 、背景
今年6月份,ESET研究人员发现了Buhtrap组织在针对东欧的APT攻击中使用的样本,样本使用了Windows的0 DAY漏洞。7月份,微软发布了针对此漏洞的补丁,这个漏洞是CVE-2019-1132。因为该漏洞被长期使用在APT攻击中,所以这次事件也引起了很大的影响。本文的主要目的是对CVE-2019-1132这个漏洞做一个详细的分析,利用的PoC来自于SHIVAM TRIVEDI。
安全人员发现该漏洞是一个提权漏洞,利用了win32k.sys中的空指针间接引用。SHIVAM TRIVEDI提供的PoC在Windows 7 32(Win7 32Bit Build 7601版本)位上可以成功利用。
漏洞描述:
漏洞编号:CVE-2019-1132
漏洞描述:当Win32k组件无法正确处理内存中的对象时,Windows中存在一个提权漏洞,即“Win32k提权漏洞”
受影响版本:
Windows 7 for 32-bit Systems Service Pack 1
Windows 7 for x64-based Systems Service Pack 1
Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2008 for Itanium-Based Systems Service Pack 2
Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1
二、行为流程
三、详细分析
1. 利用的基础
为了完成这个利用,首先需要创建一个多级菜单和两个窗口(我们称它们为Main窗口和Hunt窗口)。
这三部分是完成整个利用的所有基础,利用的两个关键步骤在于tagPopupMenu和tagWND数据结构的修改(tagPopupMenu和tagWND分别是内核中表示菜单和窗体的数据结构。)。下面我们来看一下重要的代码。
首先,需要创建一个3级的菜单,第一个菜单我们称为Root菜单,其他两个菜单被设置为Root菜单的子菜单。
然后创建两个窗体,即Main窗体和Hunt窗体。
在窗体创建完成以后,需要给该进程设置窗体的消息Hook和事件Hook。
对于消息Hook来说,重要之处是在窗体创建的时候,向第一个Menu发送MN_CANCELMENUS消息,从而销毁第一个菜单。
对于事件Hook来说,向窗体发送特定的菜单消息,以保证能触发特定的内核函数。
2.利用的过程
接下来,我们看一下,漏洞的形成和触发。
在这里我们要先说一下内核中菜单的数据结构tagWnd,tagWnd数据结构中的ppopupmenuRoot项指向了它的子菜单的数据结构,当它被销毁的时候,这个指针被置为null,也就是0。
触动漏洞的过程开始于TrackPopupMenu的使用。
当上面基础都准备好后,在调用TrackPopupMenu函数在Main窗体上显示菜单时,菜单被创建,所以菜单窗体的消息HOOK函数就会被执行,当消息HOOK函数检测到WM_NCCREATE消息和其他条件都满足的时候,就向ROOT菜单发送一个WM_CANCELMENUS消息,以销毁ROOT菜单。这个时候ROOT菜单数据结构的ppopupmenuRoot项变成了0。而这个时候,其他的子菜单仍然会继续创建。
ppopupmenuRoot为0,意味着在ROOT菜单可以引用地址为0的子菜单。接下来,在地址为0的地方分配内存,在这里构造了一个虚假的菜单。
和这个虚假的菜单相关联的重要概念是tagWND,也就是内核窗体数据结构。我们看一下tagWND数据结构。其中有一个非常重要的标识bServerSideWindowProc,这个标识的值如果被置1,那么窗体的回调函数会在内核态中被执行。
该利用使用了Hunt窗体作为最终的利用目标。为了达到这个目的,首先要获取窗口数据结构地址。
我们可以看到名为xxHMValidateHandle的函数获取了PTHREDSKHEAD的数据结构,这个结构中包含了窗体数据结构的地址。这个函数的原型应该来自于内核函数win32k!ValidateMenu。
然后,Hunt窗体的数据结构的一个特殊地址被赋值给了这个精心构造的假菜单。
我们再次调用TrackPopupMenuEx函数通过ROOT菜单和虚假的菜单来撬动利用。这次,Hunt窗体的bServerSideWindowProc会被置为1。
最后向Hunt窗体发送消息0x1234,Hunt窗体的默认回调函数就会在内核空间中执行了。
在Hut窗体的默认回调函数中拷贝SYSMTEM进程的TOKEN给自身,就实现了进程的提权操作。
(上图是成功提权)
参考链接:
https://www.welivesecurity.com/2019/07/10/windows-zero-day-cve-2019-1132-exploit/
四、防护措施
1、不要轻易打开可疑文件,如电子邮件、可疑链接、可疑文档等等。
2、及时安装系统补丁,使用最新版本的软件。
3、安装杀毒软件,及时更新病毒库。
4、使用“铁穹高级持续性威胁预警系统”(简称“铁穹”)发现潜在的攻击行为,及时响应和阻断,避免造成业务中断或经济损失。
获取升级补丁以修复漏洞,补丁获取链接:
https://portal.msrc.microsoft.com/zh-CN/security-guidance/advisory/CVE-2019-1132
来源:freebuf.com 2019-09-12 14:56:23 by: 东巽科技2046Lab
请登录后发表评论
注册