Goal Reached Thanks to every supporter — we hit 100%!

Goal: 1000 CNY · Raised: 1310 CNY

100%

CVE-2024-30078 PoC — Windows Wi-Fi Driver Remote Code Execution Vulnerability

Source
Associated Vulnerability
Title:Windows Wi-Fi Driver Remote Code Execution Vulnerability (CVE-2024-30078)
Description:Windows Wi-Fi Driver Remote Code Execution Vulnerability
Description
basic concept for the latest windows wifi driver CVE
Readme
### CVE-2024-30078更新说明

#### 更新6
这可能是最后一次更新,除非有比我更了解WiFi协议栈的人来参与。

看起来该漏洞的可利用性被高估了。要利用该漏洞,需要满足一些特定的前提条件。

如前所述,当EtherType是0x8100(VLAN标签网络)时,本地驱动程序未考虑额外的4个字节。由于数据包是在原始缓冲区上重写的,这导致数据包处理时提前了4个字节,从而导致翻译后的数据包被破坏并作为无效丢弃,还会导致超出保存数据包的缓冲区的2个字节被覆盖。

这个漏洞有多容易被利用呢?

实际上并不简单。有一个机制确保在预期dot1q头的位置,VLAN ID字段的12位必须为0。要溢出缓冲区,不能发送这些额外的字节,这意味着只能依赖内存中已有的字节。可以在SNAP头之后发送一个零字节来溢出一个字节,或者不发送任何字节以溢出两个字节。然而,尝试找到缓冲区后面的两个字节均为零的情况非常具有挑战性,因为存在65,535种可能组合。

此外,难度还不止于此。邻近的堆内存布局非常关键。虽然可以控制被覆盖的2个字节(即发送者MAC地址的最后2个字节),但实际覆盖的内容决定了是否会引起崩溃。如果幸运的话,可能会覆盖到之后被解引用的内存指针,进而导致崩溃,但导致远程代码执行的可能性非常低。至少需要另一个漏洞来远程泄露内核指针。

总之,该CVE的影响似乎比微软公告中最初建议的要轻得多。利用该漏洞需要在与目标相同的网络中,进行特定内存布局的尝试,并获得额外信息来实现超出拒绝服务(DoS)的效果。

#### 更新5
抱歉,这周末很忙。问题出在LLC,当设置vlan时,应该是8个字节,除非是vlan的情况下还需要额外的4个字节,这就是补丁检查的内容。所以在未修补的版本中,我们会遇到越界读取,然后在第113/114/115行直接修改缓冲区,由于我们的载荷长度是10个字节,而期望的是12个字节,因此会有一个2字节的写入条件,即发送者MAC地址的最后两个字节会被写入。将在这周整理相关写作和案例。

#### 更新4
迟来的更新,但...我们有崩溃现象!后续会有更多更新,敬请关注。

#### 更新3
我们已成功让Windows连接到我们的恶意AP,并可以发送必要的dot11数据帧以进入我们关注的函数。接下来我们会将大部分开发转移到私人仓库中,直到我们可靠地运行后,再合并到公共仓库。如果有任何问题或想法,欢迎在问题页面提交,我也会设置一个讨论页面(我会的)。下次更新大约在AEST时间晚上9点。

#### 更新2
我添加了两个文件来协助调试CVE。

#### 更新1
### 问题
在逆向分析此CVE时,我发现了可能的两种利用方法:1. 攻击者可能在网络认证后发送构造的数据包,这需要更复杂的步骤;2. 较简单的方法是识别探测信号,推测设备曾使用的探测信号,不需要认证,构建恶意AP,利用开放网络探测的细节(可能需要一些猜测),然后等待设备自动连接并发送构造的帧以到达受影响的代码路径(这也是我目前工作的地方)。在加入开放网络时,AP发送的多个帧到达了受影响的代码块(没有包含所需的标志位),我们可以构造包含所需标志位的帧以尝试触发漏洞。目前我们有足够的信息来使其有效,只需构建并在内核调试时运行几个测试用例。

#### 信息
该仓库代码似乎未触发CVE中提到的相同漏洞,感谢FarmPoet的新信息。CVE-2024-30078漏洞在Windows本地WiFi驱动程序(nwifi.sys)的Dot11Translate80211ToEthernetNdisPacket()函数中,必须构造非常特定的数据帧才能到达易受攻击的代码路径(该代码未达到这一点)。

#### 我在处理
我已识别出函数中的更改,并在逆向构建相关帧以进入这个代码段。

### CVE-2024-30078漏洞利用概述

#### 代码如何工作
- **导入和初始化**:脚本从Scapy和系统模块中导入必要的模块。
- **SSID分块**:`create_wifi_packet`函数将提供的SSID分成每块255字节(每块允许的最大长度)。
- **帧创建**:对于每个分块,创建一个WiFi信标帧,包括Dot11头、Dot11Beacon(信标帧)和Dot11Elt(包含SSID分块)。
- **发送帧**:使用`sendp`函数发送每个帧,指定接口、次数、间隔和详细程度。
- **错误处理**:脚本检查在数据包发送期间可能出现的权限错误和其他异常。

#### 缓冲区溢出机制
Windows处理的SSID长度上限为512字节,这超过了WiFi标准。通过发送超过此长度的SSID块,可以触发Windows WiFi处理子系统中的缓冲区溢出。此溢出可能允许攻击者执行任意代码或导致系统崩溃。

### 可能的问题和考虑事项
- **根权限**:脚本需要根权限来发送数据包,确保以`sudo`运行脚本。
- **接口可用性**:脚本假定无线接口名称为`wlan0`,如有不同,请调整。
- **权限和依赖错误**:确保正确安装Scapy及其依赖项,并处理对网络接口的访问权限。
- **法律和道德问题**:使用该脚本在未经授权的网络上利用漏洞是违法和不道德的。仅在获得明确授权的环境中进行安全测试和研究。

### 免责声明
该代码仅供教育用途。作者对因误用该脚本而造成的任何损害不承担任何责任。请负责任地使用,仅在您拥有明确许可的环境中进行此类测试。
File Snapshot

Log in to view the POC file snapshot cached by Shenlong Bot

Log in to view
Remarks
    1. It is advised to access via the original source first.
    2. Local POC snapshots are reserved for subscribers — if the original source is unavailable, the local mirror is part of the paid plan.
    3. Mirroring, verifying, and maintaining this POC archive takes ongoing effort, so local snapshots are a paid feature. Your subscription keeps the archive online — thank you for the support. View subscription plans →