WPA/WPA2-PSK认证过程

WEP是粗制滥造的临近Deadline的不合格品,而WPA则是设计精美的艺术品。以致目前没有真正可行的攻击方法。现行的WPS Pin法(针对路由器设置)和字典法(暴力,下面会讲到),都不算好的针对WPA攻击方法。

总感觉不自己试试就不知道WPA是否真的这么牛掰,所以我用python模拟了WPA的认证过程。这里说的WPA都是PSK(预共享密钥),不是Enterprise。主要区别是Enterprise是同时需要用户名和密码,然后要到RADIUS认证服务器上认证,是大学常里用的WiFi认证方法。而PSK是所有用户一个密码,就是家里用的那种。PSK的一个缺点就是Key固定,一旦被破解,整个家庭网络就跪了。


WPA 认证原理

首先是PSK产生方式。PSK不是我们输入的密码,而是以一个公式产生。我没认真看PBKDF2是怎么样的算法。反正是产生Key的标准。可以以一个命令产生: wpa_passphrase SSID PassPhrase 。当然也有python算法

然后还有个叫PMK的Key,在Personal模式下PSK就是PMK,就不详细说明了。这个PMK还不是实际中使用的,实际使用的是PTK(Pairwise Transient Key)。PTK计算方法也很奇特。 PTK = PRF (PMK + ANonce + SNonce + AA + SPA) 。参数从EAPOL四次握手过程中的前两次得到。而且PTK是有结构的,前16Bytes用来计算MIC,是我用到的。下面示意图和代码说明一切。抓包数据也在github上,有兴趣的可以自己实验。密码包含在代码里。

PTK
TKIP或CCMP的PTK结构,来自aircrack-ng

400px-4-way-handshake.svg
EAPOL四次握手过程,来自wikipedia


真实数据

我在自己的WiFi抓了流量,就是WireShark数据。因为WPA还有两种,一个是WPA一个是WPA2。主要区别是WPA用的是TKIP加密算法,WPA2是CCMP加密算法。下图是TKIP的认证过程。
WPA_TKIP
获取其中的数据,使用Python检验,能得到一致结果。检验的是用我产生的PTK对原始数据签名,看看获得的MIC是否与抓包得到的MIC一致。一致就说明我的模拟没有问题。

然后也有类似的WPA2的CCMP认证过程。认证过程主要区别是EAPOL的第三个帧是加密的,而且使用的是SHA1的hash签名,而TKIP是MD5的hash签名。为什么CCMP更安全,不止是认证过程,还有数据传输过程,我还没有搞清楚。先不管,只管认证过程。WireShark数据截图:具体代码和数据包见github.
WPA_CCMP

所以从上述步骤看,从始至终都没有交换密钥。要破解通信的话,必须捕获EAPOL中的ANouce和SNouce,这样就可以用字典暴力破解。可行性不大。因为一次测试要4096次HMAC,计算量还是可以的,还有PSK还加了盐,彩虹表也用处不大。貌似Linux的密码也是这样的方式。从认证过程来说,WPA还是很安全的。真实过程除了要生成PTK,还要生成GTK(Group Temporal Key)。过程类似,不赘述。

为了完整性,还有Enterprise的没搞。必需等我搞懂SSL/TLS再说。
有用链接:

  1. 非常详细的PPT
  2. 802.11 securityEAPOL细节计算PTKpython 计算PTK
  3. PSK产生方式
  4. 介绍WPA中各种key
  5. WPA攻击
  6. 论坛问题

WEP认证过程

为了将来能搞定WiFi,最近看了一下关于WiFi的认证过程。偷密码什么的最有意思了。我没有深入去了解WiFi怎么加密传输,我只看了怎么认证。因为对目前我来说,只有认证是比较有意思也是比较重要的。


WEP认证原理

就从最简单的WEP开始。从etutorials了解到,非OPEN的WEP认证过程为4步:

  1. STA(客户端)先发起认证要求;
  2. AP返回一个随机的字符串(challenge),让STA加密。加密方式为RC4,密钥为IV(24bits)+WEP KEY(40bits)。IV是STA和AP都可以随机选择的,并且放在每个包中;
  3. STA加密后返回给AP;
  4. AP用自己的Key,和STA发送来的IV合并,以同样的方式加密,看看是否一致。一致就认证通过。

wep
使用WireShark抓一下自己设置好的WEP类型无线网,设置过滤为wlan.fc.type_subtype == 0x0b,参考cisco。就可以看到WEP WiFi的认证帧。下图显示了2个帧。wep_wireshark
可以看到要加密的Challenge Text为:0100020000001080e0c3b6bacbe834233fe094e49c975b55553a56560b6614cff5135c172cbb1ff43b38905da7d89c2a10d985b66df7d290f49be85a8ca947011b652f1deb7397fa299a3600b6f1242eb500c04be5ac8a97a66edd6d54c435564806f89d94eab5e549e9180a76825274c99f80bd26e2846027c17024bfbf071836ab88ade43a6619
加密后的Data为:56d2cc9138ef6ca906b5423cac31101fb3e14169f9808b904925231b01fc24c6e2ddb715b31ba1d130da3d72f563988d0b6d4a93b77705e121e31deb9c2d6f3c893fe3932d5f8d42625103dd9a03ea1f43c027cc72fd5ed0bb9468766fb92e982cff950ece35c508d924cfdb91e87995751d6b4ee9cdf452a7a3dee18bd53cd32d47c46a25cd16dd
使用Python来测试一发:

完全正确。源码和抓的包见github。所以到此为止,我测试WEP认证的目的已经达成。其实我先是学习WPA的认证方式的,搞完了为了完整性才补上WEP。WEP现在很少用的,因为都说不安全,不仅认证不安全,加密也不安全。认证的话,只需暴力40bits(虽然会有更多的bits),这是非常快的。加密好像说RC4和24bits的IV不合适,细节不清楚。反正不安全,用的人上,没有意义深入。而且说Open的反而更安全(wikipedia),就是因为能够通过认证帧来暴力破解密码,然后整个通信就不安全了,反而不认证的却没有这个问题。

最后再说一遍,WEP是错误的设计,WEP的用户密码是非常容易破解的,给了密码学界和搞无线重大的启发。因此也催生了安全的WPA。为了完整性,就先写出WEP的认证过程。有时间再写WPA的认证过程。或者直接看github上认证Python源码,步骤复杂多了。


有用链接

  1. 简单的WEP工具
  2. Understanding WEP Weaknesses

 

无线安全之被动攻击

危险程度:非常危险
实现难度:非常简单

诚哥经常在各种地方上无线网,有时候会遇到这样情况。系统告诉诚哥这个WiFi是不安全的。这到底是怎么回事,为什么是不安全的?
openwifi
诚哥打开WireShark,这可是专业抓包工具,不仅能抓有线网络的包,还能抓无线网络的包。特别是能够以监听模式运行。就是说,无线网卡可以不连接相应的WiFi而获取所有能被无线网卡接收到的数据帧。诚哥认为可以使用WireShark来看看无线网络中的流量。开始抓包,发现都是802.11,数据看不到。摸索后发现应该启用解密。Edit->Protocols->Enable decryption。
interface
配置好后,再次抓包。这下好东西出来了。HTTP包就能显示出来。但是不能证明对方连的是OPEN的WiFi,这个问题要靠Aircrack-ng来解决。由于电池没电了,Aircrack-ng 这么牛的工具一下子讲不完。看看截获包的效果。decrypt
获取这些包后,就要发掘有用信息。简单过滤下,http || tcp contains “baidu”,然后follow TCP Stream。诚哥看到令人兴奋的cookie,可以去看他百度网盘了。接下去就靠chromium来利用这些cookie了。诚哥使用EditThisCookie来修改自己的cookie。复制相应字段,保存刷新。就完成了一次侵略隐私。
cookie
attack
所以诚哥知道了为什么这些OPEN的网络是不安全的,因为这些网络完全没有加密,数据直接在空气中跑,就像桂言叶裸体勾引诚哥。CMCC什么的能不连就不连,连了的话,也应该使用VPN加密一下。在这些网络中上网,就相当于把钱扔在路边。攻击者来攻击你根本不犯法,这是被动攻击。

事已至此,诚哥又发现只要知道一个家庭无线网络的密码,同样可以实现这种神不知鬼不觉的攻击。根据HowToDecrypt802.11设置即可。