Wat zit er nou eigenlijk in dat .bin-bestand?
Vraag iemand wat er in een router zit en je hoort meestal “een besturingssysteem”. Klopt, maar dat systeem staat niet los op schijf: het is verpakt in één firmwarebestand dat je van de site van de fabrikant downloadt. In dit artikel pakken we zo’n bestand open en laten we zien wat erin zit, aan de hand van ons onderzoek van de D-Link DIR-890L (firmware 1.03B07). Na dit artikel kijk je nooit meer met dezelfde blik naar dat zwart doosje in de meterkast.
Stap 1: Binwalk, je eerste blik naar binnen
Binwalk ontleedt een firmware-image en laat zien wat er op welke plek in het bestand zit. De eerste scan ziet er ongeveer zo uit:
binwalk DIR890A1_FW103b07.bin
De uitvoer toont een bekende mengelmoes: een bootloader, een kernel-image en, de hoofdprijs, een SquashFS-bestandssysteem. Dat laatste is het complete Linux-systeem van de router: /bin, /etc, /usr, al het werk van de fabrikant. En het meest nuttige van alles: met de optie -e pak je het hele systeem uit naar een map die je gewoon kunt rondkijken.
binwalk -e DIR890A1_FW103b07.bin
cd squashfs-root
Stap 2: de structuur lezen als een verhaal
Een Linux-bestandssysteem is geen willekeurige hoop bestanden, en firmware al helemaal niet. Wie de structuur leest, begrijpt hoe het apparaat opstart en waar de interessante plekken zitten. Op de DIR-890L vallen een paar dingen op:
- /usr/sbin/telnetd en /etc/init0.d/S80telnetd.sh: de router bevat een volledige telnetdaemon, inclusief een opstartscript. Officieel uit, maar aanwezig en aanroepbaar.
- /htdocs: alle webcontent van de beheerinterface, inclusief een map HNAP1 met de XML- en PHP-bestanden van het beheerprotocol.
- /etc/defnodes/defaultvalue.xml: de fabriekswaarden, waaronder het standaard admin-account met een leeg wachtwoord.
- /etc/init0.d/rcS: het hoofdopstartscript dat alle scripts in /etc/init0.d in volgorde start.
Dat rcS-script is het waard even te lezen. Het loopt alle scripts die met S beginnen na en genereert daarbij netjes een stop-mechanisme. Zo’n script vertelt je precies welke diensten een router start, en dus welke diensten jij kunt tegenkomen zodra het apparaat live is.
Stap 3: Firmwalker, de geautomatiseerde ober
Handmatig rondkijken is leerzaam, maar voor een systematische sweep gebruik je Firmwalker: een script dat het uitgepakte bestandssysteem doorzoekt naar de klassieke blunders. Denk aan:
- Hardcoded wachtwoorden en sleutels
- Private keys (op de DIR-890L: een leesbare RSA-sleutel in stunnel.key, bruikbaar om versleuteld verkeer en updates te ontsleutelen)
- Configuratiebestanden met gevoelige inhoud (passwd, defaultvalue.xml)
- Web- en beheerdiensten (httpd, telnetd, upnp)
cd firmwalker
./firmwalker.sh /pad/naar/squashfs-root
De uitvoer is een soort boodschappenlijstje voor de volgende fase van je onderzoek. Niet alles is een kwetsbaarheid, maar alles is een startpunt.
Stap 4: permissies en gevaarlijke functies
Twee snelle checks die in vrijwel elke firmware iets opleveren.
Wereld-schrijfbare bestanden. Bestanden die iedereen mag wijzigen zijn in firmware een klassieke bron van escalatie:
find . -type f -perm 0777
Op deze router levert dat zeven bestanden op, voornamelijk binaries voor opslagbeheer (zoals hotplugd, sxstoragemanager, ntfs-3g). Het advies voor fabrikanten is simpel: 644 of 600, niet 777.
Gevaarlijke C-functies. Firmware van deze generatie zit vol met aanroepen van strcpy, sprintf, strcat en system, de functies die bekendstaan om buffer overflows en injectie mogelijk te maken. Ze zitten in de gedeelde bibliotheek libuClibc-0.9.32.1.so:
readelf -a libuClibc-0.9.32.1.so | less
De ELF-header vertelt je meteen waar je aan toe bent: 32-bit, ARM, little endian. Handig voor later, want precies die architectuur moet je emuleren in de volgende fase. Lees je daarna de kleine lettertjes van de firmware, dan begrijp je al vrij snel waarom de HNAP-injectie (die we hier uitgebreid behandelen) überhaupt kon werken.
Stap 5: verouderde componenten tellen
Een laatste statische check die veelzeggend is: welke versies van bekende componenten zitten erin? Op de DIR-890L:
- BusyBox 1.14.1, uit 2009, met veertien geregistreerde CVE’s, waaronder eentje waarbij een kwaadaardige DHCP-server commando’s kan uitvoeren via shell-metatekens (CVE-2011-2716).
- hostapd 0.5.9, de wifi-authenticatiedaemon, met tien bekende CVE’s uit 2017 rond WPA2-key-reinstallatie (de KRACK-familie).
Fabrieksoftware van 2015 die draait op componenten van 2009: dat is geen randgeval maar de standaard in consumenten-IoT. En juist daarom is dit soort onderzoek zo leerzaam en zo onthullend.
Wat doe je met al die kennis?
Statische analyse geeft je geen kwetsbaarheid op een presenteerblaadje, maar iets waardevullers: een plattegrond. Je weet welke diensten bestaan, welke bestanden interessant zijn en waar de volgende stap moet zoeken. In ons vervolgonderzoek hebben we de firmware daarna ook echt laten opstarten met FirmAE, zodat we alle bevindingen levend konden testen. Het complete verhaal van begin tot root-shell vind je in de walkthrough.
Checklist voor je eigen firmware-analyse
- Download firmware alleen van de officiële leverancierssite.
- Begin met
binwalk, pak uit metbinwalk -e. - Lees de init-scripts: ze vertellen welke diensten starten.
- Draai Firmwalker voor de geautomatiseerde sweep.
- Controleer permissies met
find . -perm 0777. - Noteer architecturen (readelf) en componentversies (BusyBox, hostapd, uClibc).
- Werk in een geïsoleerd lab: geen productnetwerken, geen onbekende firmware op je eigen router.
Ben je hier nieuw? Begin bij onze handleiding om je eerste eigen hacklab op te zetten, of bekijk de gereedschapskist voor de tools die je hier vaker tegenkomt.