从补丁到POC CVE-2015-0003(2015.3)
从补丁到POC CVE-2015-0003
1. 简介
该漏洞是由于Windows的win32k.sys模块存在对用户层参数验证不完全,导致存在空指针解引用(Null Pointer Dereference)的问题。
实现对漏洞的有效利用,攻击者可以实现权限提升。
影响的系统包括(32bit & 64 bit):
Windows Server 2003
Windows Vista
Windows Server 2008
Windows 7
Windows 8 & Windows 8.1
Windows Server 2012
测试环境:
Win7 32bit
下面对通过补丁对比构造POC和漏洞成因做简单说明。
2. 补丁对比
2.1 初窥
使用IDA的BinDiff插件得到win32k.sys补丁前后的函数对比,部分如下:
结合微软对该漏洞的描述,可以得知与窗口处理函数有关。FindSystemTimer函数补丁前后差异较大,加上xxxDispatchMessage和FindSystemTimer之间的存在调用关系,所以有理由怀疑FindSystemTimer函数和漏洞相关。下面对这两个函数进行简单分析。
2.2 近一点
xxxDispatchMessage
利用BinDiff查看补丁前后此函数的差异,可以发现补丁后其在调用FindSystemTimer时多传递了一个参数。
FindSystemTimer
补丁前后FindSystemTimer函数变化较大。
补丁前,FindSystemTimer会遍历一个链表(_gtmrListHead),如果pTmr->flags,pMsg->lParam和pTmr->pfn通过验证,那么就会返回当前这个pTmr。否则就会返回NULL。
补丁后,FindSystemTimer需要两个参数,pMsg和pWnd。函数的功能看起来还是一样,都是遍历链表得到pTmr,但是需要验证更多的变量:pMsg->wParam和pTmr->ID,pWnd和pTmr->spwnd。
目前,我们可以知道函数FindSystemTimer的嫌疑很大,hWnd和wParam可能和漏洞有关。
3.构造POC
3.1 一条路径
xxxDispatchMessage虽然和问题函数FindSystemTimer存在调用关系,但是xxxDispatchMessage是内核函数,能否在用户层找到一条路径控制xxxDispatchMessage到达调用FindSystemTimer的流程是决定能够构造出POC的关键之一。
微软对函数采用匈牙利命名法对于分析的帮助非常大,内核函数xxxDispatchMessage可以很自然联想到用户层DispatchMessage函数。DispatchMessage函数似乎只是DispatchMessageWorker函数简单的一个过渡:
而DispatchMessageWorker函数会调用内核的NtUserDispatchMessage函数。NtUserDispatchMessage函数对参数做一些有效性检查后,就会调用xxxDispatchMessage函数。在xxxDispatchMessage函数中存在这么一段代码:
其中0x113为WM_TIMER消息,0x118为WM_SYSTIMER消息。当要处理的消息为WM_SYSTIMER时,就会顺利调用FindSystemTimer这个问题函数了。
WM_SYSTIMER为未公开的消息,还好通过Google查询可以知道其和caret blink有关。
目前为止,我们在用户层找到了一条调用路径,可以最终调用可疑函数FindSystemTimer:DispatchMessage(WM_SYSTIMER)àDispatchMessageWorkeràNtUserDispatchMessageàxxxDispatchMessageàFindSystemTimer。
3.2 一个框架
通过以上分析知道,要触发这个漏洞至少需要一个窗口并且能够产生WM_SYSTIMER消息。将一个最基本的win32窗口改一下就可以了,在消息循环之前加入如下代码:
用spy++观察这个窗口可以产生WM_SYSTIMER消息:
3.3 修改
现在得到了一个可以产生目标消息的一个窗口,消息中的hWnd和wParam是我们需要测试的两个参数,怎么让这两个参数随机化又是需要解决的问题。回头看创建caret时所产生的WM_SYSTIMER消息十分的有意思,因为我们并没有一个循环或者定时器,但是其产生的WM_SYSTIMER消息却是具有时间连续性,隔一段时间就会发出一个WM_SYSTIMER消息。所以有理由怀疑创建caret的函数中有一个定时器,并且很有可能是这个定时器发出的WM_SYSTIMER消息。
这次又是微软的匈牙利命名法帮了大忙,果然在xxxCreateCaret函数中找到了一个似乎和定时器相关的函数:
注意此时_SetSystemTimer的第二个参数为0xFFFF,这正好和上面spy++的输出中wParam相等,所以又可以怀疑一下该参数就代表wParam的值了。利用IDA的XREFS功能查看所有调用_SetSystemTimer的地方:
经过测试众多的函数,包括最开始的CreateCaret,似乎只有xxxFlashWindow函数才靠谱:不会崩溃,窗口的消息循环中也可以改变相关的值。用户层对应的是FlashWindow函数,其调用_SetSystemTimer上下文:
去掉创建caret的部分,增加FlashWindow函数,修改以前的框架为:
运行后,利用spy++查看输出,我们期望wParam的值为0xFFF8。
结果显示wParam正是0xFFF8,所以此时我们就拥有了一个可以产生目标消息,并且可以修改相关值的框架。
3.4 Crash
最后利用这个框架来对hWnd和wParam这两个值做随机化处理,在窗口的消息循环中可以添加这样的代码:
将整个代码放在虚拟机运行一段时间后,就可以得到崩溃了:
此时hWnd=0,wParam=0xFFF8(等于原来的值)。
4. 漏洞分析
根据崩溃后的调用堆栈,对此时的eax进行回溯,在函数xxxDispatchMessage内最终可以确定其是一个win32k!tagWnd结构:
所以漏洞的成因就很明显了:FindSystemTimer函数对参数的验证不完全,导致窗口句柄为0所对应的内核对象被解引用。打补丁后,FindSystemTimer函数会对这种情况进行校验改变流程使其不会进去到解引用流程中去。
5. 参考
http://blog.beyondtrust.com/fuzzing-for-ms15-010
by:会飞的猫
转载请注明:http://www.cnblogs.com/flycat-2016
从补丁到POC CVE-2015-0003(2015.3)的更多相关文章
- CVE-2015-0057 POC构造 & 利用分析(2015.7)
CVE-2015-0057 POC构造 & 利用分析 主要内容: 构造POC 利用思路 0x00 初探 从这篇文章可以获知: 1.问题出在 win32k!xxxEnableWndSBArrow ...
- QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置
1.下载: 所有Qt版本的下载地址: http://download.qt.io/archive/qt/ 实际使用了http://download.qt.io/archive/qt/5.7/5.7.1 ...
- Visual Studio 2015+InstallShield 2015
下载Installshield http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visua ...
- #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲
又到周五,这一周博主我工作效率极高,每天更新博客一篇,<快速创建网站>系列已经进程大半了,希望这个系列能够对大家有所帮助.今天周五了,博主要休息一下,就给大家唠叨一下这段时间都发生了什么. ...
- #一周五# VS2015 CTP6, TFS2015 CTP1更新,老衣的开发工具汇总,2015 MVP 社区巡讲
又到周五,这一周博主我工作效率极高,每天更新博客一篇,<快速创建网站>系列已经进程大半了,希望这个系列能够对大家有所帮助.今天周五了,博主要休息一下,就给大家唠叨一下这段时间都发生了什么. ...
- Team Foundation Server (TFS) 2015 安装指导
1. 概述 微软于8月6日发布了大家期待已久的TFS 2015正式版, https://www.visualstudio.com/en-us/news/tfs2015-vs.aspx ,新版本包含的大 ...
- Adobe CC Family 2015 Master 或 Adobe CC Family 2017 Master的安装步骤(图文详解)
不多说,直接上干货! 你还在为安装PS烦恼吗?你还在为制作视频软件寻找烦恼吗?..... 前言 现在,已经出来了 简单了解, Adobe Acrobat的百度百科: http://baike.ba ...
- 挑战黑客极限:Pwn2Own 2015成史上“最难”黑客大赛
Pwn2Own是全球最著名.奖金最丰厚的黑客大赛,由美国五角大楼入侵防护系统供应商TippingPoint赞助.近日Pwn2Own 2015公布全新的比赛规则,本届赛事难度超高.史无前例,包括VUPE ...
- 2015,2016 Open Source Yearbook
https://opensource.com/yearbook/2015 The 2015 Open Source Yearbook is a community-contributed collec ...
随机推荐
- JavaScript中变量声明有var和没var的区别
JavaScript中变量声明有var和没var的区别 JavaScript中有var和没var的区别 Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (functi ...
- ISupportInitialize的用处
[译]ISupportInitialize的用处 [译]ISupportInitialize的用处 注:本文是对How ISupportInitialize Can Help的翻译.原文作者编 ...
- MapXtreme+Asp.net 动态轨迹(请求大神指点)
功能简介:在MapXtreme+Asp.net的环境下实现轨迹回放功能,经过两天的努力基本实现此功能.但还有部分问题需要解决,求大神们指点迷津,问题会在结尾处提出. 客户端前台页面 <asp:S ...
- Python之路2Day(基础深入)
一,整数 1.int型 具有的功能: class int(object): (1).返回表示该数字的时占用的最少位数 def bit_length(self): 例: >>> bin ...
- 排序算法用C++的基本算法实现十个数排序
本文个人在青岛喝咖啡的时候突然想到的...近期就有想写几篇关于排序算法的文章,所以回家到之后就奋笔疾书的写出来发布了 冒泡排序法 道理: 它重复地访问过要排序的数列,一次比较两个元素,如果他们的顺序错 ...
- kubernetes入门之快速部署
角色说明 这里主要有三个角色,分别部署不同的服务. 角色 服务 etcd etcd master kube-apiserver/kube-scheduler/kube-controller node ...
- EF 下的code fist 模式编程
EF 分两种模式 codefirst(就是不知道数据是啥,也没有数据库) 和 database fist (数据已经设计好了) 首先打开vs 新建一个项目 创建一个控制台程序 然后 新建一个Tea ...
- (转载)python日期函数
转载于http://www.cnblogs.com/emanlee/p/4399147.html 所有日期.时间的api都在datetime模块内. 1. 日期输出格式化 datetime => ...
- 标签<a>的注意事项1
使用a标签时,其子元素可以为其他元素,但是不能包含<a>标签,否则会造成布局改变! 因此请尽量不要在a标签里放太多子元素,可以在外层套一个div,其他子元素放在a标签同级下. 正确布局: ...
- 自定义配置文件的使用及加载-txt
[Game] Version=1 [Login] Account = 阿斗阿斯顿撒 Password =我去饿我去恶趣味 Success = 成哥 Faild = 失败 [Job] Job1 = 战士 ...