Scapy: получить / установить частоту или канал пакета - PullRequest
8 голосов
/ 01 марта 2020

Я пытался перехватить пакеты WIFI с Linux и посмотреть частоту / канал, на котором был перехвачен пакет. Я попробовал Wireshark, и не было удачи и никакой помощи 1002 *. Хотя, используя примеры пакетов от Wireshark, я могу видеть частоту / канал.

Так что теперь я экспериментирую со Scapy. Я хотел выяснить частоту / канал прослушиваемого пакета, но все же не повезло. Есть ли способ сделать это с помощью Scapy.

PS Если есть инструмент лучше, чем Scapy, или Python, я ценю комментарии

Ответы [ 2 ]

4 голосов
/ 10 марта 2020

I обнаружил , что заголовки RadioTab не являются частью какого-либо протокола Dot11, а просто добавляются сетевым интерфейсом. И причина, по которой я получил заголовки RadioTab для примеров пакетов от Wireshark.org , а не от моего живого захвата wireshark, заключается в том, что некоторые сетевые адаптеры не добавляют RadioTap, в то время как другие делают, а сетевой адаптер моего ноутбука не добавляет RadioTab заголовки. Я проверил это с помощью нового внешнего адаптера WiFi, и он добавил заголовки RadioTap.

Если адаптер не вводит дополнительную информацию, поскольку он захватывает кадры, то заголовки радиоленты не будут добавлены.

Итак, на мой главный вопрос, как получить / установить частоту пакета. Я ожидал, что у Scapy будет эта опция, но ее нет и не должно быть. Причина в том, что частота зависит от того, что установлено на сетевом адаптере. Поэтому я настроил другую частоту / канал моего адаптера WiFi. Мой внешний WiFi-адаптер может работать на разных каналах, поэтому я изменил каждый и подтвердил заголовок RadioTap. Есть простые linux команды / инструменты , которые помогли мне проверить поддерживаемые каналы моего интерфейса WiFi и переключиться на определенный канал.

Для захвата / отправки пакетов на определенной частоты или канала, вам нужно изменить рабочий канал вашего интерфейса и настроить интерфейс анализатора / отправителя в scapy на этот интерфейс.

РЕДАКТИРОВАТЬ - другие проблемы, с которыми я столкнулся и решения:

Если вы используете 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.

1 голос
/ 05 марта 2020

Этот ответ распространяется на заголовок и содержание вопроса: предоставление геттеров и сеттеров для частоты и канала пакета.

Для этого решения используйте файл wpa-Induction.pcap в Sample Captures от Wireshark .

Обыскивать

Полезно просмотреть один пакет, чтобы увидеть, к каким полям у 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 не предоставляет доступ к каналу, но преобразовать частоту в канал тривиально.

Соединение это

Получение частоты

Учитывая номер файла и пакета, теперь мы можем получить канал и частоту для пакета.

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
...