WPA2**重装攻击原理分析

最近Wi-Fi wpa2 安全模式曝出了安全漏洞,攻击者可以通过拦截wpa2四次握手的Msg4报文,利用Wi-Fi client对AP端重传的Msg3报文的处理,来达到reinstall PTK & GTK,从而**传输报文的目的,下面这篇文章讲的比较详细,分享下:

WPA2**重装攻击原理分析


壹、WPA2的机制

无线通信协议有很多,例如WEP,WPA等都已经被证明不安全,还有TKIP机制也有大量文献说明其缺陷。WPA2协议是WIFI联盟一直力推的协议,被广泛运用在现在的无线互联网络当中;CCMP(Counter Mode CBC-MAC Protocol   )我之前也被推行过很长一段时间,现在有新的GCMP,不过都是基于计数器CTR的,都类似。我下面会以WPA2和CCMP为例解释此次事件。

在WPA2中运用了丰富的密码手段,原因是无线信道的开放性必须有加密措施来保证传输过程的安全。握手协议则是通信双方互相进行一个身份确认的过程。WPA2的四次握手协议是EAPOL(EAP on LAN,即 Extensible Authentication Protocol on LAN)的四次握手协议的落地,,所有的数据包都是使用EAPOL帧进行封装的,EAPOL数据帧的格式可以参考下图:

WPA2**重装攻击原理分析

图1:EAPOL帧结构,来源Mathy Vanhoef团队论文(https://papers.mathyvanhoef.com/ccs2017.pdf)

关于EAP协议:之前在西电上课刚接触到的时候就理解了好一会,因为它不像TCP/IP一样是直接落地的协议。它是一个密码协议,用到相同的密码手段的地方都可以使用它,然后再在不同场景转化为落地的东西,所以一定意义上可以理解成是“指导协议的协议”。所以我看来,这次四次握手出现的问题,也很有可能在其他用到类似密码手段的地方重新出现。这里涉及到很多密码学通用的概念,因此尊重作者,下文将AP(wifi接入点)称为认证方(Authenticator),待接入的STATION称为请求方(Supplicant)。

该帧中关键的点有如下几个

header部分标志了该帧的用途。

replay-counter是一个计数器,用于防止重放攻击:认证方下发认证请求时,设置该值,请求方在回应认证要求时,使用相同的值;在一系列会话中,该计数器递增。

nonce 部分存放之后生成**要使用到的值。注意,这里的nonce不是我们后面会话中的nonce。

MIC 作为完整性校验部分,可选。

KeyData 部分未来存放group key用,这里不展开。

那么接下来还是看一下WPA2的4次握手的过程:

WPA2**重装攻击原理分析

图2:来源wikipedia

握手之前会有一些无线发现的过程;WPA2 的4次握手,目标是完成身份认证,建立会话**;握手之后是组**协商过程,此次事件在这里也发现有问题。

这里很重要,我阐述一遍四次握手的过程。

①、由认证方发起,下发一个握手请求,并且发送了认证方随机生成的nonce值ANonce。

②、申请方收到ANonce之后,也随机生成一个SNonce发还给认证方,同时附加MIC值。

双方在具备两个nonce之后,就可以开始分别计算PTK(Pairwise Transient Key)了。PTK的计算方法可以看作是计算(PMK,ANonce,SNonce,认证方的MAC地址 ,请求方的MAC地址)这样一个5元组的哈希值。这里的PMK(Pairwise Master Key)则可以看作是ssid和口令(就是平常的wifi密码,不过这里实际是先又口令生成PSK,再到这里)的哈希值。

MIC值是PTK的前16个字节。这里如果双方的MIC一致,说明PMK生成的一致,则说明双方拥有的口令一致(即输对了wifi密码),那么认证方就认可请求方的身份了。

③、认证方生成并发放组会话**,同时下发另一个MIC。 

④、最后请求方回应一个Ack完成会话。

之后通信双方就可以使用PTK中的各种**进行安全的通信了。

贰、问题所在

佩服他们的想法,他们意识到一点,在收到握手包③之后,请求方就会认为生成的PTK是正确的,而不清楚也没有办法验证认证方是否收到了握手包④,安装PTK并开始进行使用其派生的**作为CCMP的会话**,通过802.1x进行通信了。

而且,在协议的实现上有规定:1、每次生成PTK之后,都要重设CCMP的计数器的值。(有关计数器后面再说)2、处在已经安装PTK状态下的请求方要处理重传的握手包①和③

而对于认证方而言,则不会安装PTK。如果认证方收不到握手包④就会重传握手包③,同时递增其中的replay-counter值来使其有效。这样就出现问题了,一个显而易见的攻击方法是:

攻击者可以事先在申请者和认证者之间占据一个中间人的位置。然后通过阻断握手包④到达认证方来时认证方发送新的握手包③。这样就导致申请方会重新安装PTK,这样,就能够重设CCMP中的计数器。而且基于不同的会话加密协议,可以实现如重放、解密、伪造等能力略有不同。

如何实现中间人:不能简单做中继因为PTK的计算使用到了双方的MAC地址。Mathy Vanhoef团队的方案是使用基于信道不同的AP克隆,同时也保持MAC地址一致。 

一个基础的攻击模型如下:

WPA2**重装攻击原理分析

在第一阶段,阻断了回传的握手包④。然后截获了加密的数据报文。然后再下一次认证方发起重传时,再转发之,实现**重安装,之后又得到一份计数器被重用之后的密文。如下图,CTR模式下面,**流和计数器是关联的,计数器重用就相当于**流复用了,在密码学上就标志这短明文沦陷了。而且可以通过重复握手过程来多次实施该攻击。

WPA2**重装攻击原理分析

图4、CTR模式的加密图解(来源wikipedia

虽然计数器重用以后离恢复明文还有一些密码学上面的路要走,但是该团队还发现了很多有意思的协议实现上面的BUG,导致这个攻击能够相当有威力。就比如视频中演示到的,linux和Android重安装之后的加***变为了空;还有对重传replay字段校验不严格等等也导致了有意思的错误。