CVE-2015-0057 POC构造 & 利用分析

主要内容:

构造POC

利用思路

0x00 初探

从这篇文章可以获知:

1.问题出在 win32k!xxxEnableWndSBArrows 函数,其在触发 user-mode callback 后,执行完相应操作后从用户层返回到内核层,对接下来操作的对象未能验证其是否已经释放(更改),而继续对其进行操作,导致UAF。触发user-mode callback的调用流程为:

2.所涉及的敏感对象为 tagSBINFO,可以通过CreateWindows("SCROLLBAR"...)来创建。

3.关键利用代码也位于 win32k!xxxEnableWndSBArrows 函数内,位于第一次调用 xxxDrawScrollBar 函数后。

所以要构造POC,思路就很明确了:

在 win32k!xxxEnableWndSBArrows 函数执行到关键代码之前,找到一条能够触发 user-mode callback 的调用路径,hook 掉对应的应用层函数,在其中 destroy tagSBINFO 对象。

Aaron Adams给出了触发上面 user-mode callback 流程的部分代码,为其添加一个最基本的窗口,然后在WM_CREATE消息中创建scrollbar、Show scrollbar 和 Enable scrollbar,将其编译成程序。

0x01 跟踪

对该程序的执行过程跟踪,查看其是否按照预期的 user-mode callback 流程执行。发现在其 xxxGetColorObjects 函数中,流程走向了另一条流程 --> 调用 xxxGetControlBrush 函数。相关代码段:

经查阅ReactOS,得知tagWnd.fnid=0x29A 含义:

此时的 tagWnd 就是我们所创建的 SCROLLBAR 的,而SCROLLBAR的fnid的值一直都为0x29A。

所以此时有两个选择:

1.想办法更改 fnid 的值

2.寻找另一条触发user-mode callback的路径

:寻找 xxxGetControlBrush 函数内触发user-mode callback的调用路径。

关于怎么判断 user-mode callback 是否可以触发,内核小王子Tajei Mandt很早就纰漏了相关知识:

任何的user-mode callback流程最终内核到用户层的入口点都会是 nt!KeUserModeCallback

函数名带有"xxx"和"zzz"前缀的一般都可以触发。

。。。

有趣的是,在寻找的过程中,结合动态调试发现 xxxGetControlBrush 又去调用 xxxDefWindowProc 函数了。那么是否可以回到上面的user-mode callback继续执行,但是在对 xxxLoadUserApiHook 函数跟踪之后,发现其并不能调用 xxxLoadHmodIndex。

:放弃这条路径,返回到 xxxDefWindowProc 函数中寻找另一条路径。

在 xxxDefWindowProc 调用 xxxLoadUserApiHook 附近有这样一段代码:

虽然call ds:rva gapfnScSendMessage[r11+r10*8]看起来是动态确定,但在测试过程中,在xxxEnableWndSBArrows的调用流程中,其都是调用的 SfnDWORD 函数。

这就是寻找的user-mode callback的调用流程了。

0x02 确定

目前确定的 user-mode callback 流程内核部分:

NtUserEnableScrollBar--> xxxEnableScrollBar--> xxxEnableWndSBArrows--> xxxDrawScrollBar(第一次) -->xxxDrawSB2 -->xxxGetColorObjects -->xxxGetControlBrush -->xxxGetControlColor -->xxxDefWindowProc -->SfnDWORD(call ds:rva gapfnScSendMessage[r11+r10*8])--> KeUserModeCallback

关于该流程对应的用户层函数,这个对应关系可以通过使用 Windbg 查看 peb.KernelCallbackTable 来确定:

也可以直接利用IDA查看:

Index为调用KeUserModeCallback 最后一个push的值:

所以 win32k!SfnDWORD 对应的用户层函数为 user32!fnDWORD。

到此,整个user-mode callback流程便清晰了。

0x03 行动

接下来需要利用这次user-mode callback,hook 掉其流程中用户层函数 user32!fnDWORD,然后在 MyfnDWORD 中 destroy scrollbar。

由于user32!fnDWORD调用频繁,所以要进行区分,为了把干扰和不确定因素降低,在 WM_CREATE消息中,hook 掉 user32!fnDWORD 便立即调用 EnableScrollBar 。

测试过程中,在目标 user-mode callback 流程触发的 user32!fnDWORD 调用之前,没有一次 user32!fnDWORD 的调用,所以第一次的 MyfnDWORD 调用就是目标流程所触发的,此时 destroy scrollbar 就好了。

0x04 效果

调用 win32k!xxxDrawScrollBar 函数之前:

之后:

可以看到其已经从tagWnd中移除了。

0x05 利用分析

流程:

[1] 创建大量的 tagPROPLIST 对象,为下一步挖坑做前提条件。

[2] 释放掉一些 tagPROPLIST 对象,为 tagSBINFO 对象准备一些坑

[3] CreateWindow(SCROLLBAR....)创建 tagSBINFO 对象,入坑

[4] xxxEnableWndSBArrows 触发 user-mode callback 机制,在流程中用户层函数 USER32!_fnDWORD 中释放掉SCROLLBAR,再利用 user32!NtUserSetProp 来让 tagPROPLIST 占据刚释放掉的 SCROLLBAR 对象内存空间.

[5]user-mode callback 流程返回到内核,来到关键代码段,利用其增加 tagPROPLIST.cEntries 大小。此时利用 SetProp() 可以获得对 tagPROPLIST 相邻内存进行越界写的能力。

[6]利用这个越界写的能力,对事先布置在tagPROPLIST对象相邻 tagWnd.strName 进行操作,利用tagWnd.strName相关的函数 InternalGetWindowText() 和 NtUserDefSetText() 可以分别获得任意地址读和任意地址写的能力。

[7] Write-What-Where 完成,将 HalDispatchTable+4 修改为 shellcode 地址。到此剩下的工作和其他内核漏洞利用一样了。

by:会飞的猫
转载请注明:http://www.cnblogs.com/flycat-2016

CVE-2015-0057 POC构造 & 利用分析(2015.7)的更多相关文章

  1. fastjson 1.2.24-基于JdbcRowSetImpl的PoC构造与分析

    前言: 基于fastjson的第一种payload是基于templatesImpl的方式,但是这种方式要求Feature.SupportNonPublicField才能打开非公有属性的反序列化处理,是 ...

  2. CVE-2014-1767 利用分析(2015.2)

    CVE-2014-1767利用分析 参考这篇文章利用思路,重现利用,主要说明自己在实现的时候遇到的坑. 利用思路 1. 第一次 IoControl,释放 MDL,我们通过 VirtualAddress ...

  3. 在VS 2015中边调试边分析性能

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 对代码进行性能分析,之前往往是一种独立的Profiling过程,现在在VS 2015中可以结 ...

  4. Java反序列化漏洞通用利用分析

    原文:http://blog.chaitin.com/2015-11-11_java_unserialize_rce/ 博主也是JAVA的,也研究安全,所以认为这个漏洞非常严重.长亭科技分析的非常细致 ...

  5. Lib之过?Java反序列化漏洞通用利用分析

    转http://blog.chaitin.com/ 1 背景 2 Java反序列化漏洞简介 3 利用Apache Commons Collections实现远程代码执行 4 漏洞利用实例 4.1 利用 ...

  6. CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)

    CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...

  7. CVE-2014-0322漏洞成因与利用分析

    CVE-2014-0322漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存,对指定内存处的值进行了加1.其特点在于攻击者结合flash实现了 ...

  8. CVE-2013-3897漏洞成因与利用分析

    CVE-2013-3897漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存.攻击者可以利用此类漏洞实现远程代码执行.UAF漏洞的根源源于对对 ...

  9. CVE-2015-3864漏洞利用分析(exploit_from_google)

    title: CVE-2015-3864漏洞利用分析(exploit_from_google) author: hac425 tags: CVE-2015-3864 文件格式漏洞 categories ...

随机推荐

  1. mysql数据类型简介

    MySQL的数据表类型很多,其中比较重要的是MyISAM,InnoDB这两种. 这两种类型各有优缺点,需要根据实际情况选择适合的,MySQL支持对不同的表设置不同的类型.下面做个对比: MyISAM表 ...

  2. Winform常用开发模式第一篇

    Winform常用开发模式第一篇 上一篇博客最后我提到“异步编程模型”(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了 ...

  3. 解密:LL与LR解析 1(译)

    解密:LL与LR解析 1 作者:Josh Haberman 翻译:杨贵福 由于GFW,我无法联系到作者,所以没有授权,瞎翻译的.原文在这里[http://blog.reverberate.org/20 ...

  4. C#中 如何执行带GO的sql 语句

    C#中是不允许执行带GO的sql 语句的, 如何做呢? 思路就是将带GO的sql语句转化为分段执行, 但在同一事务内执行. 扩展方法是个很不错的主意, 但是尽量不要影响原来的cmd的一些东东, 如 c ...

  5. android电源“有毒”移动电源Android版的设计及其实现

    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下android电源 报道http://www.cnbeta.com/articles/239726.htm称:安全研 ...

  6. ajax实现分页

    使用ajax分页原理:第一步:做一个表格 第二步:封装两个方法.第三步:新建个负责显示页面.第四步:做一个纯PHP处理页面处理要显示页的所有数据 首先使用一张数据比较多的数据库中的表格: 首页面加载后 ...

  7. 结构-行为-样式-Angularjs-ngSanitize

    简单点,上代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. Windows平台下安装Eclipse插件,开发Hadoop应用

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  9. C语言之自增和自减运算符

    一 自增和自减 自增(++):就是给自己的值再加1 自减(--):就是给自己的值减1 tips: ++(--)可以放在前面,也可以放在后面,效果都是一样,都是会给自身+1(-1) 前缀++(--):会 ...

  10. 回溯法、数独与N阶可达问题

    回溯法是剪了枝的穷举,这是字面上的说法,不太好理解,不如讲解实例来的酸爽,于是引出了N阶可达问题: 有N个国家,每个国家有若干城市,小明要从中国(任意一个城市)出发,遍历所有国家(假设这个遍历顺序已经 ...