CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析

漏洞描述:

3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了。网上流传的poc下载链接如下。

github地址:https://github.com/edwardz246003/IIS_exploit

结合上面的POC,我们对漏洞的成因及利用过程进行了详细的分析。在分析过程中,对poc的exploit利用技巧感到惊叹,多次使用同一个漏洞函数触发,而同一个漏洞同一段漏洞利用代码却实现不同的目的,最终通过ROP方式绕过GS的保护,执行shellcode。

调试环境:

虚拟机中安装Windows Server 2003企业版,安装iss6.0后,设置允许WebDAV扩展。使用的调试器为:windbg:6.7.0005.1

远程代码执行效果如下:

由上图可到,漏洞利用成功后可以network services权限执行任意代码。

漏洞分析:

漏洞函数

漏洞位于ScStoragePathFromUrl函数中,通过代码可以看到,在函数尾部调用memcpy函数时,对于拷贝的目的地址来自于函数的参数,而函数的参数为上层函数的局部变量,保存在上层函数的栈空间中。在调用memcpy时,没有判断要拷贝的源字符长度,从而导致了栈溢出。

通过伪代码更容易看出:

漏洞利用:

在POC中,可以看到发送的header中包含两部分<>标签,这会使上面的每个循环体都会运行两次,为了下面的描述方便,我们对这两个header的标签部分分别定义为HEAD_A与HEAD_B。

漏洞利用流程:

  1. 在HrCheckIfHeader函数中,通过使用HEAD_A溢出,使用HEAD_B被分配到堆空间地址中。

  2. 在HrGetLockIdForPath函数中,再次通过使用HEAD_A溢出,使HEAD_B所在的堆地址赋值给局部对象的虚表指针,在该对象在调用函数时,控制EIP。

  1. 最终调用IEcb类的对象偏移0x24处的函数指针,控制EIP

漏洞利用主要在于HrCheckIfHeader函数与函数HrGetLockIdForPath中。

函数HrCheckIfHeader主要功能是对用户传递来的Header头进行有效性的判定。在函数中HrCheckIfHeader通过了while循环来遍历用户输入的Header头中的数据。

HrGetLockIdForPath主要功能是对传递来的路径信息进行加锁操作。在HrGetLockIdForPath函数中,也是通过while循环来遍历路径信息,同样也对应着两次调用漏洞函数。

调试过程:

两次溢出控制EIP

对这4个调用漏洞函数的地方分别下断:

bp httpext!CParseLockTokenHeader::HrGetLockIdForPath+0x114 ".echo HrGetLockIdForPath_FIRST";
bp httpext!CParseLockTokenHeader::HrGetLockIdForPath+0x14f ".echo HrGetLockIdForPath_SECOND";
bp httpext!HrCheckIfHeader+0x11f ".echo HrCheckIfHeader_FIRST";
bp httpext!HrCheckIfHeader+0x159 ".echo HrCheckIfHeader_SECOND";

调试程序,共会断下6次,我们对这6次断点处漏洞函数在利用时的功能进行归纳:

第一次:

暂停在HrCheckIfHeader _FIRST,对漏洞利用没有影响

第二次:

断在HrCheckIfHeader _SECOND,此处调用漏洞函数的目的是为了使用HEAD_A标签,来溢出漏洞函数,目的是使用HEAD_A标签中的堆地址覆盖栈中的地址,此堆地址会在随后使用。

运行漏洞函数前,

运行过漏洞函数后,可以看到栈空间中的0108f90c位置处的内容已经被覆盖成了680312c0,680312c0正是一个堆中的地址。

第三次:

暂停在HrCheckIfHeader_FIRST,此时漏洞函数的作用是,将HEAD_B标签拷贝到上面的堆地址中。本来正常的程序在这里会将用户传递进来的HEADER拷贝到栈空间中,但在上面因为溢出,将HEAD_B标签拷贝到了堆中。可以看到使用的堆地址680312c0。

第四次:

暂停到HrCheckIfHeader_FIRST,对漏洞利用没有影响

第五次:

HrCheckIfHeader_SECOND,此处调用漏洞函数的目的是为了使用HEAD_A标签,来溢出漏洞函数,目的是使用HEAD_A标签中的堆地址覆盖栈中的地址,此堆地址会在随后使用。溢出AAA  db ebp-14 将栈中的地址改成了与堆中的地址 680312c0,在这里ebp-14的地址也被覆盖,这个地址在下面第六次的溢出时,会赋值给对象指针,在这里就控制了ebp_14的值,也就可以控制下一步中的对象指针。

第六次:

HrCheckIfHeader_FIRST在这个函数下面的子子函数中会调用虚函数,从而控制EIP。

总结一下,在上面六次调用处,需要关注的利用过程是:

1) 第二次与第三次处是必须的,因为没有第二次处的利用,就不会有第三次处的把HEAD_B拷贝到堆中。没有堆中的地址在第六次调用时就没法控制虚表指针。所以没有第二次的溢出调用,就不会有堆中的HEAD_B内存。(本来HEAD_B的归宿是栈空间,就是因为溢出了才把HEAD_B放到了堆空间中)

2) 第五次再次把栈溢出,把堆的地址写到了局部变量中,才导致第六次能成功调用虚函数。因为第六次调用虚函数时,是调用的局部变量的虚函数。如果没有第五次断点处的溢出,就无法把堆中地址成功的写入到局部变量的虚函数中,也就无法控制虚函数指针。

由此可以看出,两次对漏洞函数溢出操作,其中一次溢出操作(第二次断点处)将栈地址改写为堆地址,保证了HEAD_B被写入到堆中,另外一次溢出操作(第五次断点处)将局部变量对象的指针指向堆。两次溢出代码相同,实现的目的却不同,双剑合壁,鬼斧神工,巧妙结合实现对EIP的控制。

ROP

控制EIP后,使用ROP技术绕过GS的保护。

使用SharedUserData的方法执行自定义的函数

来到shellcode处:

Shellcode进行一次循环解码:

解码完成后,就是长得比较漂亮的shellcode了

缓解方案:

l 禁用 IIS 的 WebDAV 服务

l 使用 WAF相关防护设备

l 建议用户升级到最新系统 Windows Server 2016。

总结

通过分析可以看到,漏洞原理只是因为没有对拷贝函数的长度做判断,而导致了栈溢出。这也提醒广大程序员们,慎用不安全的内存操作函数,在编译代码时开启所有保护。从漏洞利用角度分析,对于栈溢出,喜闻乐见的利用手法为修改返回地址,覆盖虚表指针等方法,但这种利用栈溢出把指针引向堆空间中,在需要的时候,再通过溢出将堆空间中的地址引回到栈空间中的利用手法确实也是标新立异、与众不同,同一个漏洞代码处使用多次溢出最终实现exploit,即使在分析完成后也对利用手法回味悠长。

时间: 2024-10-11 22:51:59

CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析的相关文章

Apache Tomcat CVE-2017-12615远程代码执行漏洞分析

2017年9月19日, Apache Tomcat官方发布两个严重的安全漏洞, 其中CVE-2017-12615为远程代码执行漏洞,通过put请求向服务器上传恶意jsp文件, 再通过jsp文件在服务器上执行任意代码, 且最新的补丁未完全修复漏洞.中新网安将对该漏洞进行持续关注, 并第一时间为您更新相关漏洞信息. 漏洞编号 CVE-2017-12615 漏洞名称 Apache Tomcat 远程代码执行漏洞 漏洞评级 严重 影响范围 Apache Tomcat 7.0.0 - 7.0.79 漏洞分

小米手机MIUI远程代码执行漏洞分析

7月我在研究webview漏洞时专门挑小米手机的MIUI测试了下,发现了非常明显的安全漏洞.通过该漏洞可以远程获取本地APP的权限,突破本地漏洞和远程漏洞的界限,使本地app的漏洞远程也能被利用,达到隔山打牛的效果.在漏洞发现的第一时间,我已经将漏洞细节报告给了小米安全响应中心,目前漏洞已经修复. 测试环境:手机型号:MI 3 Android版本:4.2.1 JOP40D MIUI版本:MIUI-JXCCNBE21 内核版本:3.4.35-ga656ab9 一.   小米MIUI原生浏览器存在意

ThinkPHP 5.0.0-5.0.23 远程代码执行漏洞利用

漏洞影响范围: 5.0.0-5.0.23 官方已在5.0.24版本修复该漏洞.测试Payload: /public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo() /index.php?s=index/think\app/invokefunction&function=call_user_func_array

【转载】Joomla远程代码执行漏洞分析

利用脚本.exp:python jj.py http://123.123.123.123 ->直接GETSHELL python jj.py http://123.123.123.123 "whoami" ->执行命令#author:we8i&90sec import urllib2,urllib,base64 import cookielib,sys,re cj = cookielib.CookieJar() opener = urllib2.build_open

Bash远程代码执行漏洞分析

 今日爆出一个Bash的RCE漏洞,威力巨大.看了看老外的分析,觉得有必要写一写自己对这个漏洞的理解. 首先,问题起因于一个命令ENV. 原型: env [OPTION]... [NAME=VALUE]... [COMMAND [ARGS]...] Man是这么说的: Display, set, or remove environment variables,Run a command in a modified environment. 我的理解是使用env命令的key=value,首先会

Bash远程代码执行漏洞批量利用脚本

Bash远程代码执行漏洞的威力确实要比心脏滴血大很多,但是影响范围不是很广泛,不过昨天的分析文章Bash远程代码执行漏洞分析中末尾提到了这个漏洞的批量问题. 其中最最简单的方法就是使用搜索引擎的hacking技术,这里我使用的Google Hacking语法结合Google API来进行链接的抓取.只不过在国内的话....需要加代理. 程序中的代理是我本地的goagent代理,端口是8087.如何检测漏洞思路也很简单,我这里直接根据服务器返回码进行判断的. 思路就是以上这些,下面还是和往常一样,

ECShop全系列版本远程代码执行漏洞复现

前言 问题发生在user.php的display函数,模版变量可控,导致注入,配合注入可达到远程代码执行 漏洞分析 0x01-SQL注入 先看user.php $back_act变量来源于HTTP_REFERER,我们可控. assign函数用于在模版变量里赋值 再看display函数 读取user_passport.dwt模版文件内容,显示解析变量后的html内容,用_echash做分割,得到$k然后交给isnert_mod处理,由于_echash是默认的,不是随机生成的,所以$val内容可随

关于发布的CVE-2013-2251漏洞,strust远程代码执行漏洞

(*该漏洞影响版本:Struts 2.0.0 – Struts 2.3.15) (*该博客仅仅只是记录我工作学习时遇到的问题,仅供参考!) (*如果,描述中可能存在错误,请多指教!) 在昨天在对我目前负责的那个项目进行日常维护的时候,系统被别人攻克,上传了一个.txt文件,他人可以直接访问这个项目下txt文件,就可以获取到txt文件内的内容. 首先,介绍下我目前维护的项目,使用的是strust2.1+hibernate3.0架构模式,也就是javaweb+SSH框架,不过为了简化,并没有添加sp

Struts2再爆远程代码执行漏洞(S2-016)

Struts又爆远程代码执行漏洞了!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction没有正确过滤,导致ognl代码执行.  描述 影响版本 Struts 2.0.0 - Struts 2.3.15 报告者 Takeshi Terada of Mitsui Bussan Secure Directions, Inc. CVE编号 CVE-2013-2251 漏洞证明 参数会以OGN