HTTP.sys远程代码执行(CVE2015-1635)
漏洞原理
在原来网络不是很好的时候,下载大型文件很不容易,如果下载中断 ,那么只能重头开始下载,为了解决这个问题 HTTP/1.1引入的范围请求。即请求这个文件x~y的字节,指定范围,在请求报文的首部添加Range字段,此字段指定资源的byte范围,告诉服务器,请求资源是哪个范围的内容,让断点续传和并行下载得以实现。
如果服务器支持范围请求,响应包中,会存在Accept-Range字段(且值部位none,bytes为资源范围的单位),并在content-length字段告诉客户端资源的大小范围。
GET /js/site.js HTTP/1.1
Range: bytes=0-18446744073709551615
Cookie: ASPSESSIONIDAQCSSQQQ=AENCJGCBHMLGFOCHOJEBNLCJ
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate
Host: xxx.xxx.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 .....
Connection: Keep-alive
响应:
HTTP/1.1 416 Requested Range Not Satisfiable
Content-Type: application/x-javascript
Last-Modified: Wed, 18 Sep 2013 05:52:53 GMT
Accept-Ranges: bytes
ETag: "963ee15033b4ce1:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sat, 05 Sep 2020 03:16:27 GMT
Content-Length: 362
Content-Range: bytes */1602
.....
如果没有Accept-Ranges字段,则服务器可能不支持范围请求,有的服务器会明确将值设为“none”。
服务器面对范围请求,有三种响应:
请求成功: 响应206 Partial Content
请求范围越界:(范围超过资源的大小) 响应416 Requested Range Not Satisfiable
不支持范围请求: 响应200 OK
而HTTP.sys远程代码执行漏洞正是利用Range字段注入恶意数据。该漏洞的检测,也是利用服务器面对范围请求时的响应特征来判断
漏洞检测
HTTP.sys漏洞的检测比较简单,先判断目标环境是不是Windows+IIS,然后构造Range字段进行检测即可。
检测时,在请求包中添加Range字段,如下:
Range: bytes=0-18446744073709551615
服务器响应400,证明不存在HTTP.sys远程代码执行漏洞。如果响应416,则证明系统存在漏洞。
这里简单说一下Range字段值的含义。18446744073709551615转为十六进制是 0xFFFFFFFFFFFFFFFF(16个F),是64位无符号整型所能表达的最大整数,整数溢出和这个超大整数有关。
另外,Apache几个老版本存在的Apache HTTP Server畸形Range选项处理远程拒绝服务漏洞,也是通过Range字段触发的,有兴趣的校友可以去了解了解。
漏洞修复
升级补丁:
http://technet.microsoft.com/security/bulletin/MS15-034
禁用IIS内核缓存(缓解方案):
https://technet.microsoft.com/en-us/library/cc731903(v=ws.10).aspx