前言
上周六在看雪安全峰会分享了一个议题,简单整理了一下分享过程中的一些内容,做了一个简单记录,有些地方由于时长有限,可能过的比较快,感兴趣的朋友可以看一下文字的一些记录,另外议题的PPT和视频demo上传至百度云了,论坛里有需要的朋友可以下载下来,欢迎一起学习和交流。
链接:https://pan.baidu.com/s/12U08fy1gxRpeWWAUhO4iEg
密码:awbb
《从WPA2四次握手看KRACK密钥重装攻击》
关于wpa2协议的这个漏洞相信大家在去年年底应该或多或少的都有一些了解,因为当时各路新闻也是采用了很大的篇幅来报道这一漏洞,一度营造了一种Wi-Fi马上要完了的氛围。我当时看到这个消息之后其实只是简单了解了一下,因为我印象里WPA2协议是在数学上被证明过是安全的,而且都已经服役了这么长时间了,也没有出现过什么问题,这回直接爆出了协议层面的缺陷,那肯定得是很严重的漏洞了,但也只是去简单看了一下,并没有深入去了解。这个漏洞真正让我感兴趣是在细节公开的几个月之后,我有一次突然想起来既然漏洞这么严重,那怎么这还没过去多久就没动静了呢,然后我回过头来去找当时的一些报道,发现内容多半也是词不达意,不但漏洞的原理没说清楚,而且最后krack攻击能干什么也没说,这就让我觉得挺有意思,想进一步的去了解一下这次的事件到底是说了一些什么东西,于是也就有了后续的一些研究。
我们首先来看一下什么是krack,krack也就是我们所说的密钥重装攻击,它的本质还是属于一种重放攻击,这种攻击的作用范围很有限,因为后面我们会提到需要搞一些中间人攻击的东西,它主要利用的是WPA或WPA2协议在实现上的漏洞,这个漏洞在四次握手过程当中就出现了,当客户端试图连接wifi时,四次握手过程被触发,其中有一个AP向客户端传输Msg3的过程,攻击者可以反复重放这一过程,导致nouce被重置,继而导致传输的数据可以被攻击者解密,这个是krack的一个大致流程,至于krakc是如何做到这些的,这个就需要我们首先去搞清楚这次漏洞的原理了,因为我们说过问题是出在四次握手过程当中的,所有我们还是要回到四次握手协议本身,来看一看问题出在什么地方。
在看四次握手协议之前我们先来明确一些概念,我们说四次握手过程会产生一个叫做PTK的会话密钥,这个密钥我们在后面还会反复提到,所以我们先来看一下它,PTK实际上可以看做由5个部分组成,前两个部分分别是Anonce和Snonce,这里nonce的话就是我们密码学上随机数的一个意思,就是number used once,表示一个随机数,这里我们在客户端和AP通信的过程中,我们把AP这一方也叫做authenticator,就是认证方的意思,客户端这一方也叫做supplicant,表示请求方的意思,这里Anonce和Snonce就是分别表示AP和客户端产生的两个随机数,就是区分了一下产生的源头。然后接下来的两个部分Amac和Smac也是一样,分别表示了两端的MAC地址,最后一个部分是PMK,PMK这个东西又可以看做是由一个pre-shared key,预共享密钥来生的,也可以说是我们平时说的这个wifi密码,但是他不是只由这一部分来生成,他还包含了一些其他的参数,共同生成了这个PMK,然后PMK还不是用来加密数据的,他又和我们刚才提到的另外四个部分共同组成了PTK,这个PTK才是真正我们后面用来加密传输的数据的密钥,这个是我们首先需要明确的一个地方。
好明确了这些概念之后,我们再来看一下四次握手的过程,首先第一个报文Msg1是由AP发送给客户端的,这个报文里面主要包含两个东西,一个是这个Anonce,这个nonce的话就是AP这边,也就是authenticator这边产生的一个随机数,另一个就是这个r,r在这表示的就是replay cunter的意思,就是一个重放计数器,它会随着authenticator这边每发送一次自动加1,但是同一次发送的应答过程中使用的r不变,所以可以看到客户端回应的这个还是一个r,它主要就是用来检测一下重放的数据,没有什么别的用途。好那么我们之前说过,生成PTK需要5样东西,现在客户端这边4样都有,就缺一个Anonce,就等着这个Anonce传过来呢,现在收到了这个,它要准备的东西都全了,所以客户端这边就会生成一个PTK,这边生成PTK了但是那边还没有对吧,所以客户端这边就会回应一个Msg2,这个里面也是包含了2个东西,一个是这个SNonce,表示客户端也就是supplicant这边产生的一个随机数,另一个就是这个replay counter,跟传过来的这个保持一致也是一个r。然后AP这边也是就等着这个SNonce呢,现在他收到了这个东西,他这边也全了,所以这边也生产了一个PTK。现在两边用来秘密通信的PTK就都有了,也就是说,咱们四次握手的前两次握手,解决了这个PTK的产生问题。
然后接下来看这个第三次握手,AP这边生成这个PTK之后实际上还会验证一下,如果没问题了,那么就会发送第三个报文给客户端,这个报文也是主要包括2个东西,一个是这个GTK组密钥,另一个就是replay counter+1,因为这边是AP第二次向客户端发报文么所以这个r+1,然后客户端这边收到组密钥之后就会回复一个Msg4过去,这个Msg4实际上就是一个ACK的作用,所以说在这个地方,如果AP没有收到这个Msg4会怎么样,他就会认为我这个Msg3丢了,因为我发一个东西过去都没人理我,没人应答,那我肯定得重发一次,所以说只要AP这边没收到Msg4他就会重传Msg3。但是客户端这边不管这些,他会想我可不管你AP这边收没收到,反正我这边这个Msg4就是这个ACK只要是发出去了,你收没收到反正我这边的工作都完成了,四次握手以经结束了,所以我接下来就会使用这两个密钥,一个PTK一个GTK,如果发单播我就用PTK发组播我就用GTK,后面所有我客户端这边发送的东西都会经过加密了。但是AP这边的话,只有成功接收到Msg4之后,才会安装PTK,否则他就会重传Msg3,直到最后成功收到Msg4,他这边也就认为工作结束了,然后才会安装PTK,这个就是四次握手的一个主要流程。
好我们刚才说到接下来,客户端就会用这个PTK来进行加密了对吧,我们一直在说加密加密,那么到底是怎么加密的,我们详细来看一下。首先客户端这里想要发送一个明文的数据,然后呢,他会使用这个PTK,和我们另一样东西结合起来,这样东西就是Nonce,我们之前在说krack的原理的时候说他因为密钥重装倒置nonce被重置,说的就是这里的这个Nonce,而不是之前四次握手里面说的那个Anonce和Snonce,这里一定要区分清楚,很多人都当成了四次握手里的那个nonce,不是那个,nonce重置指的是加密的过程中用到的这个nonce,在这里。那么这个nonce的话在这里又叫做packet number,这是一个什么东西呢,就是所咱们这个客户端,每发送一个报文,这个packet number就会+1,发一个+1发一个+1,这样的话我们可以看到虽然它叫做nonce但是实际上它一点也不随机,因为它在这就是一个序列,或者说就是我们四次握手里的那个重放计数器,它有他自己的增长规律,那么这样做有什么好处呢,我们可以看一下他把这个PTK和nonce结合起来,做成了这么一个密钥流,然后有一个明文数据过来,我就用这么一个密钥流,来进行一个异或运算,就可以得到一个密文数据,这个时候你就会发现因为我们的nonce是一个变化的值,所以有一个包过来,我们就这么结合一下,生成一个密钥流,所以我们的这个密钥流也是一直在变的,对于每一个包它的密钥流都不一样,你发一个包,它这边nonce+1,下一个过来的包密钥流又不一样了,所以相当于每一个包都可以使用一个不同的钥匙,那么这有啥用呢。其实了解过密码学的一些人应该都知道,加密的人其实很怕一样东西,叫做数学统计,在这里就是说如果我们反复用同一个密钥去加密很多数据的话,那么存在通过数学统计,找出它的规律,继而解密数据的这种可能性。那么现在我每次使用的密钥都不一样,我就可以在一定程度上避免这种问题。好那这个的话就是我们加密的一个详细过程,我们用PTK,和一个并不随机的Nonce,生成一个密钥流,然后每一个明文数据,都采用不同的密钥流,进行异或运算,得到一个密文数据,这个就是加密的过程,这里我们还需要注意一点的是,我们刚才说krack攻击可以导致密钥被重装继而nonce被重置,现在我们看一下这个加密过程,因为我们的PTK是不变的,所以说如果nonce被重用的话,也就相当于我们的密钥流被重用了,就对于WPA2的这里面的几种加密方式来说,nonce被重用就等于密钥流被重用了,这个我们待会还会提到。
好现在我们清楚了四次握手的过程以后,就可以来看一下krack的攻击过程了,首先客户端试图连接WI-FI,比如说正常的连接到了AP的信道6,这一过程没有问题,然后攻击者首先要做的是什么呢,就是通过deauthtication洪水一类的无线儿攻击,断开客户端与AP的连接,被迫其下线,那么说这个怎么防呢,它没法防,因为这东西它不认证、也不加密,不讲道理,说掉线就掉线了,它防不胜防的这个东西。但是客户端它发现自己掉线了以后,他就会尝试重新去连接这个AP,这个时候呢,攻击者需要再次CSA一类的攻击,强制客户端连接上另一个信道,这个是什么意思呢,就是攻击者可以使用2块网卡,因为我们知道MAC地址很容易伪装,所以攻击者在这可以模拟成一个AP,它把信道6的东西克隆一份,这样再通过CSA攻击让客户端连接到另一个信道上,比如说假设连接上的是这个信道1,这样攻击者实际上就卡在了两个信道中间,扮演了一个中间人的角色,客户端和AP之间的流量都会经过这么一个中间人的传输,这是我们krack攻击的第一步,先卡上一个中间人的位置,但是它暂时还不进行任何的篡改,我们接下来看第二步:
在第二步这个过程中客户端和AP进行四次握手过程,前三次不进行任何操作,在最后一次,客户端发出Msg4之后,攻击者开始拦截Msg4,不让它成功的发送给AP,我们前面也说过,Msg4是一个关于Msg3的ACK,现在我AP这边假如说没有收到这个ACK,那我就认为我发的这个包丢掉了,我会重新传输这个Msg3,这就来到了我们攻击的第三步,我们继续看:
好现在说AP这里重传了Msg3,这里看到这个replay counter又+1了,表示重传的这个Msg3了,好我们现在看看客户端这边这回收到这个Msg3会出现什么情况,由于我们客户端这边之前已经传过一次Msg4了,所以我这边不管你AP收没收到,反正我的ACK都给你回过去了,没有一种机制说AP那边还得需要再回一个ACK过来,那没完没了了就,肯定得有停的时候,所以说我客户端这里已经认为四次握手过程结束了,已经安装了PTK,并且开始用PTK加密数据了,这个时候客户端又收到了一个Msg3,他就会奇怪,哎不是之前已经收到了一个Msg3了吗,四次握手都已经结束了啊,为什么又来了一个Msg3,那么在这个时候,客户端接下来要做出的反应动作,就是这次漏洞爆发的关键,我们来看一下,在这里,IEEE规定,只要客户端收到了Msg3,就要回应一个Msg4来表示应答,但是由于我们已经安装了PTK了,所以我们回复的不再是一个简单的Msg4了,而是一个加密之后的Msg4,我们可以看一下这个加密符号,这里这个1表示加密使用的nonce,下面的PTK表示使用PTK加密,我们可以看到里面的这个replay counter变成r+2了,说明他和我们之前的这个Msg4是有连续性的,是接着上面的包发的,只不过是这次这个Msg4被加密了,那么到这里就结束了吗,还没有,IEEE同时规定,再你重发这个Msg4后,还要重新安装你的PTK,并且将你的nonce重置,比如说你这里用了一个1了,本来应该更新了,结果一重置,下回发的时候又用1了,我们之前说之所以每个明文数据都能用不同的密钥流去加密,就是因为我们的这个nonce一直在变,好那么我们看看现在重置之后会出现什么情况,接下来来到我们攻击的第四步:
现在甭管是Msg4也重新发了一回了,密钥呢也重新安了一会了,客户端想现在总应该没有事情了,然后开始回到正常的同信,去往AP发送数据,因为我们刚才发送Msg4的时候用了一次nonce,这回发送数据的时候,本来nonce应该增加了,结果因为我们刚才重装了一次PTK,nonce又回去了,我们从图上看到,这里的nonce又变成1了,传输了两回东西但是使用了同一个nonce,这个时候就出问题了,我们可以看一下这个被加密的数据,如果说攻击者想要解开这个数据他需要什么,很简单就是需要这个密钥流因为他说由明文数据和密钥流异或得到的,那么这个密钥流怎么获得呢,这就来到我们攻击的第五步:
我们接着往下看,现在这个密钥流怎么获取呢,我们可以看看攻击者到现在都已经有了那些东西,我们刚才说AP重传Msg3的时候,客户端回给出一个被加密的Msg4的回应,就是我们攻击者现在手里可以拿到一个被加密的Msg4,除了这个呢,我们之前还可以得到一个明文的Msg4,那么这两个Msg4实际上除了这个包增长序列以外都是一样的,没有什么不同,这个r+1 r+2并不影响这个Msg4本身,这等于说,我们现在手里面已经拿到了一个明文和其对应的密文,那么我们有了这个明文和其对应的密文之后可以做什么呢,我们之前说,加密的时候是进行异或运算的,明文异或密钥流得到密文,所以现在我只需要反过来算一下就行了,让明文异或密文,就可以倒推出这个密钥流,那么有了这个密钥流之后,最担心的事情还是发生了,由于我们之前的nonce被重置了,所以导致我们在这里传输数据时,使用的是和前面推出来的密钥流是相同的,所以攻击者就可以使用这个密钥流,去解密我们后面传输的这个数据,从而实现数据的解密,这个就是我们KRACK攻击四次握手的一套完整流程。通过这5步,我们最终实现了数据的一个解密。
所以说我们清楚了这个攻击的流程,自然也就可以回答我们一开始提出的那个问题了,就是krack攻击到底能干什么,现在我们知道它至少可以完成重放和解密两个功能了,其实事实上针对某些加密方式KRACK攻击还能更进一步,就是除了重放和加密,还能够伪造数据包,这个就要取决于这个加密方式了,如果是采用的(AES-)CCMP这种方式那还好,我们顶多是能重放和解密,如果是(WPA-)TKIP或者后来的GCMP这种方式那就更严重了,除了重放和解密之外,我们还能伪造数据包,因为时间有限,我们刚才分析的krack攻击流程里没有提到伪造的这一部分,有感趣的话我会在会议之后分享一些伪造的部分,但是它的这个核心思想也是和我们刚才的分析是一样的,或者说我们刚才的那个分析流程就是KRACK攻击的核心思想,不管形式再怎么变它的本质思路是不变的。然后我们再来看一下它的这个作用范围:
我们刚才说到这个krack密钥重装给我们带来了一定的威胁,但这里有两类系统比别的系统遭受的威胁更大,就是Linux和安卓系统,为什么是这两类呢,原因就出在这个wpa_supplicant上,这个东西他是一个wi-fi客户端的加密认证工具,在Linux上用的比较多,后来谷歌把它整合到安卓平台里了,所以这回俩跟着都出事了。那么为什么说他俩遭受的威胁更严重呢,因为他们不仅是清除了已经安装的密钥,而且直接安装了一个全零的加密密钥来进行代替,这就等于说我们的加密已经形同虚设了,这回是一点安全性也谈不上了。在这里还有一个比较有意思的地方就是Windows系统遭受krack攻击的威胁就很小,我们看一下这个表就会发现,微软直接拒绝了我们这个Msg3的重传,我们说这个krack攻击最关键的地方就是客户端接受Msg3的重传,然后重装密钥继而重置nonce最后进行解密,微软这边说好你重传吧,我这边不接受,这等于从最一开始就堵死了krack攻击的流程,那么后边的步骤全都没有了。但是可能会说这个接受重传Msg3不是IEEE的规定吗,对确实是这里微软就是没有按照IEEE的规定来做,反而躲过一劫,而认真听话的到时收到威胁了,但是这并不意味着我们就应该不按协议的规定去做啊,你这样的话在这里可能没出问题但可能在别的地方还会出问题,而且我们也可以看到微软在组密钥这种情况下还是会收到影响,组密钥这种基本就是通杀了,所以说其实这个还是因为不同的厂商对同样的一句规定可能有不同的解读,所以说对不同的系统可能影响也不一样,这个也是比较有意思的一个地方。
那么最后我们来看一下如何对抗krack,我们之前一直在提到其实漏洞的核心地方在于nonce被重用,那么nonce重用是发生在我们重装密钥的这个动作之后,我们可不可以想一种机制让他既能够发出去Msg4这个ACK,又能够做出判断不重装密钥呢,其实有一个很方便的办法就是通过设置一个布尔型变量再配合状态机来进行判断。我们首先用一个布尔型变量并将其初值设置为FALSE,当变量进入到PTK-START状态并且生成了PTK时,将变量的值修改为TRUE,如果变量来到了PTK-DONE状态并且其值为TRUE,那么进行PTK的安装,并将其修改为FALSE,这样一来,如果变量以FALSE状态来到PTK-DONE,那么说明我们的PTK已经安装过一次了,这个时候只需跳过PTK的安装步骤即可。如果我们注意观察的话,就会发现其实wpa_supplicant 2.6以上版本当中就是采取了这样的一种思路。
对于个人用户来讲的话,最好也是最简单的办法就是及时的进行更新升级或安装补丁,避免Msg3的重传,防止密钥重装。对于企业来讲的话,除了更新升级之外,还可以考虑一下WIPS,这个WIPS的话就是无线入侵防御系统的意思,我们可以使用WIPS来检测和减轻中间人攻击,防止我们的客户端设备连接到这些伪造的无线接入点上,它其实一定程度上采用了和我们攻击者同样的思路,我们攻击者不是试图去模拟一个AP么,它可以去探测周围的有没有和我们的AP发一样的SSID的设备,如果有的话,那么我们也可以采取同样的方式,比如说deauth洪水攻击,来打掉攻击者的设备,以牙还牙,来保证我们的设备不去连接到攻击者伪造的WIFI上,这样我们也可以看到实际上就是将我们对抗krack攻击的方式转化到了对抗中间人攻击的方式上,这个也是我们在对抗上可以采用的一个思路。
最后是关于这次漏洞和这种攻击方式的一点反思和总结,我们之前说四次握手过程被证明是安全的,这个其实也并没有什么问题,因为我们如果看一下这个证明过程的话就会发现其实这个证明是建立在密钥只会被安装一次的基础上来进行的,这就好比我们在进行一系列数学证明的开头把一个不是定理的理论当成定理来用,那么一旦前面被指出不成立,后面的推理都会跟着崩塌。或者说我们可以换一个角度来看待这种证明,这个是比利时研究员在blackhat Europe上放的两张图,我觉得已经足够形象和直观的说明这个问题了,我们单看两个桥都没有问题,但是拼在一起就会出问题,或者单看两个抽屉都可以拉开,但是同时打开就会出问题。这其实就是说明,我们部分的安全不代表整体的安全,我们的ptk密钥是安全的,我们的协议是安全的,这些我们都可以证明安全性,但这不说明他们组合在一起就不会出现问题,我们的krack攻击就正是从这一部分进行击破,这其实也是对我们在以后安全领域的证明过程提出了更高、更准确的要求。
最后还有一点内容就是,这次的议题我们是从四次握手的角度来看krack密钥重装攻击,但实际上krack攻击却不是仅仅局限于四次握手这一过程的,像其他的一些握手方式,比如peerkey握手,组密钥握手,FT握手等等,同样是可以应用krack中的技术来进行攻击的,这也说明这种密钥重装的攻击并不是一个单一的攻击方式,他其中还是有很多思路和技巧值得我们去继续研究和学习的,所以说如果你对这部分内容感兴趣的话,也欢迎在会后和我继续交流,那么我这次的议题分享就到这里,谢谢大家。