IoT-hacking in de praktijk: van firmware-download tot root-shell

Eén oude router, één root-shell

Dit is het verslag van een compleet IoT-onderzoek dat een van onze collectief-leden als eindopdracht voor de opleiding Ethical Hacking (leerlijn Software Security) heeft uitgevoerd. Het doelwit: een D-Link DIR-890L, een AC3200 “Ultra Wi-Fi”-router uit 2015 waarvan de firmware sinds 2019 end-of-life is. Het eindresultaat: ongeautoriseerde root-toegang, met een CVSS-score van 9,4.

In dit artikel loop je de volledige kill chain na, van firmware-download tot en met de root-shell. Elk onderdeel van het traject hebben we daarnaast uitgewerkt in losse, diepgaande artikelen die je onderaan vindt. Alles speelde zich af in een geïsoleerd lab, op een apparaat dat allang niet meer ondersteund wordt, en de bevindingen zijn via responsible disclosure bij de fabrikant gemeld. Dit soort onderzoek doe je alleen op eigen spullen.

Het doelwit: waarom de D-Link DIR-890L?

Een goed IoT-onderzoek begint bij een haalbaarheidscheck. Het apparaat moet aan een paar eisen voldoen:

  • Firmware vrij beschikbaar. De fabrikant moet het bestand gewoon aanbieden, zodat je legaal aan de binary kunt.
  • Emuleerbare architectuur. De DIR-890L draait op ARM, een architectuur die zich goed laat nabootsen met FirmAE. Ideaal: geen fysiek apparaat nodig.
  • Webinterface én mobiele app. Twee aanvalsvlakken in plaats van één.
  • End-of-life. De firmware (versie 1.03B07) krijgt sinds 2019 geen updates meer. Alles wat je vindt, blijft dus bestaan.

Die combinatie maakt deze router een perfect studieobject: realistisch, kwetsbaar en veilig om te onderzoeken.

Het lab: eerst de omgeving, dan het apparaat

Wie firmware gaat ontleden, weet vooraf niet wat de software kan. Daarom stond het hele onderzoek in een afgesloten omgeving: Kali Linux in VMware, de host losgekoppeld van persoonlijke netwerken, geen internet tijdens de analyse, gedeeld klembord uit, schijf versleuteld. De gouden regel is simpel: behandel onbekende firmware als onbekend wild. Je zet het niet zomaar op je eigen netwerk.

Wil je zelf zo’n lab opzetten? Ons artikel over je eerste eigen hacklab met VirtualBox en Kali loopt de basis door.

De kill chain in zeven stappen

Stap 1: firmware downloaden en uitpakken

De firmware (DIR890A1_FW103b07.bin) komt rechtstreeks van de site van de fabrikant. Eén blik met Binwalk is al onthullend: het bestand bevat een ingepakt SquashFS-bestandssysteem, het complete Linux-systeem van de router. Een paar commando’s later ligt de hele bronstructuur open op schijf. Het volledige reverse-engineeringproces lees je hier.

Stap 2: het bestandssysteem lezen

In de uitgepakte structuur vallen direct dingen op: een HNAP1-directory, telnetd in /usr/sbin, een opstartscript dat telnetd activeert, en configuratiebestanden met standaardwaarden. Ook vindt Firmwalker een leesbare RSA-private key (stunnel.key) en bestanden met wereld-schrijfbare permissies. Een aanvaller hoeft hier nog niets uit te buiten: het leeswerk alleen al levert een schat aan informatie op.

Stap 3: de router emuleren

Daar komt FirmAE om de hoek: een tool die de firmware op je eigen laptop laat opstarten, compleet met netwerkinterface. Na het opstartcommando meldt de geëmuleerde router zich op 192.168.0.1 en staat de webinterface er gewoon. Zo zet je FirmAE zelf op.

Stap 4: inloggen met een leeg wachtwoord

De webinterface vraagt om een admin-wachtwoord. De standaardwaarden uit de firmware (terug te vinden in defaultvalue.xml) suggereren dat het wachtwoord leeg mag zijn. En inderdaad: de eerste inlogpoging met een blanco wachtwoord slaagt direct. Bevinding één, en meteen een klassieke: veel apparaten verlaten de fabriek met een leeg wachtwoord, en een flink deel van de gebruikers past het nooit aan.

Stap 5: poorten scannen en de achterdeur vinden

Een nmap-scan op de geëmuleerde router laat zeven open poorten zien, waaronder enkele “onbekende”. Poort 31338 blijkt bij navraag een werkende telnetdienst te zijn: de combinatie met de gevonden telnetd-binary en het opstartscript S80telnetd.sh was geen toeval. Via die poort is de content van /var/passwd uit te lezen: gebruikersnaam en wachtwoord van de admin, in platte tekst. Nmap gebruik je trouwens vaker in ons vak: ook in de HTB-gereedschapskist hoort het bij de basisuitrusting.

Stap 6: commando-injectie via HNAP

Het zwaarste geschut volgt via HNAP, een op SOAP gebaseerd beheerprotocol dat op /HNAP1 bereikbaar is. De functie GetDeviceSettings vraagt geen authenticatie, en de parser die de SOAPAction-header verwerkt neemt ongefilterd input aan. Door achter de echte actie een slash met een backtick-commando te plakken, voert de router dat commando gewoon uit:

wget --timeout 1 --tries 1 \
  --header='SOAPAction: "http://purenetworks.com/HNAP1/GetDeviceSettings/`telnetd`"' \
  http://192.168.0.1/HNAP1

Het gevolg: poort 23 springt open en er staat een telnetd te wachten. Inloggen geeft een root-shell, zonder dat er ergens om gevraagd is. De volledige technische uitwerking, inclusief PoC-scripts, staat hier.

Stap 7: de buut

Via de root-shell is het configuratiebestand config.xml uit te lezen. Daar staan alle instellingen in: het admin-wachtwoord, de wifi-sleutels van alle netwerken inclusief het gastnetwerk, en zelfs de inloggegevens van de mobiele app. Met één geïnjecteerd commando ligt de complete router, en alles wat erachter hangt, open.

Hoe ernstig is dit? CVSS 9,4

De kwetsbaarheid is volgens de CVSS v3-calculator van NIST geclassificeerd met een score van 9,4 (critical). De redenering in het kort:

  • Geen authenticatie of speciale voorwaarden nodig; de aanvaller hoeft geen rechten te hebben.
  • De aanval werkt zonder tussenkomst van een gebruiker.
  • Volledig verlies van vertrouwelijkheid, integriteit en beschikbaarheid: alle bestanden lees- en wijzigbaar.
  • Reproductie is betrouwbaar en functioneel bewezen met een PoC.

Dat de fabrikant inmiddels een firmwarepatch heeft uitgegeven verandert weinig voor wie het oude toestel nog draait: end-of-life hardware krijgt die patch niet automatisch.

De bredere les: vertrouw geen zwart doosje

Wat dit onderzoek eigenlijk laat zien, is hoe dun de beveiliging van consumenten-IoT vaak is. Niet één megakwetsbaarheid, maar een stapeltje kleine keuzes: een leeg standaardwachtwoord, een beheerprotocol zonder authenticatie op één endpoint, ongefilterde invoer, verouderde BusyBox (1.14.1, met veertien bekende CVE’s), wereld-schrijfbare bestanden. Elke keuze alleen is al vervelend. Samen zijn het een open deur.

En de mobiele app die bij de router hoort bleek nauwelijks beter: zwakke MD5-hashing, een certificaatcontrole die alles goedkeurt en plain HTTP-verkeer. Dat verhaal lees je in ons artikel over het reverse-engineeren van de bijbehorende Android-app.

Verder lezen

Alle bevindingen uit dit onderzoek zijn verwerkt in mitigatie-adviezen en via responsible disclosure gemeld bij de fabrikant. Meer over de aanpak van het collectief lees je op onze Over Ons-pagina.