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:获取/设置数据包的频率或通道的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scapy 生成数据包的 PDF 时如何抑制 PyX 警告消息?

Scapy SYN 在我们自己的 IP 地址上发送

Scapy 从入门到放弃

如何从 pcap 文件中提取所有数据包的 TCP 标头?

Python 发包收包利器 - scapy

python解析pcap文件中的http数据包