Firmware emuleren met FirmAE: een router-lab zonder hardware

De router op je laptop

Het lastige aan IoT-onderzoek is niet de software, het is de hardware. Als je een router wilt uittesten, heb je het apparaat nodig, een voedingskabel, een plekje en het risico dat je je eigen netwerk in de soep draait. FirmAE lost dat op met een genereus gebaar: de tool emuleert de complete firmware op je eigen laptop, inclusief netwerkinterface. De router draait er, terwijl er geen router is.

In dit artikel zetten we FirmAE op en booten we de firmware van de D-Link DIR-890L, het apparaat uit ons IoT-onderzoek. Het is de opvolger van Firmadyne en vooral in het slagingspercentage: waar Firmadyne vaak achter Netgear- en TP-Link-images blijft steken, kent FirmAE betere ondersteuning voor onder andere D-Link, Tenda en tplink-varianten.

Wat je nodig hebt

  • Een Kali Linux (of andere Debian-achtige) virtuele machine. Ons artikel over je eerste eigen hacklab legt de basis uit.
  • FirmAE van GitHub, plus de binaries (binwalk, qemu-system-arm, een werkende PostgreSQL).
  • Het firmwarebestand van het apparaat dat je wilt onderzoeken.
  • Een gedoseerd portie geduld: emulatie is kunst met vallen en opstaan.

Stap 1: FirmAE installeren

git clone --recursive https://github.com/firmadyne/FirmAE.git
cd FirmAE
sudo ./install.sh
./init.sh

Let op: init.sh herstart PostgreSQL en vraagt om je sudo-wachtwoord. De database is nodig omdat FirmAE per image bijhoudt wat er geëmuleerd is en welke netwerkconfiguratie werkte.

Stap 2: de firmware door de haalbaarheidscheck halen

Niet elke firmware laat zich emuleren. FirmAE heeft daarom een ingebouwde testmodus:

sudo ./run.sh -d dlink firmwares/DIR890A1_FW103b07.bin

De vlag -d start de debug-modus. Wat er dan gebeurt is een klein wonder om te zien:

[*] firmwares/DIR890A1_FW103b07.bin emulation start!!!
[*] extract done!!!
[*] get architecture done!!!
[*] infer network start!!!
[+] Network reachable on 192.168.0.1!
[+] Web service on 192.168.0.1

FirmAE pakt de image uit, bepaalt de architectuur (ARM, in dit geval), zoekt uit welke netwerkconfiguratie het systeem gebruikt en brengt vervolgens via een virtueel TAP-apparaat je laptop en de “router” bij elkaar. De geëmuleerde router meldt zich op 192.168.0.1 en de webinterface is in je browser te bereiken. Bij de DIR-890L werkt dit meteen: open je browser, ga naar 192.168.0.1 en kijk naar een opstartende router die alleen in software bestaat.

Stap 3: de debugger in

Nadat de firmware draait, krijg je het debug-menu aangeboden:

------------------------------
|       FirmAE Debugger      |
------------------------------
1. connect to socat
2. connect to shell
3. tcpdump
4. run gdbserver
5. file transfer
6. exit

Optie 2 (connect to shell) is de snelste weg naar een prompt op het systeem. Vanaf daar zit je in een echte shell op de geëmuleerde router, met toegang tot het bestandssysteem van de firmware. Alle dingen die je in de statische analyse alleen kon lezen, kun je nu levend controleren.

De overige opties zijn goud waard voor dieper onderzoek: tcpdump om verkeer op te nemen (handig om het beheerprotocol te volgen) en gdbserver om processen te debuggen terwijl ze draaien.

Stap 4: het image bij de les houden

Een handige extra: terwijl de firmware draait, kun je het image van de geëmuleerde router mounten:

sudo ./scripts/mount.sh 1

Daarmee koppel je het bestandssysteem van de draaiende “router” aan je eigen host-systeem. Bestanden aanpassen, patches testen, config-bestanden lezen: het kan allemaal zonder telnet-sessie. Sluit je af met umount voordat je de emulatie stopt, anders kan het image inconsistent raken.

Stap 5: scannen vanaf de host

Eenmaal opgestart, behandel je de geëmuleerde router als elk ander doelwit in je lab:

nmap -p- 192.168.0.1

Op de DIR-890L levert dat zeven open poorten op: 53 (DNS), 80 (web), twee onbekende hoogpoorten (31338, 49152, 63481) en de poorten die bij de virtualisatie zelf horen. Poort 31338 bleek in ons onderzoek een vergeten telnetd-dienst, en daarmee de eerste deur naar binnen. Het vervolg daarvan lees je in de complete walkthrough.

Vallen en valkuilen

  • Niet elke image start. Als de netwerkinferentie faalt, probeer FirmAE dan met andere images van dezelfde fabrikant. De haalbaarheidsdatabase op de FirmAE-pagina geeft per model een indicatie.
  • IP-adres klopt niet. De meeste routers willen op 192.168.0.1 of 192.168.1.1 zitten. Check met ifconfig in de emulatieshell welk adres de firmware echt gebruikt.
  • Houd je host buiten je eigen netwerk. Ook al is het een emulatie: de firmware is en blijft onbekende software. Doe dit niet op je thuisnetwerk, en al helemaal niet met de bridge-instellingen aan.
  • Soms is het beeld groter dan de werkelijkheid. Een webinterface die in de browser laadt, wil nog niet zeggen dat alles start. Controleer in de shell of de diensten echt draaien.

Waarom emulatie zoveel meer is dan een trucje

De kracht van FirmAE is niet dat het grappig is (dat wel), maar dat het onderzoek reproduceerbaar maakt. Iedereen met een laptop kan exact hetzelfde onderzoek overdoen, zonder het apparaat te hoeven kopen of te riskeren. Voor ons collectief is het dé manier om kwetsbaarheden in end-of-life firmware te documenteren en te delen. Het is ook een uitstekende oefening richting Hack The Box: dezelfde denkstappen (verkennen, scannen, misbruiken), alleen nu op een apparaat dat echt in huiskamers staat.

Ben je er klaar voor? Volgende stap in de reeks: HNAP-commando-injectie, of hoe één SOAP-header genoeg was voor root.