我们分析了802.11组秘钥的生成和管理。这些秘钥是用来保护WiFi通信的广播和多播。我们发现了几个问题,并通过解密一个典型的Wi-Fi网络的所有组(和单播)流量来说明它们的重要性。
首先我们来讨论一下802.11随机数生成器的设计缺陷,并提供了足够的熵量。通过在多个平台上预测随机生成的组密钥,证实了这一点。我们还检测了组秘钥在传输过程中的安全性。在这里我们发现了在四路握手机制中,可以使用降级攻击的方法来破解RC4加密的组密钥。RC4每个秘钥流包含了包含了带有16字节密钥的公共16字节初始化向量,初始的256字节的密钥流也缩减了。我们研究了这种RC4独特的用法,发现只要捕获231次的握手信息就足够恢复128位的组秘钥。我们 也检测了组通信是否和单点通信隔离了。我们发现并没有这回事,事实是组秘钥也可以用来注入和加密单点通信。最后,我们提出了一种针对802.11协议的一种新的随机数生成器。
在过去十年,WiFi逐渐成为了公认的中线程无线通信标准。不仅是因为它被广泛应用,一些新的加强功能也让它的表现更加出色。不过有一个缺点是(加密的)流量很容易被截获。所以,WiFi的安全已得到业界的重视。例如,WEP加密协议可以被完全破解[11, 42, 4],攻击WPA-TKIP加密协议的展示 [43, 45, 47, 41],AES-CCMP加密协议的安全分析[24, 39, 13],四路握手安全性的研究[17, 18, 34]等。然而,大多数研究只关注于成对秘钥和单播通信。组秘钥和组通信往往被忽视。
在这篇文章中,我们想说明在现代的Wi-Fi网络中,生成和管理密钥是一个关键但被低估的部分。特别地,我们研究了组密钥的生成及其对客户机的传输,以及组通信与单播通信之间的隔离。我们发现了在组密钥有效期内,这些阶段都存在问题。为了解决我们的一些发现,我们提出并实现了一种新的,从物理Wi-Fi信道中提取随机数的随机数发生器。
首先,我们先来看一下802.11标准中提出的随机数生成器。除其他事项外,接入点(AP)会使用它来生成组密钥。令人惊讶的是,我们发现在设计中就有缺陷--参考的算法运算速度很慢。我们检测过的实际运用这套算法的设备,都加强了生成器算法来提高它的速度。我们也证实了这些实际运用中随机数生成器可以通过预测来破解,在几分钟之内就能够算出组秘钥。生成的组密钥会在四路握手期间传递给客户端。我们发现可以在四路握手期间进行降级攻击,迫使AP使用RC4算法来加密需要传输的组秘钥。我们分析了每条信息的RC4秘钥,和它对秘钥流中的重定向的影响。这表明,攻击者可以通过滥用重定向捕捉230到 232加密的组密钥数据包,来恢复128位密钥,准确的数目取决于网络配置。
组秘钥应该只能被用来加密广播和多播的数据帧,换句话说,成对秘钥和组密钥应该被正确地隔离,单播数据包不应该用组密钥加密。AP可以通过只发送,但从不接收组寻址帧来强制执行此操作。然而,我们测试的所有AP都没有提供这种隔离。这样就允许攻击者使用组秘钥来进行注入攻击,并反过来对Wi-Fi网络中发送的任何数据进行解密。
FC
图1:简化的802.11数据帧,带有WAP2头部
最后,我们提出了一种针对802.11标准的新型随机数生成器算法。它通过收集接收信号强度指示(RSSI)的测量数据来提取随机量。这些常用的无线设备上就有这些测量数据,而且即使没有背景流量也可以经行。我们算法生成自由量的速度大概是每秒3000位。即使攻击者能够以高概率预测个别RSSI测量量,但生成器的输出仍然保持高度的随机性。我们的主要贡献是:
1. 我们证明了802.11标准中的随机数生成算法是有缺陷的,通过预测算法的输出,在实际应用中破解了算法,并得到组秘钥。
2. 我们展示了在4次握手期间进行降级攻击,通过RC4加密算法的弱点解密出了组秘钥。
3. 我们证明了组秘钥可以用来实现注入攻击,对Wi-Fi网络中发送的任何数据进行解密。
4. 我们提出并实现了从无线信道中提取随机量的随机数生成器。
本文的其余部分组织如下。第2节介绍了802.11标准的相关部分。我们破解了802.11的随机数生成器。在第3节,第4节展示了对四路握手的降级攻击,并对其使用RC4加密情况下进行攻击。
第五节,我们使用组秘钥进行注入攻击和解密数据帧,包括单播帧。第六节,我们提出了一种新的随机数生成算法。最后在第七节中回顾了相关的工作,在第八节中进行了总结。
这一些提供了一些802.11协议,四路握手机制,RC4密钥流
当站点需要传输数据,它需要在数据包头部添加一个有效的802.11头部(详见图 1)。这个头部包含了必要的MAC地址,用来路由数据帧。
addr1 = 接收方MAC 地址
addr2 = 发送方MAC 地址
addr3 = 目标 MAC 地址
图2:从搜索AP到四路握手流程
接入点(AP)向目的地收发数据帧,这个目的地可能是有线网络中的一个节点,或是WIFI中的客户端。如果是客户端手到的数据帧addr1 应该等于 addr3,因此,这次通信就会终止。例如,当客户端发送一个出站IP数据包,addr1等于AP的MAC地址,addr2包含了客户端自己的MAC地址。Addr3应该是路由器的MAC地址。
如果客户端希望发送一个广播或多播帧,例如组寻址帧,它首先应该将这个数据帧以单播的通信方式发给AP。这就意味着addr1中就是AP的MAC地址,addr3等于多播或者广播的目的地址。如果需要的话,AP会用组秘钥加密这个数据帧,然后向所有连接该AP的站点广播这个数据帧。
这个Frame Control (FC)域包含了ToDS 和 FromDS的标志位。如果数据帧是从客户端发送到AP上,则ToDS 标志位置1,反之,则FromDS标志位置1.如果数据帧经过加密,在图1的第5个域中只 会包含Key ID 和 Packet Number (PN).
通过监听信标,客户端可以搜索附近的AP,AP会周期性地广播信标(详见图2).这些信标包含了AP支持的加密算法。当客户端希望连接到AP,而且已经选好加密算法,它会开始向AP发送连接请求。
图3:EAPOL-Key数据帧结构
这个请求包含了选好的加密算法。为了防止降级攻击,客户端和AP会将接收到的IE痛四路握手中选择的IE做一次验证。在这次握手中,客户端和AP也会相互验证,并协议生成成对秘钥Pairwise Temporal Key (PTK)。这个PTK是重要的协商秘钥。PTK的第一部分是Key Confirmation Key (KCK),它是用来验证握手信息。第二部分叫做the Key Encryption Key (KEK),它是用来加密在握手期间的一些敏感信息。第三部分称为Temporal Key (TK),它是用在握手认证之后加密需要传输的数据帧。为了确保每次建立连接PTK都是新生成的,客户端和AP都会先生成一个随机数分别称为SNonce 和 ANonce。根据共享的密码,ANonce 和 SNonce、客户端和AP各自的MAC 地址,会生成衣蛾PTK
在四路握手的第一次,AP 会发送ANonce到客户端(见图2)。在收到这条消息之后哦,客户端就会计算出PTK。在第二次握手时,客户端会发送SNonce,IE中也说明了所选择的加密算法,还有根据整条信息算出的Message Integrity Code (MIC)。注意MIC是用PTK秘钥中的KCK算出来的。在收到Msg2和SNonce之后,AP也会生成一个PTK。这样通信双方有一个相同的PTK,所有的数据包都会用MIC验证。使用KCK和接受到的MIC,AP就可以验证Msg2的完整性。然后AP就可以检查Msg2中包含的IE是否与初始连接请求中的AP是否相匹配。如果不匹配,握手进程将终止。否则AP就会在应答中发送e Group Temporal Key (GTK),在IEs中列出AP所支持的加密协议。客户端会先验证Msg3的完整性,然后将其中的IEs与先前在信标中接收到的IEs 相比较。如果不同,握手将终止。否则客户端会向AP发送Msg4来结束这次握手认证。
四路握手的消息都使用EAPOL-Key帧格式,它最重要的域在图3中有介绍。Key Info域中包含了这个数据包是握手中的第几次进程的标志位。它也说明了是用什么算法来计算MIC,还有用什么算法来加密Key Data field(在第四章中有详细描述)。注意KCK秘钥是用来计算MIC,KEK是用来加密Key Data 域
图4:RC4在Python的伪代码实现
最后,Key IV域包含了初始化向量(IV),来确保Key Data域是用独一无二的秘钥加密。Key Data通常是用来传输组秘钥(GTK),和转化IEs。
RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。
RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的RC4加密算法的有效攻击方法。
在介绍RC4算法原理之前,先看看算法中的几个关键变量:
1、密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节;
2、状态向量S:长度为256,S[0],S[1].....S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换;
3、临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;
4、密钥K:长度为1-256字节,注意密钥的长度keylen与明文长度、密钥流的长度没有必然关系,通常密钥的长度为16字节(128比特)。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)