WIFI远程代码执行漏洞或许没你想得那么严重

admin 2024年6月29日02:06:05评论5 views字数 5490阅读18分18秒阅读模式
【转载】WIFI远程代码执行漏洞或许没你想得那么严重

关于windows WiFiE的漏洞,目前已经有师傅进行分析了,感兴趣的师傅可以了解一下。

微软最新WiFi远程代码执行漏洞(CVE-2024-30078)探究 - 先知社区[1]

1. 背景介绍

微软在六月的安全更新中,修复了一个WiFi驱动的漏洞。漏洞描述[2]的攻击场景吸引了很多人的注意:在近源的场景下,攻击者通过发送WiFi数据包来发动攻击。

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

这篇漏洞公告一石激起千层浪:

有人声称以5000美元出售漏洞的PoC;国内技术论坛上对漏洞的讨论和猜测,如1[3]2[4]【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重【转载】WIFI远程代码执行漏洞或许没你想得那么严重

‒ 以及github上流传的各种假PoC。首推https://github.com/blkph0x/CVE_2024_30078_POC_WIFI[5] ,被国内营销号各种转发。它一开始声称漏洞原因是SSID溢出,直到广大网友在issues中质疑无法复现,才承认自己只是在尝试复现漏洞,并删光了之前所谓对漏洞原理的描述。

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

从直觉上讲,这个漏洞危害不会很大。漏洞作者是赛博昆仑@XiaoWei___[6],如果特别好用在这个时间点可能就不会提交了。至于出售PoC可信度也不高,5000美元也过于便宜了。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

漏洞作者的推特上有一些公开的信息,表明这是一个越界写漏洞。漏洞的发现受到了古河2023年blackhat议题[7]的启发。这个议题是关于windows对各种底层网络协议处理上的漏洞。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

考虑要过去出现过类似场景下的漏洞,例如p0团队从苹果的AWDL协议(基于WiFi)中发现的漏洞[8],可以做到0click通过WiFi黑掉iphone。因此我们希望弄清楚,漏洞的影响具体如何,是否有大家猜测的那样危害巨大。

2. 静态分析

定位补丁

首先需要定位到patch的位置。在打上win10的6月更新补丁后,我们发现win10的C:WindowsSystem32Drivers目录下有以下文件的更新:

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

从文件名上看,nwifi.sys和wdiwifi.sys比较可疑【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

经过bindiff的处理,wdiwifi.sys新旧版本没有明显的差异,而nwifi.sys有个疑似打过补丁的函数,Dot11Translate80211ToEthernetNdisPacket【转载】WIFI远程代码执行漏洞或许没你想得那么严重

后续漏洞作者也在回复中确认,漏洞位于nwifi.sys【转载】WIFI远程代码执行漏洞或许没你想得那么严重

初步分析

从函数的名称Dot11Translate80211ToEthernetNdisPacket可以推测,这个函数用于处理802.11数据包。802.11是一种无线局域网的标准,而WiFi是802.11标准的一种产品实现。用IDA反编译函数,发现补丁是增加了一处对数值的比较,如果不满足条件则返回NDIS_STATUS_INVALID_PACKET(0xc001000),即数据包非法。

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

调用层次图表明,函数会在接收到802.11数据包时被调用。上层函数的名称中,STA即Station,AP即Access Point。Station是无线网络中的客户端设备,而Access Point则是提供无线接入服务的网络基础设施设备。用户通过Station设备连接到Access Point,进而访问网络资源。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

我们预期受害者应该作为Station,进而关注上层的ExtSTAReceivePacket函数。在其中可以看到对多种类型802.11数据包的处理,包括DataPacket、ProbeRequest和Beacon【转载】WIFI远程代码执行漏洞或许没你想得那么严重

Beacon和ProbeRequest都属于802.11的管理帧:‒ Beacon是WiFi服务端AP定期广播的数据包,其主要目的是宣告该AP的存在以及网络的基本信息。WiFi客户端会监听这些Beacon帧,来发现可用的网络;‒ ProbeRequest是由WiFi客户端Station发起的,用于主动搜索特定的无线网络。如果存在匹配的网络,则该AP将回应一个Probe Response帧,包含网络的具体配置信息。在802.11的header中,管理帧的Type值为00,控制帧的Type值为01,数据帧的Type值为10。观察函数ExtSTAReceiveDataPacket所在分支的进入条件 v19 & 0xC == 0x8,即 v19 & 0b1100 == 0b1000。所以想要进入Patch的代码,需要数据包为数据帧,而非管理帧。因此一些假PoC所谓Beacon中SSID溢出,明显是错误的。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

接下来的部分难以通过静态分析看出来,需要进行动态调试。

3.动态调试

环境搭建

准备一个usb无线网卡,以及两台windows虚拟机

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

在vmware中设置debugee连接usb网卡 为两台虚拟机设置同一个host-only网络,以进行双机内核调试,具体可参考教程[9]

主要问题

根据patch的代码,现在有两个需要解决的问题:

1.满足v14==0x81,才能进入补丁的逻辑,那么v14是数据包中的哪个字段,0x81又是什么含义;2.patch处比较的两个值又是什么,注意这是一个纯数值上的比较,v27 - *(a+12) >= 12。

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

问题1. 0x81是什么

对于加密的WiFi,其数据帧中的数据是被加密的。

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

不过在进入ExtSTAReceiveDataPacket函数时,Data的内容已经被解密。动态调试发现,v8指向解密后的数据包,v7为802.11数据头的长度,因此&v8[v7]即跳过了header,指向解密后Data数据。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

将数据从内存中导出,放到wireshark中进行分析。可以看出v14就是取出Logical-Link Control层中,Type的值。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

LLC是数据链路层的网络协议,通常占用8个字节【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

实际调试时,v14的值不是0x8就是0xdd86 ‒ 0x8 -> 0x0800 表示ipv4【转载】WIFI远程代码执行漏洞或许没你想得那么严重

‒ 0xdd86 -> 0x86dd 表示 ipv6【转载】WIFI远程代码执行漏洞或许没你想得那么严重

‒ 而关键的判断条件,0x81 -> 0x8100 则表示 VLAN-tagged frame【转载】WIFI远程代码执行漏洞或许没你想得那么严重

如果类型标识是VLAN的话,LLC的8字节后还要带上一个4字节的802.1Q Header,用来标识VLAN ID【转载】WIFI远程代码执行漏洞或许没你想得那么严重

而v14 == 0x81后的代码,就是在处理这4 个字节 (&v8[v7+8], &v8[v7+10])【转载】WIFI远程代码执行漏洞或许没你想得那么严重

其实这里已经可以看出问题了,先卖个关子,不知道读者能不能反应过来。提示:不要被“越界写漏洞”这个概念先入为主。

问题2. 比较双方的值是什么

回顾patch的内容,大概逻辑是判断x < y+12

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

其实在patch之前,还有一处比较,比较逻辑是 x < y+8【转载】WIFI远程代码执行漏洞或许没你想得那么严重

经过测试,我们发现y是802.11 header的长度,而x是整个数据包的大小 (包括802.11 header)。现在答案已经呼之欲出了:正常来说LLC的大小为8字节,但是如果LLC中Type为VLAN,后面还要跟上4字节的内容。然而如果整个数据包只有802.11 header和LLC,且LLC长度为8、Type为VLAN,则在未打补丁的版本上会越界读4个字节!这么看来两处比较就非常合理:‒ total_len >= 80211_header_len+8 接下来要处理8字节的LLC数据,所以这8个字节必须存在 ‒ (patch) total_len >= 80211_header_len+12 接下来要处理12字节的LLC数据,所以这12个字节必须存在

越界写

漏洞的直接原因清楚后,既然漏洞作者表明这是一个越界写,则在后续的代码中自然有越界写的位置。这个Patch函数的名字是Dot11Translate80211ToEthernetNdisPacket,说明它是一个转换函数。但问题是这个转换的过程没有发生在新的buffer,而是直接修改原buffer。注意变量v15,最终指向了802.11header的倒数第6个字节。在line113/114/115发生了对原buffer的修改。

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

直接说结论,最后会在原buffer中写12字节的数据,分别是802.11header中,帧接收端mac地址以及帧发送端的mac地址。为了节约空间,正常就是覆盖802.11header结尾的6个字节,以及LLC的6个字节。至于为什么保留了2个字节,因为要保留EtherType的信息。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

但是如果LLC类型为VLAN,程序就会默认LLC有12字节,给v15加上4。于是便覆盖LLC开始的6+4=10个字节。但是在上述恶意的数据包中,LLC长度只有8,这样就会在堆上越界写2个字节,且这两个字节为发送端mac地址的后两位,是可控的。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

例如图中数据包原长度为0x22,经过函数处理后,越界写了2个字节。22:0b即发送者mac地址的后两位(c2:38:97:bd:22:0b)。【转载】WIFI远程代码执行漏洞或许没你想得那么严重

TODO

要在实际环境下复现该漏洞,需要能通过wlan适配器发送任意的数据包。可能是受到无线网卡驱动的限制,尝试用scapy没有发送成功。我是采用windbg手动修改数据包内容的方式,简单复现漏洞造成的结果。具体是在ExtSTAReceivePacket修改数据包的长度和内容标识,不过因为不够底层,没法修改堆上缓冲区分配的大小。后续会想方法补充动态复现的过程。

4. 总体回顾

漏洞效果

攻击者发送恶意的WiFi数据包;受害者在处理这个数据包时,会触发一个堆上的越界写,写入的两个字节攻击者可控。

利用场景

1.攻击者作为AP,诱导受害者连上该WiFi,之后发动攻击

注意:不存在用户仅仅是开启WiFi就被攻击的情况

1.攻击者和受害者连上同一WiFi,之后发动攻击

1) 内存洞利用在场景2下可能较为困难:‒ 一些路由器会配置相关策略,比如mac地址黑名单,直接丢弃修改源mac后的数据包。如果不能自由修改mac地址,溢出2个字节的可操作性会大大降低;‒ 连上WiFi的设备普遍会有大量的数据包交互,可能会影响漏洞利用时对堆的控制;场景1下实战RCE的可能更大,因为作为AP可以严格控制发送给受害者的数据包,一定程度上降低对内存布局的干扰。2) 受害者必须要主动连上WiFi,不存在什么都不操作,只要开启wifi功能就会中招的情况:WiFi客户端会自动忽略来自不同WiFi的数据帧,即使没有改WiFi没有加密。这是由网卡厂商开发的驱动决定的。如果能自动监听数据帧等于有窃听的功能,有法律上的风险。除非网卡进入“监视模式”,才会接收和处理周围所有 WiFi 网络中的数据帧,而不是直接过滤掉。但是Windows上网卡驱动一般不支持开启监视模式,即使支持也需要用户主动去切换(netsh wlan show wirelesscapabilities 查看)。所以正常用户必须要连上WiFi才可能中招;

【转载】WIFI远程代码执行漏洞或许没你想得那么严重

3 采用较新的WDI驱动模型编写的网卡驱动,不会受到漏洞影响:无线网卡的驱动都会与ndis.sys交互。ndis.sys是Windows操作系统中的网络驱动接口规范(Network Driver Interface Specification, NDIS)的核心驱动程序。如果驱动使用的是传统NDIS模型,则ndis.sys最终会调用nwifi.sys驱动模块的功能;而如果驱动是采用WDI驱动模型,则ndis.sys最终会调用wdiwifi.sys驱动模块的功能。nwifi.sys和wdiwifi.sys都有对802.11相关协议的解析,后者只支持win10及以上的版本。例如我测试的tx-ac88网卡的驱动,采用了WDI驱动模型,不会受到漏洞的影响【转载】WIFI远程代码执行漏洞或许没你想得那么严重

而UGREEN-AX300为了兼容win7使用了传统NDIS模型,才能触发到漏洞位置【转载】WIFI远程代码执行漏洞或许没你想得那么严重


所以这个漏洞确实有一定的危害性,但是没有大家猜测的那么危险。直观的缓解措施就是不要随便连WiFi。同时这个漏洞也能给我们带来很多启发,近源场景下的漏洞值得被关注。最后,由于笔者水平有限,文章难免有错误或疏漏的地方,欢迎各位大佬交流指正。

References

[1] 微软最新WiFi远程代码执行漏洞(CVE-2024-30078)探究 - 先知社区: https://xz.aliyun.com/t/14941?time__1311=mqmxyD0iDtD%3DKAKDsYoYKw1nD9QK7YDuY3D#toc-0
[2] 漏洞描述: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-30078
[3] 1: https://www.v2ex.com/t/1049977
[4] 2: https://linux.do/t/topic/113329/4
[5]: https://github.com/blkph0x/CVE_2024_30078_POC_WIFI
[6] @XiaoWei___: https://x.com/XiaoWei___
[7] blackhat议题: https://www.blackhat.com/us-23/briefings/schedule/#diving-into-windows-remote-access-service-for-pre-auth-bugs-31968
[8] 漏洞: https://googleprojectzero.blogspot.com/2020/12/an-ios-zero-click-radio-proximity.html
[9] 教程: https://wambui-ngige.medium.com/how-to-setup-windows-kernel-debugging-between-two-vms-on-a-linux-host-vmware-f1d64f18a281

原文始发于微信公众号(云鸦安全):【转载】WIFI远程代码执行漏洞或许没你想得那么严重

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月29日02:06:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   WIFI远程代码执行漏洞或许没你想得那么严重https://cn-sec.com/archives/2895482.html

发表评论

匿名网友 填写信息