Scapy:获取/设置数据包的频率或通道
Posted
技术标签:
【中文标题】Scapy:获取/设置数据包的频率或通道【英文标题】:Scapy: get/set frequency or channel of a packet 【发布时间】:2020-06-13 20:02:19 【问题描述】:我一直在尝试使用 Linux 捕获 WIFI 数据包,并查看捕获数据包的频率/信道。我尝试了 Wireshark,但没有运气,也没有 help。虽然使用 Wireshark 的sample packets,但我可以看到频率/频道。
所以现在我正在尝试使用 Scapy。我想弄清楚嗅探数据包的频率/频道,但仍然没有运气。有没有办法用 Scapy 做到这一点。
附: 如果有比 Scapy 或 Python 更好的工具,我感谢 cmets
【问题讨论】:
一个有效的答案是给出关于如何在某个频率/频道发送数据包的详细答案 看你到底想做什么我会推荐bettercap.org @F***N.,谢谢。现在正在调查。 【参考方案1】:我found out 认为 RadioTab 标头不是任何 Dot11 协议的一部分,而只是由网络接口添加的。我从Wireshark.org 而不是从我的实时wireshark 捕获中获得样本数据包上的RadioTab 标头的原因是因为一些网络适配器没有添加RadioTap,而其他一些网络适配器没有添加RadioTab 标头。我用一个新的外部 WiFi 适配器检查了这个,它确实添加了 RadioTap 标头。
如果适配器在捕获帧时未注入额外信息,则不会添加 radiotap 标头。
所以对于我的主要问题,如何获取/设置数据包的频率。 我希望 Scapy 有这个选项,但它没有,也不应该。原因是频率取决于网络适配器上的设置。所以我所做的就是将我的 WiFi 适配器的频率/频道设置为不同的。我的外部 WiFi 适配器可以在各种通道中工作,因此我更改了每个通道并使用 RadioTap 标头进行确认。有一个简单的linux commands/tools 可以帮助我检查我的 WiFi 接口支持的频道,并切换到特定频道。
要以特定频率或通道捕获/发送数据包,您需要更改接口的工作通道并将 scapy 中的嗅探器/发送器接口设置为该接口。
编辑 - 我遇到的其他问题和解决方案:
如果您使用的是 linux,并且想要更改接口的工作通道,则需要禁用该接口的网络管理器并执行此操作
第一的
将以下sn-p添加到/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)。您可以将它们编辑为所需的频率。 Source。但首先你必须检查你的接口是否支持这些频率。检查
iwlist channel
最后一切都完成了。
sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="wlp3s0")
这将以wlp3s0
设置的频率向您发送数据包。
【讨论】:
@RossJacobs,你只是在 scapy 上使用普通的发送方法,没什么新意。除了你改变你的界面。一个例子是sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
,你可以将你的界面设置为你喜欢的某个频率,如果它支持的话。【参考方案2】:
此答案仅限于问题的标题和内容:为数据包的频率和通道提供 getter 和 setter。
对于此解决方案,请使用 Wireshark 的 Sample Captures 中的 wpa-Induction.pcap 文件。
四处逛逛
查看一个数据包以查看 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= '\x00\x00+\x00\x00\x9fa\xc9\\'
... <output truncated> ...
虽然 2412 是一个频率并且不是一个频道,但这是我们想要的数据。 RadioTap 是每个pkts[0].summary()
的层。放在一起,
>>> frequency = pkts[0][RadioTap].Channel
>>> print(frequency)
2412
Scapy does not provide access 到频道,但是将频率转换为频道是微不足道的。
把它放在一起
获取频率
给定一个文件和数据包编号,我们现在可以得到一个数据包的频道和频率。
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
【讨论】:
@Babydesta 我确实阅读了这个问题并将这个答案限定在它的范围内。您可能想请一位同事就您的问题/标题的阅读方式获得第二意见。您可能想按照how to ask 中的格式重新提出问题,重点放在第二个标题上。如果您认为这回答了您提出的问题,请将其标记为这样。以上是关于Scapy:获取/设置数据包的频率或通道的主要内容,如果未能解决你的问题,请参考以下文章