MS15-034 (CVE-2015-1635) 远程代码执行漏洞复现报告

1. 基本信息

项目内容
漏洞编号MS15-034 / CVE-2015-1635
漏洞名称HTTP.sys 远程代码执行漏洞
漏洞类型整数溢出
影响组件Windows HTTP 协议栈驱动HTTP.sys
理论危害拒绝服务、信息泄露、远程代码执行

2. 实验环境

角色操作系统IP 地址说明
攻击机Kali Linux 2023192.168.10.224安装 curl、Nmap、Metasploit
靶机Windows Server 2008 R2 SP1192.168.10.142IIS 7.5,未打补丁 (KB3042553)

3. 漏洞检测

发送恶意Range头验证漏洞:

返回416 Requested Range Not Satisfiable,确认漏洞存在。

4. 危害复现情况

针对于这个漏洞来说,理论上是存在信息泄露和远程代码执行的危害的,但是可能是我水平不够吧,没能成功复现出信息泄露和远程代码执行,仅仅成功复现出了拒绝服务(蓝屏)

危害类型复现结果说明
拒绝服务(蓝屏)成功使用 Metasploit DoS 模块,靶机立即蓝屏,错误代码IRQL_NOT_LESS_OR_EQUAL
信息泄露❌ 未成功在 Windows Server 2008 R2 上使用 MSF 内存读取模块及手动 curl 均未获得额外数据
远程代码执行❌ 未尝试无公开稳定利用代码,理论风险极高,实际难以利用,需要其他漏洞联动

4.1 拒绝服务复现步骤

查询漏洞MS15-034,返回了两个工具,工具1也可以用来检测漏洞的存在

返回选择工具0,使用工具0,设置靶机ip后运行完成了蓝屏攻击。

执行后靶机蓝屏(截图见附件)。复现成功。

4.2 信息泄露尝试说明

为尝试信息泄露,在靶机C:\inetpub\wwwroot下创建 10MB 文件large.txt,然后执行:

bash

curl http://192.168.10.142/large.txt -H "Range: bytes=0-18446744073709551615" --output dump.bin

仅返回 416 错误页面,无内存数据。Metasploit 的ms15_034_http_sys_memory_dump模块也只输出漏洞存在提示,未返回数据。判断在 Windows Server 2008 R2 上信息泄露难以复现。

5. 漏洞原理简述

HTTP.sys在处理Range: bytes=0-N时计算长度length = N - 0 + 1。当N = 2^64-1时,length = 2^64,超出 64 位整数范围,溢出为 0。但代码缺陷导致仍使用原始N值去读取内存,从而越界访问:若访问不可读区域则蓝屏,若访问可读区域则信息泄露。

攻击者利用了Range头的计算逻辑缺陷,发送了一个不可能满足的区间

Range: bytes=0-18446744073709551615

这个结束值18446744073709551615是 64 位无符号整数的最大值(2^64 - 1)。
服务器在处理时,需要计算要发送的数据长度:

长度 = 结束 - 开始 + 1 = (2^64 - 1) - 0 + 1 = 2^64

但服务器内部用来存储长度的变量是 64 位无符号整数,最大只能表示2^64 - 12^64超出了这个范围,发生整数溢出,实际存储的值变成了0

正常情况下,服务器在处理Range请求时,会先计算Length = End - Start + 1,然后检查Start + Length是否超过文件大小。如果超过,则返回 416 Requested Range Not Satisfiable。但在攻击者构造的恶意请求中,Length溢出为 0,导致Start + Length = 0,这个值小于文件大小,因此安全检查被绕过,服务器误以为这是一个合法的范围请求。

然而,在底层执行内存读取时,HTTP.sys并没有使用这个溢出后的Length值(0),而是直接使用了原始的End值(0xFFFFFFFFFFFFFFFF)来计算结束地址:EndAddr = CacheBuffer + End。系统尝试从StartAddr读取到EndAddr,但EndAddr远远超出了文件缓存的实际映射范围。当系统尝试访问这个未映射的内核地址时,触发页错误,导致蓝屏。也就是说,溢出只是骗过了安全检查,真正的危害来自底层直接使用原始的 End 值。

于是,HTTP.sys 从文件缓存的起始地址开始,尝试读取2^64字节的数据——这远远超出了实际文件大小。它会一直读到文件缓存后面的内核内存区域。如果那片内存区域是可读的,就会把数据返回给攻击者(信息泄露);如果不可读,就会触发页错误,导致系统蓝屏(拒绝服务)。

IIS 内核缓存的作用

  • 正常功能HTTP.sys将静态文件内容缓存到内核内存中,加速后续请求。

  • 漏洞中的角色:攻击者触发溢出后,HTTP.sys错误地使用原始的N值作为读取长度,从内核缓存起始地址开始越界读取。

    • 若越界区域可读 → 信息泄露

    • 若不可读 → 蓝屏

因此,IIS 内核缓存是信息泄露能够成功的“放大镜”和“通道”。关闭内核缓存可切断该通道,但整数溢出缺陷依然存在(仍可能蓝屏)。


四、总结

  • 正常Range头用来请求文件的一部分,服务器返回 206。

  • 恶意:攻击者构造一个超大范围,让服务器计算溢出,利用代码缺陷读取不该访问的内存。

  • 你的实验中:发送恶意Range后,服务器返回 416(它检测到了范围无效,但没有泄露数据),是因为 Windows Server 2008 R2 上的 HTTP.sys 实现可能更早地拦截了这种请求,或者内存布局使得越界读取落入了不可读区域,只触发了蓝屏。

如果你想更直观地理解,可以这样类比:
Range头就像你去餐厅点“只要第 3 口到第 5 口菜”。
攻击者点的是“从第 0 口吃到第 100 亿口”,餐厅厨师算错账,结果从厨房里搬出了别人桌的菜(信息泄露),或者撞到墙上把厨房砸了(蓝屏)。

6. 修复建议

  • 安装微软补丁KB3042553

  • 临时缓解:IIS 管理器中禁用内核缓存

7.漏洞修复

临时缓解:IIS 管理器中禁用内核缓存 在下图位置关闭内核缓存,在关闭之后再次返回kali尝试攻击,发现无法触发蓝屏了。但是通过查阅资料发现,关闭内核缓存后并不能完全修复漏洞,仍有几率触发漏洞,并且关闭内核缓存后会导致服务器性能下降,所以这个修复方式并不完美。

安装微软补丁 KB3042553:在微软官网下载补丁后传入win2008靶机中,运行补丁程序重启后自动就打上了补丁(打补丁的时候忘记截图了,反正也没什么好看的),重新返回kali中再次尝试攻击,发现攻击失败,再次运行漏洞查询程序,得到结果如第二张图片,漏洞不存在了,证明漏洞修复成功。

8.参考资料

标题/描述链接
微软安全公告 MS15-034https://technet.microsoft.com/library/security/ms15-034.aspx
绿盟科技:Windows HTTP.sys远程代码执行漏洞跟踪进展https://www.nsfocus.com.cn/html/2015/21_0416/292.html
IT168技术分析:Windows HTTP.sys将令网站面临安全威胁https://net.it168.com/a2015/0427/1724/000001724000.shtml
CSDN漏洞复现教程https://blog.csdn.net/ec_carrot/article/details/114546019
博客园漏洞复现与修复https://www.cnblogs.com/luuxiaoming/p/16590228.html
网络系统安全——MS15_034漏洞利用与安全加固https://ncsimple.blog.csdn.net/article/details/131239276
腾讯云漏洞修复文章https://cloud.tencent.cn/developer/article/2101233
CN-SEC漏洞复现http://cn-sec.com/archives/4173246.html
KB3042553 补丁下载 (Windows Server 2008 R2)https://www.microsoft.com/zh-cn/download/details.aspx?id=46480
补丁依赖说明https://blog.csdn.net/y_66666666/article/details/146398267

9. 结论

本次实验成功复现了 MS15-034 漏洞的拒绝服务危害,验证了 Windows Server 2008 R2 系统存在该漏洞且可被远程利用导致蓝屏。信息泄露和远程代码执行因环境和技术限制未成功复现,但理论上仍然存在风险,在理论上存在信息泄露和远程代码执行。