Wifi-stopcontact monitoren met Wireshark
Hoe verzend je het wifiwachtwoord naar een nieuw apparaat nog voordat dit op het wifinetwerk is aangesloten? De fabrikanten van IoT-apparaten hebben allerlei slimme oplossingen voor dit probleem, maar die zijn soms allesbehalve veilig. We laten zien hoe je dat kunt nagaan met Wireshark in c't-Raspion.
Het proces heeft iets magisch: je steekt gewoon de net uitgepakte wifistekkerdoos in het stopcontact, downloadt de app van de fabrikant naar je smartphone en typt daar het wachtwoord in. Enkele seconden later logt het schakelbare stopcontact als bij toverslag in op je eigen wifi.
Hoe kon de app, die verbonden is met het versleutelde wifi, communiceren met de wifistekkerdoos die de sleutel niet kent? Sommige fabrikanten lossen dat probleem op door het nieuwe wifi-apparaat eerst als niet-versleuteld toegangspunt te gebruiken, waarmee de smartphone vervolgens kortstondig verbinding maakt om het wachtwoord door te geven. Dat is niet zo bij de wifistekkerdozen van Aldi, die al enkele jaren af en toe in het speciale assortiment verschijnen. Daar blijft de smartphone verbonden met het wifi en slaagt er toch in, ondanks het versleutelen van het dataverkeer, om het wifiwachtwoord over te brengen naar de gloednieuwe, schakelbare stekkerdoos.
Hoe dat kleine wonder kan werken, is makkelijk te zien met Wireshark op c't-Raspion. We hebben de wifistekkerdoos van Aldi eens onderzocht. De eerste stap in een poging om het geheim van zo’n stekkerdoos te ontrafelen, is om van tevoren te overwegen hoe het delen van wachtwoorden in het algemeen zou kunnen werken. Mogelijke alternatieve paden moeten dan stap voor stap worden uitgesloten – anders kan het zijn dat je met het verkeerde gereedschap op de verkeerde plaats aan het zoeken bent.
UITSLUITINGSPROCEDURE
Eén ding is duidelijk: de smartphone moet vanuit de app communiceren met de stekkerdoos, je moet immers je wifiwachtwoord intypen bij de app. Aangezien de smartphone naast wifi ook Bluetooth heeft, zou de wifistekkerdoos uitgerust kunnen zijn met Bluetooth om het wachtwoord te ontvangen. Maar de wificonfiguratie werkt ook als Bluetooth op de smartphone uitgeschakeld is – dat kan het dus niet zijn.
Een andere mogelijkheid zou ultrasoon geluid kunnen zijn, waarbij de app via de luidspreker van de smartphone extreem hoogfrequente geluiden uitzendt, die worden ontvangen door een microfoon die in de stekkerdoos verstopt zit. Maar het instellen van het wifi werkt ook met een aangesloten koptelefoon en vanuit een aangrenzende kamer – dus kan het ook geen ultrasoon geluid zijn.
Vrij naar Sherlock Holmes blijft, ook al is het door de versleuteling eigenlijk onmogelijk, dan alleen nog wifi over als transmissieroute. En daarmee is het moment van c't-Raspion aangebroken: in plaats van je draadloze thuisnetwerk te gebruiken, wordt de smartphone gekoppeld aan het wifi van c't-Raspion en vervolgens wordt Wireshark op c't-Raspion gestart om het dataverkeer van de app te onderzoeken.
Maar net als alle andere apps neemt de app van de wifistekkerdoos bij het opstarten contact op met allerlei servers op het internet, wat leidt tot een stortvloed aan datapakketten in Wireshark. Maar die kunnen niets te maken hebben met de wificonfiguratie van de stekkerdoos, omdat het wifiwachtwoord pas later wordt ingevoerd. Het is daarom belangrijk om dergelijke storende pakketten uit te filteren, zodat de verdachte gegevensoverdrachten überhaupt opgespoord kunnen worden.
UITGEFILTERD
Het ‘Display Filter’ is het hart van Wireshark. Deze balk vind je onder de knoppenbalk (‘Main Toolbar’). Het tekstvak in deze filterwerkbalk dient om filterregels in
te typen, die echter alleen van invloed zijn op de weergave in Wireshark. Als je een filterregel verwijdert of wijzigt, zie je al het verkeer weer.
Dat is niet zo bij ‘Capture Filter’, dat je aan de rechterkant van de Main Toolbar vindt: met dat filter kun je beïnvloeden welke gegevenspakketten Wireshark überhaupt vastlegt. Pakketten die daarmee worden uitgefilterd, ontbreken in de opname en kunnen later niet meer worden hersteld. Dat betekent dat je bij twijfel helemaal geen verdachte pakketten kunt vinden, omdat die al zijn weggelaten door dat afvangfilter.
DNS-requests voor de domeinnaamconversie spelen geen rol bij het onderzoek naar de smartphoneapp. Je smartphone zal beslist lokaal communiceren met de wifistekkerdoos, die nog geen toegang heeft tot je wifinetwerk en dus niet tot internet. ARP-requests en ICMP-pakketten maken het ook moeilijk om te zien wat wel belangrijk is. De volgende filterregel sorteert al dit soort pakketten: not icmp and not icmpv6 and not dns and not mdns
Dit voorbeeld laat zien dat Wireshark IPv4 en IPv6 verschillend behandelt. Filterelementen voor IPv4 hebben geen specifieke naamuitbreiding, terwijl die voor IPv6 altijd de aanduiding v6 aan het eind hebben. Dat stamt uit de tijd dat Wireshark nog geen IPv6 ondersteunde – door de namen van de filterelementen voor IPv4 te behouden, bleven de nieuwere Wiresharkversies compatibel met oudere filterregels.
Je kunt lange filterregels vermijden door gemeenschappelijke elementen te combineren, zoals gebruikelijk in wiskundige uitdrukkingen – bijvoorbeeld het not in het laatste voorbeeld. De volgende filterregel heeft dezelfde betekenis: not (icmp or icmpv6 or dns or mdns)
Als je de configuratie van de stekkerdoos met dat filter start, zul je snel zien dat de app veel TCP- en UDP-datapakketten naar het lokale netwerk stuurt. Om die pakketten uit te filteren, is het een goed idee om de vorige filterregel dienovereenkomstig uit te breiden: (tcp or udp) and not (icmp or icmpv6 or dns or mdns)
Door de filterregels één voor één uit te breiden, kan het gebeuren dat je elkaar uitsluitende criteria toevoegt, omdat je gewoon het overzicht kwijt bent. Door aan het begin van het filter tcp or udp te zetten is de specificatie van not (icmp or icmpv6) verderop overbodig geworden, zodat je de filterregel aanzienlijk kunt inkorten:
(tcp or udp) and not (dns or mdns)
Als je bekend bent met de verschillende netwerkprotocollen, moet je daarom van tijd tot tijd naar de filterregel als geheel kijken en specifiek zoeken naar elkaar uitsluitende criteria. Een herhaling van de wificonfiguratie in de app laat zien dat de app de meeste pakketten naar het broadcast-adres 192.168.250.255 en daarop naar poort 8801 stuurt. Je kunt die pakketten eruit filteren met de volgende regel: ip.addr==192.168.250.255 and udp.port==8801
Een blik op de datapakketten laat alleen onverdachte gegevens zien. Het wifiwachtwoord zit daar blijkbaar niet in.
Alleen als je het transmissieproces van verschillende wifiwachtwoorden vergelijkt, waarbij steeds slechts één teken veranderd is, kom je de achterliggende truc van de app op het spoor. De inhoud van de datapakketten van de verschillende wifiwachtwoorden bestaat dan nog steeds alleen uit generieke tekens, maar de pakketgrootte verandert. De app gebruikt dat blijkbaar om het wachtwoord teken voor teken naar de stekkerdoos te sturen.
Dat is logischerwijs ook begrijpelijk, aangezien de inhoud van de wifipakketten gecodeerd is met de wifisleutel, zodat de stekkerdoos die niet kan lezen. De lengte van een wifipakket kan daarentegen door elk wifi-apparaat op hetzelfde wifikanaal worden bepaald, ook zonder sleutel. Door het gebruik van verschillende wifisleutels die slechts één teken verschillen, is het eenvoudig te bewijzen dat een ‘1’ in het wifiwachtwoord wordt doorgeseind als een reeks van 91 bytes grote gegevenspakketten. Een ‘2’ genereert pakketten van 92 bytes, een ‘3’ pakketten van 93 bytes, enzovoorts.
Dit laat zien dat de app het wifiwachtwoord niet geheel versleuteld doorgeeft, maar alleen maar een beetje vermomd. Dat betekent op zijn beurt dat je, telkens wanneer je zo’n wifistekkerdoos instelt, dan je wifiwachtwoord doorseint naar de hele buurt – daarom moet zo'n apparaat in het beste geval worden gekoppeld aan een gastnetwerk of aan je eigen IoT-wifi, waarvan de veiligheid voor jou niet zo belangrijk is.
Een volledig onbeschermd wifi is in elk geval ook niet geschikt, omdat de wifistekkerdozen vaak een niet gedocumenteerde webinterface bevatten waarmee iedereen in hetzelfde wifinetwerk ze naar believen kan in- en uitschakelen.