CVE-2020-16898“坏邻居”漏洞分析与利用技术详解
CVE-2020-16898 – “坏邻居”漏洞利用分析
引言
在2020年10月13日的补丁星期二活动中,微软修复了一个非常有趣(且具有威胁性)的漏洞:CVE-2020-16898 - Windows TCP/IP远程代码执行漏洞。根据微软的描述:
“当Windows TCP/IP堆栈不当处理ICMPv6路由器通告数据包时存在远程代码执行漏洞。成功利用此漏洞的攻击者将能够在目标服务器或客户端上执行代码。要利用此漏洞,攻击者必须向远程Windows计算机发送特制的ICMPv6路由器通告数据包。此更新通过纠正Windows TCP/IP堆栈处理ICMPv6路由器通告数据包的方式来解决该漏洞。”
漏洞信息收集
最初的分析基于检测逻辑提供的技术细节:
- 需要发送RDNSS(递归DNS服务器选项)数据包
- 问题出现在Length字段为偶数时
- 解析数据包的函数会将RDNSS负载的最后8字节作为下一个头部引用
RDNSS技术细节
RDNSS是路由器通告消息的子选项之一,通过ICMPv6发送。其格式如下:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
: Addresses of IPv6 Recursive DNS Servers :
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Length字段为8位无符号整数,以8字节为单位计算选项长度。包含一个IPv6地址时最小值为3,每增加一个地址长度值增加2。
关键技术挑战
问题1 - IPv6链路本地地址限制
漏洞只能在源地址为链路本地IPv6地址时被利用,这限制了潜在目标范围。
问题2 - 数据包大小验证
整个负载必须是有效的IPv6数据包,所有定义的"长度"必须与数据包大小匹配。
问题3 - NDIS API优化绕过
Windows NDIS API存在令人讨厌的优化(从利用角度)。要绕过它,需要使用分片技术,否则虽然能触发漏洞但不会导致内存破坏。
漏洞触发机制
通过设置偶数的Length字段,利用以下计算逻辑:
tmp = (Length - 1) / 2
当Length为偶数时,负载的最后8字节将被用作下一个头部的开始,从而允许 smuggled 一个额外的未经验证的头部。
利用技术细节
数据包构造
使用Scapy构造恶意RDNSS数据包,通过精心设计的数据包布局绕过各种大小验证。
分片技术应用
为了绕过NDIS的连续缓冲区优化,必须对数据包进行分片处理,确保数据被复制到栈缓冲区而非直接引用。
内核调试分析
通过内核调试器分析tcpip.sys驱动中的关键函数:
- tcpip!Ipv6pHandleRouterAdvertisement
- tcpip!Ipv6pUpdateRDNSS
详细跟踪了数据包处理流程和漏洞触发路径。
概念验证代码
提供了完整的Python PoC代码,演示了如何构造恶意ICMPv6数据包并利用分片技术实现漏洞利用。
技术总结
该漏洞利用涉及多个技术层面:
- ICMPv6协议深度理解
- Windows TCP/IP堆栈内部机制
- 内核调试技巧
- 数据包分片技术
- 内存破坏利用
成功利用需要精确控制数据包结构和绕过多个安全验证机制。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码