学习笔记
1、背景
WiFi技术发明于上世纪90年代,96年申请专利,发展至今已经有20多年的历史,WiFi市场竞争也愈发激烈,如今市场上用到的WiFi芯片主要来自BroadCOM(博通)、QualCOMM(高通)、Realtek(瑞昱)、MEDIATEK(联发科)、Intel(因特尔)、HISILICON(海思)、MARVELL(美满)。
- BroadCOM主要应用于苹果电脑、iPhone、三星手机等设备
- Qualcomm的骁龙平台在安卓手机中应用十分广泛
- Intel WiFi芯片主要应用于笔记本电脑中,其中联想、Dell使用的是Intel的WiFi芯片
- MEDIATEK WiFi芯片主要应用于路由器网卡和安卓手机中
- Realtek WiFi芯片主要用于路由器和USB网卡中
- MARVELL WiFi芯片主要应用于微软Surface pro系列
- HISILICON WiFi芯片主要应用于华为手机和中国众多的物联网设备中
任何一项技术都不会是完美的,WiFi技术发展20多年来,它的安全性依然不那么乐观。
- 2017年 远程命令执行漏洞:利用博通芯片的WiFi栈
- 2017年 远程代码执行漏洞:利用苹果设备上的WiFi栈
- 2018年 Marvell WiFi芯片无感知远程漏洞
- 2019年 博通多个芯片安全预警,影响了电脑、手机、IoT、路由器等设备,未授权的攻击者可以通过恶意的WiFi包即可发起攻击,无认证、无感知、无接触
这些漏洞堪称十分完美的漏洞,WiFi甚至成为一个未上锁的大门
2、WiFi重点概念
应用场景
AP(Access Point)接入点,指无线路由器等产生WiFi信号的设备
STA(Station)工作站,指手机或电脑等连接WiFi的设备
IBSS(Independent Basic Service Set) 独立基本服务集,STA通过AP接入网络就组成了一个IBSS
管理帧
802.11文档中管理帧占了很大的篇幅,有线设备的联网只需要将网线接入口插入网口即可连接网络系统,而无线网络则需要管理帧完成这部分的工作。
- 移动设备寻找网络系统
- 网络系统对移动设备进行验证
- 移动设备关联到网络系统
- Beacon Frame
- Probe Request/Response Frame
- Authentication Frame
- Association Request/Response Frame
Beacon Frame结构:
2 | 2 | 6 | 6 | 6 | 2 | 8 | 2 | 2 | variable |
---|---|---|---|---|---|---|---|---|---|
Frame Cotrol |
duration | address1 | address2 | address3 | Sequence Control |
TimeStamp | Beacon Interval |
Capabilities Information |
IEs |
header | header | header | header | header | header | body | body | body | body |
由BeaconFrame结构可以看出管理帧结构的特点为:
-
由Frame header和Frame body组成
-
Frame header的Frame Control字段包含了帧的类型Type和一些标志位
Version 2bit 表示版本类型,目前该字段均为0 Type 2bit 指明帧类型:00管理帧、01控制帧、10数据帧 SubType 4bit 指明帧的子类型,数据帧控制帧管理帧的子类型,所以同一个子类型标识在三种帧中代表了不同的子类型。 ToDS 1bit FromDS 1bit 这两个标志位有关联所以一起描述,ToDS为0FromDS为0表明是在STA与STA间传播、ToDS为0FromDS为1表明数据帧来自AP、ToDS为1FromDS为0表明数据帧发往AP、ToDS为1FromDS为1表明是在AP与AP间传播 More 1bit 表示后面还有很多段 Retry 1bit 表示是对之前发送过的某帧的重传帧 Pwr.mat. 1bit 表示发送方进入节能模式 MoreData 1bit 表示发送方还有更多的帧发送给接收方 Protected 1bit 表示是帧已经被加密 Order 1bit 表示是接收方高层希望按顺序处理帧序列 -
duration字段包含了发包的时间间隔
-
address1表示该帧发往的Mac地址
-
address2表示该帧发送方的Mac地址
-
address3表示该IBSS中热点的Mac地址
- SequenceControl包含了发包的顺序
STA通过AP接入网络系统的流程:
步骤 | 详情 |
---|---|
发现网络 | STA获得AP的一些基本信息,比如热点的名称、支持的速率、支持的认证方式等信息,有主动模式和被动模式两种: <ul><li>被动模式:热点不停地向外发送Beacon Frame,STA通过Beacon包来获得热点信息。</li><li>主动模式:STA向周围发送Probe Request Frame,周围的热点收到Probe Request后发送Probe Response Frame进行响应返回热点信息。</li></ul> |
认证身份 | Authentication Frame进行身份验证 |
关联设备 | Association Frame,当STA关联成功,AP会返回一Authentication ID,用于标识此关联 |
发现网络、认证身份、关联设备是无需密码的,只要物理距离足够,STA和AP就可以发起用户无感知的管理帧交互
接入过程完成之后,就进入了验证密码的四次握手阶段。
信息元素
从上面的帧组成部分可以看到,最后一部分IEs是可变长的,那这部分存储的是什么呢?
Information Element(信息元素),是管理帧中的可变长组件,即每个Information Element长度不一定,一个管理帧中的IE数量也不一定。
信息元素的结构是
Element format:(Element ID[1B])+(length[1B])+(Element ID Extension[1B])+(Information)
下面给出几个例子:
- ssid信息:\x00+length+ssid
- 支持速率信息:\x01+length+SupportedRates
- …….
- ESP信息:\xff+length+\x0b+ESPinformationList
之所以有Element ID Extension字段,是因为信息元素种类过多,一个字节的ElementID字段已经无法满足需要,所以将ElementID=\xff时采用类似于子网划分的方法使用ElementIDExtension字段的1B来将一个种类变成256个种类,缓解ElementID字段不够用的情况。
3、攻击面剖析
在WiFi芯片用于通信设备中既需要发送和接受通信链路层的数据包也需要和系统及应用层软件进行交互,面向数据链路层的通信接口和操作逻辑就存在远程攻击面。
远程攻击面
影响较大的几个远程攻击面:
- WiFi基本入网流程:STA接入AP的三次交互,WiFi最基本且应用最广的功能
- WiFi密码认证阶段:普通的验证如WPA/WPA2是四次握手,复杂一些的如WPS是八次握手,更复杂的如企业入网流程。这类攻击面需要密码和证书才能完成所有的通信交互流程。
- WiFi认证后功能:如TDLS功能,即上面提到的攻破安卓和iPhone使用的漏洞所在的地方,该攻击面需要密码认证后和目标同时处在一个WiFi网络下。
- WiFi P2P:无线投屏、手机高速分享就是使用的这个技术,也包括入网、认证、建立连接这三个攻击面
- WiFi Mesh:WiFi的一种新型组网方式
本地攻击面
- WiFi驱动IOCTL:WiFi驱动会开放给应用软件IOCTL函数接口,使得用户可以和WiFi驱动进行通信。因为WiFi代码位于内核驱动中,代码运行权限很高,如果存在漏洞,则能够造成本地提权。
WiFi基本入网流程攻击面
特点:
- 无需用户参与
- 无需知道WiFi密码
- 无需物理接触
只要STA接入AP过程中出现漏洞,则该漏洞能够在无需用户参与、无需知道WiFi密码、无需物理接触即可触发该漏洞。
在网络安全领域,越复杂越危险。但WiFi基本入网流程只需要三次握手,看起来很简单,拿着部分为什么能成为攻击面呢?
答案就在于信息元素这部分,信息元素是管理帧结构中变长的结构。
- 一般对某个IE的长度都有一个标准范围,例如SSID IE,通常在0~32B,但是该结构实际上的value可以达到255字节长。如果在驱动中没有对长度加以验证,则很容易造成缓冲区溢出,这种洞很容易发现,一般在10年前就发现完了,但是也不能保证新人不会犯老人犯过的错误。
- 200+种信息元素,一个字节的Element ID字段已经不足以标识所有的信息元素了。仅仅是信息元素的定义在802.11文档中就占据了很大的篇幅,一种信息元素就携带着一种信息或者实现了一种功能,开发在实现这些功能时应该会花费不少的精力。正是如此多的信息元素才使得WiFi具备了十分丰富的特性和功能。也正是因此才扩大了攻击面。
- 802.11中还预留了对未来协议的扩展支持,而对于扩展内容的操作增加了程序的复杂性,增加了安全风险。
- Vendor specific这个IE不仅包含了各个厂商自己定义的内容,也包含了WiFi保护访问和其他功能,在一个IE中承载了如此多的功能,这对Vendor specific的解析要求比较高了。
- 结构中嵌套结构,RSN(Robust Security Network,强健安全网络) IE使得STA和AP能够互换安全信息,RSN IE中包含了设备支持的加密套件。而加密套件有一个数量字段Count,和对应的套件列表List,这就存在IE长度和Count字段冲突的可能。
变长结构、丰富的信息元素、扩展接口、厂商私有定制、结构中嵌套结构每一项都是对开发人员的考验,更不要说文档中未明确定义的部分由开发人员来实现。
4、FUZZ
一个基于协议的黑盒Fuzz,完全参考802.11标准文档。不同的厂商、不同的WiFi设备的共同点都是参考了802.11标准文档,因此一个基于协议的黑盒Fuzz就可以对他们进行测试。
流程
- Fuzz模式:选取Fuzz功能
- 变异策略:按一定规则来生成各种畸形的数据
- 发包方法:介绍我们发送WiFi通信包的方式
- 崩溃检测
- POC精简
- 漏洞分析
Fuzz模式
WiFi最基本的设备就是AP和STA,因此Fuzz首先针对这两个功能:
- AP模式:伪装成一个AP,在目标STA设备上部署脚本、app等工具,是STA不停连接fake AP
- STA模式:伪装成一个STA,不停地连接目标AP
变异策略
变异策略的好坏对Fuzz的效率有很大的影响,变异策略是能够挖掘出大量漏洞的首要原因。一开始通过一个笔记本、一个无线网卡对一个目标设备进行测试,可以很快发现漏洞。
- 管理帧随机变异、不同管理帧组合变异
- 各个IE随机变异、不同IE组合变异
- IE各个字段随机变异、不同字段组合变异
上面三个变异方向加上动态变化的变异程度,可以做到变异的深度和广度。
发包方式
802.11协议是数据链路层协议,可以使用无线网卡的监听模式来监听和发送数据链路层的通讯包
#设置监听模式和监听信道
ifconfig wlps0 down
iwconfig wlps0 mode monitor
ifconfig wlps0 up
iwconfig wlps0 channel 6
WiFi有2.4G和5G两个频段,2.4G有14个信道,一般网卡的监听模式只能在2.4G模式下工作,我们可以监听一个信道进行802.11协议的监听和发包,一共尝试过三种发包方案,各有优缺点:
- Ralink RT2870/RT3070/RT5370
- 优点是价格便宜、发包稳定
- 缺点是其中的时间戳无法设置
- Atheros AR9271
- 优点是发包内容完全可控
- 缺点是监听模式下运行不太稳定,经常出现卡死情况
- SDR(Software Defined Ratio)
- 优点是发包迅速、内容完全可控
- 缺点是成本高
崩溃发现
- 检测AP时,AP通常不停地向外发送Beacon Frame,等待STA的连接,当AP设备crash后,则无法检测到目标AP的Beacon Frame,此时认为目标crash,停止Fuzz
- 检测STA时,STA连接AP,会发送Probe request或者Authentication包,当无法检测到目标STA的Probe request和Authentication包,此时认为目标crash,停止Fuzz
漏洞复现
一定时间内发送的每一个frame都会记录下来,当发送crash时,就重放记录的frame,一步一步的精简,知道确定出最后的一两个frame
漏洞分析
- 源码审计
- 高通Android开源代码:高通Android开放了一部分源码,这部分可以依靠代码审计来分析漏洞成因
- 逆向分析
- 老版本驱动符号信息:二进制符号信息对逆向分析特别重要,一般最新的驱动都是没有符号信息的,只能在网上搜索老版本的符号信息,老版本驱动的符号信息对分析工作的帮助同样很大
- 字符串:有的字符串中会包含函数名称或者是相关的信息,可以通过IDA脚本来批量恢复函数名
- 通过poc推导
- 根据触发漏洞的frame和IE推导:例如这个函数是用来处理BeaconFrame的、还是ProbeFrame的、还是处理Authentication包的、又或者是处理Association包的。它是用来解析SSID的,还是用来复制Support Rates的。
5、典型漏洞
CVE-2020-3650
Qualcomm ATHW10X.SYS Driver Stack-Overflow Vulnerability
高通的一个USB无线网卡,在Windows平台存在一个栈缓冲区溢出漏洞,该漏洞在AP模式下和STA模式下都可以被触发,当Windows平台通过该网卡开启一个无线热点或连接一个伪造的热点时都可以触发该漏洞。漏洞涉及到的Information Element是Support Rates IE和Extended Supported Rates IE。
STA接入AP的三个交互分别是:
- Probe发现网络
- Authentication认证身份
- Association关联网络
该漏洞存在于关联阶段,不论是Authentication request,还是Authentication response,只要携带了恶意的Support Rates IE和Extended Support Rates IE均能触发该漏洞。
漏洞逻辑:
该函数用于解析Support Rates信息元素和Extended Supported Rates信息元素。
虽然有长度检查,但是长度检查出了问题,可以被绕过,导致后置缓冲区溢出
void function(BYTE *Rates,BYTE *ExtendedRates){
....
//判断Support Rates长度是否超过了36,此处Support Rates可以等于36
if(Rates[1]>36){
printf("Bad rates len");
return -1;
}
....
//检查Support Rates长度与Extended Supported Rates信息元素之和是否超过了36
//此处显然是为了防止缓冲区溢出
//第二个检查了Support Rates长度是否小于36,此处导致出了问题!
//当Support Rates为36时,两个if均未执行,此时Extended Supported Rates没有被校验
if(Rates[1]+ExtendedRates[1]>36&&Rates[1]<36){
printf("extended rate set too large");
return -1;
}
....
//进入内存复制流程,此时过长的Extended Supported Rates就可以导致缓冲区溢出
memcpy(...);
}
Qualcomm修复方案就是去掉了第二个if中的第二个判断条件
CVE-2020-0558
Out-Of-Bound Write Vulnerabilities in All family of Intel dualband wireless adapters
- Intel芯片漏洞,位于对全系列Windows WiFi驱动中,是一个内存越界写漏洞。
- 当Windows系统通过网卡分享一个移动热点时,攻击者只要连接该热点就能触发该漏洞,导致系统崩溃。
- 该漏洞主角是SupportedOperationalClasses IE,这个信息元素声明了STA支持的操作类。
Element ID | Length | Current Operating Classes | Operating Classes | Current Operating Classes Extension Sequence (optional) |
Operating Classes Duple Sequence (optional) |
---|---|---|---|---|---|
1 | 1 | 1 | variable | variable | variable |
漏洞逻辑:
//处理Association frame所支持的ChannelList
void prvPanCnctProcessAssocSupportedChannelList(){
....
for(int i=0;i<classis[1];i++){
//这个函数每次执行都会向一块内存中写入512B,并累加内存地址
//当调用次数过多时,会造成内存越界
//循环次数由SupportedOperationalClasses IE的length字段决定
//最多循环255次
utilRegulatoryClassToChannelList();
....
}
....
}
其他案例
- 类型转换导致的陷入循环跳不出循环
- 两个畸形的Beacon包就能让手机崩溃
- 特殊的包会进入一个从未进入过的分支,触发一个功能实现的bug,进而可以导致远程命令执行漏洞
独立思考
1. 主动模式是通过Probe Frame进行发现,此时是一对多探测所有ap还是针对给定ssid探测指定的ap?
Probe request Frame 的Frame Header 的Frame Control 字段如下:
- Version:00
- Type:00
- SubType:0100
- FromDS:0
- ToDS:0
- …….
在主动扫描中,STA扮演比较积极的角色。在每个频道上都会发出Probe Request帧,请求某个特定网络予以回应。主动扫描试图寻找网络,而不是听候网络宣告自己的存在。使用主动扫描的工作站就会以如下的程序扫描频道表所列的频道:
- 跳至某个频道,然后等待来讯显示,或者等到ProbeDelay计时器超时。如果这个频道收得到帧,就证明该频道有人使用,因此可以加以探测。
- 利用基本的DCF(DistributedCoordinationFunction,分布式协调功能)访问程序取得介质使用权,然后发送Probe Request。
- 至少等候一段最短频道时间(MinChannelTime)
- 如果介质不忙碌,表示没有网络存在
- 如果在MinChannelTime这段期间介质非常忙碌,就继续等候一段时间,直到最长频道时间(MaxChannelTIme),然后处理任何ProbeResponse帧
当网络收到其所属之延伸服务组合的Probe Request,就会发出Probe Response。
- 寻找特定SSID网络。在舞会中找认识的朋友,大声喊出对方的名字,对方听到后,会做出反应,至于其他人不会搭理。
- 广播探测所有网络。在Probe Request帧当中使用broadcast SSID,如此一来该区域内所有的网络都会以Probe Response进行回应。类似在舞会上大喊失火了~
每个BSS,必须至少有一部工作站负责回应Probe Request。
具体可以之后用usb网卡实际抓包分析
2、隐藏WiFi功能是如何实现的?
一种早期的安全性功能即所谓的封闭式网络,也叫隐藏式网络、SSID广播禁止、私有网络名称。
802.11问世之初,工作站必须设置基站所使用的网络名称SSID。当时用户端软件相当于按时,连接之前,会先在空中搜寻具有特定名称的Beacon。
隐藏网络中有两个组成部分:
- 依然会依标准的规定传送Beacon帧,但不包含SSID信息元素,这样当时的用户端软件就不会显示该网络。
- 要与之连接,工作站必须送出包含SSID的Probe Request帧,因此它的作用类似一把隐藏的密钥,使用隐藏SSID功能的基站只接受在Probe Request中给周围隐藏的SSID的工作站。目前即便该STA发送Probe request包SSID是正确的,在AP回复STA时Probe response包中也不会带上SSID,做到ssid的隐藏。
ProbeFrame中带有Mac地址,用于后续通信。
3、Authentication Frame不是用来验证身份吗?那为什么关联设备之后才进行密码的四次握手?
工作站与无线网络连接的过程中,可能必须经过多次身份认证。连接之前,工作站会先以本身的MAC来跟基站进行基本的身份辨识,此时的身份认证通常称为802.11身份认证,有别于后续进行的牢靠且经过加密的使用者身份认证。
Authentication Frame 的Frame Header 的Frame Control 字段如下:
- Version:00
- Type:00
- SubType:1011
- …….
SPA和AP之间是通过无线链路进行连接的,在建立这个链路的过程中,需要要求STA通过无线链路的认证,只有通过认证才能进行STA和AP之间进行无线关联。但是此时不能判断,STA是否有接入无线网络的权限,需要根据后续STA是否要进行接入认证和是否通过接入认证才能判断。
结论:
- AuthenticationFrame是用来进行链路认证的,有Open开放系统认证和Shared-key共享密钥认证两种
- 关联之后的WiFi密码验证阶段802.1x(EAP)、PSK等是接入认证方式,接入认证后方可接入无线网络
- 能够接入网络之后,还可以选择数据加密方式
- 而WEP、WPA/WPA2-802.1x、WPA/WPA2-PSK、WAPI-CERT、WAPI-PSK、WPA3等是安全策略,是对链路认证、接入认证、加密方式的组合策略。
- 三大WLAN规范分别是WEP、WPA、WPAI。
802.1x的基础是EAP(Extensible Authentication Protocol)。EAP是一系列验证方法的集合,设计理念是满足任何链路层的身份验证需求。
只有通过Authentication验证,STA才有资格和AP建立无线链路,之后在Association阶段与AP协商无线链路的服务参数,才能完成无线链路的建立
4. 缓冲区溢出为什么会成为漏洞?如何利用?
缓冲区溢出,是针对程序缺陷,向程序输入缓冲区写入使之溢出的内容,通常是超出缓冲区能保存的最大数据量的数据,从而破坏程序运行,趁着中断获取程序乃至系统的控制权。
计算机对接收的输入数据没有进行有效的检测,向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据一出道被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。
缓冲区溢出攻击中最致命的是堆栈溢出攻击,在函数返回时改变程序的地址,让其跳转到任意地址,继而获取程序的控制权。一般来说,攻击者攻击root程序,然后执行类似”exec(sh)”的执行代码来获得root权限的shell。
利用必须满足两点:
- 在程序的地址空间里安排适当的代码
- 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。
5. 很多主讲人都提到了Fuzz,那么什么叫做Fuzz?
Fuzz测试,也叫做”模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件写入非法的字段,观测被测试软件是否异常而实现。
漏洞挖掘分为三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。Fuzz测试是黑盒测试中效率中最高的一种方式,所以常用。
主讲人提到的程序就是一个Fuzz,通过各种变异策略生成各种非法字段,通过观察被测试软件是否crash来发现漏洞,最后通过精简找出POC,最后进行漏洞分析。
产生过的疑问
- 主动模式是通过Probe Frame进行发现,此时是一对多探测所有ap还是针对给定ssid探测指定的ap?
- 隐藏WiFi功能是如何实现的?
- Authentication Frame不是用来验证身份吗?那为什么关联设备之后才进行密码的四次握手?
- 缓冲区溢出为什么会成为漏洞?如何利用?
- 很多主讲人都提到了Fuzz,那么什么叫做Fuzz?