web-dev-qa-db-ja.com

Scapy:パケットの周波数またはチャネルの取得/設定

LinuxでWIFIパケットをキャプチャして、パケットがキャプチャされた周波数/チャネルを確認しようとしています。 Wiresharkを試してみましたが、運も help もありませんでした。 Wiresharkの サンプルパケット を使用していますが、周波数/チャネルを確認できます。

だから今私はスケイピーで実験しています。スニッフィングされたパケットの周波数/チャネルを把握したかったのですが、まだ運がありません。 Scapyでこれを行う方法はありますか?.

追伸ScapyやPythonよりも優れたツールがある場合は、コメントをいただければ幸いです。

9
Baby desta

この回答は、質問のタイトルと内容を範囲としています。パケットの周波数とチャネルにゲッターとセッターを提供します。

このソリューションでは、Wiresharkの Sample Captures にある wpa-Induction.pcap ファイルを使用します。

突っつい

ScapyがScapyインタープリターでアクセスできるフィールドを確認するには、1つのパケットをざっと見回すと便利です。

_>>> 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 アクセスを提供しません チャンネルへのアクセスですが、周波数をチャンネルに変換するのは簡単です。

それを一緒に入れて

周波数を取得する

ファイルとパケット番号を指定すると、パケットのチャネルと周波数を取得できます。

_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
_
1
Ross Jacobs