前面提到的方法都需要发送大量的数据包,而这篇 post 中的方法仅需要嗅探再加上少量的包就可以实现对使用 WPA / WPA 2 的用户进行攻击,使受害者无法连接上 AP。这种方法即 RSN IE Poisoning。
![RSN IE Poisoning](/wp-content/uploads/2017/06/rsnie-poisoning.png)
简单来说一下 802.1X,802.1X 规定了一个 STA 想要连接上某个无线局域网时的步骤。
- 这个 STA 需要向对应的那个 AP 发送 authentication 包,请求加入这个无线局域网。
- 于是 AP 则会询问 STA 的身份(即要求密码验证)。
- 然后 STA 会向 AP 发送自己的身份以及利用和 AS (Authentication Server) 共享的主密钥签名这个身份信息。
- AP 在接收到了这个包以后,将由 AS 来验证,如果是有效的,则会告知 AP 允许这个 STA 访问此网络。
- 最后,AP 再将 AS 的结果告知 STA。
但是 802.1X 的 authentication 并不是每个网络中都要求验证的,在不使用 802.1X 的 authentication 的情况下,TKIP 则会为每个 STA 产生一个 256 位长的 PMK (Pairwise Master Key),再有了 PMK 和另外一些和设备相关的信息之后,会产生 4 个 128 位的密钥,Pairwise Transient Keys,即 PTKs。这四个临时密钥将用于 STA 和 AP 连接过程中的数据加密,数据完整性检测,EAPoL (Extensible Authentication Protocol over LAN) 加密以及 EAPoL 完整性检测。在标准中,这四个密钥依次被称为
- Data Encryption Key
- Data MIC Key
- the EAPoL Encryption Key
- the EAPoL MIC Key
前两个分别是用于加密 STA 和 AP 间的数据,为这个数据计算 MIC (Message Integrity Code,消息完整性码)。后两个类似,即用于加密 STA 和 AP 在最初进行 4 次握手时的通信。产生 PTKs 则是利用PMK、STA 的 MAC 地址、AP 的 MAC 地址、STA 随机产生的 nonce、AP 随机产生的 nonce。根据以上的条件,显然要在 STA 和 AP 中计算出来相同 PTKs 的话,STA 和 AP 就必须拥有相同的这几个信息,也就是说,它们必须交换得到对方的 MAC 地址和 nonce。TKIP 使用的则是 4 次握手来完成这一交换过程。
第 1 次握手
这一步是由 AP 向 STA 发送自己的 $nonce_{AP}$ (为了区分 AP 和 STA 各自的 nonce,我们使用下标标记)。AP 首先生成一个 $nonce_{AP}$、一个序号 $sn$,然后组成消息
$$message_1=(\text{MAC}_{AP}, nonce_{AP}, sn)$$
这一步的消息是以明文形式发送给 STA 的。在 STA 接收到这个消息之后,就可以生成自己的 $nonce_{STA}$ 了,此时,STA 方面计算 PTKs 的必要信息就都有了。
第 2 次握手
在 STA 有了 PTKs 之后,STA 就可以利用 PTKs 中的 EAPoL MIC Key 了。STA 在这里向 AP 发送的消息是(我们将使用 $\|$ 代表两个二进制串“连接”的意思)
$$message_2=(\text{MAC}_{STA},nonce_{STA},sn)\|\text{MIC}(nonce_{STA},sn)\|\text{RSNIE}_{STA}$$
这里的 $\text{RSNIE}_{STA}$ 是 robust security network information element,即标题中的 RSN IE。这个 RSN IE 包含了验证 authentication,pairwise cipher suite selectors, group key cipher suite selector, RSN capabilities 和一些其他的 RSNA 定义的参数。参考下图~
![Four-Way Handshake Step 2](/wp-content/uploads/2017/06/four-way-handshake-step-2.png)
第 3 次握手
AP 收到来自 STA 的消息之后,提取出前面部分的 $nonce_{STA}$ 和 $\text{MAC}_{STA}$,此时 AP 也可以按照标准计算出 PTKs,随后利用自己计算所得的 EAPoL MIC Key 来验证 STA 发来的 $\text{MIC}(nonce_{STA},sn)$ 部分。如果验证失败,那么 AP 就停止握手。否则会准备这一次握手的消息
$$message_3=(\text{MAC}_{AP},nonce_{AP},sn+1)\|\text{MIC}(nonce_{AP},sn+1)\|\text{RSNIE}_{AP}$$
第 4 次握手
STA 在收到 $message_4$ 之后,则会向 AP 发送这一次的消息(似乎这一步 STA 也是会验证 AP 发来的 $\text{MIC}(nonce_{AP},sn+1)$,因此理论上我们的攻击也可以选择这一步进行)
$$message_4=(\text{MAC}_{STA},sn+1)\|\text{MIC}(sn+1)$$
至此,4 次握手完成,AP 和 STA 都拥有并确认使用了相同的 PTKs。
那么回到我们的 DoS 攻击上来,在第 3 次握手的初始阶段,AP 会利用自己计算的 EAPoL MIC Key 来验证 STA 发来的 $\text{MIC}(nonce_{STA},sn)$ 部分。如果验证失败,那么 AP 就停止握手。利用这一点,我们只需要监听第一次握手的包,然后伪造一个无效的第 2 次握手的包发送给 AP。AP 在收到这样的包以后则会终止 4 次握手的过程,拒绝该 STA 连接。
![RSN IE Poison Demo](/wp-content/uploads/2017/06/rsniepoison.png)
不过 4 次握手的过程实在太快了,不一定每次都能在监听到第 1 次握手之后,抢在真正的 STA 前向 AP 发送伪造的第 2 次握手消息。即使时间上差不多,实际中 RSN IE Poisoning 攻击在受害者那边产生的效果看起来似乎也不唯一,我这边测试时出现了设备要求重新输入无线网络密码、提示无互联网连接这两种情况。
![No Internet Connection](/wp-content/uploads/2017/06/no-internet-connection.png)
![Require Password](/wp-content/uploads/2017/06/require-ppassword.png)
猜想可能是 AP 在验证这一步的自动机状态没有考虑到这种攻击,我这里偶尔还会出现明明真正的 STA 和 AP 完成了 4 次握手,但是我发送的伪造的包还是让 AP 回到了 step 3,然后由于 STA 已经不再理会 $message_3$ 了,AP 在多次重传 $message_3$ 没收到回应后,自动 deauthenticate 了 STA。如下图。
图中黑色背景标记的则是真正的 STA 和 AP 的 4 次握手,可以看到在 0.014578 秒时,就已经完成了 4 次握手,可是后面 AP 又进入了 step 3 的状态,以致在 4.582004 秒处 AP 选择了 deauthenticate 这个 STA。
References
- 《Introduction to Network Security Theory and Practice》, Jie Wang, Zachary A. Kissel, p221-225
- IEEE 802.11i-2004 - Wikipedia