IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

复现的过程中 五种失败原因

第一种、端口和域名绑定问题

实际环境中,iis绑定的域名和端口可能不是默认的,比如:

  • 默认绑定
IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog
  • 非默认绑定
IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

If头信息中的两个url是要求和站点绑定相匹配的,否则只能收到一个502。这里所说的相匹配指的是if头中url的port必须与站点绑定的端口相匹配,而if头中的域名只需要和host头保持一致就好。

失败原因 POC中if头里面的域名及端口与绑定不一致时。

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

上图是端口不匹配的情况,下图是域名不匹配的情况

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog
  • 成功情况 :POC中if头里面的域名及端口与绑定一致时。(端口与实际端口一致,host的值与if中的域名一致)
IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

物理路径

根据CVE-2017-7269 IIS6.0远程代码执行漏洞分析及Exploit中提到:POC中If头中的第一个URL会被解析成物理路径,默认情况下是C:\Inetpub\wwwroot\,在覆盖缓冲区的时候填充的字符长度要根据物理路径的长度来决定,且物理路径长度 + 填充字符的个数 = 114。POC中的是按照默认的物理路径(19位)来计算填充字符的长度的,当物理路径的长度不为19位的时候就会收到一个500。(这里物理路径长度计算方法要加上最后的\

物理路径长度<19位

  • 失败情况 :物理路径长度小于19位。
IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog
  • 成功情况 :物理路径长度小于19位,且增加POC中padding的长度。

物理路径为c:\asp\其长度为7,因此POC需要增加12个a。

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

物理路径长度>19位

ROP和stackpivot前面的padding实际上为UTF8编码的字符,每三个字节解码后变为两个字节的UTF16字符,在保证Exp不出错的情况下,有0x58个字符是没用的。所以可以将前0x108个字节删除,换成0x58个a或b。

所以大概的POC是这样的:

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

 物理路径为C:\Inetpub\wwwroot\test\长度为24位,因此需要padding 90位,其中红框中ab的个数为90。

爆破物理路径长度

这个漏洞利用的成功与否,也取决于是否知道物理路径的长度。物理路径的长度可以根据上面已知的信息,来进行爆破:

物理路径长度 + 填充字符的个数 = 114

长度不匹配时返回500。

因为盘符占了3位字符(c:\),所以要爆破物理路径长度,可以将padding增加到111位,并依次减少,如果长度不匹配就返回500。判断长度的工具附在最后面。

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

多次执行错误ShellCode

 多次执行错误的shellcode会覆盖很多不该覆盖的代码,从而导致正确的shellcode也执行也返回500,提示信息为:参数不正确,也可能什么都不返回。该问题在巅峰极客比赛中也遇到过,我们控制的靶机什么都没动一会儿就全站500了。

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

EXP执行成功后

 当exp执行成功一段时间之后(大概十分钟到二十分钟左右,其间无论有无访问,被windbg挂起的时间不算),再对这个站点执行exp永远不会成功,同时返回400。

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

 遇到该问题的解决方案:

  • 1.找旁站,因为每个池都是独立的w3wp进程,换一个可能在其他池的进行尝试
  • 2.等待w3wp重启

Win03 x64

Win03 x64并不多见,此类型的不能直接用网上的POC进行攻击。

总结

IIS6_WebDAV远程代码执行漏洞(CVE-2017-7269)-Ti0s's Blog

附带爆破路径长度检测模式、指定路径长度检测模式脚本