Scapy:获取/设置数据包的频率或频道



我一直在尝试用Linux捕获WIFI数据包,并查看捕获数据包的频率/通道。我试过Wireshark,但没有运气,也没有帮助。虽然使用了Wireshark的样本数据包,但我可以看到频率/信道。

所以现在我在试验Scapy。我想弄清楚被嗅探的数据包的频率/信道,但仍然没有成功。有办法和Scapy一起做这件事吗。

p.S。如果有比Scapy或Python更好的工具,我很感激的评论

我发现RadioTab标头不是任何Dot11协议的一部分,而只是由网络接口添加的。我之所以从Wireshark.org而不是从我的实时Wireshark捕获中获得样本数据包的RadioTab标头,是因为有些网络适配器不添加RadioTap,而另一些则添加,而且我笔记本电脑的网络适配器也不添加RadioTab标头。我用一个新的外部WiFi适配器检查了一下,它确实添加了RadioTap标头。

如果适配器在捕获帧时不注入附加信息,则不会添加无线映射标头。

所以我的主要问题是,如何获取/设置数据包的频率。我本以为Scapy会有这个选择,但它没有,也不应该。原因是频率取决于网络适配器上设置的内容。所以我所做的是将我的WiFi适配器的频率/频道设置为不同的频率/通道。我的外部WiFi适配器可以在各种频道中工作,所以我更改了每个频道,并用RadioTap标头进行了确认。有一个简单的linux命令/工具可以帮助我检查WiFi接口支持的频道,并切换到特定的频道。

要以特定频率或通道捕获/发送数据包,您需要更改接口的工作通道,并将scapy中的嗅探器/发送器接口设置为该接口。

EDIT-我面临的其他问题和解决方案:

如果您在linux上,并且想要更改接口的工作通道,则需要禁用该接口的网络管理器并执行此操作第一将以下代码段添加到/etc/network/interfaces

auto $iface
iface $iface inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

$iface替换为您的接口名称。这将允许您自己控制界面。然后将以下行添加到/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
network={
ssid="Your_AP_SSID"
psk="Your_Passphrase"
freq_list=2412 2437 2462
}

请注意,2412 2437 2462是供您的接口选择的频率(在本例中为信道1、6、11(。您可以将它们编辑为所需的频率。来源但首先你必须检查你的接口是否支持这些频率。检查

iwlist channel

最后在一切都完成之后。

sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="wlp3s0")

这将以设置wlp3s0的频率向您发送数据包。

这个答案的范围是问题的标题和内容:为数据包的频率和通道提供getter和setter。

对于此解决方案,请使用Wireshark的Sample Captures中的wpa-Induction.cap文件。

四处闲逛

浏览一个数据包以查看Scapy在Scapy解释器中可以访问哪些字段是很有用的。

>>> pkts = rdpcap('wpa-Induction.pcap')
>>> pkts[0].summary()
"RadioTap / Dot11FCS / Dot11Beacon / Dot11Elt / Dot11EltRates / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11EltRSN / Dot11Elt / Dot11EltVendorSpecific / Dot11EltMicrosoftWPA / SSID=''"
>>> pkts[0].show()
###[ RadioTap dummy ]###
version= 0
pad= 0
len= 24
present= Flags+Rate+Channel+Lock_Quality+Antenna+dB_AntSignal+RXFlags
Flags= FCS
Rate= 2
Channel= 2412
ChannelFlags= CCK+2GHz
Antenna= 84
notdecoded= 'x00x00+x00x00x9faxc9\'
... <output truncated> ...

2412是一个频率,而不是一个通道,这是我们想要的数据。RadioTap是每个pkts[0].summary()的图层。整合起来,

>>> frequency = pkts[0][RadioTap].Channel
>>> print(frequency)
2412

Scapy不提供对信道的访问,但将频率转换为信道是微不足道的。

把它放在一起

获取频率

给定文件和数据包编号,我们现在可以获得数据包的频道和频率。

from scapy.all import RadioTap, rdpcap
def getChannel(frequency):
base = 2407              # 2.4Ghz
if frequency//1000 == 5: 
base = 5000          # 5Ghz
# 2.4 and 5Ghz channels increment by 5
return (frequency-base)//5
def getFrequency(file, packet_number):
pkts = rdpcap(file)
# Scapy mixes up Channel/Frequency here
frequency = pkts[packet_number][RadioTap].Channel
return frequency
freq = getFrequency('wpa-Induction.pcap', 0)
chan = getChannel(freq)
print("Channel: {0} nFrequency: {1}".format(freq, chan))

设置频率

假设我们想将频率更改为5300并保存它。这只需要迭代数据包列表,更改每个数据包的频率并保存结果。在scapy解释器中:

>>> for i in range(len(pkts)):
...     pkts[i][RadioTap].Channel = 5300
>>> wrpcap('temp.pcap', pkts)
>>> pkts2 = rdpcap('temp.pcap')
>>> pkts[0].Channel
5300

最新更新