Tegenwoordig is elke tv of mediaspeler wel aangesloten op het internet. Handig om Netflix kijken, maar weet jij zeker dat jouw tv geen persoonlijke data naar de fabrikant of een derde partij stuurt? In deze workshop leggen we twee methodes uit om het uitgaande netwerkverkeer van een smart tv te monitoren.
Auteur: Filip Vervloesem
Eén van de vele voordelen van open source software is dat jouw PC niet ongevraagd persoonlijke gegevens doorstuurt naar de ontwikkelaars. En mocht dat toch het geval zijn, dan blijft dat nooit lang een geheim. Iedereen kan de code immers inkijken en desnoods meteen aanpassen om die functionaliteit te verwijderen. Helaas gebruiken we steeds meer apparaten die verbonden zijn met het internet en waarvoor géén open source software beschikbaar is. Het meest opvallende voorbeeld zijn wellicht smart tv’s. Die draaien dan wel vaak op Android, maar de fabrikant voorziet ze nog van een hele resem eigen tools. Veel van die tools kan je zelfs niet uitschakelen. Je hebt dus weinig controle over wat jouw tv op de achtergrond allemaal uitspookt. Wil je niet het risico lopen dat je tv jouw kijkgedrag analyseert of -nog erger- de microfoon of camera gebruikt om persoonlijke data te delen met adverteerders? Dan krijg je vaak de suggestie om jouw smart tv dan maar niet aan je netwerk moet koppelen. Een effectieve oplossing, maar nogal drastisch als je het ons vraagt.
In plaats van die ‘alles of niets’ aanpak, gaan we op zoek naar een manier om selectief uitgaande netwerkverbindingen te blokkeren op een smart tv. Afhankelijk van de mogelijkheden van jouw smart tv, heb je twee opties:
Een proxyserver onderschept al het webverkeer tussen een client (in dit geval je smart tv) en een server (een webserver op het internet). Squid is de bekendste proxyserver voor Linux, maar voor deze workshop is dat wellicht overkill. Tenzij je al ervaring hebt met Squid, raden we je aan om Tinyproxy te installeren. Tinyproxy is veel eenvoudiger te configureren dan Squid en voldoet ook prima om je smart tv te monitoren. Let wel op: als de proxyserver onbereikbaar is, kan je smart tv niet meer aan het internet! Installeer Tinyproxy dus op een apparaatje dat 24/7 aanstaat, zoals een Raspberry Pi. Zelf gaan we aan de slag met een BeagleBone Black, voorzien van Debian 8. Onder Raspbian zijn de commando’s identiek. Na installatie (apt install tinyproxy) open je het configuratiebestand /etc/tinyproxy.conf. Voeg nu het IP-adres van jouw smart tv toe onder de regel “Allow 127.0.0.1”, bijvoorbeeld:
Allow 192.168.1.11
Zorg er eerst voor dat jouw smart tv steeds hetzelfde IP-adres heeft. Dat doe je door een vast IP-adres in te stellen op de tv zelf. Je kan dit ook doen door een specifiek IP-adres te reserveren in de dhcp-server van je router. Om de logfile wat overzichtelijker te houden, is het raadzaam ook de log level aan te passen:
LogLevel Connect
Pas nu de aangepaste configuratie toe:
service tinyproxy reload
En stel de volgende proxyserver in op je smart tv:
<ip-adres-Raspberry-Pi>:8888
In het bestand /var/log/tinyproxy/tinyproxy.log zie je vanaf nu met welke webservers je smart tv verbindt. Voor http-verkeer krijg je zelfs de precieze URL’s te zien, voorgegaan door GET. Door de encryptie van https-verkeer is het helaas niet zo eenvoudig om te achterhalen welke requests de client precies verstuurt. Voor https-verkeer zie je in de logfile dus enkel het domein van de webserver, voorafgegaan door CONNECT. De logfile bevat trouwens nog iets meer informatie dan wat wij nodig hebben. Om alleen de requests van de smart tv te zien, gebruik je volgend commando:
grep Request /var/log/tinyproxy/tinyproxy.log
Of om in real time het webverkeer op te volgen:
tail -f /var/log/tinyproxy/tinyproxy.log | grep Request
Heb je een request gezien naar een bepaald domein dat je niet zint of op een ogenblik dat jij absoluut niets aan het doen was op je tv? Stel dan een blacklist op van requests die Tinyproxy moet blokkeren. Open opnieuw het configuratiebestand en haal het #-je vóór de volgende regel weg:
Filter "/etc/filter"
Het is het eenvoudigst om meteen een volledig domein te blokkeren. Wil je liever alleen specifieke URL’s blokkeren, schakel dan volgende optie nog in:
FilterURLs On
Vervolgens maak je een tekstbestand /etc/filter aan, met daarin een lijst van domeinen of URL’s die je wilt blokkeren (één domein of URL per regel). Probeer het domein steeds zo breed mogelijk te houden: domain.com blokkeert bijvoorbeeld zowel www.domain.com, sub.domain.com als domain.com. Vergeet tot slot niet de permissies van dat bestand correct te zetten én de nieuwe configuratie in te lezen:
chown nobody:nogroup /etc/filter service tinyproxy reload
In de logfile krijg je nu de melding “Proxying refused on filtered domain <domein>” als de smart tv met een geblokkeerd domein probeert te verbinden. Controleer zeker of de gewenste functionaliteiten van de tv nog steeds werken. Aanvankelijk moet je wellicht wat experimenteren om de blacklist helemaal goed te krijgen. Wil je absoluut zeker zijn dat de smart tv jouw proxyserver gebruikt en niet achter jouw rug om rechtstreeks naar het internet gaat? Blokkeer dan op jouw router alle uitgaande verbindingen vanaf het IP-adres van je smart tv. Dat is hoe dan ook nodig om verkeer te blokkeren dat niet via het http(s)-protocol verloopt.
Met Wireshark (apt install wireshark) onderschep al je het verkeer dat langs de netwerkkaart van jouw PC passeert. Helaas verstuurt een switch (in tegenstelling tot een eenvoudige hub) alle netwerkpakketten alleen naar die poort waarvoor ze bedoeld zijn. Is de smart tv aangesloten op poort 4 en jouw PC op poort 6? Dan ziet jouw PC niets van het netwerkverkeer van de smart tv. Gelukkig bieden smart switches een oplossing: via port mirroring dupliceer je het verkeer van en naar een bepaalde poort op een andere poort. Bij onze Netgear switch werkt dat als volgt: onder Monitoring > Mirroring selecteer je de poort van de smart tv (g4 in ons geval) en kies je ‘Tx and Rx’ onder ‘Direction’ om zowel uitgaande als inkomende netwerkpakketten te dupliceren. Selecteer vervolgens de interface van jouw PC (g6) onder ‘Destination Interface’, kies ‘Enable’ bij ‘Session Mode’ en klik op ‘Apply’. Maar let op: zodra port mirroring is ingeschakeld, is geen communicatie meer mogelijk tussen jouw PC en de andere poorten van je switch! Je verliest dus de toegang tot alle apparaten in je netwerk en het internet. Zelfs je switch is onbereikbaar: om de port mirroring weer uit te schakelen, moet je dus een andere machine erbij halen…
Niet elke gebruiker mag zomaar een packet capture starten in Wireshark. Beantwoord de vraag “Should non-superusers be able to capture packets?” tijdens de installatie van Wireshark met ‘Yes’. Is Wireshark reeds geïnstalleerd, dan roep je dat dialoogvenster opnieuw op met het commando:
sudo dpkg-reconfigure wireshark-common
Voeg daarna jouw gebruiker toe aan de wireshark-groep met het commando (in dit voorbeeld voor de gebruiker filip):
sudo gpasswd -a filip wireshark
Vergeet niet om even uit te loggen en opnieuw in te loggen om die laatste wijziging toe te passen. Alles staat nu klaar voor een eerste packet capture. Na het opstarten, toont Wireshark je een lijst van beschikbare netwerkinterfaces. Selecteer de interface waarvoor je port mirroring hebt ingeschakeld en vul het IP-adres van je smart tv in bij de capture filter, bijvoorbeeld:
host 192.168.1.44
Klik tot slot op de blauwe knop links bovenaan om de packet capture te starten. Je krijgt meteen erg veel netwerkpakketten te zien. Via de invoerbalk bovenaan stel je een filter in om ongewenste pakketten te verbergen. Wil je bijvoorbeeld enkel het webverkeer zien, vul dan “http” in voor http of “ssl” voor https. Wireshark toont dan nog steeds een overvloed aan data, waardoor het lastig is om die te interpreteren.
Gelukkig kan je de output van Wireshark verder analyseren in gespecialiseerde tools. Heb je voldoende netwerkverkeer onderschept, klik dan op het rode stop-icoontje linksboven. Exporteer de data via File > Save en kies het Wireshark/tcpdump/… – pcap-formaat. Voor http-verkeer toont tshark (Wiresharks commandline tegenhanger) met volgende opties een mooi overzicht:
tshark -r capture.pcap -Y 'http.request.method == "POST" or http.request.method == "GET"' -T fields -e http.request.method -e http.request.full_uri
Uiteraard is dat maar één voorbeeld om een pcap-bestand te analyseren. Aarzel niet om te experimenteren met de tshark-opties of om andere tools te testen. Houd ook in het achterhoofd dat de communicatie tussen je PC en de fabrikant niet noodzakelijk via http verloopt. Op basis van de gevonden Destination-adressen in Wiresharks of tsharks uitvoer blokkeer je uitgaand verkeer van je smart tv naar specifieke IP-adressen op je router. De precieze procedure hangt uiteraard af van het merk en model van jouw router. Daarvoor raadpleeg je dus het beste de documentatie of help-functie van je router.