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

漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了。网上流传的poc…

Failure when receiving data from the peer

    漏洞描述: 在POC中,您可以看到发送的标题包含两个部分<>标签,这将使每个循环体上面运行两次。为了方便以下描述,我们分别具有两个标题的标签部分。定义为HEAD_A和HEAD_B。 调试环境 在HrCheckIfHeader函数中,通过使用HEAD_A溢出将HEAD_B分配给堆空间地址。 在HrGetLockIdForPath函数中,再次通过使用HEAD_A溢出,将HEAD_B所在的堆地址分配给本地对象的虚拟表指针,并在对象调用该函数时控制EIP。

最后调用Iecb类偏移函数指针的对象在0x24,控制EIP 该漏洞主要在HrCheckIfHeader函数和函数HrGetLockIdForPath中。 函数HrCheckIfHeader的主要功能是确定用户传递的Header头的有效性。在该函数中,HrCheckIfHeader传递while循环以遍历用户输入的Header头中的数据。

HrGetLockIdForPath的主要功能是锁定传递的路径信息。在HrGetLockIdForPath函数中,路径信息也遍历while循环,漏洞函数也被调用两次。

  漏洞分析: 漏洞函数 调用漏洞函数的四个地方被破坏: 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';

  调试程序将被破坏6次。我们在第6个断点处总结了漏洞函数的功能: 第一次: 暂停在HrCheckIfHeader _FIRST中,对攻击没有影响 第二次: 在HrCheckIfHeader _SECOND中,此处调用漏洞函数的目的是使用HEAD_A标记来溢出漏洞功能。目的是使用HEAD_A标记中的堆地址覆盖堆栈中的地址,稍后将使用该地址。 在运行漏洞功能之前,

  运行漏洞功能后,您可以看到堆栈空间中0108f90c位置的内容已被覆盖为680312c0,这是堆中的地址。

第三次: Failure when receiving data from the peer 2)堆栈第五次再次溢出,堆地址被写入局部变量,这导致第六次成功调用虚函数。因为虚函数是第六次调用,所以它是被调用的局部变量的虚函数。如果第五个断点没有溢出,则堆中的地址无法成功写入局部变量的虚函数,并且无法控制虚函数指针。 可以看出,漏洞函数上的两个操作溢出,其中一个溢出操作(在第二个断点处)将堆栈地址重写为堆地址,确保将HEAD_B写入堆中,另一个溢出操作(第一个在第五个断点,将局部变量对象的指针指向堆。两个溢出代码相同,执行的目的不同,双剑与墙结合,并用神奇的组合实现控制EIP。 漏洞利用: 在控制EIP之后,ROP技术用于绕过GS的保护。

使用SharedUserData方法执行自定义函数

  来shellcode:

  Shellcode执行循环解码:

解码完成后,它是一个非常漂亮的shellcode。

漏洞利用流程: l禁用IIS的WebD *服务 l使用与WAF相关的保护设备 l建议用户升级到最新的Windows Server 2016系统。 调试过程: 从分析中可以看出,漏洞原理仅仅是因为没有判断复制函数的长度,导致堆栈溢出。这也提醒程序员谨慎使用不安全的内存操作函数,并在编译代码时打开所有保护。从利用的角度来看,对于堆栈溢出,我喜欢使用该方法来修改返回地址,覆盖虚拟表指针等,但这会使用堆栈溢出将指针指向堆空间,然后,在需要时,堆溢出。在空间中使用地址回到堆栈空间也是非常规和独特的。相同的漏洞代码使用多个溢出来最终实现漏洞利用,即使在分析完成后,该方法的使用也很长。 [原文:CVE-2017-7269-IIS 6.0 WebD *远程执行代码漏洞分析  作者:菠菜编辑由 安全脉冲编辑器]