Windows 7 TCP/IP劫持漏洞深度分析

本文详细分析了Windows 7系统中存在的TCP/IP劫持漏洞,该漏洞源于IP_ID全局计数器的实现缺陷。文章揭示了如何利用空闲扫描技术获取必要参数实现会话劫持,并提供了针对现代系统的攻击调整方案和实际测试数据。

Windows 7 TCP/IP劫持

盲TCP/IP劫持在Windows 7上依然可行…且不仅限于此。尽管2020年1月14日Windows 7已正式终止支持,但它仍然是"最具吸引力"的攻击目标之一。根据各类数据,Windows 7在操作系统市场中仍占据约25%的份额,是全球第二受欢迎的桌面操作系统。

历史背景

2012年我加入微软担任安全软件工程师前几个月,曾向微软提交了一份关于所有版本Windows(包括当时最新的Windows 7)中有趣漏洞的报告。这是TCP/IP协议栈实现中的一个问题,允许攻击者执行盲TCP/IP劫持攻击。在与MSRC(微软安全响应中心)讨论时,他们承认该漏洞存在,但对其影响表示怀疑,称利用"非常困难且不可靠",因此不打算在当前操作系统中修复,但会在即将发布的Windows 8中解决。

我不同意MSRC的评估。2008年我开发了完全可用的PoC工具,能自动查找执行盲TCP/IP劫持攻击所需的所有参数(客户端端口、序列号和确认号)。该工具利用的正是我报告中提到的TCP/IP协议栈弱点。微软表示如果我分享工具(我不愿意),他们会重新考虑决定。但当时不会分配CVE编号,该问题预计在Windows 8中解决。

随后我作为正式员工加入微软,验证了该问题在Windows 8中已修复。多年后我离开微软时,在旧笔记本电脑上发现了这个工具,决定在有时间时重新研究。

TCP/IP劫持原理

最著名的盲TCP/IP劫持攻击是1994年圣诞节Kevin Mitnick对San Diego超级计算机中心Tsutomu Shimomura计算机的攻击。这是一种非常老派的技术,但2021年仍可能在不攻击初始TCP序列号(ISN)生成PRNG的情况下实现TCP/IP会话劫持。

现代影响

现代协议大多实现了加密,因此影响不如以往严重。但如果上层协议未加密流量(如FTP、SMTP、HTTP、DNS、IMAP等),攻击者仍可造成危害。

漏洞细节

TL;DR: Windows 7的TCP/IP协议栈实现中,IP_ID是全局计数器。

关键技术要点

  1. 发现客户端端口:通过发送伪造的SYN包并监测IP_ID变化来验证端口正确性
  2. 获取服务器SND.NEXT:利用TCP窗口机制和序列号空间循环特性进行高效扫描
  3. 获取客户端SND.NEXT:Windows 7在此阶段行为特殊,需要采用暴力破解方式

Windows 7的特殊性

  • 在ACK验证阶段,Windows 7对边缘情况处理不同
  • 查找客户端SND.NEXT时,Windows 7不会返回任何数据包
  • 需要采用TCP窗口大小为0x3FF的洪水攻击方式,约需5分钟

重要注意事项

  • 该攻击不限于特定OS,任何易受"空闲扫描"攻击的系统都受影响
  • 需要能够发送伪造IP数据包
  • 网络延迟和受害者机器负载会影响攻击效果

实际测试

在完全更新的Windows 7上测试表明,整个攻击过程(发现客户端端口、服务器SQN和客户端SQN)约需45分钟。对比2009年攻击Windows XP的记录,当时整个攻击耗时近1小时。

工具代码可在此获取:http://site.pi3.com.pl/exp/devil_pi3.c

结论

现代操作系统(如Windows 10)通常将会话的IP_ID实现为"本地"计数器,每个会话有独立的IP_ID基础,有效防御了此类攻击。

快乐黑客, Adam

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计