MS15-034 (CVE-2015-1635) 远程代码执行漏洞复现报告
1. 基本信息
| 项目 | 内容 |
|---|---|
| 漏洞编号 | MS15-034 / CVE-2015-1635 |
| 漏洞名称 | HTTP.sys 远程代码执行漏洞 |
| 漏洞类型 | 整数溢出 |
| 影响组件 | Windows HTTP 协议栈驱动HTTP.sys |
| 理论危害 | 拒绝服务、信息泄露、远程代码执行 |
2. 实验环境
| 角色 | 操作系统 | IP 地址 | 说明 |
|---|---|---|---|
| 攻击机 | Kali Linux 2023 | 192.168.10.224 | 安装 curl、Nmap、Metasploit |
| 靶机 | Windows Server 2008 R2 SP1 | 192.168.10.142 | IIS 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 - 1。2^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-034 | https://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 系统存在该漏洞且可被远程利用导致蓝屏。信息泄露和远程代码执行因环境和技术限制未成功复现,但理论上仍然存在风险,在理论上存在信息泄露和远程代码执行。
