web-dev-qa-db-fra.com

Scapy: obtenir / définir la fréquence ou le canal d'un paquet

J'ai essayé de capturer des paquets WIFI avec Linux et de voir la fréquence/le canal auquel le paquet a été capturé. J'ai essayé Wireshark et il n'y avait pas de chance et non aide . Bien que j'utilise un échantillons de paquets de Wireshark, je peux voir la fréquence/le canal.

Alors maintenant, j'expérimente avec Scapy. Je voulais comprendre la fréquence/le canal d'un paquet reniflé, mais toujours pas de chance. Y a-t-il un moyen de faire cela avec Scapy.

P.S. S'il existe un meilleur outil que Scapy, ou Python, j'apprécie les commentaires

9
Baby desta

Cette réponse concerne le titre et le contenu de la question: Fournir des getters et des setters pour la fréquence et le canal d'un paquet.

Pour cette solution, utilisez le fichier wpa-Induction.pcap dans Sample Captures de Wireshark.

Fouiner

Il est utile de fouiller dans un paquet pour voir à quels champs Scapy a accès dans l'interpréteur 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> ...

Alors que 2412 est une fréquence et PAS un canal , ce sont les données que nous voulons. RadioTap est la couche par pkts[0].summary(). Mettre ensemble,

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

Scapy ne fournit pas d'accès au canal, mais il est trivial de convertir la fréquence en canal.

Mettre ensemble

Obtenir la fréquence

Étant donné un fichier et un numéro de paquet, nous pouvons maintenant obtenir le canal et la fréquence d'un paquet.

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

Réglage de la fréquence

Disons que nous voulions changer la fréquence à 5300 et la sauvegarder. Cela nécessiterait seulement une itération sur la liste des paquets, changer la fréquence pour chaque paquet et enregistrer le résultat. Dans l'interpréteur 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