在 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):
[...]
我正在尝试使用 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):
[...]