首页
社区
课程
招聘
[原创]CVE-2017-7269:IIS6.0远程代码执行漏洞逆向分析记录
发表于: 2017-4-11 15:50 9820

[原创]CVE-2017-7269:IIS6.0远程代码执行漏洞逆向分析记录

2017-4-11 15:50
9820

该漏洞可针对IIS 6.0的WebDAV服务发起攻击,通过缓冲区溢出造成远程代码执行。漏洞提交者已在GitHub上公布Poc代码以及漏洞描述,我们可以方便得到Poc以及漏洞信息进行调试

作为一个初学者,看完别人的分析文章需要做的是上手调试,于是形成了这篇调试笔记。行文略显烦琐,错误含糊之处希望各位指(pao)出(hong)

本文的分析思路是跟踪执行脚本时大规模拷贝的数据,弄清数据的含义以及拷贝之后的流程走向,因为没有对相关函数进行反汇编阅读,理解上难免狭隘肤浅

[操作系统]: Windows Server 2003 R2 Enterprise Edition SP2

[调试器]: WinDbg 6.11.0001.402 X86

[Python]: Python 2.7

在Add or Remove Programs中选择 Add/Remove Windows Components

对Application Server选项的描述中提到了IIS

点击Details全部选中(只选择IIS应该也可以),然后点击Next

在安装组件的过程中需要插入安装光盘

安装完成之后打开IIS服务管理器

鼠标右键将WebDAV设置为Allow

打开服务,查看WebClient,需要将其开启

目前处于停止状态且无法开启,将该服务设为自启动,然后重启

此时服务正常开启

将python路径设为环境变量,使用控制台窗口运行样本

查看任务管理器,多出了隐藏窗口的calc.exe进程

使用Process Explorer查看进程依赖关系

可以看到calc.exe的父进程是w3wp.exe

查看calc.exe进程详细信息

由于w3wp.exe并不是开机启动的进程,而样本只是简单启动计算器,干脆先执行一次脚本,然后使用Windbg附加调试

既然会创建新进程,那就对几个关键API下断等它来

执行起来,中断到kernel32!WinExec函数中

查看调用栈

没有调用关系可以参考,好了,老招数,对esp下断

凭感觉收获真是太多了

重新加载样本,对如下rep movsd指令的地址下断

设置断点

抢先剧透,这个漏洞的产生的确来自这里,这里的数据拷贝会来三次

通常俺喜欢从上层函数开始往下看

好了重新加载样本,新增断点,对地址0x67119464下断

运行样本,中断在httpext!ScStoragePathFromUrl函数调用前

当前函数是这样的

跟进httpext!ScStoragePathFromUrl,单步几句

此时内存布局为

G一下,到拷贝数据的位置

先不急,观察一下上下文,附近有四句rep movsd指令

目前在第三处rep movsd,重新加载样本,看看前两次都干嘛了

新增断点0x67126faf

G一下,断到第一句rep movsd指令处

此时的目的地址edi的值就是上层函数传进来的第一个参数

查看拷贝的内容

执行过去

来到第二次rep movsd,拷贝次数为0,并不关心

好了,来到关键的第三次rep movsd

查看拷贝的数据

拷贝前,对比一下目的地址的原始数据和源地址的数据

忍不住又要剧透了,这次拷贝的关键在于覆写地址0x00fef90c处的数据,数据0x00FEF804修改为0x680312C0,这不是一个巧合

单步过去,然后G起来

中断到上层函数,看看这次的参数

经过前面的调试,已经知道地址0x680312c0肯定会作为目标地址被拷贝数据,那么就,围观一下这段内存空间

这就是初初调试时感到美妙的地方,0x680312c0这个值是哪里冒出来的?这可是别人的模块

查看上下文环境

那么地址0x00fef7b8的数据0x680312c0又从哪里来的呢?

重新运行样本,对地址0x00fef7b8下个写断点

留意地址0x00fef7b8处数据的值,执行到这里时出现我们寻找的值

查看上下文环境

edi的值来自[ebp-328h]

这就是前面剧透的,拷贝数据时,地址0x00fef90c处的数据由0x00FEF804修改为0x680312C0

取消该写断点,G一下,中断到上层函数,地址0x00fef90c处的数据没有变化

如上所述,当前参数如下

以上整个过程中,弄清了第一次大规模拷贝数据的意义:控制第二次大规模拷贝数据的目的地址

现在分析第二次大规模拷贝,G一下,直接断在第三次rep movsd处

是的,目的寄存器edi的值在内存中属于rsaenh.dll模块

查看拷贝的源数据

拷贝之后的内存数据

现在分析第三次大规模数据拷贝,来到上层函数

查看参数

G一下,断在第三次rep movsd处

查看源数据,和第一次大规模拷贝的数据相同

拷贝之后的内存数据

这次大规模拷贝的数据,连上第一次rep movsd,是从地址0x00fefab4开始的

G一下,再次来到上层函数

查看参数

此次的参数跟上一次参数是相同的,上一次已经向地址0x00fefab4拷贝了数据,经过调试,现在没有大规模数据拷贝了,跟进httpext!ScStoragePathFromUrl函数


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/05/08
最新回复 (4)
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
俺觉得你好厉害
2017-4-11 17:16
0
雪    币: 181
活跃值: (977)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
俺也觉得你好厉害
2017-4-11 17:41
0
雪    币: 1217
活跃值: (621)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
俺也觉得你好厉害
2017-4-12 17:07
0
雪    币: 158
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这书真的是没白读啊,好强大,好优秀,必须点赞。
2017-4-13 22:57
0
游客
登录 | 注册 方可回帖
返回
//