Gehen Sie auf einem sauberen Feld spazieren oder sammeln Sie MAC-Adressen von Wi-Fi-Geräten in der Nähe

Ich beginne alle meine öffentlichen Reden (zum Glück gibt es nicht so viele) mit der expliziten oder impliziten Erwähnung der These: „Unsere Branche ist komplex, Probleme können bei jedem, selbst dem offensichtlichsten Schritt aufgedeckt werden, und es ist optimistisch anzunehmen, dass alles einfach und leicht sein wird - naiv.“ . Seltsamerweise ist diese einfache Idee, die durch jahrelanges Füllen von Zapfen erhalten wurde, manchmal eine Offenbarung für erfahrene Fachleute, obwohl es den Anschein hat, als ob all die hektische Begeisterung und der Glaube an die Unfehlbarkeit ihrer eigenen Ideen und Praktiken lange Zeit verwittert sein sollten. Ich erzähle Ihnen eine Geschichte darüber, ein Beispiel für ein einfaches Projekt auf den ersten Blick.




Eines schönen Tages warf mir ein Freund einen Link zu einem interessanten Startup . Die Jungs schlugen vor, dass Vertreter kleiner Unternehmen aus dem Service- und Vertriebssektor einen Zugangspunkt (mit einem Captive-Portal) für ihre Kunden einrichten, um das Internet zu verbreiten und gleichzeitig die MAC-Adressen von Smartphones vorbeikommender Personen zu sammeln. Der Zweck dieser Aktion ist sehr einfach: Mit einer großen Anzahl von Werbenetzwerken können Sie auf die Liste der Geräteadressen zielen. Wenn Sie die Werbefirma an vorbeikommende Benutzer weiterleiten, werden wir höchstwahrscheinlich neue Besucher empfangen (weil sie nahe ist und "irgendwo habe ich sie bereits gesehen"). . Jene. eine solche Verteilung von virtuellen Flyern. Ein Freund fragte, wie das gemacht wird und ob wir das wieder machen können.

Ein kurzes Googeln zu diesem Thema enthüllte den Mechanismus einer solchen Datenerfassung. Der WiFi-Adapter wurde im Air Listening-Modus gestartet und lief durch die Kanäle, um Pakete zu erfassen, zu analysieren und die empfangenen Daten zu aggregieren. Es gab auch fertige offene Dienstprogramme dafür, zum Beispiel Airodump-ng von Aircrack-ng . Jene. Zur Wiederholung müssen wir dieses Dienstprogramm nur ausführen, vorzugsweise auf einem separaten kompakten und tragbaren Gerät, und die empfangenen Daten in die Datenbank verschieben, aus der wir dann vorgefertigte Listen mit MAC-Adressen für Werbenetzwerke erhalten. Es scheint, dass die Aufgabe einfach ist, höchstens an einem - zwei Abenden gemächlicher Arbeit, fast alles ist fertig.

Dies war natürlich nie der Fall.

Wie Sie wissen, ist das, was Jupiter erlaubt ist, dem Bullen nicht erlaubt. Und wenn Einzelzahler eingesetzt werden, müssen Sie zunächst Rechenressourcen und Speicher opfern. Auf das Opfer von Ressourcen folgt das Opfer von Entwicklungs- und Debugging-Komfort - nicht jedes System ermöglicht das Ziehen von Kompilierungswerkzeugen auf das Gerät.

Anfangs wollten wir etwas Einfaches und Billiges nehmen, zum Beispiel Orange Pi Zero- BoxenLegen Sie dort airodump-ng ab und leiten Sie die vom Dienstprogramm ausgegebenen Daten an den Server weiter, wo sie sicher in die Datenbank gestellt werden können. Ich hatte Erfahrung mit solchen verteilten Systemen mit einem dedizierten Zentrum (obwohl dort virtuelle Maschinen als Arbeitspferde fungierten und über die Cloud-API durch dasselbe Zentrum wie erforderlich, aber nicht durch den Punkt gehoben wurden), sodass ein Teil des Codes erfolgreich in ein neues Projekt migriert wurde .

Das Tool zum Weiterleiten von Daten an den Server war die einfachste geschriebene Erlang-Anwendung, die Daten aus dem Ether-Dämpfer ziehen (analysieren), serialisieren (Erlangs native Serialisierung) und über den Web-Socket über HTTPS an den Server übertragen sollte (ohne Verdacht zu erregen) DPI-Systeme und keine eigenen Protokolle erfinden). Die im Orange Pi verwendeten Allwinner H2 + -Prozessoren sind leistungsstark genug, um direkt auf dem Gerät zusammengebaut und debuggt zu werden. Auch hier ist theoretisch alles in Ordnung.

Die Praxis hat begonnen.

1. Wie sich herausstellte, war das integrierte WLAN in Orange Pi nur gut geeignet, um einen Zugangspunkt aufzunehmen und Daten auf den Server zu werfen. Genauer gesagt, nicht der Adapter selbst, sondern die Unterstützung seines Chipsatzes im Kernel. Für die meisten IoT-Projekte würde dies wahrscheinlich ausreichen. Wir waren jedoch bereit für diesen Schlag, da eine vorläufige Studie der Aircrack-ng-Website eine sehr klare und zweideutige Aussage ergab: "Es wird nicht überall funktionieren. Wenn dies nicht unsere Schuld ist, werden wir eine Liste der getesteten Chipsätze beifügen." Fast alle Atheros-Geräte (von Qualcomm gekauft) und Ralink (von MediaTek gekauft) wurden in der Liste gefunden, was einige Aussichten für den Übergang von unersättlichen chinesischen ARMs zu asketischeren MIPS von den Chipsätzen für Router inspirierte.

Aber während dies alles von Rotz und Stöcken geht, d.h. Prototyp - Sie müssen das Problem hier und jetzt lösen. Daher haben wir solche Exoten in unserer technologischen Zeit (wenn die drahtlose Kommunikation leichter ist) als Wi-Fi-USB-Adapter genutzt. Das Studium der Kompatibilitätsliste und der Vergleich mit dem Sortiment des nächstgelegenen Geschäfts ergab ein Opfer - den DLink DWA-160 in Revision C1 (dies ist wichtig, da andere Hardware-Revisionen einen anderen Chip verwendeten und Kopfschmerzen bei der Durchsetzung der Arbeit verursachten). Dual-Band, bei dem nicht mit dem Fahrer getanzt werden muss, da die Unterstützung schon lange im Kernel vorhanden ist, hat sich diese Pfeife später bei anderen Projekten als nützlich erwiesen. Deshalb habe ich sie gekauft, wahrscheinlich alle (fünf Stücke), die in unserer Provinzstadt erhältlich waren.



Nachdem ich sichergestellt hatte, dass das Gerät funktioniert, verband ich es mit einem Einplatinengerät und schaltete den integrierten WLAN-Adapter aus, mit der Erwartung, dass das Internet über die Ethernet-Schnittstelle verfügbar sein würde.



Das zweite Schwein wurde durch Luftknacken gelegt. Diese Dienstprogramme wurden mit dem Ziel des Hackens erstellt.WiFi-Penetrationsprüfungen, d.h. wurde von Hackern für Hacker geschrieben. Ich weiß nicht, dank welcher Logik sie es vorgezogen haben, den drahtlosen Ätherkipper nicht in Form eines herkömmlichen Unix-Way-Ansatzes zu verwenden, um strukturierten Text zur weiteren Verarbeitung auszuspucken, sondern um eine vollwertige Begriffsschnittstelle zu erstellen, auf der Informationen in nahezu Echtzeit angezeigt werden können (und die Terminaleinstellungen berücksichtigt werden). von entdeckten Netzwerken und Geräten, aber genau das haben sie getan. Ja, ich fand die Python-API mit einem unbekannten Grad an Bereitschaft für all dies, aber die Prototyping-Spinne, die in meinem Kopf lebte, verbot strengstens, eine andere Sprache zu ziehen und zu einer anderen zu wechseln (wir erinnern uns, der Serverteil war bereits teilweise fertig und geschrieben war weit entfernt von Python-e) oder, Gott bewahre, implementieren Sie Airodumping auf der Basis von tcpdump. Und folglichIch musste nach Problemumgehungen suchen.

Glücklicherweise begannen drahtlose Hacker, etwas zu vermuten, das in der Benutzeroberfläche ständig dumm ist, und implementierten daher das regelmäßige Hochladen von allem, was in Form von CSV-Dateien gefunden und aggregiert wurde. Mit einem festgelegten Intervall. Du kannst schon damit leben. Natürlich wurde die naive Option - das Dienstprogramm auszuführen und die Datei auf einem Timer erneut zu lesen - sofort von Hand gegeben. Bei der Arbeit an einem Laptop schlug die Übertragung auf eine einzelne Karte beim Lesen der Datei aus offensichtlichen Gründen fehl - manchmal hatte das Dienstprogramm einfach keine Zeit, alles zu entladen, und einige der Daten gingen unwiederbringlich verloren.

Die Lösung hierfür war der Inotify-Mechanismus im Kernel, der über Dateivorgänge informiert. Sobald mein Code die Änderungen an der Datendatei sah, leitete er das Lesen mit einer leichten Verzögerung ein (eher mit einem rein psychologischen Wert, um den Autor zu beruhigen). Die Experimente zeigten, dass in diesem Fall keine Lesefehler und Datenverluste auftreten. Gut, schön, CSV-Parsim, in interne Strukturen einfügen und an den Server senden. Wir speichern es auf dem Server in PostgreSQL (danke für jsonb) und danach ist es bereits möglich, Abfragen durchzuführen, Formulare zu entladen usw. Wir werden die einfachste Autorisierung mithilfe eines symmetrischen Schlüssels hinzufügen, damit wir dort keinen Müll stopfen und die Daten an den Punkt binden können, an dem das Gerät installiert ist. Alles scheint in Ordnung zu sein. Sie können in den Kampf ziehen.

Ja, jetzt wie. Die Testanordnung dieser Kette (und das Schreiben und Debuggen von Code dauerte wirklich ein paar Abende) ergab eine lustige Tatsache: Die Anzahl der Adressen, die pro Tag in unserem Büro gefangen wurden, schwankte weit genug von öffentlich zugänglichen Orten, um ein paar tausend Stück. Ja, natürlich gab es ein kleines Hotel in der Nähe (es war in der Zeit vor der Quarantäne, keine Überraschung), aber es gibt trotzdem viel.

Ich habe das Wissen über die Struktur der MAC-Adresse aktualisiert und daran erinnert, dass mobile Geräte häufig lokale Adressen generieren, um ihre wahren MAC-Adressen zu verbergen. Ich habe den Serverteil mit einem einfachen Filter geändert, der alle Broadcast- und lokalen Adressen am Eingang bereinigt. Die Liste wurde um eine Größenordnung reduziert und sah bereits wie die Wahrheit aus. Alles war bereit für Feldversuche.

Wie Sie wissen, funktionieren Prototypen beim Wechsel des Standorts von einem warmen und komfortablen Büro zu rücksichtslosen Kampfbedingungen in der Regel nicht mehr normal. Daher sollte der Implementierungsprozess von einem Tascheningenieur begleitet werden, der alle aufkommenden Probleme behebt. Andererseits ist auch bekannt, dass ein Gerät, das zu Beginn des Betriebs kein zusätzliches Tanzen mit einem Tamburin erfordert, wahrscheinlich bald und unwiderruflich ausfällt. Dies spiegelte sich sicherlich in Murphys Gesetzen wider, aber leider ist der Autor dieser Zeilen zu faul, um zu überprüfen, welche, daher werden wir uns auf den Begriff "Gemeinheitsgesetz" einigen.

Die erste Installation enthüllte sofort eine Reihe von Fehlern.

Erstens verfügen die meisten chinesischen Prototyping-Boards im Gegensatz zu NAND / NOR-Flash-Chips über einen Langzeit-microSD-Speicher. Eine Ausnahme wird nur für leistungsstarkes SoC gemacht, das für diese Aufgabe eindeutig redundant ist. Leider ist MicroSD der unmittelbare Kopfschmerz des Bedieners - Oxidation der Pads, Ausfall von SD-Karten, Abhängigkeit der Kontakte von der Temperatur im Inneren des Gehäuses (was beträchtlich ist, die chinesischen Chips sind nicht sehr energieeffizient und die Karten werden häufig vollständig basierend auf berechnet Spitzenstromverbrauch, also ohne zusätzlichen Kühler, na ja, auf keinen Fall). Es stellte sich also heraus, dass das System beim Ausschalten des Geräts nicht mehr funktionsfähig war - Dateien mit dem ERTS-Bytecode wurden beschädigt, nachdem die Anwendung nach dem Neustart nicht mehr funktionierte.

Der zweite unangenehme Moment - zum Zeitpunkt der Installation wurde das Internet von einem LTE-Router bereitgestellt und war, gelinde gesagt, im Gegensatz zu einem Bürokabel von mittelmäßiger Qualität. Das Netzwerk funkelte ständig, die Anwendung wurde häufig wieder verbunden oder starb sogar an angesammelten Nachrichten in den Warteschlangen.

Natürlich sind beide Probleme überwindbar. Beispielsweise würde der Datenverlust durch die Suche nach der optimalen Kombination aus einer guten MicroSD-Karte und den Dateisystemeinstellungen beseitigt, und die Instabilität der Verbindung könnte durch vorläufige Datenaggregation, kurze Sendesitzungen, rechtzeitige Entladung usw. ausgeglichen werden. Die aufgedeckten Probleme sind jedoch eine Gelegenheit, darüber nachzudenken, ob der richtige Weg gewählt wurde. Die Notwendigkeit einer dauerhaften Verbindung zum Server hat die Ereignisdatenerfassung beendet, wenn das Gerät an einen externen Akku gehängt und in einen Rucksack geworfen wird, dessen Besitzer zu einem Massenereignis geht, bei dem Sie natürlich keine Stabilität der Verbindung erwarten können.

Dementsprechend bestand der nächste Schritt darin, den Serverteil zu verlassen und das Data Warehouse direkt auf dem Gerät zu lokalisieren. Um lange und sehr trostlose Experimente mit SD-Karten zu vermeiden, wurde außerdem beschlossen, in der nächsten Iteration Steckbrettmodelle mit Flash-Chips zu verwenden.

In diesem Moment erinnerte ich mich daran, dass es in meiner Sammlung ein wundervolles Carambola 2- Brett der litauischen Genossen 8Devices gab . Und wenn Sie zu ihrer Website gehen, finden Sie ein noch kompakteres Gerät auf demselben Chip namens Centipede. Frühere Experimente mit dieser Geräteklasse haben gezeigt, dass Erlang vollständig in die zugewiesenen 16 MB Flash-Speicher passt (und ein wenig für die Anwendung übrig bleibt). Das einzige Minus (was eher ein Plus ist) ist das MIPS mit geringem Stromverbrauch und die Notwendigkeit einer Kreuzkompilierung, was das Erstellen einer Erlang-Anwendung etwas trivialer macht. Da es sich jedoch bereits um eine bekannte Route handelte, habe ich ein paar Hundertfüßer bestellt und bisher die vorhandene Version, die mit dem Server funktioniert, nach Carambol portiert.



Als die Komponenten ankamen, begann eine neue Phase. Der AR9331-Chip wurde erfolgreich von Aircrack-ng unterstützt, Daten können von der Ethernet-Schnittstelle abgerufen werden, die neuesten Versionen von OpenWRT und ERTS wurden gesammelt und erfolgreich getestet. Die Anwendung wurde neu geschrieben - ein Teil des Codes wurde in den Gerätecode verschoben, Daten wurden in einem separaten Prozess gesammelt und regelmäßig in Form eines serialisierten Erlang-Begriffs in eine Datei geschrieben. Hierzu wurde die einfachste webbasierte Schnittstelle gezeichnet, die Daten über Websocket empfängt. Die Ports für inotify und erlexec werden mit OpenWRT sicher kompiliert.

Nur eines war verwirrt - 300 Kilobyte blieben in den Daten. Es ist nicht so klein, wenn Sie nur die MAC-Adressen von Client-Geräten speichern, aber airodump-ng bietet Ihnen viel interessantere Informationen, einschließlich Access Point-Adressen, deren ESSIDs usw., an die Sie sich auch gerne erinnern würden. Nur für den Fall. Okay, wir werden auf die Umstände reagieren.

Wir sammeln, prüfen. Ein Problem wird im laufenden Betrieb aufgedeckt.

OpenwrtWie wir alle wissen, handelt es sich hierbei um einen so minimalistischen Linux-Build, der speziell für Geräte mit begrenztem Speicher entwickelt wurde. Infolgedessen warf es von dort heraus, dass es möglich war, schmerzlos wegzuwerfen, und vereinfachte das, was vereinfacht werden konnte, einschließlich des Mehrspielermodus. Jene. Es ist eine gängige Praxis, wenn der Code von root ausgeht und mit maximalen Berechtigungen arbeitet, was natürlich Probleme im Zusammenhang mit Gruppen, Benutzern und der Kontrolle ihrer Aktionen erleichtert. Ja, ja, der Buchstabe S in der Abkürzung IoT ist für die Sicherheit verantwortlich. Das Problem ist, dass erlexec, mit dem ich airodump-ng ausgeführt und verwaltet habe, kann keine Operationen unter dem Stamm ausführen. Dazu benötigt es einen zusätzlichen Benutzer, für den es die ihm zugewiesenen Prozesse erzeugt. Und wenn Sie einen zusätzlichen Benutzer mit einer anderen Berechtigungsstufe erstellen ... wird korrekt verhindert, dass Airodump das Netzwerkgerät erreicht. Das Aufheben dieser Einschränkung aus der Bibliothek schien ein langsamer Prozess zu sein, daher wurde erlexec durch Ports ersetzt - den integrierten Mechanismus zum Starten von Prozessen von Drittanbietern in Erlang. Eine Kleinigkeit, aber unangenehm.

So werden die Geräte empfangen, neu geflasht und arbeiten sogar unter Gewächshausbedingungen. Wir fangen die Batterie, werfen die Kiste in den Rucksack und gehen ins Einkaufszentrum. Am nächsten Tag schauen wir uns das Ergebnis an - ein Fiasko, eine Datendatei mit der Länge Null - entweder war nicht genügend Speicherplatz vorhanden oder eine Verzerrung der Leistung funktionierte nicht in einem sehr guten Moment. Wir korrigieren den Code so, dass das Speichern in zwei Schritten erfolgt - zuerst wurde eine temporäre Datei erstellt, dann wurde die aktuelle ersetzt.

Die Hände konnten jedoch die Funktionsfähigkeit dieser Option nicht überprüfen - das nächste Spielzeug - Onion Omega2 + auf dem Mediatek 7688 kam in Sicht. Wie ihre Brüder, der LinkIt Smart 7688-Designer , gab es viele DingeDas Wichtigste ist jedoch doppelt so viel Flash-Speicher, sodass Sie sich keine Sorgen mehr über den Platzmangel bei der Datenspeicherung machen müssen. okay

Wir bestellen, warten. Monat. Zwei. Geduld platzt - wir schreiben an die Amerikaner zum Thema „Wo ist die Ware, Zin“. Stille. Eröffnen Sie einen Streit über PayPal. Die Amerikaner wachen auf. Sie sagen: "Oh, unser Auftragsannahmesystem ist ausgefallen. Jetzt senden wir alles." Sie senden, wir warten drei Wochen. Fuh, das Gerät ist zur Hand und funktioniert sogar.



Hier müssen wir einen kleinen Exkurs machen - trotz der Tatsache, dass ich mehrere LinkIt Smart-Boards zu Fuß erreichbar hatte, betrachtete ich sie nicht als Plattform, da zu Beginn der Saga ein Versuch, sie als Erfassungsgeräte zu verwenden, fehlschlug. Dann wurden die Treiber für den Chip in Form von zusammengesetzten Modulen für bestimmte Versionen des Kernels geliefert, und dies wurde anscheinend zur Ursache für die Inoperabilität. In den neuesten Versionen von OpenWRT wurden sowohl native Unterstützung für 7688 als auch ein offener Treiber angezeigt. Dies ist daher eine Gelegenheit, die Vorgehensweise bei diesen Geräten zu überdenken.

Es war jedoch üblich, WiFi direkt auf dem Chip für den vorgesehenen Zweck zu verwenden - schließlich benötigt das Gerät mindestens eine Steuerschnittstelle und auch vor Ort, um zu verstehen, ob es funktioniert oder nicht. Es wäre auch nützlich, die erhaltenen Daten zu betrachten.

Dementsprechend kombinieren wir die vorherigen Ansätze - wir verwenden die einzige auf dem MiniDoc angezeigte USB-Schnittstelle für eine WiFi-Pfeife zum Scannen des Raums und das integrierte WiFi -, um das Gerät als Zugangspunkt mit geringem Stromverbrauch zu steuern. Wir sammeln, prüfen, alles funktioniert.

Aber der Appetit kommt mit dem Essen. Zunächst einmal ist die Datendatei in Form der Erlang-Serialisierung eine Menge echter Maniacs, und ein etwas breiteres Spektrum speziell ausgebildeter Fachkräfte benötigt etwas Einfacheres. Zusätzlich zum Hinzufügen von Daten aus dem Airodump möchte ich auch die genaue Messzeit und vorzugsweise zumindest eine Art Referenz auf den Standort des Geräts im Weltraum.

Wir binden zwischen einer WiFi-Pfeife und einem USB-Hub-Gerät ein. Die Einstellungen (und sie hängen bei OpenWRT von der Position des Geräts am Bus ab) sind bewaldet, dies sind jedoch geringfügige Kleinigkeiten. Richtig. Wir nehmen den USB-GPS-Empfänger glücklicherweise bereits erprobt und mit dem geschriebenen Code aus den TrümmernNMEA-0183-Analyse (der Code musste natürlich trotzdem korrigiert werden). Wir prüfen - das Gerät wird vom System nicht sicher erkannt, es fehlen eindeutig die Treiber. Wir sammeln die seriellen USB-Treiber und legen sie auf dem Gerät ab - auch Stille. Dann erinnern wir uns, dass in großen Systemen die GPS-Pfeife nicht als ttyUSBx, sondern als ttyACMx erkannt wurde, d.h. USB GSM Modem. Gut, gut, der zweite Aufruf, Treiber hinzuzufügen, Erfolg.

Wir nehmen den Code, integrieren ihn in die Anwendung. Fügen Sie der Anwendung sqlite3 als Speicher hinzu. Jetzt ist es nicht mehr erforderlich, die Verfügbarkeit des Datensatzes im Status zu überprüfen, und im Allgemeinen wird die Arbeit mit Daten auf eine kleine Anzahl von Zeilen vereinfacht. Alles in allem lernen wir, wenn wir Daten hinzufügen, um GPS-Messungen durchzuführen, den JS-Code im Gesicht zu korrigieren, um ihn bei einem unvollständigen Datensatz anzuzeigen (dies kann passieren, wenn GPS noch keine Satelliten erfasst hat und die Luftscan-Daten bereits eingehen). Wir überprüfen die Arbeit - sie scheint zu leben. Sie können einen Zwischensieg erklären.



Für ein paar Wochen ununterbrochener Arbeit - viele Daten sowohl zu Sendern in der Luft als auch zu Kunden. Jetzt kämpfe ich mit der Versuchung, dieses Gerät Infobes anzubieten, um den Rundfunk in den anvertrauten Gebieten zu kontrollieren, und dem Staat, um die Bewegung der Telefone der Bürger zu kontrollieren. Es ist natürlich ein Witz, sie selbst wissen bereits alles.

Alle oben beschriebenen Prüfungen sind also nur ein Haustierprojekt mit sehr geringer Komplexität (es war fast sofort klar, was und wie zu tun ist), mangelnder Hardwareentwicklung (hi, Physik) und Zugang zu einem etwas mehr oder weniger vollständigen Produkt. Nein, natürlich kann nicht ausgeschlossen werden, dass der Autor dieser Zeilen ein dichter Amateur ist, und echte Gurus gehen an einem Abend zwischen Abendtee und einem Glas Cognac diesen Weg, aber die Erfahrung hat bisher nur eines gezeigt: IT ist kompliziert und Optimismus wird finanziell und seriös bestraft und motivierend, und diejenigen, die sagen, "alles ist einfach", sind entweder Genies oder Gauner, und der zweite ist wahrscheinlicher.

All Articles