Rake marche dans un champ propre ou comment collecter les adresses MAC des appareils Wi-Fi à proximité

Je commence tous mes discours publics (heureusement, il n'y en a pas beaucoup) en mentionnant explicitement ou implicitement la thèse «Notre industrie est complexe, les problèmes peuvent être révélés à n'importe quelle étape, même la plus évidente, et il est optimiste de supposer que tout sera simple et facile - naïf» . Curieusement, cette idée simple, obtenue par de nombreuses années de bourrage de cônes, est parfois une révélation pour des spécialistes plus expérimentés, même s'il semblerait que tout l'enthousiasme et la croyance frénétiques en l'infaillibilité de leurs propres idées et pratiques auraient dû être altérés pendant longtemps. Je vais vous raconter une histoire à ce sujet, un exemple d'un projet simple, à première vue.




Un beau jour, un ami m'a lancé un lien vers une startup intéressante . Les gars ont suggéré que les représentants des petites entreprises des secteurs des services et des ventes mettent en place un point d'accès (avec un portail captif) pour leurs clients afin de distribuer Internet, collectant simultanément les adresses MAC des smartphones des passants. Le but de cette action est très simple - un grand nombre de réseaux publicitaires vous permettent de cibler la liste des adresses d'appareils, donc, en dirigeant la société de publicité vers les utilisateurs de passage, nous sommes plus susceptibles de recevoir de nouveaux visiteurs (car elle est proche et "quelque part je l'ai déjà vue") . Ceux. une telle distribution de flyers virtuels. Un ami a demandé comment cela se faisait et si nous pouvions recommencer.

Une recherche rapide sur le sujet a révélé le mécanisme d'une telle collecte de données. L'adaptateur WiFi a été lancé en mode d'écoute aérienne et a parcouru les canaux, capturant les paquets, les analysant et agrégeant les données reçues. Il y avait aussi des utilitaires ouverts prêts à l'emploi pour cela, par exemple, airodump-ng de aircrack-ng . Ceux. pour la répétition, nous avons juste besoin d'exécuter cet utilitaire, de préférence sur un appareil compact et portable séparé, et de pousser les données reçues dans la base de données, à partir de laquelle nous obtenons ensuite des listes d'adresses MAC prêtes à l'emploi pour les réseaux publicitaires. Il semble que la tâche soit simple, résolue en un, au plus - deux soirées de travail tranquille, presque tout est prêt.

Bien sûr, cela n'a jamais été le cas.

Comme vous le savez, ce qui est permis à Jupiter ne l'est pas au taureau. Et lorsque l'on utilise un seul payeur, il faut tout d'abord sacrifier les ressources informatiques et la mémoire. De plus, le sacrifice des ressources est suivi du sacrifice de la commodité de développement et de débogage - tous les systèmes ne permettent pas de faire glisser les outils de compilation vers l'appareil.

Au départ, nous voulions prendre quelque chose de simple et pas cher, par exemple, des boîtes Orange Pi Zero, placez airodump-ng et transférez les données crachées par l'utilitaire vers le serveur, où elles peuvent être placées en toute sécurité dans la base de données. J'avais de l'expérience avec de tels systèmes distribués avec un centre dédié (même si, là-bas, les machines virtuelles agissaient comme des chevaux de bataille levés via l'API cloud via le même centre que nécessaire, mais pas le but), donc une partie du code a migré avec succès vers un nouveau projet .

L'outil de transfert des données vers le serveur était la simple application Erlang écrite, qui était censée extraire les données du registre éther (analyse), les sérialiser (sérialisation native d'Erlang) et les transférer via la socket Web vers le serveur via HTTPS (sans provoquer de soupçons). Systèmes DPI et ne pas inventer leurs propres protocoles). Les processeurs Allwinner H2 + utilisés dans l'Orange Pi sont suffisamment puissants pour être assemblés et débogués directement sur l'appareil. Encore une fois, en théorie, tout va bien.

La pratique a commencé.

1. comme il s'est avéré, le WiFi intégré dans Orange Pi était seulement bon pour ramasser un point d'accès et jeter des données dans le serveur. Eh bien, plus précisément, pas l'adaptateur lui-même, mais le support de son chipset dans le noyau. Pour la plupart des projets IoT, cela suffirait probablement. Cependant, nous étions prêts pour ce coup, car une étude préliminaire du site aircrack-ng a donné une idée très claire et ambiguë "cela ne fonctionnera pas partout, si ce n'est pas de notre faute, nous allons joindre une liste de chipsets testés". Presque tous les appareils Atheros (achetés par Qualcomm) et Ralink (achetés par MediaTek) ont été trouvés dans la liste, ce qui a inspiré certaines perspectives dans le cas d'une transition d'ARM chinois voraces vers des MIPS plus ascétiques à partir de chipsets pour routeurs.

Mais, alors que tout cela va de la morve et des bâtons, c'est-à-dire prototypé - vous devez résoudre le problème ici et maintenant. Par conséquent, nous avons profité de ces espèces exotiques à notre époque technologique (lorsque la communication sans fil est plus légère) en tant qu'adaptateur USB Wi-Fi. L'étude de la liste de compatibilité et la comparaison avec l'assortiment du magasin le plus proche a donné à la victime - le DLink DWA-160 dans la révision C1 (cela est important parce que d'autres révisions matérielles ont utilisé une puce différente et ont causé des maux de tête en termes d'application du travail). Double bande, qui ne nécessite pas de danser avec le pilote, car le support est depuis longtemps dans le noyau, ce sifflet est devenu utile plus tard dans d'autres projets, alors je les ai achetés, probablement tous (cinq pièces) qui étaient disponibles dans notre ville de province.



Après m'être assuré que l'appareil fonctionnait, je l'ai connecté à un appareil à carte unique et j'ai désactivé l'adaptateur WiFi intégré dans l'espoir que l'Internet serait disponible via l'interface Ethernet.



Le deuxième cochon a été pondu par aircrack-ng. Cet ensemble d'utilitaires a été créé dans le but de pirater.Contrôles de pénétration WiFi, c.-à-d. a été écrit par des pirates pour des pirates. Je ne sais pas, grâce à quelle logique ils ont préféré utiliser le dumper d'éther sans fil non sous la forme d'une approche unix traditionnelle, pour cracher du texte structuré pour un traitement ultérieur, mais pour créer une interface terminologique à part entière sur laquelle afficher des informations presque en temps réel (et en tenant compte des paramètres du terminal) par des réseaux et des appareils découverts, mais ils l'ont fait. Oui, j'ai trouvé l'API Python d'un degré de préparation inconnu pour tout cela, mais, encore une fois, l'araignée de prototypage qui vivait dans ma tête interdisait strictement de faire glisser une autre langue, de passer à une autre (nous nous souvenons, la partie serveur était déjà partiellement prête et écrite était loin de Python-e) ou, à Dieu ne plaise, implémentez airodump-ng vous-même sur la base de tcpdump. Et par conséquent,J'ai dû chercher des solutions de contournement.

Heureusement, les pirates sans fil ont commencé à soupçonner quelque chose qui se bloquait constamment dans l'interface était une telle activité, alors ils ont mis en œuvre le téléchargement périodique de tout ce qui a été trouvé et agrégé sous forme de fichiers CSV. Avec un intervalle défini. Vous pouvez déjà vivre avec. Bien sûr, l'option naïve - pour exécuter l'utilitaire et relire le fichier sur une minuterie - a été immédiatement donnée à la main. Travaillant sur un ordinateur portable, lors du transfert sur une seule carte, il a commencé à échouer dans le processus de lecture du fichier pour des raisons évidentes - parfois, l'utilitaire n'a tout simplement pas eu le temps de tout décharger et certaines des données ont été irrémédiablement perdues.

La solution à cela était le mécanisme inotify dans le noyau, notifiant les opérations sur les fichiers - dès que mon code a vu les modifications du fichier de données, il a commencé sa lecture avec un léger retard (plutôt, ayant une valeur purement psychologique, rassure son auteur). Les expériences ont montré que dans ce cas, les échecs de lecture et la perte de données ne se produisent pas. Eh bien, chouette, CSV parsim, mis en structures internes et envoyé au serveur. Nous l'enregistrons sur le serveur dans PostgreSQL (merci pour jsonb) et après cela il est déjà possible de faire des requêtes, de décharger des formulaires, etc. Nous ajouterons l'autorisation la plus simple à l'aide d'une clé symétrique, afin que nous ne nous y retrouvions pas et que nous puissions lier les données au point où l'appareil est installé, et tout semble aller bien, vous pouvez aller au combat.

Ouais, maintenant comment. L'assemblage de test de cette chaîne (et l'écriture de code et le débogage ont vraiment pris quelques soirées) a révélé un fait amusant - le nombre d'adresses capturées par jour dans notre bureau, assez éloigné des lieux praticables publics, a fluctué autour de quelques milliers de pièces. Oui, bien sûr, il y avait un petit hôtel à proximité (c'était en période d'isolement pré-quarantaine, ne soyez pas surpris), mais quand même, il y en a beaucoup.

Rafraîchissant la connaissance de la structure de l'adresse MAC et rappelant le fait que les appareils mobiles génèrent souvent des adresses locales pour cacher leurs vraies adresses MAC, j'ai modifié la partie serveur avec un simple filtre qui nettoie toutes les adresses locales et de diffusion en entrée. La liste a été réduite d'un ordre de grandeur et ressemblait déjà à la vérité. Tout était prêt pour les essais sur le terrain.

Comme vous le savez, lors du changement de lieu d'un bureau chaleureux et confortable à des conditions de combat impitoyables, les prototypes ont tendance à cesser de fonctionner normalement, de sorte que le processus de mise en œuvre doit être accompagné de la disponibilité d'un ingénieur de poche qui corrigera tous les problèmes émergents. D'autre part, il est également bien connu qu'un appareil qui ne nécessite pas de danse supplémentaire avec un tambourin au début de l'opération est susceptible de tomber en panne rapidement et irrévocablement. Cela, bien sûr, se reflétait dans les lois de Murphy, mais, hélas, l’auteur de ces lignes est trop paresseux pour vérifier laquelle, par conséquent, nous nous mettrons d’accord sur le terme «loi de la méchanceté».

La première installation a immédiatement révélé un tas de défauts.

Premièrement, la plupart des cartes de prototypage chinois sont livrées avec une mémoire microSD à long terme par opposition aux puces flash NAND / NOR. Une exception n'est faite que pour les SoC puissants, clairement redondants pour cette tâche. Hélas, MicroSD est le casse-tête immédiat de l'opérateur - oxydation des électrodes, défaillance des cartes SD, dépendance des contacts à la température à l'intérieur du boîtier (ce qui est considérable, les puces chinoises ne sont pas très éconergétiques et les cartes sont souvent calculées complètement sur la base de pic de consommation d'énergie, donc sans radiateur supplémentaire, eh bien, pas du tout). Il s'est donc avéré que lorsque l'alimentation a été coupée de l'appareil, le système est devenu inutilisable - les fichiers avec le bytecode ERTS ont été endommagés, après le redémarrage, l'application a refusé de fonctionner.

Le deuxième moment désagréable - au point d'installation, Internet était fourni par un routeur LTE et était, pour le moins, de qualité médiocre, contrairement à un fil de bureau. Le réseau a constamment déclenché, l'application s'est souvent reconnectée ou est même morte à cause des messages accumulés dans les files d'attente.

Bien sûr, les deux problèmes sont surmontables, par exemple, la perte de données serait éliminée en recherchant la combinaison optimale d'une bonne carte MicroSD et des paramètres du système de fichiers, et l'instabilité de la connexion pourrait être compensée par une agrégation préliminaire des données, de courtes sessions d'envoi, déchargées à temps, etc. Mais les problèmes qui ont été révélés sont l'occasion de se demander si la bonne voie a été choisie. La nécessité d'une connexion permanente au serveur a mis fin à la collecte de données d'événements, lorsque l'appareil est suspendu à une batterie externe et jeté dans un sac à dos, dont le propriétaire se rend à un événement de masse, où, bien sûr, vous ne pouvez pas vous attendre à la stabilité de la connexion.

En conséquence, l'étape suivante consistait à abandonner la partie serveur et à localiser l'entrepôt de données directement sur l'appareil. De plus, afin d'éviter des expériences longues et très mornes avec les cartes SD, il a été décidé d'utiliser des modèles de maquette avec des puces flash lors de la prochaine itération.

À ce moment-là, je me suis souvenu que dans ma collection il y avait une merveilleuse planche Carambola 2 des camarades lituaniens 8Devices . Et si vous allez sur leur site, vous pouvez trouver un appareil encore plus compact sur la même puce appelé Centipede. Des expériences précédentes avec cette classe d'appareils ont montré qu'Erlang s'intègre complètement dans les 16 Mo de mémoire flash alloués (et qu'il reste un peu pour l'application). Le seul inconvénient (ce qui est plutôt un avantage) est la faible puissance MIPS et la nécessité d'une compilation croisée, ce qui rend la construction d'une application Erlang un peu plus simple. Mais c'était déjà une route bien connue, j'ai donc commandé quelques Centipede, et jusqu'à présent, j'ai porté la version existante qui fonctionne avec le serveur vers Carambol.



Lorsque les composants sont arrivés, une nouvelle phase a commencé. La puce AR9331 a été prise en charge avec succès par aircrack-ng hors de la boîte, les données peuvent être prises à partir de l'interface Ethernet, les dernières versions d'OpenWRT et ERTS ont été collectées et testées avec succès. L'application a été réécrite - une partie du code a été déplacée vers le code de l'appareil, les données ont été accumulées dans un processus distinct et périodiquement transférées dans un fichier sous la forme d'un terme Erlang sérialisé. À cela a été tirée l'interface Web la plus simple qui reçoit des données via websocket. Les ports pour inotify et erlexec sont compilés en toute sécurité avec OpenWRT.

Une seule chose confuse - 300 kilo-octets restaient sur les données. Ce n'est pas si petit si vous ne stockez que les adresses MAC des appareils clients, mais airodump-ng vous donne des informations beaucoup plus intéressantes, y compris les adresses des points d'accès, leurs ESSID et ainsi de suite, ce qui serait également agréable à retenir. Au cas où. D'accord, nous agirons en fonction des circonstances.

Nous collectons, vérifions. Un problème est révélé à la volée.

Openwrt, comme nous le savons tous, il s'agit d'une version Linux minimaliste conçue spécifiquement pour les appareils avec une mémoire limitée. En conséquence, il a jeté à partir de là qu'il était possible de jeter sans douleur et a simplifié ce qui pourrait être simplifié, y compris le mode multijoueur. Ceux. C'est une pratique courante lorsque le code démarre à partir de la racine et fonctionne avec des privilèges maximaux, ce qui, bien sûr, facilite les problèmes liés aux groupes, aux utilisateurs et au contrôle de leurs actions. Oui, oui, la lettre S dans l'abréviation IoT est responsable de la sécurité. Le problème est que erlexec, que j'avais l'habitude d'exécuter et de gérer airodump-ng, ne peut pas effectuer d'opérations sous la racine - pour cela, il a besoin d'un utilisateur supplémentaire, au nom duquel il générera les processus qui lui sont assignés. Et lorsque vous créez un utilisateur supplémentaire avec un niveau de privilège différent ... correctement, cela empêche l'airodump d'atteindre le périphérique réseau. Dévisser cette restriction de la bibliothèque semblait être un processus lent, donc erlexec a été remplacé par des ports - le mécanisme intégré pour lancer des processus tiers dans Erlang. Une bagatelle, mais désagréable.

Ainsi, les appareils sont reçus, reflashés et fonctionnent même en serre. Nous attrapons la batterie, jetons la boîte dans le sac à dos, allons au centre commercial. Le lendemain, nous regardons le résultat - un fiasco, un fichier de données de longueur nulle - soit il n'y avait pas assez d'espace, soit une distorsion de la puissance n'a pas fonctionné à un très bon moment. Nous corrigeons le code afin que l'enregistrement se déroule en deux étapes - un fichier temporaire a d'abord été créé, puis il a remplacé le fichier actuel.

Cependant, les mains n'ont pas pu vérifier l'opérabilité de cette option - le prochain jouet - Onion Omega2 + sur le Mediatek 7688 est apparu. Comme leurs frères, le concepteur LinkIt Smart 7688 , il y avait beaucoup, mais la chose la plus importante est deux fois plus de mémoire flash, ce qui signifie que vous ne pouvez plus vous soucier du manque d'espace pour le stockage des données. d'accord

Nous commandons, attendez. Mois. Deux. La patience éclate - nous écrivons aux Américains sur le sujet «où sont les marchandises, Zin». Silence. Ouvrez un litige sur PayPal. Les Américains se réveillent. Ils disent: "Oh, notre système d'acceptation des commandes a échoué, maintenant nous allons tout envoyer." Ils envoient, nous attendons trois semaines. Fuh, l'appareil est à portée de main et fonctionne même.



Ici, nous devons faire une petite digression - malgré le fait que j'avais plusieurs cartes LinkIt Smart à distance de marche, je ne les considérais pas comme une plate-forme, car au tout début de la saga, une tentative de les utiliser comme périphériques de capture a échoué. Ensuite, les pilotes de la puce ont été fournis sous forme de modules assemblés pour des versions spécifiques du noyau et, apparemment, cela est devenu la cause de l'inopérabilité. Dans les dernières versions d'OpenWRT, la prise en charge native du 7688 et un pilote ouvert sont apparus, c'est donc l'occasion de reconsidérer l'approche de ces périphériques.

Cependant, il était habituel d'utiliser le WiFi directement sur la puce pour son usage prévu - après tout, l'appareil a besoin d'au moins une interface de contrôle, et également sur le terrain, au moins afin de comprendre s'il fonctionne ou non. Il serait également utile d'examiner les données obtenues.

En conséquence, nous combinons les approches précédentes - nous utilisons la seule interface USB affichée sur le MiniDoc pour un sifflet WiFi pour scanner l'espace, et le WiFi intégré - pour contrôler l'appareil en tant que point d'accès à faible consommation. Nous collectons, vérifions, tout fonctionne.

Mais l'appétit vient avec manger. Pour commencer, le fichier de données sous forme de sérialisation Erlang est le lot de vrais maniaques, et un éventail légèrement plus large de professionnels spécialement formés a besoin de quelque chose de plus simple. Encore une fois, en plus d'ajouter des données à partir du déchargement aérien, je voudrais également le temps de mesure exact et, de préférence, au moins une sorte de référence à l'emplacement de l'appareil dans l'espace.

Nous intégrons entre un sifflet WiFi et un concentrateur USB. Les paramètres (et ils dépendent de la position de l'appareil sur le bus dans le cas d'OpenWRT) sont boisés, mais ce sont des bagatelles mineures. Correct. Nous sortons le récepteur USB-GPS des décombres, heureusement, déjà testé dans le temps et avec le code écritAnalyse NMEA-0183 (le code, bien sûr, a dû être corrigé de toute façon). Nous vérifions - l'appareil n'est pas détecté en toute sécurité par le système, il y a clairement un manque de pilotes. Nous collectons les pilotes USB Serial et les déposons sur l'appareil - également en silence. Ensuite, nous rappelons que dans les grands systèmes, le sifflet GPS a été détecté non pas comme ttyUSBx, mais comme ttyACMx, c'est-à-dire Modem GSM USB. Eh bien, très bien, le deuxième appel à ajouter des pilotes, le succès.

Nous prenons le code, intégrons dans l'application. Ajoutez sqlite3 à l'application en tant que stockage. Maintenant, il ne sera pas nécessaire de vérifier la disponibilité de l'enregistrement dans l'état, et en général le travail avec les données est simplifié à un petit nombre de lignes. En mettant tout cela ensemble, nous enseignons lors de l'ajout de données pour prendre des lectures GPS, nous corrigeons le code JS sur le visage pour l'afficher en cas de jeu de données incomplet (cela peut se produire lorsque le GPS n'a pas encore capté de satellites et que les données de balayage aérien vont déjà). Nous vérifions le travail - il semble vivre. Vous pouvez déclarer une victoire intérimaire.



Pendant quelques semaines de travail ininterrompu - beaucoup de données à la fois sur les stations en direct et sur les clients. Maintenant, je lutte contre la tentation d'offrir cet appareil aux spécialistes de la sécurité de l'information pour contrôler la diffusion dans les territoires confiés et à l'État pour contrôler la circulation des téléphones des citoyens. C’est une blague, bien sûr, eux-mêmes savent déjà tout.

Ainsi, toutes les épreuves décrites ci-dessus ne sont qu'un projet familier avec une très faible complexité (il était presque immédiatement clair quoi faire et comment), le manque de développement matériel (bonjour, physique) et l'accès à un produit un peu plus ou moins complet. Non, bien sûr, il ne peut pas être exclu que l'auteur de ces lignes soit un amateur dense, et de vrais gourous vont de cette façon en une soirée entre le thé du soir et un verre de cognac, mais jusqu'à présent l'expérience n'a montré qu'une chose: l'informatique est compliquée et l'optimisme est puni financièrement et de réputation et motivationnellement, et ceux qui disent «tout est simple» sont des génies ou des escrocs, et le second est plus probable.

All Articles