HackRF One – Deurbel Fun
Jaaaaaa vandaag is het zover… ik ga mijn eigen deurbel hacken!!! Aaaaa mijn eigen belletje. In weer en wind hangt hij daar gedwee te wachten en te wachten. En als iemand erop drukt, visite, verkopers of Jehova’s Getuigen dan klinkt hij altijd even vrolijk. Dat vrolijke geluidje wil ik ook graag kunnen triggeren zonder naar buiten te gaan en op het knopje te drukken. Vanuit mijn luie stoel… gewoon omdat het kan.
Frequentie zoeken
Het allereerste wat we moeten ontdekken is de frequentie waarop de bel opereert. De draadloze bel en ontvanger staan namelijk met elkaar in contact middels een specifieke (vanuit de fabriek) gedefinieerde frequentie. Ik heb de volgende bel:

Maar dan weten we nog niet heel veel meer dan dat het een Byron bel is. Belangrijk is om te weten wat voor bel we hebben. Als ik achterop de bel kijk krijg ik echter al veel meer informatie:

De ontvanger is een Byron BY501E en de bel zelf is een Byron BY37. Interessanter is nog wel dat de frequentie waarop ze opereren gewoon achterop vermeld staat. Namelijk 433.92 MHz (of 433920000 Hz).
Er zijn veel apparaten waar de actieve frequentie niet op het label vermeld staat. Laten we voor de grap doen alsof dat ook bij deze bel niet het geval was. Dan zijn er nog 3 manieren om uit te vinden op welke frequentie het apparaat opereert.
1. De meeste apparaten opereren tussen de 300 en 500 MHz frequentie. Je kunt met je SDR apparatuur de frequentieband uitlezen en kijken wanneer er een piek te zien is als het apparaat geactiveerd wordt. De piek geeft vervolgens aan op welke frequentie het apparaat functioneert. Dit is een langzame trail & error tactiek die ik als last resort zou toepassen.
2. Sommige apparaten (vooral Amerikaanse apparaten omdat de FCC het hier verplicht stelt) vermelden een zogenaamde FCC ID. Dit is het “Federal Communications Commission IDentification” nummer van het apparaat. En, handig voor ons bestaat er een FCC database waarbij we kunnen zoeken op het FCC ID om alles over dit apparaat te weten te komen. De FCC database is te vinden op: https://www.fcc.gov.
3. Wij hebben geen FCC ID vermeld staan op deze Byron, dus op naar methode 3. Als het lukt, schroef dan het apparaat eens open. In het apparaat bevindt zich namelijk de chipset. Soms staan er op de chips nummers vermeld die we op kunnen zoeken om zo de juiste frequentie erbij te zoeken. De binnenkant van de Byron bel ziet er als volgt uit:

Als we beter naar het chipset kijken dan zien we wel degelijk het typenummer van het chipset PT4317-S:

Een Google search brengt ons dan snel naar de volgende pagina: http://www.datasheetspdf.com/datasheet/PT4317.html waar we specificaties van het chipset kunnen vinden en de volledige datasheet kunnen downloaden.
We hebben hier te maken een PTC Low Power 315/433 MHz OOK/ASK Superheterodyne Receiver. De eerste regel geeft ons al hele goede informatie in de juiste richting:
The PT4317 is a low power single chip OOK/ASK superheterodyne receiver for the 315MHz and 434MHz frequency bands that offers a high level of integration and requires few external components.
Dus de receiver is geoptimaliseerd voor de 325 MHz en 434 MHz band Met deze informatie alleen is het sniffen naar de juiste frequentie een stuk makkelijker geworden. Stel je SDR apparatuur in op de 315 en 434MHz band en kijk bij welke van de 2 je een piek ziet wanneer de bel ingedrukt wordt.
In de datasheets kunnen we hele interessante informatie ophalen, een paar voorbeelden:



En zo is er nog veel meer informatie over de chipset te vinden. Bovenstaande pagina uit de datasheet verteld ons de exacte frequentie zoals deze ook achterop het label van de bel vermeld staat. 433.92 MHz. Dat is dus onze frequentie waar we mee aan de slag gaan.
Signaal opnemen
Nu we weten op welke frequentie de bel opereert kunnen we het signaal gaan opnemen. Het opgenomen signaal kunnen we later verzenden op de juiste frequentie om de bel te activeren. Dit signaal heeft een bepaald ritme (een bepaalde vorm). De ontvanger moet deze vorm juist ontvangen om geactiveerd te worden.
Om dit te bekijken gebruiken we GQRX. We stellen deze applicatie in op 433.92 MHz en drukken de deurbel in om te kijken of we het signaal kunnen zien:

En ja hoor, de piek in de frequentie is de deurbel die ingedrukt wordt.
Nu we het signaal kunnen zien kunnen we het ook opnemen in GQRX. We gaan het signaal opnemen in een WAV bestand. We drukken een aantal keer op de bel en nemen de hele stream op.
Nu we het signaal hebben opgenomen in een WAV bestand (audio bestand) kunnen we het analyseren in een audio applicatie zoals Sound Forge of de gratis applicatie Audacity. Als we het WAV bestand openen ziet het er als volgt uit:

Alle 4 de keren dat we de bel ingedrukt hebben ziet het signaal er hetzelfde uit. Dus wat zit er in 1 signaalstroom?
En als we verder inzoomen op 1 signaalstroom volgt het volgende resultaat:

De signaalstroom bestaat uit een repeterend signaal welke iedere keer (nagenoeg) hetzelfde is:


Nu moeten we dit signaal omzetten in bits (0en en 1en). De pieken in het signaal zijn een serie aan 1en en de witruimtes een serie van 0en.

Nu moeten we uitvogelen hoeveel 0en en 1en er in de signaalreeks zitten. Hiervoor gaan we uit van de kleinste waarde. De kleinste waarde is 1 bit.

Nu we weten hoe groot 1 bit is kunnen we 1 van de repeterende gedeeltes om gaan zetten in bits:

1 compleet repeterend gedeelte ziet er dan uit als:
1001001001011001011011011011001011001001001001011001001001001000000
Omgezet in bytes:
10010010 01011001 01101101 10110010 11001001 00100101 10010010 01001000 000
Bovenstaande repeterende deel komt 50x voor in het hele signaal. We tellen hier 67 bits per deel. Het laatst deel heeft 61 bits omdat hier de laatste 6 nullen wegvallen. We hebben dus in totaal 67 x 50-6 = 3344 bits = 418 bytes.
Deze bytes gaan we omzetten naar hexadecimaal. Het voorgaande voorbeeld ziet er dan dus uit als:
92 59 6D B2 C9 25 92 48
We zetten de bits om in hexadecimale code omdat dit de code is die we gaan verzenden. Om hexadecimale code te verzenden beginnen we elke hexadecimale code met een “\x”.
Deze reeks:
92 59 6D B2 C9 25 92 48
Wordt:
\x92\x59\x6D\xB2\xC9\x25\x92\x48
De gehele bitsstring omgezet in bytes en hexadecimaal ziet er als volgt uit:

We zijn nu klaar om de code terug te sturen. Dit doen we via GNURadio of ander Python based script. Voor hexadecimale code gebruik ik een simpel RFCat based script zoals:

Ding Dong… en zo “simpel” is het om een deurbel te hacken. Uiteraard zijn er zeer veel methodes. Een simpele “replay” attack werkt ook prima. Het doel van deze post is om te laten zien dat “normale” radio-controlled apparaten zonder verdere security mechanismen relatief gemakkelijk te hacken en misbruiken zijn.