Penyebaran IoT terus tumbuh dan satu bagian dari pertumbuhan yang signifikan terdiri dari jutaan sensor LPWAN (jaringan luas dengan kekuatan rendah) yang digunakan di ratusan kota (kota pintar) di seluruh dunia, juga di industri dan rumah. Salah satu teknologi LPWAN yang paling banyak digunakan adalah Lora yang Lorawan adalah Standar Jaringan (Lapisan MAC). Lorawan adalah protokol yang aman dengan enkripsi bawaan tetapi masalah implementasi dan kelemahan mempengaruhi keamanan sebagian besar penyebaran saat ini.
Proyek ini bermaksud untuk menyediakan serangkaian alat untuk membuat, menguraikan, mengirim, menganalisis, dan memecahkan satu set paket Lorawan untuk mengaudit atau memudor keamanan infrastruktur Lorawan.
Di bawah, struktur repositori ini:
|-- 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
Kami menyediakan berbagai opsi untuk menjalankan dan menjalankan kerangka kerja Audit Lorawan Anda:
tools/ Dir, untuk menghindari masalah dengan pemetaan port Docker.localhost . Lihat instruksi di bawah ini untuk mengatur Docker.Instruksi ini akan memberi Anda salinan proyek dan ketergantungannya di mesin lokal Anda. Perintah di bawah ini adalah untuk lingkungan berbasis Debian:
Clone Repositori ini: git clone --recurse-submodules https://github.com/IOActive/laf.git
Instal Python3:
sudo apt-get updatesudo apt-get install python3.6Unduh dan instal dependensi Python:
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilAtur pythonpath dan lingkungan
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'Instal dan Siapkan Golang:
cd ~/Downloadssudo tar -C /usr/local -xvzf YOUR_GOLANG_FILEexport PATH=$PATH:/usr/local/go/binexport GOPATH="$HOME/go"Kompilasi Perpustakaan GO:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goTergantung DB mana yang ingin Anda gunakan:
A. POSTRESQL: Ikuti instruksi 'Instal LAF menggunakan Docker' hingga langkah ke -3.
B. Sqlite:
cd laf/auditing/db__init__.py dengan editor teks pilihan Anda dan komentar baris yang akan digunakan dengan postgres (koneksi db dan variabel lingkungan) unkromment garis yang akan digunakan dengan sqlite.Dan itu saja!
Pendekatan ini menghindari berurusan dengan pemasangan dependensi dan memulai DB PostgreSQL di mana alat menyimpan paket dan data. Wadah:
Tangga:
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashAnda dapat memeriksa data di DB menggunakan pgadmin:
Pertama, akses ke pgadmin:
Kemudian, Anda perlu menambahkan server:
Berikut adalah deskripsi direktori dan alat / fungsi di dalamnya.
Tujuan utama alat yang disediakan dalam direktori ini adalah untuk memudahkan pelaksanaan tes penetrasi ke infrastruktur Lorawan.
Alat ini dimaksudkan untuk mengirim paket uplink (ke server jaringan atau GatewayBridge, tergantung pada infrastruktur) atau paket downlink (ke paket-forwarder). Secara opsional, paket dapat disebabkan dan MIC yang valid dapat dihitung.
Argumen opsional:
-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
Argumen yang Diperlukan:
--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}'"
Contoh:
Untuk mengirim satu paket setiap 2 detik ke (localhost, 10001) dari port 10000 fuzzing secara acak mic dan 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="}]}'"
Proxy UDP ini terutama dimaksudkan untuk ditempatkan di antara gateway seri (packet_forwarders) dan server jaringan atau jembatan gateway tergantung pada infraestruktur yang dievaluasi. Ini juga menawarkan potensi untuk membatalkan data ke arah yang diinginkan (uplink atau downlink)
Argumen opsional:
-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)
Argumen yang Diperlukan:
--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.
Contoh:
Untuk mengirim paket yang diterima di pelabuhan 1234 ke (Localhost, 1235) dan Vicecerssa. Paket yang diterima di pelabuhan akan disebabkan (Devnonce akan diubah secara randonly) dan diteruskan ke (Localhost, 1235).
python3 UdpProxy.py --port 1234 --dst-ip 127.0.0.1 --dst-port 1235 --fuzz-in 9
Proxy TCP ini terutama dimaksudkan untuk ditempatkan di antara server jaringan dan broker MQTT. Ini juga menawarkan potensi untuk data fuzz.
Argumen opsional:
-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)
Argumen yang Diperlukan:
--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.
Contoh:
Kirim dan terima data dari (Localhost, 1884) dan (Localhost, 1883)
python3 TcpProxy.py --lcl-port 1884 --dst-ip 127.0.0.1 --dst-port 1883
Direktori ini berisi serangkaian skrip untuk diurai, kerajinan, bruteforcer, dll. Lorawan Paket.
Skrip ini menerima gabungan atau gabungan di Base64 dan mencoba mendekripsi appkey dengan satu set kunci yang mungkin dapat disediakan dalam file atau dapat dihasilkan dengan cepat.
Argumen opsional:
-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
Argumen yang Diperlukan:
-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=
Contoh:
Retak JoinRequest dengan satu set kunci dari my-keys.txt dan juga menghasilkan aprox. 200000 lebih dinamis.
python3 BruteForcer.py -a IHvAP4MXo5Qo6tdV+Yfk08o= -r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc= -k ./my-keys.txt
Script ini menerima paket phypayload di Base64 dan kunci yang dapat menjadi NWKSKey dari Appley tergantung pada jenis paket dan menghasilkan mikrofon baru.
Argumen opsional:
-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"
Argumen yang Diperlukan:
-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
Contoh:
Tandatangani phypayload yang diberikan dengan Appkey 00112233445566778899AABBCCDDEEFF.
python3 MicGenerator.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -k 00112233445566778899AABBCCDDEEFF
Script ini menerima paket Lorawan JSON dan memindahkannya ke Base64. Itu melakukan terbalik sebagai packetparser.py, sehingga output dari skrip itu dapat digunakan di sini dan sebaliknya.
Argumen opsional:
-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.
Argumen yang Diperlukan:
-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"}'
Contoh:
Dapatkan phypayload joinRequest di base64 dengan diberikan di json dengan nilai -nilai yang diturunkan ke dalamnya.
python3 PacketCrafter.py -j '{"mhdr":{"mType":"JoinRequest","major":"LoRaWANR1"},"macPayload":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf50003","devNonce":51639},"mic":"7005c4a5"}'
Script ini mem -parsing dan mencetak data lorawan phypayload tunggal di Base64. Itu melakukan terbalik sebagai packetcrafter.py, sehingga output dari skrip itu dapat digunakan di sini dan sebaliknya.
Argumen opsional:
-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
Argumen yang Diperlukan:
-d DATA, --data DATA Base64 data to be parsed. eg. -d
AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
Contoh:
Dapatkan JoinRequest dalam format JSON dari contoh di atas.
python3 PacketParser.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
Skrip ini menerima gabungan dan gabungan di Base64, dan appkey untuk menghasilkan kunci sesi. Contoh penggunaan:
Argumen opsional:
-h, --help show this help message and exit
Argumen yang Diperlukan:
-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
Contoh:
Dapatkan AppsKey dan NWKSKey dengan data gabungan berikut.
python3 SessionKeysGenerator.py -r AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -a IB1scNmwJRA32RfMbvwe3oI= -k f5a3b185dfe452c8edca3499abcd0341
Ini adalah fungsi tambahan yang digunakan oleh UdpSender.py dan UdpProxy.py . Di Fuzzer.py Anda dapat melihat mode fuzzing diimplementasikan.
Tujuan umum dari direktori ini adalah untuk mengumpulkan paket Lorawan dan menganalisis berbagai aspek lalu lintas, serta mencoba satu set kunci untuk mencoba bruteforce appkey.
Direktori ini berisi satu set skrip yang menerima paket Lorawan dari berbagai sumber (yaitu gateway packet_forwarder, jaringan benda, dll.) Dan menyimpannya ke dalam file, dengan format standar. File ini harus diambil kemudian oleh skrip /auditing/analyzers/LafProcessData.py untuk menjalankan sub-tool yang berbeda.
Skrip ini terhubung ke broker MQQT, mengambil semua topik dan menyimpan pesan ke dalam file di bidang yang ditentukan. Nama file disusun pada tanggal skrip ini dimulai.
Argumen opsional:
-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 "#.
Argumen yang Diperlukan:
--ip IP MQTT broker ip, eg. --ip 192.168.3.101.
--port PORT MQTT broker port, eg. --port 623.
Contoh:
Sambungkan ke MQTT broker dengan IP 200.200.200.200 di port default (1883).
python3 GenericMqttCollector.py --ip 200.200.200.200 --port 1883
Script ini terhubung ke broker Loraserver.io MQQT dan menyimpan pesan ke DB. Anda harus menentukan collectorid unik dan Anda dapat menentukan topik yang ingin Anda sukai.
Argumen opsional:
-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 "#.
Argumen yang Diperlukan:
--ip IP MQTT broker ip, eg. --ip 192.168.3.101.
Skrip ini menerima paket UDP dari proxy UDP dalam format gateway packet_forwarder dan bertahan.
Argumen opsional:
-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
Argumen yang Diperlukan:
-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.
Contoh:
Rekam data antara gateway yang mengirim ke port 1700 lokal dan network xserver mendengarkan di (localhost, 1701). Simpan data di ./ Direktori.
python3 PacketForwarderCollector.py --name semtech_collector --port 1700
Script ini membaca dari file atau file atau stdin dan menjalankan sub-alat yang berbeda. Bergantung pada opsi yang dipilih, Anda dapat menjalankan analisis lalu lintas Lorawan, cobalah untuk membasmi Appkey, atau menguraikan semua paket yang diterima. Opsi ini dapat digabungkan.
Argumen opsional:
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.
Contoh:
Proses paket dalam DB mulai dari Packet ID 1000, menjalankan analisis lalu lintas, dan cobalah untuk memecahkan appkeys yang diberikan di my-keys.txt, tetapi jangan menghasilkan lebih banyak kunci secara dinamis.
python3 LafProcessData.py -a -b -k my-keys.txt --no-gen --from-id 1000
Script ini memberikan fungsionalitas yang diatur oleh lafprocessdata.py. Di bawah ini, peringatan yang diimplementasikan oleh LafPacketAnalysis.py dan LafBruteForcer.py :
| PENGENAL | Judul | Penganalisa | Tingkat risiko | Keterangan | Tindakan yang disarankan |
|---|---|---|---|---|---|
| LAF-001 | Devnonce diulangi | Lafpacketanalysis.py | Rendah | Devnon untuk setiap perangkat harus cukup acak untuk tidak bertabrakan. Jika devnonce yang sama diulang dalam banyak pesan, dapat disimpulkan bahwa perangkat berada di bawah serangan replay. Ini adalah, seorang penyerang yang menangkap JoinRequest dan mencoba mengirimkannya lagi ke gerbang. | Periksa bagaimana DevNones dihasilkan: fungsi yang menghasilkannya harus diimplementasikan menggunakan pustaka acak. Selain itu, Anda harus memastikan bahwa server memeriksa devnon historis (mereka harus bertahan dalam DB), agar tidak menerima joinRequest lama yang sebelumnya dikirim oleh perangkat dan dengan demikian menghasilkan sesi baru. |
| LAF-002 | Deveuis berbagi devaddr yang sama | Lafpacketanalysis.py | Info | Dua perangkat yang berbeda mungkin telah ditugaskan devaddr yang sama. Ini bukan ancaman keamanan. | Jika perangkat di atas udara diaktifkan (OTAA): Periksa logika yang digunakan untuk menetapkan devaddrs, dan pastikan bahwa server tidak menetapkan devaddr yang sama ke perangkat yang berbeda. Jika perangkat diaktifkan oleh Personalisasi (ABP): Periksa Devaddr yang dikonfigurasi di firmware perangkat unik di jaringan Lorawan. |
| LAF-003 | Bergabunglah dengan replay | Todo | Sedang | Paket permintaan gabungan yang digandakan terdeteksi, yang mungkin menyiratkan bahwa server Lorawan berada di bawah serangan replay. Ini adalah, penyerang yang mungkin telah menangkap paket permintaan gabungan sebelumnya dan mengirimkannya lagi ke server Lorawan, untuk mencoba menghasilkan sesi baru. | Periksa bagaimana DevNones dihasilkan: fungsi yang menghasilkannya harus diimplementasikan menggunakan pustaka acak. Selain itu, Anda harus memastikan bahwa server memeriksa devnon historis (mereka harus bertahan dalam DB), agar tidak menerima joinRequest lama yang sebelumnya dikirim oleh perangkat dan dengan demikian menghasilkan sesi baru. |
| LAF-004 | Uplink Data Packet Replay | Todo | Sedang | Paket uplink yang digandakan terdeteksi, yang mungkin menyiratkan bahwa server Lorawan berada di bawah serangan replay. Ini adalah, penyerang yang mungkin telah menangkap paket uplink (dikirim dari perangkat) dan mengirimkannya lagi ke server Lorawan. | Di Over the Air Activated (OTAA) perangkat: Pastikan bahwa tombol sesi dihasilkan kembali setelah setiap perangkat diatur ulang atau melawan luapan untuk menghindari efek dari serangan ini. Dengan perangkat yang diaktifkan oleh personalisasi (ABP) dari Lorawan v1.0.*, Tidak ada yang dapat dilakukan untuk mencegah serangan replay kecuali dari beralih perangkat ke OTAA. |
| LAF-005 | Replay Paket Data Downlink | Todo | Tinggi | Paket downlink yang digandakan terdeteksi. Server menanggapi serangan replay atau menghasilkan lalu lintas atipikal ke perangkat | Periksa log server dan periksa apakah tindakan yang disarankan sebelumnya diterapkan |
| LAF-006 | Perangkat ABP yang mungkin (Penghitung Reset dan Tidak Bergabung) | Lafpacketanalysis.py | Tinggi | Jika penghitung diatur ulang (kembali ke 0), Devaddr tetap sama, dan tidak ada proses gabungan sebelumnya yang terdeteksi, dapat menyiratkan bahwa perangkat diaktifkan oleh Personalisasi (ABP). Implementasi Perangkat ABP tidak disarankan karena tidak ada proses gabungan yang dilakukan, yang berarti bahwa kunci sesi tetap sama selamanya. Perangkat yang tidak mengubah tombol sesi rentan terhadap serangan yang berbeda seperti Eaveasdrop atau Replay. | Semua perangkat yang diaktifkan oleh Personalisasi (ABP) harus diganti untuk perangkat yang diaktifkan melalui udara (OTAA) jika memungkinkan. Implementasi perangkat ABP tidak disarankan. |
| LAF-007 | Menerima penghitung yang lebih kecil dari yang diharapkan (berbeda dari 0) | Lafpacketanalysis.py | Sedang | Jika penyerang mendapatkan satu kunci sesi (karena telah mencuri appkey di perangkat OTAA atau AppsKey/NWKSKey di perangkat ABP), ia akan dapat mengirim data yang valid palsu ke server. Agar server menerima pesan palsu, diperlukan untuk FCNT (penghitung bingkai) dari pesan menjadi lebih tinggi dari FCNT dari pesan terakhir yang dikirim. Dalam skenario di mana perangkat spoofed asli terus mengirim pesan, server akan mulai membuang pesan (valid) karena mereka akan memiliki FCNT yang lebih kecil. Oleh karena itu, ketika pesan dengan nilai FCNT yang lebih kecil dari yang diharapkan oleh server Lorawan diterima, dimungkinkan untuk menyimpulkan bahwa sesi paralel ditetapkan. | Jika perangkat di atas Air Activated Device (OTAA), ubah Appley karena mungkin dikompromikan. Jika diaktifkan oleh personalisasi, ubah AppsKey dan NWKSKey. Selain itu, pastikan bahwa server Lorawan diperbarui dan tidak menerima pesan duplikat. |
| LAF-008 | Kata sandi retak dengan gabungan | Lafbruteforcer.py | Tinggi | Dimungkinkan untuk mendekripsi pesan JoinRequest menggunakan Appkey yang dikenal. | Gunakan appkey yang berbeda dari yang disediakan oleh vendor atau gunakan lebih banyak kunci acak. |
| LAF-009 | Kata sandi retak | Lafbruteforcer.py | Tinggi | Aplikasi perangkat ditemukan mencoba dengan string yang terkenal atau nonrandom. Itu didekripsi menggunakan sepasang pesan gabungan (meminta dan menerima). | Gunakan generator kunci acak untuk appkey alih -alih menggunakan yang disediakan oleh vendor. Selain itu, jangan atur appkey yang sama ke lebih dari satu perangkat dan jangan menghasilkan appkeys menggunakan logika yang dapat diprediksi (mis. Nilai tambahan, balik byte tertentu, dll.) |
| LAF-010 | Gateway mengubah lokasi | Lafpacketanalysis.py | Sedang | Jika gerbang tidak seharusnya mengubah lokasinya. Mungkin telah dicuri, dipindahkan, atau gerbang palsu mungkin mencoba untuk menyamar sebagai gateway yang sah. | Pastikan gerbang itu tidak dirusak, baik secara fisik maupun logis. |
Direktori ini menyediakan serangkaian pembungkus untuk perpustakaan https://github.com/brocaar/lorawan/, yang ditulis dalam Golang. Fungsi -fungsi ini diimplementasikan oleh alat.
Di sini Anda akan menemukan serangkaian skrip yang dimaksudkan untuk mengotomatisasi tugas yang berbeda. Pastikan untuk memberi mereka izin eksekusi jika perlu ( chmod +x your_script untuk linux/macOS).
Mengatur gateway Anda dengan mudah dan mengganti salurannya untuk keperluan mengendus. Untuk informasi lebih lanjut tentang cara menggunakannya, Anda dapat melihat readme di direktori ini.
Skrip ini digunakan untuk menginstal semua paket perangkat lunak yang diperlukan pada Raspberry Pi untuk membangun gateway Lorawan bersama dengan konsentrator LORA yang terhubung (IC980-SPI, RHF0M301-SPI, RAK831-SPI atau lainnya dengan pengaturan manual).
Karena tidak mungkin untuk mengetahui di mana frekuensi perangkat LORA beroperasi, kami telah membuat skrip yang dapat mengganti saluran gateway dari pita frekuensi US915 dan EU868 untuk tujuan mengendus. Meskipun ada gateway profesional dan mahal yang mendukung 32 atau 64 saluran, sebagian besar gateway mendukung hingga 8 saluran. Script ini dimaksudkan untuk berjalan di gateway semacam ini.
Setidaknya di pita frekuensi US915, 8 saluran pertama adalah yang paling banyak digunakan. Tetapi ada implementasi terkenal yang menggunakan kelompok saluran lain, seperti misalnya jaringan hal-hal, yang menggunakan grup kedua (8-15) saluran untuk komunikasi uplink.
Saat ini kami tidak mendukung pita frekuensi lain tetapi, dengan beberapa perubahan pada skrip ini Anda dapat melakukan ini sendiri :).
Kami mengunggah video kerangka kerja ini dalam aksi (skenario yang sama disajikan di Blackhat 2019): https://youtu.be/mm6a2rvnocs. Langkah -langkah terperinci dari demo ada di deskripsi video YouTube.
Todo
Proyek ini dilisensikan di bawah lisensi BSD-3-Clause.