欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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

来源:本站整理 作者:佚名 时间:2017-04-06 TAG: 我要投稿

漏洞描述:

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";
13

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

第一次:

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

第二次:

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

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载