浅论密钥重装攻击KRACK

KRACK即为Key Reinstallation Attacks,中文译为密钥重装攻击。是由比利时鲁汶大学信息安全研究人员Mathy Vanhoef提出的一种针对WPA2的攻击方式。

Mathy Vanhoef

时间线

•      2017.5.19   论文被提交

•      2017.6.16   向攻击涉及的供应商发出通告

•      2017.8.28   CERT/CC向所有供应商发出通告

•      2017.10.15  作者在https://www.krackattacks.com公开披露细节,并演示了一个攻击实例

•      2017.11.1 论文在CCS会议报告

 

灵感的来源

“Ha. I wonder what happens if that function is called twice.”

      athy在写另一篇论文时,注意到WiFi标准中一个安装密钥的函数,通常只会被调用一次,他猜想调用两次将会重置相关参数。

在正式开始介绍之前,为了便于理解,我先给出一些名词。

•       成对临时密钥(Pairwise Transient Key ,PTK)作为会话密钥。

•       成对主密钥 (Pairwise Master Key, PMK)

•       接入端 随机数Anonce

•       客户端随机数Snonce

•       临时密钥(Temporal KEY, TK)

•       预共用密钥(PSK) 同一无线路由器底下的每个用户都使用同一把密钥,区别于802.1X认证服务器来分发不同的密钥给各个终端用户

•       接收计数器(Receive Sequence Counter,RSC)

•       信息完整性校验码(MIC)

 接下来正式开始介绍

 

1  背景知识

1.1  WPA的产生

WPA全名为Wi-Fi Protected Access,有WPAWPA2两个标准,是一种保护无线网络安全的系统。它是研究者为了解决在前一代的有线等效加密WEP)系统中找到的几个严重的弱点:

•        WEP不是强制使用的,使得许多设施根本就没有启动WEP

•        WEP并不包含钥匙管理协定,却在用户间共用一个秘密钥匙

•        RC4所用的24比特的IV(初始向量)并没有长到足以担保不会重复

而产生的。商业联盟 Wi-Fi Alliance制定了WPA标准,对WPA标准的实际运用检验从2003年4开始,并于2003年11变成强制性。

1.2  WPA802.11i的关系

由于WEP已被证明不够安全,人们需要更安全的加密标准,但制定802.11i的工作比原先预期的久了很多,在大家越来越关心无线安全的同时,该标准的制定花费了四年才完成。芯片厂商已经迫不及待的需要一种更为安全的算法,并能成功兼容之前的硬件,所以,WPA包含了与WEP兼容的802.11i子集合,实现了IEEE 802.11i标准的大部分,先于完整的802.11i推出。在完整的802.11i标准于2004年6通过之后,Wi-Fi Alliance2004年9推出了实现了802.11i强制性元素的WPA2

1.3  WPA2的改进

WEP所使用的CRC循环冗余校验)先天就不安全,在不知道WEP密钥的情况下,要篡改所载数据和对应的CRC是可能的,而WPA使用了名为“Michael”的更安全的消息认证码(在WPA中叫做消息完整性查核MIC),WPA2采用了计数器模式密码块链消息完整码协议CCMPCounter CBC-MAC Protocol),其安全性已被严格地证明了。

WPA仍使用RC4,使用可以动态改变密钥的临时密钥完整性协议Temporal Key Integrity ProtocolTKIP),以及48位的IVWPA2RC4AES取代。

 

2  攻击原理

2.1  四次握手

WPAWPA2均使用802.11i中定义的四次握手,客户端(Station, STA)和接入点(Access Point, AP)通过四次握手相互验证和协商名为成对临时密钥(Pairwise Transient Key, PTK)的会话密钥。PTK通过成对主密钥(Pairwise Master Key, PMK)、AP随机数ANonceSTA随机数SNonce和双方MAC地址等计算生成,其中PMK由登录密码等双方均已知的信息计算生成。而后续正常数据加密所使用的临时密钥(Temporal KEY, TK)即派生自PTK。各密钥、参数的关系如下图所示。

说明: IMG_256

 2-1 四次握手中各密钥、参数关系

 2-2 四次握手中所用数据报文格式 说明: IMG_256

 2-3 四次握手过程

消息1,2与攻击关系不大,略过不提,WPA2所遵循的802.11i标准中规定,AP在发起连接时就安装组密钥GTK,客户端接收到消息3将安装PTK和组密钥GTK,发送消息4作为回应,AP收到消息4安装PTK,未收到消息4将重发消息3.

为了完成密钥重装,攻击者需要嗅探、重放四次握手过程中的第3个消息报文,强制重置协议加密使用到的nonce值及重放计数,重安装加密密钥。而会话密钥与双方MAC地址有关,所以,普通的中间人攻击是无法奏效的,需要运用channel-based MitM技术,伪造同名同MAC不同信道热点。

 

3  不同场景的攻击

3.1  接受明文重传消息3,不安装全0密钥

攻击者作为中间人,首先放行消息1,2,3,阻塞客户端对消息3的回复消息4。此时客户端安装了PTK,将发送以此PTK加密的数据,nonce1,攻击者将此数据阻塞。

AP未接收到消息4,将重发消息3,攻击者将其转发给客户端。客户端重装PTK,此时,攻击者将先前拦下的消息4发送给AP,此后发送的加密数据将重用PTK,nonce被重置为1

nonce重用引发的后果与所采用的数据保密协议密切相关。三种数据保密协议:

•      临时密钥完整性协议TKIP

•      计数器模式密码块链消息完整码协议CCMP

•      伽罗瓦/计数器模式协议GCMP

所采用的数据加密算法分别为流密码RC4、认证加密算法AES-CCM和认证加密算法AES-GCM,其中AES-CCMAES-GCM的加密部分都是基于CTR模式的流式加密。明文数据与算法生成的密钥流按比特逐位异或后得到密文数据。流式加密的问题是在密钥固定的条件下重用nonce时总会生成相同的密钥流。这一特性可以被利用来解密数据包。

    KeyStream表示密钥流,P1P2表示两组明文数据,KeyStreamP1P2具有相同的比特长度,则两组明文对应的密文分别为:

•      C1 = P1 ⊕ KeyStream

•      C2 = P2 ⊕ KeyStream

攻击者可以通过网络收集到密文C1C2,如果攻击者知道密文C1对应的明文P1,则可以据此恢复明文P2的信息:

•      P2 = C2 ⊕ keystream = C2 ⊕(P1 ⊕ C1)

在实际情况中,通常能找到已知内容的数据包,所以可以认为在密钥固定的条件下重用nonce时获得密文数据包可根据上述过程解密。即使已知内容的数据包确实无法获得,当对消息类型有足够的知识(比如消息为英文字符)的条件下,也可能解密还原出明文。

    WAIT!!!!!!!! AP安装PTK了吗?

客户端重装PTK之后,发送的消息4将被加密,而此时AP尚未安装PTK,无法识别,消息4将被丢弃,攻击失败了吗?

    802.11标准表述存在瑕疵:

“On reception of message 4, the Authenticator verifies that the Key Replay Counter field value is one that it used on this 4-way handshake.”

注意其表述为“one”,也就是只要先前用过的都行。凡是照此实现的算法,均可用之前的消息4取代。使得攻击者可以完成一个完整的四次握手过程,使AP安装PTK。进而实现对通信数据包的解密。此时,攻击者并不知道实际安装的密钥。

 

3.2  接受明文重传消息3,安装全0密钥

LinuxAndroid系统中,实现WPA2的是wpa_supplicant.由于其2.3版本以上对协议的错误实现

使得安装PTK后将TK0,客户端再次收到消息3重装密钥时,会从内存中取回TK。在这种情况下,则会导致安装全0密钥TK,使得攻击者不仅能解密数据包,还能进行流量劫持。

基本步骤与前例一致,区别只在于此时安装的TK是全0,攻击者知道了TK,可以进行流量劫持,监控并篡改客户端发出的全部数据

3.3  接受加密重传消息3(转变为接受明文重传)

LinuxAndroid系统中,虽然设定为接受加密重传的消息3,但其也会接受明文重传的消息3,只要重传的消息3紧跟在原始消息3之后。

    无线网卡会将其送入CPU的接收队列中。

    CPU先处理第一条消息3,发出第一条消息4,发出命令,让无线网卡安装密钥。

    CPU再处理第二条消息3,发出第二条消息4 ,无线网卡使用PTK对其加密。CPU发出命令,无线网卡重装密钥,nonce被重用为1。被转化为接收明文重传消息3

2-7       接受加密重传消息3(被转变为接受明文)

3.4  仅接受加密重传消息3

攻击者先等待客户端完成一次完整的四次握手,在第二次的四次握手过程中,阻塞消息3,等待AP重传的消息3到来,一起交付给客户端的无线网卡。

    无线网卡使用当前的PTK将其解密,送入CPU的接收队列。

    CPU先处理第一条消息3,发出第一条消息4, 发出命令,让无线网卡安装新的密钥PTK’

    系统并不对对消息3加密的密钥进行检查,所以尽管第二条消息3是用以前的PTK进行的加密,对其不加区别。所以CPU直接发出第二条消息4 ,发出命令,让无线网卡重装密钥,nonce被重用为1.

3.5  不听话的孩子幸免于难?

WindowsiOS 违背802.11标准,不接受消息3重传,所以其免疫四次握手攻击。

但是,组密钥握手攻击,Fast BSSBasic ServiceSet TransitionFT)握手攻击然有效。

最后,我们一起来看一个攻击实例,视频演示可在https://www.krackattacks.com查看

 

4 攻击实例

利用安卓设备存在的可被强制安装全0密钥漏洞,获取用户登录名及密码等敏感的个人信息

4.1  工具

工具

•      探测漏洞是否可用的脚本,

•      漏洞利用脚本

•      https降级工具sslstrip

•      抓包工具wireshark

4.2  攻击过程

安卓手机在没有恶意设备接入时连接到WPA2加密的无线网络

4-1       接入加密网络

手机访问macth.com,安卓手机默认开启SSL(安全套接层)

4-2       网站开启SSL

启动攻击脚本krack-all-zero-tk.py,各项信息如下

真实热点Real AP

Ssid testnetwork

MACbc:ae:c5:88:8c:20

Channel6

被攻击客户端target

MAC: 90:18:7c:6e:6b:20

伪造同名同MAC热点(Rouge AP):

Ssid testnetwork

MACbc:ae:c5:88:8c:20

Channel1

 

4-3       启动攻击脚本

启动enable_internet_forwarding.sh脚本,使得钓鱼热点可用

4-4       使钓鱼热点可用

启动sslstrip,去除SSL保护

4-5       去除SSL保护

接下来,使用wireshark抓包,手机再次连接无线网络。

4-6       再次连接

此时,手机首先依然连接到真实热点,通过构造CSA(Channel Switch Announcement 信道切换公告)信标(beacon)的方式来强制切换到钓鱼热点。

4-7       CSA元素格式

说明: IMG_256

4-8       攻击成功

手机再次连接网页,SSL保护已去除

4-9       SSL保护已去除

输入账号密码登录说明: IMG_256

4-10 登录

查看wireshark捕获数据说明: IMG_256

4-11   WPA2保护已被绕过

审核人:yiwang   编辑:边边

(完)