freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2019-1132详细分析
2019-09-12 14:56:23

CVE-2019-1132详细分析

QQ截图20190911164556.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


二、行为流程

QQ截图20190911161832.png三、详细分析

1. 利用的基础

为了完成这个利用,首先需要创建一个多级菜单和两个窗口(我们称它们为Main窗口和Hunt窗口)。

图片1.png

这三部分是完成整个利用的所有基础,利用的两个关键步骤在于tagPopupMenu和tagWND数据结构的修改(tagPopupMenu和tagWND分别是内核中表示菜单和窗体的数据结构。)。下面我们来看一下重要的代码。

首先,需要创建一个3级的菜单,第一个菜单我们称为Root菜单,其他两个菜单被设置为Root菜单的子菜单。

图片2.png然后创建两个窗体,即Main窗体和Hunt窗体。

图片3.png

在窗体创建完成以后,需要给该进程设置窗体的消息Hook和事件Hook。

 对于消息Hook来说,重要之处是在窗体创建的时候,向第一个Menu发送MN_CANCELMENUS消息,从而销毁第一个菜单。

图片4.png对于事件Hook来说,向窗体发送特定的菜单消息,以保证能触发特定的内核函数。

图片5.png

2.利用的过程

接下来,我们看一下,漏洞的形成和触发。

在这里我们要先说一下内核中菜单的数据结构tagWnd,tagWnd数据结构中的ppopupmenuRoot项指向了它的子菜单的数据结构,当它被销毁的时候,这个指针被置为null,也就是0。

图片6.png触动漏洞的过程开始于TrackPopupMenu的使用。

图片7.png当上面基础都准备好后,在调用TrackPopupMenu函数在Main窗体上显示菜单时,菜单被创建,所以菜单窗体的消息HOOK函数就会被执行,当消息HOOK函数检测到WM_NCCREATE消息和其他条件都满足的时候,就向ROOT菜单发送一个WM_CANCELMENUS消息,以销毁ROOT菜单。这个时候ROOT菜单数据结构的ppopupmenuRoot项变成了0。而这个时候,其他的子菜单仍然会继续创建。

图片8.pngppopupmenuRoot为0,意味着在ROOT菜单可以引用地址为0的子菜单。接下来,在地址为0的地方分配内存,在这里构造了一个虚假的菜单。

图片9.png和这个虚假的菜单相关联的重要概念是tagWND,也就是内核窗体数据结构。我们看一下tagWND数据结构。其中有一个非常重要的标识bServerSideWindowProc,这个标识的值如果被置1,那么窗体的回调函数会在内核态中被执行。

图片10.png该利用使用了Hunt窗体作为最终的利用目标。为了达到这个目的,首先要获取窗口数据结构地址。

图片11.png我们可以看到名为xxHMValidateHandle的函数获取了PTHREDSKHEAD的数据结构,这个结构中包含了窗体数据结构的地址。这个函数的原型应该来自于内核函数win32k!ValidateMenu。

图片12.png然后,Hunt窗体的数据结构的一个特殊地址被赋值给了这个精心构造的假菜单。

图片13.png我们再次调用TrackPopupMenuEx函数通过ROOT菜单和虚假的菜单来撬动利用。这次,Hunt窗体的bServerSideWindowProc会被置为1。

图片14.png最后向Hunt窗体发送消息0x1234,Hunt窗体的默认回调函数就会在内核空间中执行了。

图片15.png

在Hut窗体的默认回调函数中拷贝SYSMTEM进程的TOKEN给自身,就实现了进程的提权操作。

微信图片_20190912103856.png(上图是成功提权)


参考链接:

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



# 漏洞分析 # 提权漏洞 # CVE-2019-1132 # 详细分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者