2024-11-25
Table of Contents
Overview
Hallo zusammen 👋,
mittlerweile besitzt fast jeder zu Hause Lampen oder LED-Strips, die mit einer Fernbedienung gesteuert werden können.
Doch wie funktionieren diese Fernbedienungen und kann jeder die dazugehörigen Lampen mit genug Informationen steuern?
In diesem Blogartikel werden ich die sogenannten Replay Attacken am Beispiel vom Flipper Zero für Infrarot Fernbedienungen tiefgehender durchleuchten und anhand eines Praxisbeispiel vorstellen.
Getting Started
Um Infrarot Signale zu empfangen und zu senden werde ich der einfachheit halber den Flipper Zero verwenden.
Bei einem Replay Angriff zeichnet der Angreifer das Signal eines fremden Senders auf, um sich später als der Sender auszugeben und mit dem Empfänger an dessen Stelle zu kommunizieren.
Aufzeichnen eines Infrarot-Signals
Der Flipper Zero ist aus dem UI heraus leider nicht in der Lage, Infrarot Signale im RAW-Format zu lesen, sondern interpretiert diese immer direkt. Um RAW-Signale zu lesen, muss die CLI auf https://lab.flipper.net/cli verwendet werden.
Sobald der Flipper mit einem WebSerial API fähigem Browser wie Google Chrome verbunden wurde, kann ein Signal mit dem folgenden Befehl eingelesen werden.
>: ir rx raw
Receiving RAW INFRARED...
Press Ctrl+C to abort
RAW, 75 samples:
9131 4535 588 555 587 555 587 555 587 555 587 528 614 524 618 554 588 555 588 1670 587 1640 617 1641 616 1669 588 526 616 1641 616 1641 616 1638 619 1640 617 1670 587 555 588 528 614 526 616 526 616 555 588 554 588 555 587 555 587 1642 616 1669 588 1639 618 1642 615 1670 587 1641 616 41353 9126 2253 586 96844 9158 2253 586
>:
Nach Ausführen des Befehls muss einfach auf einer Infrarotfernbedienung auf zum Beispiel den "An" Knopf geklickt werden und die von Flipper leicht vorverarbeiteten Daten werden ausgegeben.
Der Flipper Zero unterstützt und erkennt nativ viele verschiedene Protokolle wie beispielsweise NECext, wenn die in der Flipper Zero eingebaute lese Funktion verwendet wird.
Alle Protokolle sind unter https://github.com/jamisonderek/flipper-zero-tutorials/wiki/Infrared von Derek Jamison aufgelistet worden.
Mithilfe dieser Daten kann jetzt eine Flipper Zero Infrared Datei erstellt werden, damit wir uns das Signal genauer ansehen und später wieder senden können.
Für Infrarot verwendet der Flipper Zero die Frequenz 38000 Hz und als Duty Cycle 0.33 laut dem Code auf GitHub.
Filetype: IR signals file
Version: 1
#
name: data
type: raw
frequency: 38000
duty_cycle: 0.33
data: 9131 4535 588 555 587 555 587 555 587 555 587 528 614 524 618 554 588 555 588 1670 587 1640 617 1641 616 1669 588 526 616 1641 616 1641 616 1638 619 1640 617 1670 587 555 588 528 614 526 616 526 616 555 588 554 588 555 587 555 587 1642 616 1669 588 1639 618 1642 615 1670 587 1641 616 41353 9126 2253 586 96844 9158 2253 586
Dekodieren des Signals
Flipper Zero RAW-Daten enthalten die Länge eines Signals in digitaler Form mit High und Lows. Das erste Datensegment ist immer ein Low. Diese Datei kann jetzt von einem Puls Plotter wie maehw/SerialHex2FlipperZeroInfrared in einen Graphen umgewandelt werden. Wie zu sehen ist, fängt der Graph mit einem ~ 9ms langem Low an.
Der schwierige Part besteht darin, herauszufinden, welches Protokoll das Gerät verwendet. Selbst der Flipper Zero probiert nur für alle unterstützten Protokolle die Nachricht zu decodieren und wenn die Nachricht dem entsprechenden Format entspricht, gilt das Protokoll als erkannt.
Der erste lange ~9ms High burst weist auf das NEC Protokoll hin. Ebenfalls die 32 folgenden Bits entsprechen dem Format.
Es existieren jedoch zwei verschiedene 32 Bit NEC Protokolle: NEC und NECext.
NEC invertiert die Adresse und den Command, damit der Empfänger überprüfen kann, ob es Probleme bei der Übermittlung gab. Da in unserem Fall Laborbedingungen herrschen und daher mit keinen Problemen zu rechnen ist, sollte die Adresse richtig invertiert sein.
Abgerufen von https://www.sbprojects.net/knowledge/ir/nec.php am 14.11.2024
Die längeren Balken in unserer Visualisierung entsprechen einer 1 und die kürzeren einer 0. Daher ergibt sich die folgende Nachricht:
| 00000000 | 11110111 | 11000000 | 00111111 |
Da die Adresse `(00000000) != ~(11110111)`, kann es sich nicht um das normale NEC-Protokoll handeln. Dennoch ist der Befehl `(11000000) == ~(00111111)` korrekt übertragen worden.
NECext ist eine Erweiterung des NEC-Protokolls, die den Adressbereich von 8 auf 16 Bits erweitert und die Redundanz durch die Inversen Bildung vernachlässigt.
Abgerufen von https://www.sbprojects.net/knowledge/ir/nec.php am 14.11.2024
Da die erste 8-Bitfolge die niederwertigen Bits und die zweite 8-Bitfolge die höherwertigen Bits sind, ergibt sich die Adresse `0xEF00`. Der Befehl entspricht `0x03`
Viele Hardwareimplementierung von Bitverarbeitung verwenden little endianness anstatt der oft in Software verwendeten big endianness. Die Bits werden dann also von rechts nach links gelesen. Beispiel:
Hardware 0b01 = 0x2 und 0b10 = 0x1
Software: 0b01 = 0x1 und 0b10 = 0x2
Encodieren eines Signals
Nachdem wir nun über die Struktur des Protokolls Bescheid wissen, können wir unsere eigenen Nachrichten codieren und senden. Die Adresse bleibt dabei immer gleich und nur der Befehl ändert sich. Als Beispiel können wir den Befehl auf `0x6` ändern.
Aus dem Befehl:
619 1640 (1) 617 1670 (1) 587 555 (0) 588 528 (0)
614 526 (0) 616 526 (0) 616 555 (0) 588 554 (0)
588 555 (0) 587 555 (0) 587 1642 (1) 616 1669 (1)
588 1639 (1) 618 1642 (1) 615 1670 (1) 587 1641 (1)
Wird der Befehl:
587 555 (0) 617 1670 (1) 587 555 (0) 588 528 (0)
614 526 (0) 616 526 (0) 616 555 (0) 588 554 (0)
587 1642 (1) 587 555 (0) 587 1642 (1) 616 1669 (1)
588 1639 (1) 618 1642 (1) 615 1670 (1) 587 1641 (1)
Daraus entsteht die folgende Infrarot Datei:
Filetype: IR signals file
Version: 1
#
name: data2
type: raw
frequency: 38000
duty_cycle: 0.33
data: 9131 4535 588 555 587 555 587 555 587 555 587 528 614 524 618 554 588 555 588 1670 587 1640 617 1641 616 1669 588 526 616 1641 616 1641 616 1638 587 555 617 1670 587 555 588 528 614 526 616 526 616 555 588 554 587 1642 587 555 587 1642 616 1669 588 1639 618 1642 615 1670 587 1641 616 41353 9126 2253 586 96844 9158 2253 586
Senden eines Signals
Nachdem die Signaldatei auf den Flipper Zero geladen wurde, kann das Signal abgespielt werden.
TADA 🥳🎉
Der LED-Strip schaltet sich aus.
Proof of Concept:
Fazit
Replay Attacken sind durch den Flipper Zero einfach und zugänglich für jeden geworden. Dennoch können nicht alle Signale einfach wieder 1 zu 1 abgespielt werden. Sicherheitskritische Keyfobs wie Autoschlüssel sind durch sogenannte Rolling Codes geschützt, die bewirken, dass jedes Signal auf seine eigene Art und Weise einzigartig sein muss.
Sind die Geräte in eurer Wohnung anfällig für einfache Replay attacken? Probiert es doch einfach aus.
Quellen
- NEC Protocol: https://www.sbprojects.net/knowledge/ir/nec.php
- Flipper Zero NEC Protocol Decoder: https://github.com/flipperdevices/flipperzero-firmware/blob/dev/lib/infrared/encoder_decoder/nec/infrared_decoder_nec.c#L8