在 scapy 的帮助下提取 python 中的 802.11 数据帧

Extracting 802.11 data frames in python with the help of scapy

我正在尝试使用 Scapy 分析 .pcapng 文件。

我设置了无线通信的客户端和服务器。即客户端正在向服务器发送数据。我有一个单独的节点,我在其中使用 Wireshark(在监控模式下)捕获客户端和服务器之间的 802.11 流量帧。我得到运行wireshark生成的文件叫做short.pcapng

当我尝试使用 Scapy 分析此文件时,问题开始了。

我写的python代码如下:

import argparse
import os
from time import sleep
import sys
from scapy.utils import RawPcapReader
from scapy.layers.dot11 import *
from scapy.packet import Packet
from scapy.all import *

def process_pcap():
    print('Opening {}...'.format(FILE_NAME))
    for (pkt_data, pkt_metadata,) in RawPcapReader(FILE_NAME):
        dot11_packet = Dot11(pkt_data)
        print(dot11_packet.mysummary)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='PCAP reader')
    parser.add_argument('--pcap', metavar='<pcap file name>',
                        help='pcap file to parse', required=True)
    args = parser.parse_args()
    global FILE_NAME
    FILE_NAME = args.pcap
    if not os.path.isfile(FILE_NAME):
        print('"{}" does not exist'.format(FILE_NAME), file=sys.stderr)
        sys.exit(-1)

    process_pcap()
    sys.exit(0)

我是运行代码:

PS C:\Users\root\python> python thr.py --pcap short.pcapng

打印出的信息表明 short.pcapng 文件中存在的数据仅包含子类型关联请求的管理帧(而不是我预期的 802.11 数据帧和 802.11 控制帧)。

<bound method Dot11.mysummary of <Dot11  subtype=Association Request type=Management proto=0 FCfield= ID=6144 addr1=6f:00:00:00:cd:27 (RA=DA) addr2=96:03:00:00:00:00 (TA=SA) addr3=10:30:a4:15:40:01 (BSSID/STA) SC=218 |<Dot11AssoReq  cap=CFP+privacy+short-preamble+agility listen_interval=314 |<Dot11Elt  ID=220 len=166 info='22?\xfa\xdc\xa622@E\xb23\xdd\x90' |>>>>
<bound method Dot11.mysummary of <Dot11  subtype=Association Request type=Management proto=0 FCfield= ID=6144 addr1=6f:00:00:00:fc:27 (RA=DA) addr2=96:03:00:00:00:00 (TA=SA) addr3=10:30:a4:15:40:01 (BSSID/STA) SC=190 |<Dot11AssoReq  cap=CFP+PBCC+agility listen_interval=270 |<Dot11Elt  ID=220 len=166 info='22@E\x87\x92\xba0' |>>>>

然而,当我在 Wireshark 中查看 short.pcapng 文件时,它显示了预期的 802.11 数据帧:

这对我来说真的没有意义,因为 Wireshark 显示我有数据帧和控制帧(RTS、CTS),而 Scapy 似乎认为我只有关联请求帧(或管理帧)。更糟糕的是,在应用过滤器时,我无法在 Wireshark 中找到任何关联请求帧:

wlan.fc.type_subtype == 0x00

Wireshark 和 Scapy 读取的行数相同。从本质上讲,他们似乎在读取相同的数据,但解释不同。

任何有关正在发生的事情的帮助将不胜感激!

编辑:

@Carcigenicate 评论后,我将打印语句更改为:

    print(dot11_packet.mysummary())

这似乎仍会生成关联请求,只是格式略有不同:

802.11 Management Association Request a5:03:00:00:00:00 (TA=SA) > 6f:00:00:00:f4:75 (RA=DA)
802.11 Management Association Request a5:03:00:00:00:00 (TA=SA) > 6f:00:00:00:d3:76 (RA=DA)
802.11 Management Association Request a5:03:00:00:00:00 (TA=SA) > 6f:00:00:00:18:77 (RA=DA)
802.11 Management Association Request a5:03:00:00:00:00 (TA=SA) > 6f:00:00:00:46:77 (RA=DA)
802.11 Management Association Request a5:03:00:00:00:00 (TA=SA) > 6f:00:00:00:7c:77 (RA=DA)

这里的问题是您正在使用 RawPcapReader,只有当您完全确定自己在做什么时才应该使用它,而不是完全知道自己在做什么:-)

没有任何东西可以保证您正在嗅探的数据包是 Dot11。更有可能的是,第一层是RadioTap。 尝试

for dot11_packet in PcapReader(FILENAME):
    [...]