设为首页 收藏本站
查看: 1439|回复: 0

[经验分享] admin-神风

[复制链接]

尚未签到

发表于 2017-12-27 16:42:28 | 显示全部楼层 |阅读模式
漏洞描述:
  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
DSC0000.jpg

DSC0001.jpg

  远程代码执行效果如下:
DSC0002.jpg

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

漏洞分析:

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

  通过伪代码更容易看出:
DSC0004.jpg

DSC0005.jpg


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

漏洞利用流程:


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


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



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


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

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


调试过程:

两次溢出控制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";
  

DSC00011.jpg

  调试程序,共会断下6次,我们对这6次断点处漏洞函数在利用时的功能进行归纳:
  第一次:
  暂停在HrCheckIfHeader _FIRST,对漏洞利用没有影响
  第二次:
  断在HrCheckIfHeader _SECOND,此处调用漏洞函数的目的是为了使用HEAD_A标签,来溢出漏洞函数,目的是使用HEAD_A标签中的堆地址覆盖栈中的地址,此堆地址会在随后使用。
  运行漏洞函数前,
DSC00012.jpg

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

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

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

DSC00016.jpg

  第六次:
  HrCheckIfHeader_FIRST在这个函数下面的子子函数中会调用虚函数,从而控制EIP。
DSC00017.jpg

DSC00018.jpg

  总结一下,在上面六次调用处,需要关注的利用过程是:
  1) 第二次与第三次处是必须的,因为没有第二次处的利用,就不会有第三次处的把HEAD_B拷贝到堆中。没有堆中的地址在第六次调用时就没法控制虚表指针。所以没有第二次的溢出调用,就不会有堆中的HEAD_B内存。(本来HEAD_B的归宿是栈空间,就是因为溢出了才把HEAD_B放到了堆空间中)
  2) 第五次再次把栈溢出,把堆的地址写到了局部变量中,才导致第六次能成功调用虚函数。因为第六次调用虚函数时,是调用的局部变量的虚函数。如果没有第五次断点处的溢出,就无法把堆中地址成功的写入到局部变量的虚函数中,也就无法控制虚函数指针。
  由此可以看出,两次对漏洞函数溢出操作,其中一次溢出操作(第二次断点处)将栈地址改写为堆地址,保证了HEAD_B被写入到堆中,另外一次溢出操作(第五次断点处)将局部变量对象的指针指向堆。两次溢出代码相同,实现的目的却不同,双剑合壁,鬼斧神工,巧妙结合实现对EIP的控制。

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

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

  来到shellcode处:
DSC00021.jpg

  Shellcode进行一次循环解码:
DSC00022.jpg

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


缓解方案:
  l 禁用 IIS 的 WebDAV 服务
  l 使用 WAF相关防护设备
  l 建议用户升级到最新系统 Windows Server 2016。

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428686-1-1.html 上篇帖子: [转]IIS的各种身份验证详细测试 下篇帖子: 修改IIS虚拟目录名称
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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