Accéder aux frameworks de gestion sans fil 802.11 à partir de Python

À partir de Python sous Linux, je voudrais détecter les frameworks de «sonde-requête» de gestion 802.11. Ceci est possible à partir de Scapy comme ça:

# -*- coding: utf-8 -*- from scapy.all import * def proc(p): if ( p.haslayer(Dot11ProbeReq) ): mac=re.sub(':','',p.addr2) ssid=p[Dot11Elt].info ssid=ssid.decode('utf-8','ignore') if ssid == "": ssid="" print "%s:%s" %(mac,ssid) sniff(iface="mon0",prn=proc) 

Ou de tshark comme ça:

 tshark -n -i mon0 subtype probereq -R 'wlan.fc.type_subtype eq 4' -T fields -e wlan.sa -e wlan_mgt.ssid 

Nous pourrions redirect la sortie de tshark, et la réduire avec du Python (pas joli, mais ça marche).

Cependant, ces deux options ont une licence GPL, ce qui rend les projets commerciaux potentiels difficiles. J’essaie donc de trouver une solution de niveau inférieur en Python pour ce problème spécifique. De Google, j’ai réussi à déterminer deux directions possibles pour essayer:

  1. Bibliothèques Pcap: Il semble y avoir trois bibliothèques pcap disponibles pour Python: pylibpcap , pypcap et pcapy . Je ne sais pas trop comment aborder l’incorporation des fonctionnalités ci-dessus. Tout exemple de code ou de solution serait génial.

  2. Sockets bruts: PF_PACKET: “Les sockets de paquets sont utilisés pour recevoir ou envoyer des paquets bruts au niveau du pilote de périphérique (couche OSI 2). Ils permettent à l’utilisateur d’implémenter des modules de protocole dans l’espace utilisateur.”

Cela semble être une autre option, en contournant complètement pcap. J’ai entendu des commentaires que cela pourrait même être une meilleure approche, en supprimant la surcharge des bibliothèques pcap. Je ne sais pas trop par où commencer.

Toute aide pour résoudre ce problème serait grandement appréciée.

J’ai réussi à résoudre ce problème. Voici le processus que j’ai suivi:

  1. Capturez des frameworks de ‘sonde-requête’ de gestion 802.11:

     tshark -n -i mon0 subtype probereq -c 5 -w probe.pcap 
  2. Comprendre RadioTap

    En lisant la documentation de RadioTap , j’ai réalisé que les images de RadioTap sont composées des champs suivants:

     it_version (2 bytes) - major version of the radiotap header is in use. Currently, this is always 0 it_pad (2 bytes) - currently unused it_len (4 bytes) - entire length of the radiotap data, including the radiotap header it_present (8 byte) - bitmask of the radiotap data fields that follows the radiotap header 

    Par conséquent, it_len nous permet de localiser le début de la trame 802.11 qui suit les données de radiotap.

  3. Solution de codage en Python

    J’ai choisi d’utiliser pylibpcap à partir de trois options de la bibliothèque pcap trouvées dans mon post précédent, et j’ai découvert le module dpkt pour l’parsing des frameworks 802.11. La documentation était très mince, donc en jouant dans l’interpréteur Python, j’ai réussi à calculer le code suivant pour extraire MAC, sonder le SSID et la force du signal de notre fichier de capture:

     f = open('probe.pcap') pc = dpkt.pcap.Reader(f) dl=pc.datalink() if pc.datalink() == 127: #Check if RadioTap for timestamp, rawdata in pc: tap = dpkt.radiotap.Radiotap(rawdata) signal_ssi=-(256-tap.ant_sig.db) #Calculate signal strength t_len=binascii.hexlify(rawdata[2:3]) #t_len field indicates the entire length of the radiotap data, including the radiotap header. t_len=int(t_len,16) #Convert to decimal wlan = dpkt.ieee80211.IEEE80211(rawdata[t_len:]) if wlan.type == 0 and wlan.subtype == 4: # Indicates a probe request ssid = wlan.ies[0].info mac=binascii.hexlify(wlan.mgmt.src) print "%s, %s (%d dBm)"%(mac,ssid,signal_ssi)