Zo hack je de software in je hardware

© PXimport

Zo hack je de software in je hardware

Geplaatst: 11 maart 2022 - 07:26

Aangepast: 17 november 2022 - 08:55

Koen Vervloesem

Bij hacken denken we vaak aan software die op een computer draait, maar er draait ook heel wat software in allerlei andere elektronische apparaten, zoals ESP8266- of ESP32-microcontrollerbordjes, een bluetooth-beacon of een Apple AirTag. Hoe haal je daar gevoelige informatie uit of pas je de werking van het apparaat aan?

Hardware-hacken is een heel breed domein en in deze ene masterclass kunnen we daar helemaal geen recht aan doen. Maar we tonen je enkele voorbeelden van wat er zoal mogelijk is. We hopen dat je daardoor geïnspireerd raakt om zelf op onderzoek uit te gaan.

Laten we beginnen met iets eenvoudigs. In PCM hebben we al vaak gewerkt met ESP8266- en ESP32-microcontrollerbordjes. Je schreef je code daarvoor, compileerde die en schreef die dan naar het ontwikkelbordje. Dat deed je bijvoorbeeld met:

- Arduino IDE;

- Arduino IoT Cloud;

- PlatformIO;

- ESPHome;

- esptool.

Wifi-wachtwoorden ontfutselen

Met een ESP8266 of ESP32 wil je bijna altijd met een wifi-netwerk verbinden. In je code geef je dus de SSID en het bijbehorende wachtwoord op van het gewenste wifi-netwerk. Dat wordt door esptool naar het flashgeheugen van je microcontroller geschreven. Vaak is dit gewoon onversleuteld, zodat iedereen met toegang tot de microcontroller je wifi-wachtwoord kan uitlezen. De ESP32 ondersteunt wel flash-encryptie met een sleutel die zich in de registers van de microcontroller bevindt. Maar dit wordt nog niet al te vaak gebruikt.

Je mag er dus van uitgaan dat heel wat ESP8266- en ESP32-bordjes, ook degene die jij in je huis hebt ingezet, je wifi-wachtwoord onversleuteld hebben opgeslagen. Iemand die een van je ontwikkelbordjes steelt, kan hier dus je wifi-wachtwoord uit ontfutselen en zo in je netwerk inbreken. Dit is ook iets om mee rekening te houden als je een defect ontwikkelbordje weggooit: hier kunnen nog allerlei gevoelige gegevens uitgehaald worden. Als je het flashgeheugen niet kunt overschrijven of vernietigen, dan zit er niet anders op dan het bordje bij je te houden tot je je wifi-wachtwoord hebt veranderd.

Flashgeheugen uitlezen

Het flashgeheugen van een ESP8266 of ESP32 uitlezen is even eenvoudig als er firmware naar schrijven. Dat doe je met het programma esptool. Als je de programmeertaal Python hebt geïnstalleerd en de bijbehorende pakketbeheerder pip, dan installeer je esptool eenvoudig met de opdracht:

pip3 install esptool

Sluit nu je ESP8266- of ESP32-ontwikkelbordje via een usb-kabel op je computer aan en identificeer de chip met:

esptool.py flash_id

Je krijgt dan iets te zien als:

esptool.py v3.1

Found 1 serial ports

Serial port /dev/ttyUSB0

Connecting....

Detecting chip type... ESP8266

Chip is ESP8266EX

Features: WiFi

Crystal is 26MHz

MAC: 2c:3a:e8:10:db:a3

Uploading stub...

Running stub...

Stub running...

Manufacturer: ef

Device: 4016

Detected flash size: 4MB

Hard resetting via RTS pin...

Je ziet dat het hier om een ESP8266EX gaat en dat die 4 MB flashgeheugen heeft. Dat laatste is belangrijk als je het hele flashgeheugen wilt uitlezen. Dat doe je nu met de volgende opdracht:

esptool.py read_flash 0x0 0x400000 esp8266.bin

Deze opdracht leest het flashgeheugen van adres 0 tot 0x400000 (hexadecimaal voor 4 MB) uit en slaat dit op in het bestand esp8266.bin.

De ESP8266 en ESP32 zijn eenvoudig te manipuleren via de usb-aansluiting (bron: Espressif).

© PXimport

Firmware analyseren

Je hebt nu een kopie van de firmware die op je ESP8266 draait en deze kun je verder op je computer analyseren. Als je op een Linux-computer werkt, is de tool strings meestal standaard geïnstalleerd (onderdeel van het pakket binutils): die toont je alle leesbare tekenreeksen in een binair bestand. In Windows maakt een gelijknamig en bijna identiek programmaonderdeel uit van Windows Sysinternals.

Je past het als volgt toe in een opdrachtvenster:

strings esp8266.bin

Toen we dit toepasten op ESPHome-firmware in onze ESP8266, vonden we onmiddellijk de SSID en wachtwoord van ons wifi-netwerk. Die kwamen zelfs bij herhaling voor in het bestand.

De opdracht strings is ook handig om te weten te komen met wat voor soort firmware je te maken hebt. Je ziet er snel functieaanroepen, versienummers en zelfs volledige html-code van een ingebouwde webinterface.

Via een entropiegrafiek krijg je een idee in welk deel van de firmware iets versleuteld is

-

Binwalk

Als je wat meer informatie te weten wilt komen over de structuur van het firmwarebestand, is het programma binwalk handig. Dit scant de inhoud van een firmwarebestand op bepaalde signatures, en zo kan het bestandssystemen of bestanden in de firmware detecteren en zelfs uitpakken.

Stel dat je binwalk uitvoert op een firmwarebestand en je krijgt het volgende te zien:

2837765 0x2B4D05 JPEG image data, EXIF standard

Dan weet je dat op adres 0x2B4D05 een jpeg-bestand start. Hoe haal je dit nu uit de firmware? Je kunt eenvoudig alle herkende bestandstypes extraheren met de opdracht:

binwalk -e firmware.bin

Je kunt het extraheren ook beperken tot een specifiek type data waarin je geïnteresseerd bent:

binwalk -D jpeg firmware.bin

Een andere nuttige functie van binwalk is de berekening van entropie (wanorde):

binwalk -E firmware.bin

Dit toont een grafiek met op de horizontale as de geheugenadressen en op de verticale as de entropie van 0 tot 1.

Entropie is een maat voor wanorde of willekeur. De geheugengebieden waar de entropie 0 is, zijn gebieden waar dezelfde byte (bijvoorbeeld 0x00 of 0xFF) herhaald wordt. Gebieden waar de entropie 1 is, bevatten volledig willekeurige bytes. Meestal is dat een teken dat deze gebieden versleuteld zijn. Licht de entropie dicht tegen 1 en schommelt die wat, dan is het gebied waarschijnlijk gecomprimeerd. En zie je dat een specifiek gebied een merkelijk lagere entropie heeft dan andere gebieden, dan weet je dat hierin veel herhaling voorkomt. De entropiegrafiek is dus een handige manier om te onderzoeken welke geheugengebieden in de firmware extra aandacht verdienen.

Met een entropiegrafiek van binwalk zie je snel welke geheugengebieden van de firmware extra aandacht verdienen.

© PXimport

ImHex

Een grafisch programma om firmware te analyseren is ImHex, het is een hexeditor voor reverse-engineering. Het programma is te downloaden voor Windows, Linux en macOS. Open je firmwarebestand in ImHex en vink in het menu View de weergaven aan die je wilt zien.

Met Hex editor krijg je de data in het bestand te zien, met links de hexadecimale waardes van de bytes en rechts de overeenkomstige leesbare tekens die deze bytes als hun ASCII-code hebben. Met Strings kun je ImHex laten zoeken naar leesbare tekenreeksen van een opgegeven minimumlengte.

ImHex bevat allerlei tools om firmwarebestanden te analyseren.

© PXimport

Chips identificeren

Niet alle elektronica heeft een eenvoudige seriële aansluiting via usb. Vaak moet je specifieke pinnen of testpunten op een printplaatje verbinden om het geheugen van de microcontroller uit te lezen. Als je geen technische documentatie over het product vindt, dien je eerst de chip te identificeren. Een vergrootglas of een digitale microscoop kan hierbij helpen. Zelf proberen we dit uit met een bluetooth-beacon dat we op AliExpress hadden gekocht.

Wanneer we de chip onder de microscoop leggen, zien we duidelijk dat het om een nRF51822 van Nordic Semiconductor gaat, een populaire ARM-chip met bluetooth-ondersteuning. Er lopen ook duidelijke sporen van de pinnetjes aan de zijkant van de chip naar een rij met testpunten. We willen vervolgens te weten komen waarvoor die testpunten dienen, en of ze ons kunnen helpen om het geheugen van de processor uit te lezen.

Deze nRF51822 op een bluetooth-beacon heeft sporen naar enkele goed toegankelijke testpunten.

© PXimport

Testpunten identificeren

Om de pinnetjes van een microprocessor te identificeren, moeten we in de datasheet van de processor duiken. We zoeken in het InfoCenter van Nordic Semiconductor naar de product specification van de nRF51822. Op pagina 11 vinden we de pinnen van de QFN48-uitvoering van de nRF51822. De labels op de chip begint met QF, net zoals bij ons exemplaar.

Let op het zwarte bolletje in de linkerbovenhoek op de afbeelding met de pintoewijzing (zie boven/onder/plaatsaanduiding). Dit komt overeen met het bolletje op de chipbehuizing op je printplaatje. Oriënteer de chip hetzelfde. Je ziet dan in de afbeelding dat de pin rechtsonder in de onderste rij SWDCLK is en links ernaast SWDIO. Helemaal links zie je VSS, wat de negatieve spanning is (GND). In het rijtje pinnen links zie je twee keer VDD, de positieve spanning. Met deze vier pinnen weten we genoeg om verder te gaan. We hoeven alleen de sporen van die pinnen naar de overeenkomende testpunten te volgen. Voor SWDCLK en SWDIO is dat eenvoudig te zien: dat zijn de twee testpunten aan de rechterkant van de rij.

In de productspecificatie van de nRF51822 vind je de toewijzing van alle pinnen.

© PXimport

Serial Wire Debug (SWD)

De nRF51822 is een ARM Cortex-M0 32bit-processor, uitgerust met Serial Wire Debug (SWD). Dit is een debugpoort waarover kleinere ARM-processoren wel vaker beschikken. Ze bestaat uit twee pinnen (SWDIO en SWDCLK of ook wel SWCLK), en dan uiteraard nog een voedingspin en GND. Via SWDIO worden de data uitgewisseld, terwijl SWDCLK het kloksignaal vervoert.

Er is geen algemeen geldende standaardlay-out voor de SWD-pinnen, dus die zul je moeten uitzoeken. Op de meeste printplaatjes in commerciële producten zullen er geen labels bij de pinnen afgedrukt zijn. Zo ook bij het bluetooth-beacon dat we onderzochten. Maar als je de testpunten eenmaal geïdentificeerd hebt, is het een kwestie van een SWD-debugger op de correcte testpunten aan te sluiten.

Positieve en negatieve spanning identificeren

De SWDIO- en SWDCLK-testpunten hebben we al geïdentificeerd, terwijl VDD en GND moeilijker te identificeren zijn. Daarvoor heb je een multimeter nodig. Maar eerst moet je het printplaatje goed fixeren, zodat je er eenvoudig met meetpennen spanningen op kunt meten. Wij zijn zelf fan van de PCBite Kit van Sensepeek. Je plaatst twee of meer standaarden magnetisch op een metalen onderplaat, en bovenaan de standaarden klem je het printplaatje vast.

Plaats de batterij nu in het bluetooth-beacon. Het apparaatje start op en begint bluetooth-signalen uit te zenden. De SWD-testpunten hebben we al geïdentificeerd, dus nu is het enkel belangrijk om VDD en GND te vinden. Stel je multimeter in op een gelijkspanningsbereik rond 3 V, leg de zwarte meetpen van de multimeter op één testpunt en de rode op een ander testpunt. Zodra je een continue spanning van 3,3 V tussen beide punten meet, weet je dat het testpunt met de zwarte meetpen GND is en het testpunt met de rode meetpen VDD. Je hebt nu alle vier de benodigde testpunten geïdentificeerd.

Controleer met een multimeter welke testpunten VDD en GND zijn.

© PXimport

SWD-debugger aansluiten

Om met deze testpunten te verbinden, heb je een SWD-debugger nodig. Wij gebruiken de Black Magic Probe, een JTAG- en SWD-debugger voor ARM Cortex-microcontrollers (Cortex-M en Cortex-A). In tegenstelling tot vele andere SWD-debuggers heb je hiervoor geen speciale software nodig, alleen gdb uit de GNU Arm Embedded Toolchain. Deze kun je op de website van ARM downloaden voor Windows, Linux en macOS.

Voor dit soort bewerkingen op printplaatjes met testpunten is de combinatie van de Black Magic Probe met de testnaalden van de PCBite Kit ideaal. Deze testprobes hebben een heel dunne naald die je op het kleinste testpunt laat rusten en die dan door het gewicht op de juiste plaats blijft liggen. De arm blijft magnetisch op de metalen onderplaat bevestigd. Aan de kop met de testnaald zijn twee pinnen te vinden waarop je jumperwires kunt aansluiten. De andere kant van de jumperwires sluit je aan op de overeenkomstige pinnen van het 7-pins JTAG-adapterbordje waarmee de Black Magic Probe wordt geleverd. Sluit SWDIO aan op TMS/SWDIO, SWDCLK op TCK/SWCLK, VSS op GND en VDD op VCC/tVref.

De testnaalden van de PCBite Kit zijn ideaal om met de testpunten van het bluetooth-beacon te verbinden zonder dat je hoeft te solderen.

© PXimport

Continuïteit testen

De Black Magic Probe en de PCBite Kit vormen de ideale combinatie

-

SWD in GDB

Sluit nu de usb-poort van de Black Magic Probe aan op je computer en kijk welke COM-poort (in Windows) of welk TTY-apparaat (in Linux of macOS) eraan wordt toegekend. De Black Magic Probe geeft zich uit voor twee seriële apparaten: een voor SWD en een voor UART. Start nu de ARM-versie van gdb en verbind met de gdb-server op de Black Magic Probe met de opdracht:

arm-none-eabi-gdb -ex "target extended-remote /dev/ttyACM0"

Gebruik het juiste apparaatbestand voor jouw situatie. Scan daarna in de debugger naar een SWD-apparaat:

monitor swdp_scan

Als je het volgende ziet in het opdrachtvenster, dan heb je geen correcte verbinding met een of meer van de testpunten:

Target voltage: 0.0V

SW-DP scan failed!

Kijk alles dan nog eens na. Mogelijk ligt een van de testnaalden net naast een testpunt.

Je zou iets moeten zien als:

Target voltage: 3.1V

Available Targets:

No. Att Driver

1 Nordic nRF51 M0

Verbind dan met doel 1:

attach 1

De waarschuwing die je dan krijgt, mag je negeren.

Firmware uitlezen via SWD

Je wilt nu de firmware uit het geheugen uitlezen en naar een bestand schrijven. In de productspecificatie van de nRF51822 vinden we dat het flashgeheugen van de microcontroller 256 of 128 KB groot is. Voor de nRF51822-QFAA is dat 256 KB. Dan lezen we de eerste 256 KB van het geheugen uit, omdat de code zich volgens de memory-map in de productspecificatie aan het begin bevindt:

dump binary memory nrf51822-beacon.bin 0x000000 0x040000

Als je een foutmelding krijgt dat je het geheugen niet kunt uitlezen, dan heeft de fabrikant de leesbeveiliging van de nRF51822 ingeschakeld. Er zijn manieren om dit te omzeilen en er bestaan tools die je daarmee helpen, maar dat zou te ver gaan in dit artikel. Zoek maar eens op nRF51822 Read Back Protection Configuration of RBPCONF.

Verlaat nu gdb met quit en bevestig dat je het doel wilt afkoppelen.

Firmware disassembleren met ImHex

Nu kun je het opgeslagen firmwarebestand weer openen met ImHex. In plaats van tekenreeksen te zoeken, gaan we nu de machinecode disassembleren. Kies daarvoor in het menu View de Disassembler View. Vul bij Code region het adresbereik in van 0 tot 3FFFF. Kies bij Settings als architectuur ARM32, Little Endian, Thumb mode en Cortex-M mode.

Klik op Disassemble, waarna je de firmware te zien krijgt als assembler, een min of meer leesbare vorm van machinecode. Je kunt hetzelfde overigens ook op de opdrachtregel doen met de opdracht arm-none-eabi-objdump uit de GNU Arm Embedded Toolchain:

arm-none-eabi-objdump -D -bbinary -marm nrf51822-beacon.bin -Mforce-thumb > nrf51822-beacon.s

Het resultaat vind je in het bestand nrf51822-beacon.s.

Een complete analyse van de code gaat te ver in dit artikel, maar in principe kun je hier nu ook code gaan aanpassen, het firmwarebestand opslaan en daarna de aangepaste firmware met de Black Magic Probe via SWD weer naar het flashgeheugen van de chip schrijven.

Disassembleer de ARM Cortex-M-firmware in ImHex.

© PXimport

Een kleine puls schakelt de leesbeveiliging van de nRF52832 uit

-

Apple AirTags reverse-engineeren

Een groot deel van hardware-hacken bestaat uit het reverse-engineeren van de hardware en de firmware/software die erop draait. Een goed voorbeeld hiervan vind je op de webpagina Apple AirTag Reverse Engineering van Adam Catley. Hierop heeft de beveiligingsonderzoeker alle informatie verzameld die hij over de AirTag heeft gevonden, ook van andere onderzoekers.

Interessant aan de AirTag is dat Apple gebruikmaakt van de functie Access Port Protection (APPROTECT) van de nRF52832-chip, een geavanceerdere bescherming tegen het uitlezen van het interne flashgeheugen via de SWD-poort dan RBPCONF bij de nRF51822. Maar net zoals RBPCONF is ook APPROTECT niet onfeilbaar. Hacker LimitedResults vond in 2020 een manier om APPROTECT te omzeilen.

De truc zit erin om het hardware-initialisatieproces dat de bescherming van het flashgeheugen instelt, tijdens het opstarten uit te schakelen. Dat gebeurt door enkele condensatoren van het printplaatje te verwijderen en op het juiste moment een kleine puls aan te brengen op de juiste pin. Op die manier slaagde hacker Ghidra Ninja erin om het flashgeheugen van de AirTag volledig uit te lezen.

AirTag inbouwen

Adam Catley is nog verder gegaan en hij heeft een AirTag volledig gedemonteerd en in een afstandsbediening ingebouwd. Door de demontage van de behuizing krimpt de diameter van 32 mm tot 26 mm en de hoogte van 8 mm tot 3,3 mm, waardoor het in heel wat apparaten in te bouwen is.

In zijn afstandsbediening krijgt de AirTag stroom via de batterij van de afstandsbediening. De volledige functionaliteit van de AirTag blijft behouden en de ingebouwde microfoon werkt zelfs nog beter omdat de behuizing van de afstandsbediening als diafragma werkt.

Een AirTag inbouwen in een afstandsbediening is een fluitje van een cent (bron: Adam Catley).

© PXimport

BitLocker-decryptiesleutel uit TPM-chip halen

De BitLocker-decryptiesleutel van deze laptop is via de SPI-bus af te luisteren (bron: Dolos Group).

© PXimport

Deel dit artikel
Voeg toe aan favorieten