==============
== morph.sh ==
==============
Einfach mal was mit Holz machen.

Ein Plug'n'Play-Packetsniffer mit OpenWRT

network wireshark analysis sniffer de

Doof

Neulich musste ich bei einem Kunden vor Ort eine Installation debuggen, die hauptsächlich aus unseren eigenen Rechnern und sonstigen Geräten besteht, aber in der auch zwei Windows-Rechner eines Drittanbieters verbaut waren, auf die ich keinen Zugriff hatte. Diese beiden Geräte wollten plötzlich nicht mehr mit unseren zusammenspielen und da ich auf ihnen nichts installieren konnte o.ä., musste ich den Netzwerkverkehr von außen mitschneiden, um zu beweisen, dass deren Maschinen kaputt waren und nicht unsere. Dummerweise hatte ich kein passendes Gerät dabei, was meine Arbeit deutlich schwieriger gemacht hat.

Theoretisch ist die Aufgabe nicht schwer: man möchte, dass aller Netzwerkverkehr an ein und von einem Gerät zusätzlich auf einem anderen Port ausgegeben wird, damit man ihn dort analysieren kann, ohne dass es auffällt oder Verzögerungen gibt. Ethernet-Hubs, die heute glücklicherweise größtenteils ausgestorben sind, haben das von selbst so gemacht; aber schon alleine, da es die Dinger nie mit Gigabit Ethernet gab, scheiden sie für diesen Zweck aus. Stattdessen verwendet man in diesem Gebiet heutzutage üblicherweise Switches mit Port Mirroring, das genau das tut, wonach es klingt. Teure Managed Switches haben dieses Feature sowieso, aber auch schon günstigere (wie die Netgear GS30x-Serie ab 20€) können für Port Mirroring konfiguriert werden. Switches haben an dieser Stelle aber auch ein paar Nachteile:

  • Der “Monitor” (der Computer, mit dem man den Datenverkehr “abfängt”), taucht im Netzwerk auf, verschickt schlimmstenfalls Broadcasts und verfälscht somit die Ergebnisse, oder - noch problematischer - macht auf die Existenz eines Mithörers aufmerksam, wenn es wichtig ist, “undercover” zu bleiben
  • Es gibt kein WLAN - per WLAN angebundene Geräte zu sniffen, ist ja ein valides Einsatzszenario
  • Die Größe. Hängt natürlich vom verwendeten Switch ab, aber selbst die kleinsten, die ich finden konnte, waren größer und schwerer als meine Lösung
  • VLAN tagging kann zum Problem werden, wenn das Zielgerät getaggte Frames versendet
  • Die Konfigurationsmöglichkeiten sind mitunter stark beschränkt. Speziell bei günstigen Geräten hat man oft ein sehr reduziertes Webinterface, über das man die drei vorhandenen Features einstellen kann. Schlimmstenfalls mit Flash, Java oder einer anderen Höllentechnologie, die in zwei Jahren kein Browser mehr beherrscht. SSH, Serial oder eine anderweitige Shell bekommt man da in der Regel nicht.

Zusammenfassend wollte ich einfach nur ein Gerät nach dem Muster “Traffic rein / Traffic raus” mit einem bisschen Port Mirroring und idealerweise WLAN. Kann ja nicht so schwer sein(tm), dachte ich mir - diese Idee hatten bestimmt schon etliche Menschen vor mir und haben entsprechende Geräte gebastelt, die man kaufen und damit loslegen kann, aber Fehlanzeige. Vielleicht habe ich nur falsch gesucht, aber sowas scheint es nicht wirklich zu geben.

GL.iNet und OpenWRT to the rescue

Also habe ich mich daran gemacht, selbst einen “Hardware-Packetsniffer” zu bauen. Die perfekte Hardware hatte ich schon in der Bastelschublade: ein GL.iNet AR750S, beworben als “Travel Router”, aber alles in allem ein verdammt cooles Stück Hardware! Auf dem Gerät ist per default ein fast unverändertes OpenWRT installiert (mit LuCi, aber auch mit einem einfacheren Interface vom Hersteller), es hat 3 GbE-Ports, 2 WLAN-Antennen, Micro-USB zur Stromversorgung oder zur Verwendung als externes Modem am Rechner, Micro-SD-Kartenslot, komplett selbst konfigurierbare LEDs und einen Schalter - beides kann man in LuCi der vorgesehenen Verwendung zuführen. Cool auch: das GL.iNet-Webinterface hat einen eingebauten OpenVPN-Client. Da wirft man seine .ovpn-Datei rein, der Tunnel wird bei jedem Boot von selbst aufgebaut und man hat im Hotelzimmer / im Büro / sonstwo ein sicheres Netzwerk. Brauche ich zwar für dieses Projekt nicht, aber trotzdem cool.

GL.iNet AR750S

Alles in allem ein sehr feines Paket für die knapp 75€ - mehr Info gibt’s hier: https://www.gl-inet.com/products/gl-ar750s/

Konfiguration

Als erstes habe ich auf dem System die vorhandenen WLAN-Netze, SSIDs und Hardware-Interfaces gelöscht und neue erstellt: “monitor” ist der Anschluss, auf den die Pakete gemirrort werden, “lan” ist eine Bridge über die anderen beiden Ports, in die das zu debuggende Gerät und der Rest des Netzwerks gesteckt werden, und somit auch das “sniffer”-WLAN.

Screenshot der Interfaces-Seite

Die Firewall brauchen wir in dieser Konfiguration gar nicht, die stört nur - daher einfach unter “Network” -> “Firewall” einfach ausschalten.

switch0 / VLANs

Unter “Network” -> “Switch” wird der WAN-Port mit einem eigenen untagged VLAN versehen, das mit “CPU (eth0)” verbunden sein muss. Die beiden anderen Switchports können einfach auf VLAN 1 gelassen werden. Danach wird noch oben das Port Mirroring in beide Richtungen eingeschaltet und die richtigen Interfaces ausgewählt. Wichtig ist an der Stelle: da die beiden Ports (die, die nicht “monitor” sind), einfach zusammengeswitcht werden, ist es soweit egal, welcher für den Uplink und welcher für das zu sniffende Gerät verwendet wird. Das gilt aber nicht mehr, sobald WLAN ins Spiel kommt, weil nur ein physischer Port gemirrort werden kann - nimmt man dafür den “Uplink”, kommen dort zwangsläufig alle Daten vorbei. Daher sollte ein Port als “Uplink” und einer als “Device” deklariert werden und der Uplink als Ziel für das Port Mirroring angegeben werden. Entsprechende Labels auf der Hardware sind eine gute Idee.

Screenshot der Switch-Seite

“monitor”-Interface

das “monitor”-Interface ist das, was vorher “WAN” war. Es wird als “Static Address” konfiguriert, damit es ein eigenes Netz aufmachen und DHCP anbieten kann - ein Arbeitsschritt weniger für den Monitor. Es kann eine beliebige Netzwerkkonfiguration eingestellt werden; ich habe mich für das Netz 192.168.42.0/24 entschieden, weil, ya know… ;)

Der DHCP-Server wird aktiviert (“Dynamic DHCP” muss gesetzt werden!) und unter “Physical Settings” wird das Monitor-VLAN ausgewählt.

Screenshot 1 der Monitor-Interface-Seite Screenshot 2 der Monitor-Interface-Seite

Was ich mir wünschen würde, aber leider noch nicht zu gehen scheint: WLAN nicht nur für zu sniffende Devices, sondern auch für den Monitor einsetzen zu können; mit den zwei separaten WLAN-Antennen scheint der Router wie gemacht dafür. Ohne weiteres kann ich aber nur die LAN-Ports als Ziel fürs mirroren angeben, da das unter “Switch” konfiguriert wird, wo WLAN nicht auftaucht.

“lan”-Interface

Das “lan”-Interface agiert als dummer Switch und muss daher nicht viel können. Unter “Protocol” wird “unmanaged” ausgewählt (vorher natürlich den Rechner, mit dem konfiguriert wird, an “monitor” anschließen), unter “Physical Settings” wählt man VLAN 1 aus und die WLANs.

Screenshot 1 der lan-Interface-Seite Screenshot 2 der lan-Interface-Seite

Läuft

Und damit ist das Setup auch schon beendet. Jetzt sollte man sich an den “Monitor”-Port hängen können, Wireshark öffnen und alles mitlauschen, was auf dem Switch vor sich geht. Eine Option muss noch in Wireshark gesetzt werden: per default ist bei diesem Traffic natürlich auch dabei, was der Monitor-Rechner selbst erzeugt. Mit einem Display Filter wird man diese Packets wieder los - entsprechend der vergebenen IP gibt man oben ein: ! ( ip.addr == 192.168.42.x ).

Screenshot des Wireshark-Display Filters

Super Sache, das ganze. Der Router bleibt jetzt einfach so und wird nicht mehr umkonfiguriert, damit er immer betriebsbereit in der Schublade liegt und ohne jegliche Bedienung entspannt sniffen kann.

Das fertige Gerät

To Do

Der Sniffer ist so noch nicht perfekt - hier ein paar Dinge, die ich noch angehen muss:

  • Derzeit pusht DHCP auf dem Monitor-Interface den Router als default Gateway, was natürlich nicht funktioniert; das muss abgeschaltet werden (außer man löscht die Route immer manuell, aber naja…)
    • Schon gesetzt: option dhcp-option '3' und '6' in der DHCP-Config für monitor, funktioniert aber noch nicht…
  • Wie oben beschrieben: den Monitor auf einem der zwei WLAN-Ports zu haben, wäre neat
  • Vielleicht fällt mir auch noch eine Verwendung für LEDs und MicroSD-Steckplatz ein.

Appendix

Der Vollständigkeit halber an dieser Stelle noch die wichtigsten Configfiles aus OpenWRT.

/etc/config/network

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fd10:73d3:66ef::/48'

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0.1'
	option proto 'none'
	option auto '1'

config interface 'monitor'
	option proto 'static'
	option ipaddr '192.168.42.1'
	option netmask '255.255.255.0'
	option ifname 'eth0.42'
	option type 'bridge'

config switch
	option name 'switch0'
	option reset '1'
	option enable_vlan '1'
	option enable_mirror_rx '1'
	option mirror_monitor_port '1'
	option enable_mirror_tx '1'
	option mirror_source_port '2'

config switch_vlan
	option device 'switch0'
	option vlan '1'
	option vid '1'
	option ports '0t 2 3'

config switch_vlan
	option device 'switch0'
	option vlan '2'
	option vid '42'
	option ports '0t 1'

/etc/config/dhcp


config dnsmasq
	option domainneeded '1'
	option boguspriv '1'
	option filterwin2k '0'
	option localise_queries '1'
	option rebind_protection '1'
	option rebind_localhost '1'
	option local '/lan/'
	option domain 'lan'
	option expandhosts '1'
	option nonegcache '0'
	option authoritative '1'
	option readethers '1'
	option leasefile '/tmp/dhcp.leases'
	option resolvfile '/tmp/resolv.conf.auto'
	option nonwildcard '1'
	option localservice '1'

config dhcp 'lan'
	option interface 'lan'
	option dhcpv6 'server'
	option ra 'server'
	option ra_management '1'
	option start '100'
	option limit '150'
	option leasetime '12h'

config dhcp 'wan'
	option interface 'wan'
	option start '100'
	option limit '150'
	option leasetime '12h'

config odhcpd 'odhcpd'
	option maindhcp '0'
	option leasefile '/tmp/hosts/odhcpd'
	option leasetrigger '/usr/sbin/odhcpd-update'
	option loglevel '4'

config dhcp 'guest'
	option interface 'guest'
	option start '100'
	option leasetime '12h'
	option limit '150'
	option dhcpv6 'server'
	option ra 'server'

config domain 'localhost'
	option name 'console.gl-inet.com'

config dhcp 'monitor'
	option start '100'
	option leasetime '12h'
	option limit '150'
	option interface 'monitor'

/etc/config/wireless

config wifi-device 'radio0'
	option type 'mac80211'
	option channel '36'
	option hwmode '11a'
	option path 'pci0000:00/0000:00:00.0'
	option htmode 'VHT80'
	option doth '0'
	option txpower '20'
	option txpower_max '20'
	option band '5G'
	option disabled '0'
	option legacy_rates '1'
	option country 'DE'

config wifi-iface 'default_radio0'
	option device 'radio0'
	option mode 'ap'
	option encryption 'psk2'
	option ifname 'wlan0'
	option wds '1'
	option key '<redacted>'
	option ssid 'sniffer'
	option network 'lan'

config wifi-device 'radio1'
	option type 'mac80211'
	option channel '11'
	option hwmode '11g'
	option path 'platform/qca956x_wmac'
	option txpower_max '20'
	option txpower '20'
	option noscan '1'
	option htmode 'HT40'
	option band '2G'
	option disabled '0'
	option legacy_rates '1'
	option country 'DE'

config wifi-iface 'default_radio1'
	option device 'radio1'
	option network 'lan'
	option mode 'ap'
	option encryption 'psk2'
	option wds '1'
	option ifname 'wlan1'
	option ssid 'sniffer'
	option key '<redacted>'