Ein WLAN-Frühwarnsystem

Erstellt am 11.08.2014

Der Ursprung

Neulich, als ich mal wieder ein wenig auf Hackaday.com gestöbert habe, bin ich über ein kleines Projekt gestolpert, das sich Wifinder nannte. In der Projektbeschreibung geht es darum, das Netzwerk zu überwachen, ob sich bestimmte Geräte einwälen. Etwa das Handy des Mitbewohners. Ziel ist es also eine Art Frühwarnsystem zu bauen, denn das Handy wählt sich ja schon vor der Haus- bzw. Wohnungstür ein.
Die Implementierung ließ aber ein wenig zu wünschen übrig, denn anstatt einfach auf ein Authentication-Paket im WLAN zu warten und das quasi passiv mitzuhorchen, setzte diese Lösung auf einen Ping, wenn sich das Handy oder Tablet bereits eingewählt hat. In den Kommentaren zu dem Eintrag finden sich bereits einige Ansäzte zu einer Lösung, die unabhängig vom Netzwerk funktioniert und auf die Monitoring-Fähigkeiten der WLAN-Karte setzen. Per tcpdump lassen sich so nur die Auth-Pakete heraus filtern, die zum entsprechenden WLAN-Access-Point gehören. Es lag für mich also nahe bei einer Implementierung ebenfalls über die Filtermethoden des Linux-Kernels zu gehen.

Neue Version

Für die Neuauflage des Programms habe ich mich für Perl entschieden. Mit Hilfe des Net::Frame::Dump::Online2 Moduls kann man den Output von tcpdump direkt in Perl als Paket mit Timestamp, dem First-Layer-Pakettyp und den Rohdaten des Pakets bekommen. Es lassen sich ebenso die Filter, wie bei tcpdump einstellen.
Zunächst gilt es also nur die Pakete heraus zu filtern, die mit dem eigentlichen Authentifizieren zu tun haben. Das sind bei einem WPA-WLAN vier Pakete die in den Filtern unter Type mgt geführt werden:

  • assoc-req: Assossiation Request
  • assoc-resp: Assossiation Response
  • auth: Authenticate (mit Sequence 1 und 2)
  • deauth: Deauthenticate

Die drei erstgenannten finden quasi auf Veranlassung des WLAN-Clients statt. Das deauth-Paket wird hingegen vom Access-Point an alle daran angemeldeten Clients gesendet, etwa wenn der AP neustartet oder aus welchem Grund auch immer. Entsprechend muss man sich je nach dem die Source- oder Destination-MAC vorknüpfen. Diese MACs werden dann einfach mit einer CSV-List verglichen und man erhält eine Meldung sobald ein bekanntes Gerät versucht sich in das Netzwerk einzuwälen. Für eine zukünftige Version ist geplant, die Ergebnisse dann in einer Liste nach Zeitstempel sortiert anzuzeigen, sodass der neueste Eintrag immer zu oberst steht. Außerdem könnte man z.B. auch eine Zeitspanne festlegen, nach der ein erneutes Event dieses Geräts einen Alarm auslöst.

So funktioniert's

Zunächst benötigt ihr natürlich erstmal mein kleines Perl-Script: wifinder.pl.

In dem Script findet ihr eine Variable @aplist, in die ihr die MAC-Adressen eures (oder wenn ihr mehrere APs habt, eurer) Access Points eintragt. Als nächsten Schritt erstellt ihr eine Datei namens maclist.csv in die ihr die MAC-Adressen der Geräte eintragt, die eine Benachrichtigung auslösen sollen, sowie einen passenden Klarnamen.

12:34:56:78:90:ab,Peters Handy
cd:ef:01:23:45:67,Heikes Tablet

Als nächstes muss die WLAN-Karte in dem Monitoring-Modus versetzt werden. Dazu installiert ihr euch am besten das Paket aircrack-ng, das eigentlich bei allen großen Distributionen angeboten wird. Darin sollte auch der Befehl airmon-ng enthalten sein, der es ermöglicht einen Monitoring-Port einzurichten (in meinem Beispiel mon0). Des weiteren benötigt ihr natürlich auch noch das Perl-Modul, das sich am einfachsten über CPAN installieren lässt:

sudo $PAKETMANAGER install aircrack-ng
sudo cpan install Net::Frame::Dump::Online2

sudo /usr/sbin/airmon-ng start wlp3s0
...
InterfaceChipsetDriver

wlp3s0Intel 4965/5xxx/6xxx/1xxxiwlwifi - [phy0]
(monitor mode enabled on mon0)

Jetzt ist alles bereit, um das Perl-Script abzufeuern! Es wird einfach gestartet mit dem Monitoring-Port als Argument. Damit es auf den Port zugreifen kann, muss es leider mit root-Rechten laufen:

sudo perl wifinder.pl mon0

Ab sofort bekommt ihr also immer eine Meldung, wenn sich ein WLAN-Gerät in euer Netzwerk einwählt. Ist die MAC-Adresse in der CSV-Liste enthalten, wird auch der entsprechende Name dazu angezeigt. Die CSV-Liste könnt ihr übrigens im Betrieb erweitern, da sie bei jedem Event neu eingelesen wird. Das erzeugt zwar etwas mehr IO, aber ich denke mal, dass ihr keine 500 Geräte überwachen wollt (und selbst das würde wohl durch den Cache bedient werden).
Wünsche euch jetzt viel Spaß mit dem ganzen und würde mich, wie immer, sehr freuen, wenn ihr mir euren Code zukommen lasst, solltet ihr neue Funktionen oder der gleichen eingebaut haben.

Seitenanfang