![8bc62771ca9b65bff7562a3d0aee4e3f.png](https://img-blog.csdnimg.cn/img_convert/8bc62771ca9b65bff7562a3d0aee4e3f.png)
今年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
行为流程
![036410f5268629b7c5a11da4fa4b5753.png](https://img-blog.csdnimg.cn/img_convert/036410f5268629b7c5a11da4fa4b5753.png)
详细分析
1.利用的基础
为了完成这个利用,首先需要创建一个多级菜单和两个窗口(我们称它们为Main窗口和Hunt窗口)。
![93f32053cd9d67aab84d83749e418933.png](https://img-blog.csdnimg.cn/img_convert/93f32053cd9d67aab84d83749e418933.png)
这三部分是完成整个利用的所有基础,利用的两个关键步骤在于tagPopupMenu和tagWND数据结构的修改(tagPopupMenu和tagWND分别是内核中表示菜单和窗体的数据结构。)。下面我们来看一下重要的代码。
首先,需要创建一个3级的菜单,第一个菜单我们称为Root菜单,其他两个菜单被设置为Root菜单的子菜单。
![3462c17a62794c89f9b957b9b8617d8c.png](https://img-blog.csdnimg.cn/img_convert/3462c17a62794c89f9b957b9b8617d8c.png)
然后创建两个窗体,即Main窗体和Hunt窗体。
![c9dc06fd510b02b92bc5476828ad2a7b.png](https://img-blog.csdnimg.cn/img_convert/c9dc06fd510b02b92bc5476828ad2a7b.png)
在窗体创建完成以后,需要给该进程设置窗体的消息Hook和事件Hook。
对于消息Hook来说,重要之处是在窗体创建的时候,向第一个Menu发送MN_CANCELMENUS消息,从而销毁第一个菜单。
![e3c0bc52b5609de052a93d5613482738.png](https://img-blog.csdnimg.cn/img_convert/e3c0bc52b5609de052a93d5613482738.png)
对于事件Hook来说,向窗体发送特定的菜单消息,以保证能触发特定的内核函数。
![614f3317d6e4dae0fb6557b05c3d94d0.png](https://img-blog.csdnimg.cn/img_convert/614f3317d6e4dae0fb6557b05c3d94d0.png)
2.利用的过程
接下来,我们看一下,漏洞的形成和触发。
在这里我们要先说一下内核中菜单的数据结构tagWnd,tagWnd数据结构中的ppopupmenuRoot项指向了它的子菜单的数据结构,当它被销毁的时候,这个指针被置为null,也就是0。
![fed00b3a55400b88f860ce18e5ecf8a8.png](https://img-blog.csdnimg.cn/img_convert/fed00b3a55400b88f860ce18e5ecf8a8.png)
触动漏洞的过程开始于TrackPopupMenu的使用。
![2ad9ae9ce34c2792a349912dc22d1dbd.png](https://img-blog.csdnimg.cn/img_convert/2ad9ae9ce34c2792a349912dc22d1dbd.png)
当上面基础都准备好后,在调用TrackPopupMenu函数在Main窗体上显示菜单时,菜单被创建,所以菜单窗体的消息HOOK函数就会被执行,当消息HOOK函数检测到WM_NCCREATE消息和其他条件都满足的时候,就向ROOT菜单发送一个WM_CANCELMENUS消息,以销毁ROOT菜单。这个时候ROOT菜单数据结构的ppopupmenuRoot项变成了0。而这个时候,其他的子菜单仍然会继续创建。
![d2963949614824c5216edcb6e3c6bd54.png](https://img-blog.csdnimg.cn/img_convert/d2963949614824c5216edcb6e3c6bd54.png)
ppopupmenuRoot为0,意味着在ROOT菜单可以引用地址为0的子菜单。接下来,在地址为0的地方分配内存,在这里构造了一个虚假的菜单。
![51d7782544733b321af8f432d6020e03.png](https://img-blog.csdnimg.cn/img_convert/51d7782544733b321af8f432d6020e03.png)
和这个虚假的菜单相关联的重要概念是tagWND,也就是内核窗体数据结构。我们看一下tagWND数据结构。其中有一个非常重要的标识bServerSideWindowProc,这个标识的值如果被置1,那么窗体的回调函数会在内核态中被执行。
![5863b3c65a59b3d1b765968713caad65.png](https://img-blog.csdnimg.cn/img_convert/5863b3c65a59b3d1b765968713caad65.png)
该利用使用了Hunt窗体作为最终的利用目标。为了达到这个目的,首先要获取窗口数据结构地址。
![3d46687d1addc56cf1105c5544dc58c0.png](https://img-blog.csdnimg.cn/img_convert/3d46687d1addc56cf1105c5544dc58c0.png)
我们可以看到名为xxHMValidateHandle的函数获取了PTHREDSKHEAD的数据结构,这个结构中包含了窗体数据结构的地址。这个函数的原型应该来自于内核函数win32k!ValidateMenu。
![f4b1c67d2b402f0769f319d2da313697.png](https://img-blog.csdnimg.cn/img_convert/f4b1c67d2b402f0769f319d2da313697.png)
然后,Hunt窗体的数据结构的一个特殊地址被赋值给了这个精心构造的假菜单。
![daac592a949532674ef58ea662ad9fa7.png](https://img-blog.csdnimg.cn/img_convert/daac592a949532674ef58ea662ad9fa7.png)
我们再次调用TrackPopupMenuEx函数通过ROOT菜单和虚假的菜单来撬动利用。这次,Hunt窗体的bServerSideWindowProc会被置为1。
![c74879fa915839517351352f5f44b3ea.png](https://img-blog.csdnimg.cn/img_convert/c74879fa915839517351352f5f44b3ea.png)
最后向Hunt窗体发送消息0x1234,Hunt窗体的默认回调函数就会在内核空间中执行了。
![a8e69f697b8f8eed8ea87ce6b0ecabac.png](https://img-blog.csdnimg.cn/img_convert/a8e69f697b8f8eed8ea87ce6b0ecabac.png)
在Hut窗体的默认回调函数中拷贝SYSMTEM进程的TOKEN给自身,就实现了进程的提权操作。
![e42b4745b73d9aac897d999c4d0e3320.png](https://img-blog.csdnimg.cn/img_convert/e42b4745b73d9aac897d999c4d0e3320.png)
(上图是成功提权)
参考链接:
https://www.welivesecurity.com/2019/07/10/windows-zero-day-cve-2019-1132-exploit/
防护措施
1.不要轻易打开可疑文件,如电子邮件、可疑链接、可疑文档等等;
2.及时安装系统补丁,使用最新版本的软件;
3.安装杀毒软件,及时更新病毒库;
4.使用“铁穹高级持续性威胁预警系统”(简称“铁穹”)发现潜在的攻击行为,及时响应和阻断,避免造成业务中断或经济损失。