复现的过程中 五种失败原因
第一种、端口和域名绑定问题
实际环境中,iis绑定的域名和端口可能不是默认的,比如:
- 默认绑定
- 非默认绑定
If头信息中的两个url是要求和站点绑定相匹配的,否则只能收到一个502。这里所说的相匹配指的是if头中url的port必须与站点绑定的端口相匹配,而if头中的域名只需要和host头保持一致就好。
失败原因 POC中if头里面的域名及端口与绑定不一致时。
上图是端口不匹配的情况,下图是域名不匹配的情况
- 成功情况 :POC中if头里面的域名及端口与绑定一致时。(端口与实际端口一致,host的值与if中的域名一致)
物理路径
根据CVE-2017-7269 IIS6.0远程代码执行漏洞分析及Exploit中提到:POC中If
头中的第一个URL会被解析成物理路径,默认情况下是C:\Inetpub\wwwroot\
,在覆盖缓冲区的时候填充的字符长度要根据物理路径的长度来决定,且物理路径长度 + 填充字符的个数 = 114
。POC中的是按照默认的物理路径(19位)来计算填充字符的长度的,当物理路径的长度不为19位的时候就会收到一个500。(这里物理路径长度计算方法要加上最后的\
)
物理路径长度<19位
- 失败情况 :物理路径长度小于19位。
- 成功情况 :物理路径长度小于19位,且增加POC中padding的长度。
物理路径为c:\asp\
其长度为7,因此POC需要增加12个a。
物理路径长度>19位
ROP和stackpivot前面的padding实际上为UTF8编码的字符,每三个字节解码后变为两个字节的UTF16字符,在保证Exp不出错的情况下,有0x58个字符是没用的。所以可以将前0x108个字节删除,换成0x58个a或b。
所以大概的POC是这样的:
物理路径为C:\Inetpub\wwwroot\test\
长度为24位,因此需要padding 90
位,其中红框中a
或b
的个数为90。
爆破物理路径长度
这个漏洞利用的成功与否,也取决于是否知道物理路径的长度。物理路径的长度可以根据上面已知的信息,来进行爆破:
物理路径长度 + 填充字符的个数 = 114
长度不匹配时返回500。
因为盘符占了3位字符(c:\
),所以要爆破物理路径长度,可以将padding增加到111位,并依次减少,如果长度不匹配就返回500。判断长度的工具附在最后面。
多次执行错误ShellCode
多次执行错误的shellcode会覆盖很多不该覆盖的代码,从而导致正确的shellcode也执行也返回500,提示信息为:参数不正确
,也可能什么都不返回。该问题在巅峰极客比赛中也遇到过,我们控制的靶机什么都没动一会儿就全站500了。
EXP执行成功后
当exp执行成功一段时间之后(大概十分钟到二十分钟左右,其间无论有无访问,被windbg挂起的时间不算),再对这个站点执行exp永远不会成功,同时返回400。
遇到该问题的解决方案:
- 1.找旁站,因为每个池都是独立的w3wp进程,换一个可能在其他池的进行尝试
- 2.等待w3wp重启
Win03 x64
Win03 x64并不多见,此类型的不能直接用网上的POC进行攻击。
总结
附带爆破路径长度检测模式、指定路径长度检测模式脚本