
Ce projet a pour but de fournir une série d'outils pour fabriquer, parser, envoyer, analyser et casser un ensemble de paquets LoRaWAN afin d'auditer ou de tester la sécurité d'une infrastructure LoRaWAN.
Les déploiements IoT ne cessent de croître et une partie de cette croissance significative est composée de millions de capteurs LPWAN (réseau à faible consommation et longue portée) déployés dans des centaines de villes (Smart Cities) à travers le monde, ainsi que dans les industries et les foyers. L'une des technologies LPWAN les plus utilisées est LoRa, dont LoRaWAN est le standard réseau (couche MAC). LoRaWAN est un protocole sécurisé avec chiffrement intégré, mais les problèmes d'implémentation et les faiblesses affectent la sécurité de la plupart des déploiements actuels.
Ce projet vise à fournir une série d'outils pour fabriquer, analyser, envoyer, analyser et casser un ensemble de paquets LoRaWAN afin d'auditer ou de tester la sécurité d'une infrastructure LoRaWAN.
Ci-dessous, la structure de ce dépôt :
|-- tools
|-- UdpSender.py
|-- UdpProxy.py
|-- TcpProxy.py
|-- lorawan
|-- BruteForcer.py
|-- MicGenerator.py
|-- PacketCrafter.py
|-- PacketParser.py
|-- SessionKeysGenerator.py
|-- Loracrack (https://github.com/matiassequeira/Loracrack/tree/master)
|-- utils
|-- DevAddrChanger.py
|-- Fuzzer.py
|-- FileLogger.py
|-- auditing
|-- datacollectors
|-- MqttCollector.py
|-- UdpForwarderProxy.py
|-- analyzers
|-- LafProcessData.py
|-- bruteForcer
|-- LafBruteforcer.py
|-- keys
|-- dataanalysis
|-- LafPacketAnalysis.py
|-- printer
|-- LafPrinter.py
|-- db
|-- __init__.py
|-- Models.py
|-- Service.py
|-- lorawanwrapper
|-- LorawanWrapper.py
|-- utils
|-- jsonUnmarshaler.go
|-- lorawanWrapper.go
|-- micGenerator.go
|-- sessionKeysGenerator.go
|-- scripts
|-- gateway_channel_changer
|-- LoRa-GW-Installer.sh
|-- Continuous-Channel-Switch.sh
|-- LoRa-GW-Channel-Setup.sh
Nous proposons différentes options pour mettre en place votre Cadre d'Audit LoRaWAN :
tools/, afin d'éviter les problèmes de mappage de ports avec Docker.localhost. Voir les instructions ci-dessous pour configurer Docker.Ces instructions vous permettront d'obtenir une copie du projet et de ses dépendances sur votre machine locale. Les commandes ci-dessous sont pour un environnement basé sur Debian :
Clonez ce dépôt : git clone --recurse-submodules https://github.com/IOActive/laf.git
Installez python3 :
sudo apt-get updatesudo apt-get install python3.6Téléchargez et installez les dépendances Python :
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilDéfinissez PYTHONPATH et ENVIRONMENT
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'Installez et configurez golang :
cd ~/Downloadssudo tar -C /usr/local -xvzf VOTRE_FICHIER_GOLANGexport PATH=$PATH:/usr/local/go/binexport GOPATH="$HOME/go"Compilez la bibliothèque go :
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goSelon la base de données que vous souhaitez utiliser :
a. PostgreSQL : Suivez les instructions 'Installer LAF en utilisant Docker' jusqu'à la 3ème étape.
b. SQLite :
cd laf/auditing/db__init__.py avec votre éditeur de texte préféré et commentez les lignes à utiliser avec Postgres (connexion DB et variables d'environnement) et décommentez la ligne à utiliser avec sqlite.Et voilà !
Cette approche évite de gérer l'installation des dépendances et démarre une base de données PostgreSQL où les outils enregistrent les paquets et les données. Conteneurs :
Étapes :
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashVous pouvez vérifier les données dans la base de données en utilisant pgAdmin :
Tout d'abord, accédez à pgAdmin :
Ensuite, vous devez ajouter le serveur :
Voici la description des répertoires et des outils/fonctions qu'ils contiennent.
L'objectif principal des outils fournis dans ce répertoire est de faciliter l'exécution d'un test d'intrusion sur une infrastructure LoRaWAN.
Cet outil est destiné à envoyer des paquets montants (vers le serveur réseau ou la passerelle bridge, selon l'infrastructure) ou des paquets descendants (vers le packet-forwarder). Optionnellement, les paquets peuvent être fuzzés et un MIC valide peut être calculé.
Arguments optionnels :
-h, --help show this help message and exit
--lcl-port LCL_PORT Source port, eg. --lcl-port=623.
--timeout TIMEOUT Time in seconds between every packet sent. Default is
1s. In this time, the sender will listen for replies.
--repeat Send message/s multiple times
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
Fuzz data sent to dest port (see fuzzing modes in
utils/fuzzer.py), eg. --fuzz-out 1 2.
--key KEY Enter the key (in hex format, a total of 32 characters
/ 16 bytes) to sign packets (calculate and add a new
MIC). Note that for JoinRequests it must be the
AppKey, and the NwkSKey for Data packets. This cannot
be validated beforehand by this program. eg.
00112233445566778899AABBCCDDEEFF
-a DEVADDR, --devaddr DEVADDR
DeviceAddress to impersonate, given in hex format (8
characters total), eg. AABB0011.
--fcnt FCNT The frame counter to be set in the given data packet.
This wouldn't work in a JoinRequest/JoinAccept since
this packets don't have a fCnt
Arguments obligatoires :