Analyse des paquets WiFi (libpcap)

j'ai travaillé sur un moyen D'avoir un routeur OpenWRT log des requêtes WiFi probe à une base de données MySQL (il stocke l'adresse MAC et les informations RSSI pour chaque paquet de requête probe ainsi que d'autres données spécifiques au routeur).

après quelques recherches sur libpcap, j'ai pu assembler un petit programme de base qui renifle simplement les paquets sur une interface de moniteur (mon0) en utilisant une expression de filtre ('wlan subtype probe-req') et imprime ensuite les paquets bruts dans hex. Avec les informations disponible en ligne sur libpcap cette partie était assez simple.

maintenant voici où je suis coincé: Comment puis-je analyser le paquet WiFi pour récupérer l'information que je cherche (adresse RSSI et MAC source)?

pour être clair, Je ne demande pas le code pour le faire (bien que je ne me plaindrai pas si vous souhaitez en fournir quelques-uns :D). Je suis juste à la recherche d'une sorte de guide pour comprendre quel byte est qui - une carte routière de paquet WiFi, si vous voulez.

Il y a quelques bons tutoriels là-bas pour analyser les paquets qui viennent sur ethernet, mais je n'ai pas été en mesure de trouver quoi que ce soit pour aider à analyser les en-têtes spcifiquement liés à WiFi. Je suppose que ce sera un processus assez simple - juste saisir les octets pertinents pour RSSI et Mac source - mais encore une fois, je n'ai pas été en mesure de trouver la documentation sur laquelle byte est qui.

je sais que cela a déjà été fait mais je vais être honnête: je suis complètement perdu en regardant à travers le code source pour tcpdump.

alors, est-ce que quelqu'un connaît une bonne ressource pour analyser les paquets WiFi?

Cheers

EDIT: Plus de Réponse Spécifique

RSSI se trouve dans L'en-tête RadioTap (Eh bien, sur Linux c'est le cas). Extraire le RSSI du paquet est assez simple en utilisant radiotap-analyseur.c ainsi que les fichiers dont il dépend (trouvés dans le même répertoire que le fichier auquel j'ai fait référence). si quelqu'un a des problèmes avec en utilisant le radiotap-parser.c fonctions n'hésitez pas à prendre contact.

extraire L'adresse MAC source est rendu assez facile par les fonctions radiotap car la structure d'en-tête radiotap contient la longueur de l'en-tête radiotap (it_len), qui est variable. Puisque je n'analyse que les requêtes de sonde, qui ont une longueur fixe (voir page 17 ici) c'est juste une question de faire un pointeur qui pointe vers packet + it_len + 10 (l'adresse MAC source commence 10 octets après le début du cadre MAC, qui commence là où l'en-tête radiotap se termine). Les 6 octets qui commencent à ce pointeur sont <!-Dans le cadre 802.11 (encore une fois, voir page 17 ici).

14
demandé sur Mark Lakata 2013-05-29 00:50:00

4 réponses

une recherche sur Google pour "802.11 frame format" fournit quelques liens prometteurs je crois. Voici un aperçu de haut niveau qui définit le paquet: http://www.technologyuk.net/telecommunications/networks/wireless_networks.shtml.

2
répondu Mike Pelley 2013-05-29 04:55:13

si vous utilisez pylibpcap, alors vous pouvez saisir le RSSI de cette façon. C'est grossier et fait des hypothèses sur les drapeaux dans le cadre 802.11 (ie les drapeaux doivent être 0x0000482F), mais cela a fonctionné pour moi. C'est un hack python et je ne voulais pas passer par la route de l'installation de modules supplémentaires (dpkt et scapy ont des fonctionnalités pour faire cela, mais pas bien documentée) quand le hack est juste un appel à struct.unpack.

(len,data,timestamp) = p.get_next()

if data[0:8] =='\x00\x00\x22\x00\x2F\x48\x00\x00' and len(data) >= 50:
  type_subtype = ord(data[34])
  dest_mac     = data[38:38+6]
  src_mac      = data[44:44+6]
  rssi,        = struct.unpack("b",data[22])

si vos drapeaux ne sont pas comme ci-dessus, alors regardez radiotap-parser.c dans le Question de L'OP, et trouver comment calculer le décalage par rapport au champ RSSI (22 dans cet exemple). Chaque bit de drapeau modifie l'offset de 1,2,4 ou 8 octets.

2
répondu Mark Lakata 2014-01-30 00:03:09

je sais que ce post est vieux, mais je suis tombé sur elle en essayant de faire wifi parsing sans chance donc je l'espère que je pourrais être en mesure d'aider quelqu'un d'autre!

il y a une bibliothèque relativement nouvelle mais elle est étonnante pour tous les niveaux de la pile. Il s'appelle libTins et analyse les paquets à chaque couche de la pile pour vous. Son BSD autorisé (à partir de 2015) et est très facile à faire renifler. Son construit sur le dessus de lib pcap mais acceptera des tableaux d'octets si vous voulez faire le reniflement vous-même.

1
répondu nbroeking 2016-02-04 02:23:19

vous pouvez utiliser le module tshark où vous pouvez récupérer des champs spécifiques.

-1
répondu user2884960 2013-10-16 04:37:38