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是全局计数器。
关键技术要点
- 发现客户端端口:通过发送伪造的SYN包并监测IP_ID变化来验证端口正确性
- 获取服务器SND.NEXT:利用TCP窗口机制和序列号空间循环特性进行高效扫描
- 获取客户端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