漏洞描述

开启WebDAV服务的IIS6.0存在缓冲区溢出漏洞可以任意代码执行,目前针对 Windows Server 2003 R2 可以稳定利用。在WebDAV服务的ScStoragePathFromUrl函数存在缓冲区溢出漏洞,恶意访问者通过构造以 If:<http:// 开始的较长header头的PROPFIND请求执行任意代码。

工具环境

windbg:用于附加w3wp进程进行动态调试

IDA:用于对httpext.dll进行静态分析

操作机:windows 2003

环境搭建

本次测试的系统环境是Windows Server 2003,首先需要开启WebDVA服务扩展

然后打开服务配置窗口,并启用WebClient服务

漏洞测试

运行Process Explorer来监视当前进程

然后运行exp(exp在后面进行分析)

通过构造以 If:<http:// 开始的较长header头的PROPFIND请求打开了计算器

可以看到calc.exe进程已经创建,说明漏洞触发成功,用户名是NetWork Service,所以没有在桌面上直接弹出计算器。

为了后续使用Win调试W3wp进程进行调试,现在需要把calc.exe和python.exe进程结束掉

漏洞成因

使用IDA打开httpext.dll进行分析,在左侧函数窗口找到ScStoragePathFromUrl函数,然后看一下伪代码,看到qmencpy函数,参数v35表示复制的目的地址

查看对V35变量的交叉引用

可以看到v35由a3赋值,所以向目标地址复制这个操作实际是复制到a3所指向的地址上。而向上看Scstoragepathfromurl的函数声明,可以看出a3就是Scstoragepathfromurl函数的第三个参数。

漏洞源于memcpy操作,在复制时没有对复制的大小进行检查,复制的目的地址为a3,也就是调用该函数的上层函数传入的变量会被溢出。

漏洞分析

漏洞调试思路是一步一步逆向分析,从ScStoragePathFromUrl 函数到它的上层函数调用情况去分析

打开windbg,附加w3wp.exe 进程,首先要在Scstoragepathfromurl 函数开始的地方和v21=v35的地方下断点

在WinDbg中输入bp httpext!ScStoragePathFromUrl和bp httpext!ScStoragePathFromUrl+0x31e

输入bl查看下断点的情况

之后输入g让w3wp 进程继续运行,然后像之前那样打开exp,程序断在了ScStoragePathFromUrl函数的入口处

输入g两次后来到第二个断点673f6f99 处,即第一个断点被中断了两次,说明在第一次被中断时,程序并没有进入memcpy 操作.

在第二次中断时才进入memcpy 操作。继续按F10来单步执行到673f6faf 处,这里就是执行第一个memcpy操作的地址

然后输入dc esi lecx来查看要复制的信息

然后继续按F10单步执行到673f6fdb 处,输入dc esi lecx和dd edi lecx分别来查看要复制的内容以及复制目的地址范围。

可以看到复制的内容为/aaa ... ,目的地址范围为0x6af828-0x6af948。

继续输入g来执行到下一次调用Scstoragepathfromurl 函数的开始位置,即673f6c7b处,然后输入g 来到673f6f99 后

继续按F10 单步执行到 673f6fdb 处。这时输入dc esi lecx来查看要复制的内容,再输入dd edi lecx来查看复制目的地址范围

从结果中我们可以看到这次esi 指向的数据为/bbb ... ,目的地址范围为0x680312e4- 0x680318d4

同样继续输入g后在ScStoragePathFromUrl 函数中断下来,再次输入g,这次没有在673f6f99 处中断,而仍然是在ScStoragePathFromUrl函数中断下来,所以继续输入g后在673f6f99 处中断下来。

接下来按F10 单步执行到673f6fdb 处,输入dc esi lecx 来查看第三次复制的内容, 输入dd edi lecx 来查看这次复制的目的地址范围

从结果中可以看出这一次复制的目的地址为0x006afad8-0x006afbf8

继续输入g ,程序在ScStoragePathFromUrl 函数处(673f6c7b)中断下来,之后按F10一直单步执行,注意到 call ScStripAndCheckHttpPrefix 函数处

在这里按F11单步进入,该函数的功能是检查url 的合法性,如果使用ida pro 来查看ScStripAndCheckHttpPrefix 函数

可以发现674035f3 处有一个call dword ptr [eax+24h], 该处调用了IEcb 对象的0x24 偏移处指向的虚函数。

继续我们的调试,进入该函数后,按F10来单步执行到 call dword ptr [eax+24h] 处(674035f3),继续按F11进入这个虚函数调用

可以看到IEcb 对象的0x24 指向 68016082的位置,ecx 赋值给esp 以此来控制栈空间,当执行完ret 返回时,eip会被引导到了ROP 阶段,以此来绕过DEP

继续F10单步执行,在单步的过程中可以发现有一连串由POP、RET等指令组成的ROP 链

一直按F10,执行完ROP 后正式来到了shellcode 处(68031460)

从以上的调试中可以发现,POC 通过覆盖IEcb 对象的0x24 偏移处的虚函数地址以此来控制eip ,进一步的使用ROP 来引导到shellcode

因为此漏洞为栈溢出漏洞,所以还需要在ScStoragePathFromUrl 函数的上一层函数调用处去观察,其中具体的溢出覆盖过程还要进一步分析。

在IDA Pro中查看ScStripAndCheckHttpPrefix() 函数发现IEcb 对象为该函数的第一个参数,而该对象同样是ScStripAndCheckHttpPrefix() 的上层函数ScStoragePathFromUrl() 函数的第一个参数。

下面我们要通过栈回溯找到调用ScStoragePathFromUrl 函数的上层函数,首先我们先依次点击WinDbg菜单栏的和。然后像之前一样在命令提示符窗口依次输入

接下来再用WinDbg 重新附加w3wp 进程,并在命令行内输入下断点,然后输入运行

然后运行exp

发送数据触发漏洞,进程会在ScStoragePathFromUrl 函数入口处中断,这时我们输入kb来进行栈回溯,查看是哪个函数调用了ScStoragePathFromUrl函数

从结果中我们可以看出 httpext!HrCheckIfHeader+0x124 处调用了ScStoragepathfromurl 函数。

使用IDA Pro 打开 httpext!HrCheckIfHeade r函数,可以看到在函数内共有两处调用了ScStoragePathFromUrl 函数,ScStoragepathfromurl 函数的第三个参数str 为栈上的单元,可以通过查看ebp-328 地址开始的内容来得到str 的内容。

按TAB 键再查看函数汇编代码,可以看到两处调用ScStoragepathfromurl 函数的指令地址分别为673f5445和673f547f

这次在WinDbg 调试过程中需要关注ScStoragePathFromUrl 函数的第三个参数所指向的地址的覆盖情况。

像刚才一样,我们先点击WinDbg菜单栏的Debug->Break和Debug->Datch Debuggee,杀死calc和python进

再使用WinDbg 重新附加w3wp 进程,在上述两处调用ScStoragePathFromUrl 函数的地方及ScStoragePathFromUrl 函数的起始地址和函数内v21 = v35 处下断点,即分别输入

然后输入bl可以看出我们下断点的情况

之后输入g让程序继续运行,然后打开exp

触发断点,之后程序在673f5445 处中断下来

输入dd ebp-328查看

此时ebp-328 地址的内容为0128f804 ,输入g继续运行,程序在ScStoragePathFromUrl 函数入口处(673f6c7b)中断, 继续输入g ,来到了第二次call ScStoragePathFromUrl 的地方(673f547f)

根据程序上一步没有在673f6f99 处(v21 = v35处) 中断下来,可以判断出在上一次ScStoragePathFromUrl 函数里没有执行memcpy 操作。输入dd ebp-328查看该处的内容来验证

可以发现ebp-328 处的内容并没有改变。 输入g 继续跟进并来到ScStoragePathFromUrl 函数的memcpy 操作处(673f6f99)

按F10单步执行到 673f6faf 处,输入 dc esi lecx来查看复制的内容

继续按F10 执行单步,来到673f6fdb 处, 输入dc esi lecx来查看要复制的内容

接下来我们先输入dc edi lecx来查看复制操作前该地址空间的内容

然后按F10单步执行后,输入dc 680312e4 l4c来查看该地址空间复制后的内容

可以看到复制操作完成后 680312e4开始的地址已经被/bbb ... 数据覆盖。 输入g继续来到下一次call ScStoragePathFromUrl 的地方(673f5445)

输入g继续来到下一次call ScStoragePathFromUrl 的地方(673f5445),此时输入dd ebp-328可以发现ebp-328地址的内容已被修改为680312c0

输入!address 680312c0 来查看该地址的内存信息

可以看到该地址为可执行文件映像一部分的内存。 现在ebp-328地址的内容已经被前面的memcpy 操作修改了,而之前ebp-328 地址的内容为0128f828 ,所以我们输入dc 0128f828 l4c 来查看一下之前复制的内容

可以清楚的看到在0128f90c地址(即ebp-328 地址)处 被修改为了680312c0。

所以再跟进ScStoragePathFromUrl 函数的时候,memcpy 操作是复制数据到堆上,而不是栈上,输入g 跟进,程序在ScStoragePathFromUrl 函数(673f6c7b)处中断而不进入memcpy操作

通过输入kb 来查看其上层函数,可以知道是CParseLockTokenHeader 函数调用了ScStoragePathFromUrl 函数

继续输入 g 程序在673f6f99 处中断后,然后按F10单步执行到673f6fdb 处,此时复制的大小为0x17f,输入dc edilecx 来查看复制前的内容

按F10单步执行一次后,输入dc 680312e4 l17f 来查看复制后的内容

可以看到复制的内容为为/bbb ...

继续输入g,这次直接来到了ScStoragePathFromUrl 函数(673f6c7b),程序没有在Hrcheckifheader 函数里中断,通过kb 来回溯调用可知ScStoragePathFromUrl 函数被Cparselocktokenheader 函数调用。

继续输入g,又中断在673f6c7b,即ScStoragePathFromUrl 函数再次被 Cparselocktokenheader 函数调用,继续输入g来到673f6f99 处

连续按F10单步执行到673f6fdb 处,可以看出此时要复制的目的地址为 0128fad8 ,复制的数据大小为0x4c。 先输入dc edi lecx来查看复制前的数据,再按F10单步执行一次后输入dc 0128fad8 l4c 来查看复制后的数据大小

继续输入g, 程序在ScStoragePathFromUrl 函数处(673f6c7b)中断,输入kb 可知此时调用ScStoragePathFromUrl 函数的还是CParseLockTokenHeader+0x119 的地方, 由前面的调试我们可以知道,IEcb 对象的0x24 偏移已经被修改了

按F10继续单步跟进, 遇到call ScStripAndCheckHttpPrefix(673f6cc4)时,按F11步入该函数,之后继续按F10单步执行,来到call dword ptr [eax+24h] (674035f3)的地方

可以看到IEcb 对象的0x24 偏移处的地址为680313e4的数据被修改为了68016082这个地址。 按F11 继续步入,之后一直按F10 单步执行最后便可来到shellcode 处(68031460)

分析可知修改来源于向堆地址复制数据所致,而shellcode 同样是在这一次被复制。 所以,之后的流程被控制了eip ,通过ROP 技术来bypass DEP, 最后进入到shellcode 去执行。

分析总结

CVE-2017-7269 漏洞属于溢出漏洞,原理依然是对复制的数据的大小没有作限制处理,导致可以复制任意长度的数据,其漏洞的利用使用了三次有效的memcpy 复制操作.

第一次复制操作为下一次复制到堆做好了准备,第二次复制操作将IEcb 对象0x24 偏移处数据覆盖,并写入shellcode 到堆中,第三次复制是成功调用IEcb 对象0x24 偏移的关键(这里没有去动态调试)。其执行流程将栈空间引入到堆空间,确保shellcode 可以了执行。

本文由看雪论坛 hackerbirder 原创

原文链接:

[原创]IIS6.0缓冲区溢出漏洞深度分析(CVE-2017-7269)-『二进制漏洞』-看雪安全论坛​bbs.pediy.com

分区起始位置参数溢出_IIS6.0缓冲区溢出漏洞深度分析(CVE-2017-7269)相关推荐

  1. 分区起始位置参数溢出_Kafka分区副本分配解析

    重新梳理了 assignReplicasToBrokersRackUnaware() 和 assignReplicasToBrokersRackAware() 两个方法的思路.如有错误或不当欢迎指出. ...

  2. java 缓冲区溢出_浅析缓冲区溢出

    最近一直在学习缓冲区溢出漏洞的攻击,但是关于这一块的内容还是需要很多相关知识的基础,例如编程语言及反汇编工具使用.所以研究透彻还需要不少的时间,这里简单的做一个学习的总结,通过具体的实验案例对缓冲区溢 ...

  3. c语言缓冲区溢出例子,经典缓冲区溢出小例子

    经典缓冲区溢出小例子 文章目录 经典缓冲区溢出小例子 0.说明 1.基于缓冲区溢出的HelloWord 2.永不停止的HelloWord 0.说明 ​ 两个小程序,C语言编写,VC++6.0编译 ​ ...

  4. oracle缓冲区溢出,Oracle数据库缓冲区溢出漏洞有何特点?

    严重程度:高 威胁程度:远程管理员权限 错误类型:边界检查错误 利用方式:服务器模式 bugtraq id:8447 受影响系统 oracle oracle9i client edition 9.2 ...

  5. 分区起始位置参数溢出_机械硬盘在4k对齐时勾选了一个主分区,没想到居然提示起始位置参数溢出~后来我不想要这个主分区了重新...

    盘分区表错误.如果原来备份过分区表,恢复即可:如果没有: 1.用winpe启动电脑(光盘版/U盘版都行),运行diskgenuis修复分区表.即使没硬盘,winPE也可以启动电脑,所以,换个PE试试. ...

  6. 网络安全实验:CCProxy缓冲区溢出攻击

    CCProxy缓冲区溢出实验 一.实验环境说明 溢出对象:CCProxy(一款代理服务器软件,支持FTP和Telnet) 调试工具:CDB.WinDbg.OllyDBG.IDA Pro etc 实验环 ...

  7. 软件漏洞及缓冲区溢出

    软件漏洞及缓冲区溢出 文章作者:davy_yan 本文是我做溢出的一点心得,希望大家提出宝贵的修改意见,也希望对大家有一定的帮助:) 软件漏洞及缓冲区溢出 一.     缓冲区溢出的发展简史 1.   ...

  8. java 缓冲区溢出_缓冲区溢出详解

    1 缓冲区溢出原理 缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例.缓冲区可以是堆栈(自动变量).堆(动态内存)和静态数据区(全局或静态).在C/C++语言中,通常使用字符数组和mal ...

  9. java存在溢出攻击吗_缓冲区溢出攻击

    缓冲区溢出漏洞(Buffer Overflow)是最早被发现也是最基础的软件安全漏洞技术类型之一.缓冲区溢出是一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以 ...

最新文章

  1. python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例
  2. Javascript笔记02:严格模式的特定要求
  3. ***CSS魔法堂:选择器及其优先级
  4. “彪悍的代码 不羁的创意”—— 网易云信全国高校MINI开发挑战赛战队招募启动...
  5. vuex的使用和封装
  6. linux版本FTP下载
  7. MVVM教程(2):
  8. 反射 字段_java核心基础之反射
  9. Oozie的安装及使用
  10. 硅谷谍战: Menlo Park某VC是CIA开的, 你们公司实习生可能是科技间谍…
  11. 在VMware Update Manager(VUM)里添加HP的补丁源
  12. LOJ10068 秘密的牛奶运输
  13. 【考研词汇训练营】Day 6 —— eventually,state,create,productivity,stimulate
  14. 杭州拒绝车辆“带病”上路 OBD在线接入实现排放动态监管
  15. java图形验证码去除干扰,使用python 对验证码图片进行降噪处理
  16. java.beans 包_JavaBeans的介绍与使用
  17. Win2012 R2 安装Exchange Server2016
  18. android接入第三方SDK
  19. TRS平台如何使文章标题换行
  20. java架构师应该懂得技术

热门文章

  1. 当前目录未找到系统,请尝试选择更深层的目录再次搜索解决方法
  2. SLAM无人车 map_server在代码中切换地图,地图保存
  3. c++ 传入字符串 带返回值_python的数据类型(三):字符串
  4. fastdfs中浏览器访问获取不到文件_SpringBoot 2.0 开发案例之整合FastDFS分布式文件系统...
  5. 正则表达式查找字符串_如何简单理解正则表达式?只需1分钟就可以看到她优美的舞姿...
  6. 履带式机器人与轮式机器人的异同分析
  7. ❤️《分布式 Dubbo+Zookenper+SpringBoot》(建议收藏)❤️
  8. 创建MOSS网站下的新闻
  9. Scrum Meeting博客目录
  10. JAVA大数据-Week4-DAY3