IoT-Bereitstellungen wachsen nur weiter und ein Teil dieses bedeutenden Wachstums besteht aus Millionen von LPWAN-Sensoren (Low-Power-Weit-Fläche-Netzwerk), die in Hunderten von Städten (intelligente Städte) weltweit, ebenfalls in Branchen und Häusern, eingesetzt werden. Eine der am häufigsten verwendeten LPWAN -Technologien ist Lora, für die Lorawan der Netzwerkstandard (MAC -Schicht) ist. Lorawan ist ein sicheres Protokoll mit integrierter Verschlüsselung, aber Implementierungsprobleme und Schwächen beeinflussen die Sicherheit der meisten aktuellen Bereitstellungen.
Dieses Projekt beabsichtigt, eine Reihe von Tools zur Herstellung, Analyse, Senden, Analyse und Knacken einer Reihe von Lorawan -Paketen bereitzustellen, um die Sicherheit einer Lorawan -Infrastruktur zu prüfen oder zu prüfen.
Unten die Struktur dieses Repositorys:
|-- 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
Wir bieten verschiedene Möglichkeiten, um Ihr Lorawan -Prüfungsrahmen in Betrieb zu nehmen:
tools/ DIR zu verwenden, um Probleme mit der Docker -Port -Zuordnung zu vermeiden.localhost mit Postgres zu verbinden. Siehe Anweisungen unten, um Docker einzurichten.Mit diesen Anweisungen erhalten Sie eine Kopie des Projekts und seine Abhängigkeiten von Ihrer lokalen Maschine. Die folgenden Befehle sind für eine debianbasierte Umgebung:
Klon Dieses Repository: git clone --recurse-submodules https://github.com/IOActive/laf.git
Installieren Sie Python3:
sudo apt-get updatesudo apt-get install python3.6Laden Sie Python -Abhängigkeiten herunter und installieren Sie es:
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilPythonpath und Umgebung festlegen
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'Installieren und Einrichten von Golang:
cd ~/Downloadssudo tar -C /usr/local -xvzf YOUR_GOLANG_FILEexport PATH=$PATH:/usr/local/go/binexport GOPATH="$HOME/go"Compile Go Library:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goJe nachdem, welches DB Sie verwenden möchten:
A. Poststresql: Befolgen Sie die Anweisungen "Installieren Sie LAF mit Docker" bis zum 3. Schritt.
B. SQLite:
cd laf/auditing/db__init__.py mit Ihrem bevorzugten Texteditor und kommentieren Sie die Zeilen, die mit Postgres (DB -Verbindungs- und Umgebungsvariablen) verwendet werden sollen, und die mit SQLite verwendete Zeile.Und das war's!
Dieser Ansatz vermeidet es, mit der Installation von Abhängigkeiten umzugehen und ein PostgreSQL -DB zu starten, bei dem die Tools Pakete und Daten speichern. Behälter:
Schritte:
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bash verwenden möchtenSie können Daten in DB mit PGADMIN überprüfen:
Erstens Zugang zu Pgadmin:
Dann müssen Sie den Server hinzufügen:
Hier finden Sie eine Beschreibung der Verzeichnisse und der Werkzeuge / Funktionen in ihnen.
Der Hauptzweck der in diesem Verzeichnis bereitgestellten Werkzeuge besteht darin, die Ausführung eines Penetrationstests auf eine Lorawan -Infrastruktur zu verringern.
Dieses Tool soll Uplink-Pakete (je nach Infrastruktur) oder Downlink-Pakete (an den Paket-Forward) (an die Infrastruktur) oder Downlink-Pakete an den Netzwerkserver oder an GatewayBridge senden. Optional können Pakete fuzziert und ein gültiges Mikrofon berechnet werden.
Optionale Argumente:
-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
Erforderliche Argumente:
--dst-ip DST_IP Destination ip, eg. --dst-ip 192.168.3.101.
--dst-port DST_PORT Destination port, eg. --dst-port 623.
--data DATA UDP packet. It can also be added more packets in
"data" array at the end of this script. The packet
must be a byte string (you will have to escape double
quotes). ***EXAMPLE*** with the packet_forwarder
format: --data "b'x02xe67x00xb8'xebxffxfezx80
xdb{"rxpk":[{"tmst":2749728315,"chan":0,"rfch
":0,"freq":902.300000,"stat":1,"modu":"LORA",
"datr":"SF7BW125","codr":"4/5","lsnr":9.5,"r
ssi":-76,"size":23,"data":"AMQAAAAAhQAAAgAAAAAAA
ACH9PRMJi4="}]}'" ***EXAMPLE*** using the gatevice
[GV] format sending in inmediate mode, in BW125 and
freq 902.3 is "b'{"tx_mode": 0, "freq": 902.3,
"rfch": 0, "modu": 16, "datarate": 16,
"bandwidth":3, "codr": 1, "ipol":false,
"size": 24, "data":
"QOOL8AGA6AMCnudJqz3syCkeooCvqbSn", "class": 2}'"
Beispiel:
Senden Sie alle 2 Sekunden ein einzelnes Paket an (Localhost, 10001) aus Port 10000 Fuzzing zufällig das Mikrofon und die FCounter:
python3 UdpSender.py --lcl-port 10000 --dst-ip 127.0.0.1 --dst-port 10001 --timeout 2 --fuzz-out 4 5 --data "b'x02xe67x00xb8'xebxffxfezx80xdb{"rxpk":[{"tmst":2749728315,"chan":0,"rfch":0,"freq":902.300000,"stat":1"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":9.5,"rssi":-76,"size":23,"data":"AMQAAAAAhQAAAgAAAAAAAACH9PRMJi4="}]}'"
Dieser UDP -Proxy soll hauptsächlich zwischen einem Serien -Gateways (Paket_Forwarders) und einer Netzwerkserver oder einer Gateway -Brücke platziert werden. Es bietet auch die Fähigkeit, Daten in die gewünschte Richtung zu verflüchtigen (Uplink oder Downlink)
Optionale Argumente:
-h, --help show this help message and exit
--collector-port COLLECTOR_PORT
Packet forwarder data collector port, eg. --collector-
port 1701. See
auditing/datacollectors/PacketForwarderCollector.py
--collector-ip COLLECTOR_IP
Packet forwarder data collector ip. Default is
localhost. eg. --collector-ip 192.168.1.1. See
auditing/datacollectors/PacketForwarderCollector.py
--fuzz-in FUZZ_IN [FUZZ_IN ...]
Fuzz data sent to dst-port in the given modes (see
fuzzing modes in utils/fuzzer.py), eg. --fuzz-in 1 2
...
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
Fuzz data sent to (source) port in the given modes
(see fuzzing modes in utils/fuzzer.py), eg. --fuzz-out
1 2 ...
-k KEY, --key KEY Enter a device AppSKey (in hex format, a total of 32
characters / 16 bytes) to decrypt its FRMPayload and
print it in plain text. You can also enter the AppKey
if you wish to decrypt a given Join Accept. eg.
00112233445566778899AABBCCDDEEFF
-p PATH, --path PATH Filepath where to save the data. If not given, data
will not be saved.
--no-log Do not print UDP packages into console
--no-parse Do not parse PHYPayload. If this option is selected,
Golang librarys from /lorawanwrapper/ won't be
imported (golang libs compiling is not required)
Erforderliche Argumente:
--port PORT The local port to listen, eg. --port 623.
--dst-ip DST_IP Destination host ip, eg. --dst-ip 192.168.3.101.
--dst-port DST_PORT Destination host port, eg. --dst-port 623.
Beispiel:
Um Pakete zu senden, die im Port 1234 an (Localhost, 1235) und Vicecersa empfangen werden. Die im Hafen erhaltenen Pakete werden verflucht (die Devnonce werden randony verändert) und an (Localhost, 1235) weitergeleitet.
python3 UdpProxy.py --port 1234 --dst-ip 127.0.0.1 --dst-port 1235 --fuzz-in 9
Dieser TCP -Proxy soll hauptsächlich zwischen dem Netzwerkserver und einem MQTT -Makler platziert werden. Es bietet auch die Möglichkeit, Daten zu fucken.
Optionale Argumente:
-h, --help show this help message and exit
--fuzz-in FUZZ_IN [FUZZ_IN ...]
Fuzz data sent to dst-port in the given modes (see
fuzzing modes in utils/fuzzer.py)
Erforderliche Argumente:
--lcl-port LCL_PORT The local port to listen, eg. --lcl-port=623.
--dst-ip DST_IP Destination host ip, eg. --dst-ip=192.168.3.101.
--dst-port DST_PORT Destination host port, eg. --dst-port=623.
Beispiel:
Senden und empfangen Sie Daten von (Localhost, 1884) und (Localhost, 1883)
python3 TcpProxy.py --lcl-port 1884 --dst-ip 127.0.0.1 --dst-port 1883
Dieses Verzeichnis enthält eine Reihe von Skripten, um analysieren, brateforcer usw. Lorawan A -Pakete zu analysieren.
Dieses Skript empfängt in Base64 einen JoinAccept oder JoinRequest und versucht, seinen Appey mit einer Reihe möglicher Schlüssel zu entschlüsseln, die in einer Datei bereitgestellt werden oder im laufenden Fliegen generiert werden können.
Optionale Argumente:
-h, --help show this help message and exit
-k KEYS, --keys KEYS File containing a list of keys, separated by n. Will
use /auditing/analyzers/bruteForcer/keys.txt by
default
--dont-generate Select this options if you don't want to generate keys
on the fly with the following combinations: 1- Combine
the first byte and the last fifteeen bytes. eg.
AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 2- Combine even and
odd bytes position equally. eg.
AABBAABBAABBAABBAABBAABBAABBAABB 3- The first 14 bytes
in 00 and combine the last 2. eg.
0000000000000000000000000000BA01
Erforderliche Argumente:
-a ACCEPT, --accept ACCEPT
Join Accept in Base64 format to be bruteforced. eg. -a
IHvAP4MXo5Qo6tdV+Yfk08o=
-r REQUEST, --request REQUEST
Join Request in Base64 format to be bruteforced. eg.
-r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc=
Beispiel:
Machen Sie einen JoinRequest mit einem Satz von Schlüssel von my-keys.txt und generieren Sie auch APROX. 200000 dinamischer.
python3 BruteForcer.py -a IHvAP4MXo5Qo6tdV+Yfk08o= -r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc= -k ./my-keys.txt
Diese Skripte empfangen ein PhyPayload -Paket in Base64 und einen Schlüssel, der je nach Pakettyp der NWKSKEY des Appey sein kann und das neue Mikrofon erzeugt.
Optionale Argumente:
-h, --help show this help message and exit
--jakey JAKEY [JoinAccept ONLY]. Enter the key used to encrypt the
JoinAccept previously (in hex format, a total of 32
characters / 16 bytes). This cannot be validated
beforehand by this program. eg.
00112233445566778899AABBCCDDEEFF. A valid key sample
for the JoinAccept "IB1scNmwJRA32RfMbvwe3oI=" is
"f5a3b185dfe452c8edca3499abcd0341"
Erforderliche Argumente:
-d DATA, --data DATA Base64 data to be signed. eg. -d
AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
-k KEY, --key KEY Enter the new key (in hex format, a total of 32
characters / 16 bytes) to sign packets (calculate and
add a new MIC). Note that for JoinRequest/JoinAccept
it must be the AppKey, and the NwkSKey for Data
packets. This cannot be validated beforehand by this
program. eg. 00112233445566778899AABBCCDDEEFF
Beispiel:
Signieren Sie den angegebenen PhyPayload mit dem Appey 001122233445566778899aabbccddeeff.
python3 MicGenerator.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -k 00112233445566778899AABBCCDDEEFF
Dieses Skript empfängt ein Lorawan JSON -Paket und formuliert es auf Base64. Es macht das inverse als packetParser.py, sodass die Ausgabe dieses Skripts hier und umgekehrt verwendet werden kann.
Optionale Argumente:
-h, --help show this help message and exit
-k KEY, --key KEY Enter a device AppSKey or AppKey (in hex format, a
total of 32 characters / 16 bytes) to encrypt the
FRMPayload or a Join Accept. eg.
F5A3B185DFE452C8EDCA3499ABCD0341
--nwkskey NWKSKEY Enter the network session key if you'd like to
generate a data packet with a valid MIC.
Erforderliche Argumente:
-j JSON, --json JSON JSON object to parse. eg. -j '{"mhdr":
{"mType":"JoinRequest","major":"LoRaWANR1"},"macPayloa
d":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf
50003","devNonce":51639},"mic":"7005c4a5"}'
Beispiel:
Erhalten Sie eine joinRequest PhyPayload in Base64 mit angegebenen im JSON mit den in sie übergebenen Werten.
python3 PacketCrafter.py -j '{"mhdr":{"mType":"JoinRequest","major":"LoRaWANR1"},"macPayload":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf50003","devNonce":51639},"mic":"7005c4a5"}'
Dieses Skript analysiert und druckt eine einzelne Lorawan Phypayload -Daten in Base64. Es macht das inverse als packetcrafter.py, sodass die Ausgabe dieses Skripts hier und umgekehrt verwendet werden kann.
Optionale Argumente:
-h, --help show this help message and exit
-k KEY, --key KEY Enter a device AppKey or AppSKey depending on the
packet to be decrypted (join accept or data packet).
Must be in hex format, a total of 32 characters / 16
bytes. eg. 00112233445566778899AABBCCDDEEFF
Erforderliche Argumente:
-d DATA, --data DATA Base64 data to be parsed. eg. -d
AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
Beispiel:
Erhalten Sie das JoinRequest im JSON -Format aus dem obigen Beispiel.
python3 PacketParser.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
Dieses Skript empfängt eine JoinAccept und einen JoinRequest in Base64 und einen Appey, um die Sitzungsschlüssel zu generieren. Ein Beispiel für die Verwendung:
Optionale Argumente:
-h, --help show this help message and exit
Erforderliche Argumente:
-a JACCEPT, --jaccept JACCEPT
JoinAccept payload in base64
-r JREQUEST, --jrequest JREQUEST
JoinRequest payload in base64
-k KEY, --key KEY Enter a device AppKey (in hex format, a total of 32
characters / 16 bytes). eg.
00112233445566778899AABBCCDDEEFF
Beispiel:
Nutzen Sie den Appskey und NWKSKEY mit den folgenden Beiträgen.
python3 SessionKeysGenerator.py -r AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -a IB1scNmwJRA32RfMbvwe3oI= -k f5a3b185dfe452c8edca3499abcd0341
Dies sind Hilfsfunktionen, die von UdpSender.py und UdpProxy.py verwendet werden. In Fuzzer.py sehen Sie Fuzzing -Modi implementiert.
Der allgemeine Zweck dieses Verzeichnisses besteht darin, Lorawan -Pakete zu sammeln und verschiedene Aspekte des Verkehrs zu analysieren und einen Schlüssel zu versuchen, um den Appey zu brutten.
Dieses Verzeichnis enthält eine Reihe von Skripten, die Lorawan -Pakete aus verschiedenen Quellen (dh Gateway packet_forwarder, das Things Network usw.) empfangen und sie in Dateien mit einem Standardformat speichern. Diese Dateien sollten später vom Skript /auditing/analyzers/LafProcessData.py abgerufen werden, um verschiedene Untertools auszuführen.
Dieses Skript verbindet sich mit dem MQQT -Broker, ruft alle Themen ab und speichert Nachrichten in einer Datei im angegebenen Feld. Der Dateiname wird bis zu dem Datum komponiert, an dem dieses Skript gestartet wurde.
Optionale Argumente:
-h, --help show this help message and exit
--collector-id COLLECTOR_ID
The ID of the dataCollector. This ID will be
associated to the packets saved into DB. eg. --id 1
--organization-id ORGANIZATION_ID
The ID of the dataCollector. This ID will be
associated to the packets saved into DB. eg. --id 1
--topics TOPICS [TOPICS ...]
List the topic(s) you want to suscribe separated by
spaces. If nothing given, default will be "#.
Erforderliche Argumente:
--ip IP MQTT broker ip, eg. --ip 192.168.3.101.
--port PORT MQTT broker port, eg. --port 623.
Beispiel:
Schließen Sie sich mit IP 200.200.200.200 im Standardport (1883) an den Broker an.
python3 GenericMqttCollector.py --ip 200.200.200.200 --port 1883
Dieses Skript stellt eine Verbindung zu einem Loraserver.io MQQT -Broker her und speichert Nachrichten in die DB. Sie müssen eine eindeutige CollectorID angeben und die Themen, die Sie beibehalten möchten, angeben.
Optionale Argumente:
-h, --help show this help message and exit
--port PORT MQTT broker port, eg. --port 623. Default 1883.
--collector-id COLLECTOR_ID
The ID of the dataCollector. This ID will be
associated to the packets saved into DB. eg. --id 1
--organization-id ORGANIZATION_ID
The ID of the dataCollector. This ID will be
associated to the packets saved into DB. eg. --id 1
--topics TOPICS [TOPICS ...]
List the topic(s) you want to suscribe separated by
spaces. If nothing given, default will be "#.
Erforderliche Argumente:
--ip IP MQTT broker ip, eg. --ip 192.168.3.101.
Dieses Skript empfängt UDP -Pakete aus dem UDP -Proxy im Format von Gateway Packet_forwarder und behält sie an.
Optionale Argumente:
-h, --help show this help message and exit
--collector-id COLLECTOR_ID
The ID of the dataCollector. This ID will be
associated to the packets saved into DB. eg. --id 1
--organization-id ORGANIZATION_ID
The ID of the dataCollector. This ID will be
associated to the packets saved into DB. eg. --id 1
Erforderliche Argumente:
-n NAME, --name NAME Unique string identifier of the Data Collector. eg.
--name semtech_collector
-p PORT, --port PORT Port where to listen for UDP packets. --port 1702.
Beispiel:
Zeichnen Sie Daten zwischen einem Gateway, der an den lokalen Port 1700 sendet, und einem Netzwerk Xserver Hören in (Localhost, 1701). Speichern Sie die Daten in ./ Verzeichnis.
python3 PacketForwarderCollector.py --name semtech_collector --port 1700
Dieses Skript liest A aus einer Datei oder Dateien oder Stdin und führt verschiedene Untertools aus. Abhängig von der ausgewählten Option können Sie eine Analyse des Lorawan -Datenverkehrs ausführen, versuchen, den Appey Bruteforce zu brüten oder alle empfangenen Pakete zu analysieren. Diese Optionen können kombiniert werden.
Optionale Argumente:
This script reads retrieves packets from DB and executes different sub-tools.
Then, each sub-tool will save output data into the DB. See each option for
more information.
optional arguments:
-h, --help show this help message and exit
-a, --analyze Collect and analyze different aspects from traffic. If
Bruteforcer (-b) is activated, results will be
corelated
-b, --bforce Try to bruteforce the AppKeys with JoinRequests and
JoinAccepts payloads
-k KEYS, --keys KEYS [Bruteforcer] Filepath to keys file. If not provided,
"bruteForcer/keys.txt" will be used
--no-gen [Bruteforcer] Don't generate keys, only try keys from
files
-p, --parse Parse the PHYPayload into readable information
--from-id FROM_ID Packet ID from where to start processing.
--to-id TO_ID Last packet ID to be processed.
Beispiel:
Verarbeiten Sie Pakete in der DB ab Paket-ID 1000, führen Sie eine Verkehrsanalyse aus und versuchen Sie, Appkeys in my-keys.txt zu knacken, generieren Sie jedoch nicht dinamisch mehr Schlüssel.
python3 LafProcessData.py -a -b -k my-keys.txt --no-gen --from-id 1000
Diese Skripte liefern die von lafprocessdata.py orchierte Funktionalität. Unten die Warnungen, die von LafPacketAnalysis.py und LafBruteForcer.py :
| AUSWEIS | Titel | Analysator | Risikoniveau | Beschreibung | Empfohlene Aktion |
|---|---|---|---|---|---|
| LAF-001 | Devnonce wiederholt | Lafpacketanalysis.py | Niedrig | Devnonces für jedes Gerät sollten zufällig genug sein, um nicht zu kollidieren. Wenn dieselbe Devnonce in vielen Nachrichten wiederholt wurde, kann es geschlossen werden, dass ein Gerät unter einem Wiederholungsangriff steht. Dies ist ein Angreifer, der einen JoinRequest erobert hat und versucht, ihn wieder an das Tor zu senden. | Überprüfen Sie, wie devnonces generiert wird: Die Funktion, die sie generiert, sollte mit einer zufälligen Bibliothek implementiert werden. Darüber hinaus müssen Sie sicherstellen, dass der Server nach historischen Devnonces (sie sollten in DB bestehen bleiben) überprüft, um ein altes gültiges JoinRequest zu akzeptieren, das zuvor vom Gerät gesendet wurde, und somit eine neue Sitzung generieren. |
| LAF-002 | Deveuis teilen sich den gleichen Devaddr | Lafpacketanalysis.py | Info | Möglicherweise wurden zwei verschiedene Geräte derselbe Devaddr zugewiesen. Dies ist keine Sicherheitsbedrohung. | Wenn das Gerät über die Luft aktiviert ist (OTAA): Überprüfen Sie die Logik, die verwendet wird, um DevadDRs zuzuweisen, und stellen Sie sicher, dass der Server verschiedenen Geräten nicht dasselbe DevadDR zuweist. Wenn das Gerät durch Personalisierung (ABP) aktiviert wird: Überprüfen Sie, ob der in der Firmware eines Gerät konfigurierte Devaddr im Lorawan -Netzwerk eindeutig ist. |
| LAF-003 | Beitritt wiederholen | Todo | Medium | Es wurde ein doppelter Join -Anfragepaket festgestellt, was bedeuten kann, dass der Lorawan -Server unter einem Wiederholungsangriff steht. Dies ist ein Angreifer, der möglicherweise ein früheres Join -Anfragepaket erfasst hat und es erneut an den Lorawan -Server sendet, um zu versuchen, eine neue Sitzung zu generieren. | Überprüfen Sie, wie devnonces generiert wird: Die Funktion, die sie generiert, sollte mit einer zufälligen Bibliothek implementiert werden. Darüber hinaus müssen Sie sicherstellen, dass der Server nach historischen Devnonces (sie sollten in DB bestehen bleiben) überprüft, um ein altes gültiges JoinRequest zu akzeptieren, das zuvor vom Gerät gesendet wurde, und somit eine neue Sitzung generieren. |
| LAF-004 | Uplink -Datenpakete Wiederholung | Todo | Medium | Ein dupliziertes Uplink -Paket wurde festgestellt, was bedeuten kann, dass der Lorawan -Server unter einem Wiederholungsangriff steht. Dies ist ein Angreifer, der möglicherweise ein Uplink -Paket (vom Gerät gesendet) erfasst hat und es erneut an den Lorawan -Server sendet. | In Over the Air Activated (OTAA) -Geräten: Stellen Sie sicher, dass die Sitzungsschlüssel nach dem Zurücksetzen oder jedem Überlauf des Geräts neu generiert werden, um einen Effekt aus diesem Angriff zu vermeiden. Mit aktiviertem durch Personalisierung (ABP) von Lorawan v1.0. |
| LAF-005 | Downlink -Datenpakete Wiederholung | Todo | Hoch | Ein dupliziertes Downlink -Paket wurde erkannt. Der Server reagiert auf einen Wiederholungsangriff oder generiert einen atypischen Datenverkehr auf Geräte | Überprüfen Sie die Protokolle der Server und prüfen Sie, ob frühere empfohlene Aktionen implementiert sind |
| LAF-006 | Mögliches ABP -Gerät (Zählerreset und kein Join) | Lafpacketanalysis.py | Hoch | Wenn der Zähler zurückgesetzt wurde (auf 0 zurückkam), wird der Devaddr gleich gehalten, und es wurde kein früherer Verbindungsverfahren festgestellt, kann bedeuten, dass das Gerät durch Personalisierung (ABP) aktiviert wird. Die Implementierung von ABP -Geräten ist abgehalten, da kein Verbindungsverfahren durchgeführt wird, was bedeutet, dass Sitzungsschlüssel für immer gleich gehalten werden. Ein Gerät, das seine Sitzungsschlüssel nicht ändert, ist anfällig für verschiedene Angriffe wie Eaveasdrop oder Wiederholung. | Alle durch Personalisierung (ABP) aktivierten Geräte (ABP) sollten nach Möglichkeit für über die Luftaktivierten (OTAA) -Geräte ersetzt werden. Die Implementierung von ABP -Geräten ist entmutigt. |
| LAF-007 | Kleiner als erwartet (unterscheidet sich von 0) | Lafpacketanalysis.py | Medium | Wenn ein Angreifer ein Paar Sitzungsschlüssel erhält (um den Appey in OTAA -Geräten oder den Appskey/NWKSKEY auf ABP -Geräten gestohlen zu haben), könnte er/sie in der Lage sein, gefälschte gültige Daten an den Server zu senden. Damit der Server gefälschte Nachrichten akzeptiert, ist es erforderlich, damit der FCNT (Frame -Zähler) der Nachricht höher ist als der FCNT der letzten gesendeten Nachricht. In einem Szenario, in dem das ursprüngliche gefälschte Gerät weiterhin Nachrichten sendet, würde der Server (gültige) Nachrichten abwerfen, da er einen kleineren FCNT hat. Wenn Nachrichten mit einem kleineren FCNT -Wert als erwartet vom Lorawan -Server empfangen werden, ist es möglich zu schließen, dass eine parallele Sitzung festgelegt wurde. | Wenn sich das Gerät über das Luftaktivierungsgerät (OTAA) befindet, ändern Sie seinen Appey, da es wahrscheinlich kompromittiert wurde. Wenn es durch Personalisierung aktiviert wird, ändern Sie seine Appskey und NWKSKEY. Stellen Sie außerdem sicher, dass der Lorawan -Server aktualisiert wird und keine doppelten Nachrichten akzeptiert. |
| LAF-008 | Passwort mit JoinRequest geknackt | Lafbuteforcer.py | Hoch | Es war möglich, eine JoinRequest -Nachricht mit einem bekannten Appey zu entschlüsseln. | Verwenden Sie verschiedene Appkeys als die von Anbietern bereitgestellten oder mehr zufälligen Schlüssel. |
| LAF-009 | Passwort geknackt | Lafbuteforcer.py | Hoch | Der Appey des Geräts wurde mit einer bekannten oder nicht geratenen Zeichenfolge versucht. Es wurde mit einem Paar Join -Nachrichten entschlüsselt (Anfrage und Akzeptanz). | Verwenden Sie einen zufälligen Schlüsselgenerator für den Appey, anstatt die von Anbietern bereitgestellten zu verwenden. Stellen Sie außerdem nicht denselben Appey auf mehr als ein Gerät ein und generieren Sie keine Appkeys mithilfe einer vorhersehbaren Logik (z. B. inkrementelle Werte, bestimmte Bytes usw.) |
| LAF-010 | Gateway veränderte den Standort | Lafpacketanalysis.py | Medium | Wenn das Gateway seinen Standort nicht ändern soll. Es könnte gestohlen, bewegt oder ein gefälschtes Tor sein, um das legitime Tor zu haben. | Stellen Sie sicher, dass das Gateway nicht physisch oder logisch manipuliert wurde. |
Dieses Verzeichnis enthält eine Reihe von Wrappern für die Bibliothek https://github.com/brocaar/lorawan/, die in Golang geschrieben ist. Diese Funktionen werden von den Tools implementiert.
Hier finden Sie eine Reihe von Skripten, mit denen verschiedene Aufgaben automatisiert werden sollen. Stellen Sie sicher, dass sie ihnen bei Bedarf die Ausführungsgenehmigung geben ( chmod +x your_script für Linux/macOS).
Richten Sie Ihr Gateway problemlos ein und wechseln Sie seine Kanäle für Schnüffelzwecke. Weitere Informationen zur Verwendung von ihnen finden Sie in diesem Verzeichnis.
Dieses Skript wird verwendet, um alle erforderlichen Softwarepakete auf einem Raspberry Pi zu installieren, um ein Lorawan-Gateway in Verbindung mit einem verbundenen LORA-Konzentrator (IC980-SPI, RHF0M301-SPI, RAK831-SPI oder einer anderen nach manuellen Einrichtung) zu erstellen.
Da es nicht möglich ist zu wissen, welche Frequenzen Lora -Geräte arbeiten, haben wir ein Skript erstellt, mit dem Gateways -Kanäle aus den Frequenzbändern der US915 und der EU868 für Schnüffelzwecke ausgeschaltet werden können. Obwohl es professionelle und teure Gateways gibt, die 32 oder 64 Kanäle unterstützen, unterstützen die meisten Gateways bis zu 8 Kanäle. Dieses Skript soll in dieser Art von Gateways ausgeführt werden.
Zumindest im Frequenzband der US915 sind die ersten 8 Kanäle am häufigsten verwendet. Es gibt jedoch bekannte Implementierungen, die eine andere Kanalgruppe verwenden, wie zum Beispiel die Dinge, die die zweite Gruppe (8-15) der Kanäle für die Uplink-Kommunikation verwenden.
Derzeit unterstützen wir andere Frequenzbänder nicht, aber mit wenigen Änderungen an diesen Skripten können Sie dies selbst tun :).
Wir haben ein Video dieses Framework in Aktion hochgeladen (das gleiche Szenario, das bei Blackhat 2019 präsentiert wurde): https://youtu.be/mm6a2rvnocs. Detaillierte Schritte der Demo finden Sie in der YouTube -Videobeschreibung.
Todo
Dieses Projekt ist unter der BSD-3-Klausel-Lizenz lizenziert.