Scapy: Frequenz oder Kanal eines Pakets abrufen / einstellen

8

Ich habe versucht, WIFI-Pakete unter Linux zu erfassen und die Frequenz / den Kanal zu ermitteln, mit dem / dem das Paket erfasst wurde. Ich habe es mit Wireshark versucht und es gab kein Glück und keine Hilfe . Obwohl ich ein Beispielpaket von Wireshark verwende, kann ich die Frequenz / den Kanal sehen.

Jetzt experimentiere ich mit Scapy. Ich wollte die Frequenz / den Kanal eines beschnüffelten Pakets herausfinden, hatte aber immer noch kein Glück. Gibt es eine Möglichkeit, dies mit Scapy zu tun?

PS Wenn es ein besseres Tool als Scapy oder Python gibt, freue ich mich über Kommentare

Baby desta
quelle
Eine gültige Antwort wäre eine, die eine detaillierte Antwort darauf gibt, wie ein Paket mit einer bestimmten Frequenz / einem bestimmten Kanal gesendet werden soll
Baby desta
2
Je nachdem, was Sie am Ende tun möchten, würde ich bettercap.org
Fabian N.
@ FabianN., Danke. Ich schaue gerade hinein.
Baby desta

Antworten:

5

Ich fand heraus, dass RadioTab-Header nicht Teil eines Dot11-Protokolls sind, sondern lediglich von der Netzwerkschnittstelle hinzugefügt werden. Der Grund, warum ich die RadioTab-Header für Beispielpakete von Wireshark.org und nicht von meiner Live-Wireshark-Erfassung erhalten habe, ist, dass einige Netzwerkadapter kein RadioTap hinzufügen, während andere dies tun, und der Netzwerkadapter meines Laptops keine RadioTab-Header hinzufügt. Ich habe dies mit einem neuen externen WLAN-Adapter überprüft und die RadioTap-Header hinzugefügt.

Wenn der Adapter die zusätzlichen Informationen beim Erfassen von Frames nicht einfügt, werden keine Radiotap-Header hinzugefügt.

Also zu meiner Hauptfrage, wie man die Frequenz eines Pakets erhält / einstellt. Ich habe erwartet, dass Scapy diese Option hat, aber das tut es nicht und sollte es auch nicht. Der Grund dafür ist, dass die Frequenz davon abhängt, was am Netzwerkadapter eingestellt ist. Also habe ich die Frequenz / den Kanal meines WiFi-Adapters auf einen anderen eingestellt. Mein externer WiFi-Adapter kann in verschiedenen Kanälen arbeiten, daher habe ich jeden geändert und mit dem RadioTap-Header bestätigt. Es gibt einfache Linux-Befehle / -Tools , mit denen ich die unterstützten Kanäle meiner WiFi-Schnittstelle überprüfen und zu einem bestimmten Kanal wechseln konnte.

Um Pakete mit einer bestimmten Frequenz oder einem bestimmten Kanal zu erfassen / zu senden, müssen Sie den Arbeitskanal Ihrer Schnittstelle ändern und die Sniffer / Sender-Schnittstelle in scapy auf diese Schnittstelle einstellen.

EDIT - Andere Probleme und Lösungen:

Wenn Sie unter Linux arbeiten und den Arbeitskanal Ihrer Schnittstelle ändern möchten, müssen Sie den Netzwerkmanager für diese Schnittstelle deaktivieren und dies tun. Fügen Sie zunächst das folgende Snippet hinzu /etc/network/interfaces

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

Ersetzen Sie $ifacedurch Ihren Schnittstellennamen. Auf diese Weise können Sie die Schnittstelle selbst steuern. Fügen Sie dann die folgenden Zeilen hinzu/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
}

Beachten Sie, dass 2412 2437 2462die Frequenzen (in diesem Fall Kanal 1, 6, 11) für Ihre Schnittstelle zur Auswahl stehen. Sie können sie auf die gewünschte Frequenz bearbeiten. Quelle . Aber zuerst müssen Sie überprüfen, ob Ihre Schnittstelle diese Frequenzen unterstützt. Um das zu überprüfen

iwlist channel

Endlich, nachdem alles erledigt ist.

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

Dadurch erhalten Sie Pakete mit der eingestellten Frequenz wlp3s0.

Baby desta
quelle
Möchten Sie dieser Antwort Code hinzufügen?
Ross Jacobs
@ RossJacobs, Sie verwenden nur die übliche Sendemethode für Scapy, nichts Neues. außer Sie ändern Ihre Schnittstelle. Ein Beispiel wäre, dass sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")Sie Ihre Schnittstelle auf eine bestimmte Frequenz einstellen können, die Sie möchten, wenn sie dies unterstützt.
Baby desta
1

Diese Antwort bezieht sich auf den Titel und den Inhalt der Frage: Bereitstellung von Gettern und Setzern für Frequenz und Kanal eines Pakets.

Verwenden Sie für diese Lösung die Datei wpa-Induction.pcap in Wiresharks Sample Captures .

Stochern

Es ist nützlich, ein Paket zu durchsuchen, um zu sehen, auf welche Felder Scapy im Scapy-Interpreter Zugriff hat.

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

Während 2412 eine Frequenz und KEIN Kanal ist , sind dies die Daten, die wir wollen. RadioTap ist die Ebene pro pkts[0].summary(). Etwas zusammensetzen,

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

Scapy bietet keinen Zugriff auf den Kanal, aber es ist trivial, die Frequenz in einen Kanal umzuwandeln.

Etwas zusammensetzen

Die Frequenz ermitteln

Bei gegebener Datei- und Paketnummer können wir jetzt den Kanal und die Frequenz für ein Paket ermitteln.

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

Einstellen der Frequenz

Angenommen, wir wollten die Frequenz auf 5300 ändern und speichern. Dies würde nur das Durchlaufen der Paketliste, das Ändern der Häufigkeit für jedes Paket und das Speichern des Ergebnisses erfordern. Im Scapy-Dolmetscher:

>>> for i in range(len(pkts)):
...     pkts[i][RadioTap].Channel = 5300
>>> wrpcap('temp.pcap', pkts)
>>> pkts2 = rdpcap('temp.pcap')
>>> pkts[0].Channel
5300
Ross Jacobs
quelle
@Babydesta Ich habe die Frage gelesen und diese Antwort darauf gefunden. Vielleicht möchten Sie einen Kollegen bitten, eine zweite Meinung dazu einzuholen, wie Ihre Frage / Ihr Titel lautet. Sie können die Frage nach dem Format um Reask wollen , wie man fragen , mit einem Schwerpunkt auf der zweiten Position. Wenn Sie der Meinung sind, dass dies die von Ihnen gestellte Frage beantwortet , markieren Sie diese bitte als solche.
Ross Jacobs