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月18日 下午10:00
下一篇 2022年7月18日 下午10:16


相关推荐

  • 中间人攻击(MITM)姿势总结[通俗易懂]

    中间人攻击(MITM)姿势总结[通俗易懂]相关学习资料 http://www.cnblogs.com/LittleHann/p/3733469.htmlhttp://www.cnblogs.com/LittleHann/p/3738141.htmlhttp://www.cnblogs.com/LittleHann/p/3741907.htmlhttp://www.cnblogs.com/LittleHann/p/37082…

    2025年7月10日
    4
  • 内存或磁盘空间不足,excel无法再次打开_打开文件显示内存或磁盘空间不足

    内存或磁盘空间不足,excel无法再次打开_打开文件显示内存或磁盘空间不足在网络上下载的文件,使用EXCEL打开的时候提示“内存或磁盘空间不足,MicrosoftExcel无法再次打开或保存任何文档。”,针对这个问题,装机之家小编特地在网上搜罗了具体解决方法,但是网上提

    2022年8月4日
    8
  • 物联网架构概述_物联网9大应用领域

    物联网架构概述_物联网9大应用领域——物联网(TheInternetofThings,简称IOT)其核心组成就是物联设备、网关和云端。物联网网络架构从下到上依次为感知层、网络层和应用层。感知层:识别物体,采集信息;网络层:主要实现信息的传递;应用层:提供丰富的基于物联网的应用;举例:在智能电网中的远程电力抄表应用:安置于用户家中的读表器就是感知层中的传感器,这些传感器在收集到用户用电的信息后,通过网络发…

    2026年1月20日
    4
  • Android 开发环境详细概述

    Android 开发环境详细概述理解AndroidApp开发环境搭建的部分以及他们之间如何联系,协调工作(会和理解为什么要去做,知其然知其所以然)掌握环境搭建的步骤掌握配置环境项的用途,以方便我们的开发操作Android开发组成Java+AndroidSDK+开发工具(IDE)Android的开发语言是Java,只有安装JDK才能让Java运行起来Android的SDK提供了运行和硬件开发环境Eclipse开发工具可以提高编…

    2022年7月23日
    13
  • java课程设计培训班_Java课程设计「建议收藏」

    java课程设计培训班_Java课程设计「建议收藏」课程设计——博客作业五子棋(201521123009张晨晨)•团队课程设计博客链接•个人负责模块或任务说明五子棋的绘制棋盘的绘制重新开始功能的实现悔棋功能的实现•自己的代码提交记录截图•自己负责模块或任务详细说明(1)五子棋的绘制,棋盘的绘制publicvoidpaint(Graphicsg){setBackground(newColor(209,167,78));for(inti…

    2022年7月8日
    29
  • qaction不显示_QAction系列详解

    qaction不显示_QAction系列详解QAction 系列详解一 QAction 类详解 详细描述 QAction 类提供了抽象的用户界面 action 这些 action 可以被放置在窗口部件中 应用程序可以通过菜单 工具栏按钮以及键盘快捷键来调用通用的命令 由于用户期望每个命令都能以相同的方式执行 而不管命令所使用的用户界面 这个时候使用 action 来表示这些命令就显得十分有用 Actions 可以被添加到菜单和工具栏中 并且可以自动保持在菜单

    2026年3月19日
    2

发表回复

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

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