上周(2015.4.15)爆出的cve-2015-1635漏洞,遂分析一番,留作记录。使用poc如下。

wget 192.168.16.168/welcome.png --debug --header='Range:bytes=10-18446744073709551615'

从之前的各种报告可知该漏洞起始于UlpParseRange函数,对该函数下断,发送poc之后断下。查看HTTP!UlpParseRange的堆栈情况,从堆栈可以清晰的发现,此时的内核正在对用户发送的http包头进行解析。

单步进入该函数,在这个位置会对poc中Range域的数值进行校验,首先校验lower的数值是否大于0xFFFFFFFFFFFFFFFFFF,此处我们的输入为a。

对比upper的数值是否大于lower。

计算length的数值,公式为length = upper – lower + 1。

实例中length为0xFFFFFFFFFFFFFFFF-a+1 =0xFFFFFFFFFFFFFFF6

总的校验图

在该函数中的校验伪代码

因此在HTTP!UlpParseRange中实现了对lower,upper的简单校验,同时生成了length(注意,此处并没有对生成的length的值做任何校验)。

然后函数会继续运行,直到UlAdjustRangesToContentSize,在该函数中同样会对包括upper,lower,length在内的多项数值进行校验,以下为该函数调用时的堆栈。

首先在该函数中同样会检测lower的值是否大于0xFFFFFFFFFFFFFFFF(同于之前HTTP!UlpParseRange)。

校验lower是否小于请求的内容的大小0x2d272(该值为发送请求中的资源的大小)。

通过计算(0x2d272 = 184946)确实与我们请求的图片的大小一致.

取之前函数HTTP!UlpParseRange中生成的length,校验length的值是否大于0xFFFFFFFFFFFFFFFF。

计算Legtncheck = length + setoff(实际就是lower的数值)。

并校验该值是否大于请求内容的大小0x2d272,此处lengthcheck = upper-lower+1 +lower ==0

因此此处一定绕过(当upper设置为0xFFFFFFFFFFFFFFFF),该安全校验(而此处也是唯一针对length的校验)。

在函数的结束处,该问题length会被返回,并继续向下传递。

该函数中的主要校验步骤。

该函数的主要校验伪代码

之后该参数会传递到UlBuildFastRangeCacheMdlChain函数中

UlBuildFastRangeCacheMdlChain,该函数的调用栈

在该函数中会对传入的length进行截断,致使0xFFFFFFFFFFFFFFF6->0xFFFFFFF6。

之后会在该函数中连续调用三次IoBuildPartialMdl,此处可以看看msdn中对于该函数的解释。可以使用IoBuildPartialMdl来把一个IRP请求分解成多个IRP请求。

在第四次时会触发真正的漏洞。此处为传入的第四个参数SourceMdl。

第三个参数length(该值前面生成),也是造成最后蓝屏的原因。

此处为第二个参数TargetMdl。

最后是第一个参数VirtualAddress

此处为函数调用前的两个Mdl结构,其中sourceMdl的大小只有2d316大小,TargetMdl的大小为ffffff6,因此理论上通过targetMdl能都有足够的空间存储来自TargetMdl的值。

跟进该函数nt! IoBuildPartialMdl,最后会完成由SourceMdlàTargetMdl的赋值,赋值循环之前两个Mdl结构的内存状态。

从SourceMdl+30出按8比特取值,并赋值到TargetMdl+30处

此处计算之后即为Target+30出的地址,复制前两个结构

一次赋值之后

整个赋值的循环很简单如下,但是为啥会蓝屏了?仔细看下汇编指令就会发现一个可疑的值rsd,整个过程的循环由该寄存器控制,我们来看看他是如何生成的。

通过ida的分析可知r8d的生成过程如下,总结起来是:r8d=target.cout&fff+target.offset+fff+1

此处我们生成的结果即为100000;

次数通过r8d = r8d + ffffffff,当r8d为零时,停止循环赋值,通过编程可知该处会循环1048576次,每次赋值8位,即为1048576*8  = 8388608 = 0x800000,即需要从sourceMdl中赋值出0x800000长度的内容,当通过之前source.count的值即可知count为0x2d316<<0x800000,因此此处循环赋值的结果就是越界读取内存,而此时的操作位于内核中,所以duan蓝屏了

此处sourceMdl的起始位fffffa800287e930,count为2d316,所以sourceMdl的结束应该为

fffffa800287e930+2d316=FFFFFA80028ABC46(此处计算方式存在疑问,对内核其实不是很了解),此处发现FFFFFA80028ABC46是不能下断,退而求其次,对FFFFFA80028ABC40内存度断点,运行。

断下之后,在进行两次循环,此时FFFFFA80028ABC50依然可读。

但是在FFFFFA80028ABC58读取是,发生pagefault错误,从而导致蓝屏。

duan蓝屏了。。。。

下图为总的函数触发流程

一些其他问题

蓝屏的问题

关于蓝屏的限制问题,通过之前的分析出发时需要如下限制

lower<0xffffffffffffffffff

lower<upper

lower<contenlength

length+lower<contenlength

通过上面的总结发现要稳定的触发蓝屏upper的值必须恒定为0xFFFFFFFFFFFFFFFF,lower的值必须小于contenlength。满足以上调节即可稳定触发蓝屏。

contenlength问题

触发蓝屏时需要poc中必须有请求资源,即如果只是一个简单的根目录,则不会蓝屏。原因如下图所示,漏洞触发前在韩式UlSendHttpResponseIoctl中会有一个判断,请求资源为空进入上一个分支,不为空则进入漏洞触发的分支。

如下图,影响源头来源于其中的rsp+3C8h+var_333中的值(该处没有做详细分析)。

32位触发的问题

之前漏洞刚爆出来的时候,部门有小伙伴提到18446744073709551615这个数32为操作系统不识别,32为系统应该不收影响,但是实际结果是32位体统也不能幸免,揪其原因是该大数在32位系统中被截断了,如下图所示,对于存储远内存中length,在传入函数HTTP!UlAdjustRangesToContentSize之前,是按32为进行的取值,所以该整数溢出绕过在32为依然可行。

最后感谢某人晚上陪我聊微信,否则一晚上的蓝屏真的会疯的,感谢。。。。

cve-2015-1635漏洞分析的更多相关文章

  1. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

  2. CVE-2014-1767 漏洞分析(2015.1)

    CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的doubl ...

  3. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  4. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

  5. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  6. FFmpeg任意文件读取漏洞分析

    这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...

  7. Intel CPU 漏洞分析

    Intel CPU漏洞分析报告 预备知识 存储分级 由于计算机存储分级的特性(第一级:寄存器,第二级:高速缓存,第三级:内存,第四级:磁盘),每一级之间的访问速度差距高达数量级.所以处理器会将用到的数 ...

  8. Elasticsearch 核心插件Kibana 本地文件包含漏洞分析(CVE-2018-17246)

    不久前Elasticsearch发布了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在严重的本地文件包含漏洞可导致拒绝服务攻 ...

  9. ThinkCMF X2.2.2多处SQL注入漏洞分析

       1.     漏洞描述 ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本.最近刚好在渗透测试 ...

  10. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...

随机推荐

  1. Effective C++ -----条款32:确定你的public继承塑模出is-a关系

    “public继承”意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derive class对象也都是一个base class对象 ...

  2. windows下Emacs的安装与配置

    1.下载 到这个网址可以下载到Emacs的windows版本:http://ftp.gnu.org/pub/gnu/emacs/windows/ 只需要一个压缩文档,如emacs-23.2-bin-i ...

  3. 用window.print()打印指定div里面的内容(转载的)

    用window.print()打印指定div里面的内容 今天客户让添加个打印证照功能,直接用window.print()打印的是整个页面,而用以下方法就可以只打印证明了 <!--window.p ...

  4. 加载ComboBox控件

    /// <summary> /// 加载公司 /// </summary> /// <param name="cbbCompany">Combo ...

  5. 自定义Button 的图片设置不显示问题。

    如果你是自定义button  那么你设置图片就要用 button.imageView.image = [UIImage imageName:@""]; 如果你是给系统原生的butt ...

  6. 无限轮播的N+2 策略

    N张照片把contentsSize设置为N+2个图片的宽度,例子如下,两端填充如图,当处于一端时,且即将进入循环状态的时候,如第二张图,从状态1滑动到状态2,在滑动结束的时候,将当前的位置直接转到状态 ...

  7. Javascript中最常用的55个经典技巧(转)

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...

  8. qt_计算器的简单实现

    //阶乘不知道怎么实现不了/(ㄒoㄒ)/~~,以后慢慢调试吧......... //转换为后缀表达式,实现最主要功能 void MainWindow::toPostfix () { QString e ...

  9. 《Thinking in Java》十四章类型信息_习题解

    1~10    Page 318 练习1. 在ToyTest.java中,将Toy的默认构造器注释掉,并解释发生的现象. 书中代码如下(略有改动): package org.cc.foo_008; p ...

  10. js对象

    js中除数字.字符串.布尔值.null值.undefined之外都是对象. 对象是属性的容器,属性包含属性名和值,属性名可以是包括空字符串在内的任意字符串(个人想法还是使用js标识符好,省的麻烦),值 ...