WPA2密钥重装攻击
KRACK
KRACK(取自“Key Reinstallation Attack”的缩写,中文:密钥重装攻击)是一种针对保护Wi-Fi连接的Wi-Fi Protected Access(WPA)协议的攻击手段,于2017年由比利时研究员Mathy Vanhoef和鲁汶大学Frank Piessens发现。Vanhoef的研究小组于2017年10月公布了此攻击的有关细节。
此漏洞影响所有主要软件平台,包括Microsoft Windows、macOS、iOS、Android以及Linux。被Linux、Android和OpenBSD广泛使用的开源实现wpa_supplicant尤易受到影响,其可以被操纵安装全零的加密密钥,从而在中间人攻击中有效消除WPA2的防护能力。
这个攻击利用的主要利用的是WPA或WPA2协议在四次握手过程当中的漏洞,当客户端试图连接wifi时,四次握手过程被触发,其中有一个AP向客户端传输Msg3的过程,攻击者可以反复重放这一过程,导致nouce被重置,继而导致传输的数据可以被攻击者解密。
WPA四次握手
关于四次握手的具体流程可以参考网上关于wpa协议的文章。这里只会做一个简单的介绍。
首先四次握手过程会产生一个叫做PTK的会话密钥,对于每个客户端来说都是唯一的,也就是说哪怕两个人是连接的同一个wifi,使用的PTk也是不同的。那么这个PTK怎么生成呢?只需要五个参数丢进去算就行了。分别是Anonce、Snonce、PMK、Amac和Smac,其中Anonce和Snonce是双方产生的随机数,PMK可以理解为wifi密码(其实还要和ap的SSID一起计算得到,但是因为SSID攻击者肯定有,所以可以认为就是wifi密码,便于理解),Amac和Smac则是双方的MAC地址。
虽然是四次握手,但是PTK其实只用了两次就产生了,因为这次的漏洞主要是产生在三四次握手上,所以前两次就不细讲了。总之在Msg1和Msg2之后,双方就都有了一个相同的PTK了。
然后第三次握手,AP会使用PTK加密传输一个GTK(用于组播的秘钥)过去给客户端。然后客户端这边收到组密钥之后就会回复一个Msg4过去,实际上就是一个ACK,如果AP没有收到这个Msg4,AP就会认为我这个Msg3丢了,因为我发一个东西过去都没人理我,那我肯定得重发一次,所以说只要AP这边没收到Msg4就会重传Msg3。只有成功接收到Msg4之后,AP才会安装PTK,否则就会重传Msg3,直到最后成功收到Msg4。
但是在客户端这边,只要Msg4发出去了,无论AP是否收到,都会立刻认为四次握手已经结束了,可以正确通信了,就会安装PTK和GTK这两个密钥。
这就是四次握手的主要流程。当然在实际的Msg中还有MIC值,包序号等等保障安全性的数据,但是和这次漏洞的关系都不大。
加密
既然有了秘钥,客户端就会用这个PTK来进行加密了对吧。虽然我们说PTK是秘钥,但其实加密的秘钥并不是使用的PTK,而是使用PTK和一个Nonce生成一个新的秘钥来加密,虽然叫做Nonce,但是这个Nonce并不是之前握手时的Anonce和Snonce。它比较类似tcp中的packet number,每发送一个报文,就会+1,发一个+1发一个+1,这样的话虽然我们只有一个PTK,但是每次加密使用的秘钥都是不同的,就大大提升了协议的安全性,防止了数学统计的可能。
得到了秘钥之后与明文进行异或运算就生成了对应的密文。
这里需要注意一点的是,刚才说krack攻击可以导致密钥被重装继而nonce被重置,现在看一下这个加密过程,因为PTK是不变的,所以说如果nonce被重用的话,也就相当于密钥流被重用了。
krack攻击流程
清楚了四次握手的过程以后,我们就可以来看一下krack的攻击过程了。
首先客户端试图连接WI-FI,比如说正常的连接到了AP的信道6。
攻击者通过deauthtication洪水一类的无线儿攻击,断开客户端与AP的连接,被迫其下线。
客户端它发现自己掉线了以后,就会尝试重新去连接这个AP,这个时候呢,攻击者需要再次CSA一类的攻击,强制客户端连接上另一个信道,形成一个中间人攻击。但不进行任何数据的篡改,而是正常的进行转发。
在客户端和AP进行四次握手过程中,前三次不进行任何操作,在最后一次,客户端发出Msg4之后,攻击者拦截Msg4,不让它成功的发送给AP,前面说过,Msg4是一个关于Msg3的ACK,AP这边假如说没有收到这个ACK,就认为发的这个包丢掉了,会重新传输这个Msg3。
当客户端这边收到这个Msg3时,由于客户端这边之前已经传过一次Msg4了,所以说认为四次握手已经结束了,所以就安装了PTK,并且开始用PTK加密数据了,而这个时候客户端又收到了一个Msg3,在这里,IEEE规定,只要客户端收到了Msg3,就要回应一个Msg4来表示应答,但是由于我们已经安装了PTK了,所以我们回复的不再是一个简单的Msg4了,而是一个加密之后的Msg4,因为是加密后的第一个包,我们可以假设加密使用的nonce=1,生成的秘钥为PTK1。同时,IEEE还规定,在重发这个Msg4后,还要重新安装PTK,并且将nonce重置,这样问题就来了,也就是说客户端本来下一个包应该使用nonce=2生成的PTK2来加密了,但是现在nonce重置了,也就是说下一个包的秘钥还是PTK1。这样就产生了秘钥的重复使用。
现在我们来看看攻击者手上有什么,第一次发的未加密的Msg4、第二次发的使用PTK1加密的Msg4。很明显,根据前面说的加密只是将明文和秘钥简单的异或一下,现在攻击者有了明文和密文,那么PTK1肯定也就有了。
客户端发送数据包Data,根据第5步,我们知道这里使用的秘钥是PTK1,因此攻击者就可以使用PTK1去解密Data,至此,我们最终实现了数据的一个解密。
krack攻击的危害
虽然根据IEEE协议而言krack攻击是成立的,但是在实际实现中肯定不会是完全按照标准去实现的。这个漏洞在不同的平台上的危害也不同,首当其冲的是Linux和安卓系统,为什么是这两类呢,原因出在wpa_supplicant上,这个东西是一个wi-fi客户端的加密认证工具,在Linux上用的比较多,后来谷歌把它整合到安卓平台里了,在这个工具里,重发Msg3的时候不仅会清除了已经安装的密钥,而且直接安装了一个全零的加密密钥来进行代替,也就是说攻击者直接就可以知道你的PTK是0,完全丧失了安全性。
而Windows系统遭受krack攻击的威胁就很小,Windows直接拒绝了Msg3的重传,从最一开始就堵死了krack攻击的流程,那么后边的步骤全都没有了。当然这样子不按照协议规定去做也不完全是好事,因为虽然在这里可能没出问题但可能在别的地方还会出问题,一般来说还是要按照协议实现更加保险。