
Questo progetto intende fornire una serie di strumenti per creare, analizzare, inviare, esaminare e decifrare un insieme di pacchetti LoRaWAN al fine di effettuare audit o test di penetrazione sulla sicurezza di un'infrastruttura LoraWAN.
Le implementazioni IoT continuano a crescere e una parte di questa significativa crescita è composta da milioni di sensori LPWAN (low-power wide-area network) distribuiti in centinaia di città (Smart Cities) in tutto il mondo, oltre che in industrie e case. Una delle tecnologie LPWAN più utilizzate è LoRa, per la quale LoRaWAN è lo standard di rete (livello MAC). LoRaWAN è un protocollo sicuro con crittografia integrata, ma problemi di implementazione e debolezze influenzano la sicurezza della maggior parte delle implementazioni attuali.
Questo progetto intende fornire una serie di strumenti per creare, analizzare, inviare, analizzare e decifrare un insieme di pacchetti LoRaWAN al fine di verificare la sicurezza di un'infrastruttura LoRaWAN.
Di seguito, la struttura di questo repository:
|-- 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
Forniamo diverse opzioni per avere il tuo LoraWAN Auditing Framework funzionante:
tools/, per evitare problemi con il mapping delle porte di Docker.localhost. Vedi le istruzioni sotto per configurare Docker.Queste istruzioni ti permetteranno di ottenere una copia del progetto e delle sue dipendenze sulla tua macchina locale. I comandi seguenti sono per un ambiente basato su Debian:
Clona questo repository: git clone --recurse-submodules https://github.com/IOActive/laf.git
Installa python3:
sudo apt-get updatesudo apt-get install python3.6Scarica e installa le dipendenze python:
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilImposta PYTHONPATH e ENVIRONMENT
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'Installa e configura golang:
cd ~/Downloadssudo tar -C /usr/local -xvzf YOUR_GOLANG_FILEexport PATH=$PATH:/usr/local/go/binexport GOPATH="$HOME/go"Compila la libreria go:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goA seconda del DB che desideri utilizzare:
a. PostgreSQL: Segui le istruzioni 'Installare LAF usando Docker' fino al 3° passaggio.
b. SQLite:
cd laf/auditing/db__init__.py con il tuo editor di testo preferito e commenta le righe da utilizzare con Postgres (connessione DB e variabili d'ambiente) e decommenta la riga da utilizzare con sqlite.Ed è tutto!
Questo approccio evita di gestire l'installazione delle dipendenze e avvia un database PostgreSQL dove gli strumenti salvano pacchetti e dati. Contenitori:
Passaggi:
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashPuoi controllare i dati nel DB usando pgAdmin:
Prima, accedi a pgAdmin:
Poi, devi aggiungere il server:
Ecco la descrizione delle directory e degli strumenti/funzioni al loro interno.
Lo scopo principale degli strumenti forniti in questa directory è facilitare l'esecuzione di un penetration test su un'infrastruttura LoRaWAN.
Questo strumento è progettato per inviare pacchetti uplink (al server di rete o al gatewayBridge, a seconda dell'infrastruttura) o pacchetti downlink (al packet-forwarder). Opzionalmente, i pacchetti possono essere fuzzati e può essere calcolato un MIC valido.
Argomenti opzionali:
-h, --help mostra questo messaggio di aiuto ed esce
--lcl-port LCL_PORT Porta di origine, es. --lcl-port=623.
--timeout TIMEOUT Tempo in secondi tra ogni pacchetto inviato. Default è
1s. In questo tempo, il mittente ascolterà le risposte.
--repeat Invia il/i messaggio/i più volte
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
Fuzza i dati inviati alla porta di destinazione (vedi
modalità di fuzzing in utils/fuzzer.py), es. --fuzz-out 1 2.
--key KEY Inserisci la chiave (in formato esadecimale, un totale di 32 caratteri
/ 16 byte) per firmare i pacchetti (calcola e aggiungi un nuovo
MIC). Nota che per JoinRequest deve essere AppKey,
e NwkSKey per i pacchetti Data. Questo non può
essere validato a priori da questo programma. es.
00112233445566778899AABBCCDDEEFF
-a DEVADDR, --devaddr DEVADDR
DeviceAddress da impersonare, fornita in formato esadecimale (8
caratteri totali), es. AABB0011.
--fcnt FCNT Il contatore di frame da impostare nel pacchetto dati dato.
Questo non funzionerebbe in un JoinRequest/JoinAccept poiché
questi pacchetti non hanno un fCnt
Argomenti obbligatori: