IoTの展開は成長し続けており、その重要な成長の一部は、世界中の数百の都市(スマートシティ)に産業や家庭で展開されている数百万のLPWAN(低電力幅広場ネットワーク)センサーで構成されています。最も使用されているLPWANテクノロジーの1つは、Lorawanがネットワーク標準(MACレイヤー)であるLoraです。 Lorawanは、組み込みの暗号化を備えた安全なプロトコルですが、実装の問題と弱点は、ほとんどの現在の展開のセキュリティに影響します。
このプロジェクトは、ロラワンのインフラストラクチャのセキュリティを監査またはペンテストするために、一連のロラワンパケットを作成、解析、送信、分析、クラックするための一連のツールを提供する予定です。
以下、このリポジトリの構造:
|-- 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
ロラワン監査フレームワークを稼働させるためのさまざまなオプションを提供します。
tools/ DIRにあるペンテストツールを使用することである場合は、このオプションをお勧めします。localhostを介してPostgresに接続しようとします。 Dockerを設定するには、以下の指示を参照してください。これらの指示により、プロジェクトのコピーとローカルマシンの依存関係が得られます。以下のコマンドは、Debianベースの環境用です。
このリポジトリのクローン: git clone --recurse-submodules https://github.com/IOActive/laf.git
Python3をインストール:
sudo apt-get updatesudo apt-get install python3.6Python依存関係をダウンロードしてインストールします。
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilPythonPathと環境を設定します
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'Golangのインストールとセットアップ:
cd ~/Downloadssudo tar -C /usr/local -xvzf YOUR_GOLANG_FILEexport PATH=$PATH:/usr/local/go/binexport GOPATH="$HOME/go"Go Libraryをコンパイル:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goどのdbを使用したいかに応じて:
a。 postresql:3番目のステップまで、指示書「Dockerを使用してLAFをインストールする」に従ってください。
b。 sqlite:
cd laf/auditing/db__init__.py変更し、postgres(db接続および環境変数)で使用する行にコメントをコメントします。そしてそれだけです!
このアプローチは、依存関係のインストールを避け、ツールがパケットとデータを保存するPostgreSQL DBを開始します。コンテナ:
ステップ:
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashに使用する場合PGADMINを使用してDBのデータを確認できます。
まず、pgadminへのアクセス:
次に、サーバーを追加する必要があります。
ディレクトリの説明とその内部のツール /関数は次のとおりです。
このディレクトリで提供されるツールの主な目的は、ロラワンインフラストラクチャへの浸透テストの実行を容易にすることです。
このツールは、アップリンクパケット(インフラストラクチャに応じてネットワークサーバーまたはGatewayBridgeに)またはダウンリンクパケット(Packet-Forwarderに)を送信することを目的としています。オプションで、パケットをファズ化し、有効なマイクを計算できます。
オプションの引数:
-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
必要な議論:
--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}'"
例:
2秒ごとに1つのパケットを(LocalHost、10001)にポート10000からランダムにFuzzingに送信するには、MICと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="}]}'"
このUDPプロキシは、主に、評価対象の項目破壊に応じて、シリーズゲートウェイ(packet_forwarders)とネットワークサーバーまたはゲートウェイブリッジの間に配置することを目的としています。また、目的の方向(アップリンクまたはダウンリンク)でファズデータを提供する可能性を提供します
オプションの引数:
-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)
必要な議論:
--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.
例:
ポート1234で受信したパケットを(LocalHost、1235)およびVicecersaに送信する。ポートで受信したパケットはファズ化され(devnonceはrandonlyが変更されます)、(localhost、1235)に転送されます。
python3 UdpProxy.py --port 1234 --dst-ip 127.0.0.1 --dst-port 1235 --fuzz-in 9
このTCPプロキシは、主にネットワークサーバーとMQTTブローカーの間に配置することを目的としています。また、ファズデータの可能性を提供します。
オプションの引数:
-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)
必要な議論:
--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.
例:
(localhost、1884)および(localhost、1883)からデータを送信して受信します
python3 TcpProxy.py --lcl-port 1884 --dst-ip 127.0.0.1 --dst-port 1883
このディレクトリには、解析、クラフト、ブルートフォーサーなどの一連のスクリプトが含まれています。
このスクリプトは、base64でJoinAcceptまたはJoinRequestを受信し、ファイルで提供できる、またはその場で生成できる一連の可能なキーでAppkeyを復号化しようとします。
オプションの引数:
-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
必要な議論:
-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=
例:
my-keys.txtからキーのセットを使用してJoinRequestをクラックし、Aproxも生成します。ディナミーに200000。
python3 BruteForcer.py -a IHvAP4MXo5Qo6tdV+Yfk08o= -r AMQAAAAAhQAAAgAAAAAAAADcYldcgbc= -k ./my-keys.txt
このスクリプトは、Base64のPhypayloadパケットと、パケットタイプに応じてAppkeyのnwkskeyになる可能性のあるキーを受信し、新しいマイクを生成する可能性があります。
オプションの引数:
-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"
必要な議論:
-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
例:
AppKey 00112334556678899AABBCCDEFEFFで指定されたPhyPayloadに署名します。
python3 MicGenerator.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -k 00112233445566778899AABBCCDDEEFF
このスクリプトは、lorawan jsonパケットを受信し、base64にtranformsします。 PacketParser.pyとして逆になるため、このスクリプトの出力はここで使用でき、その逆も同様です。
オプションの引数:
-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.
必要な議論:
-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"}'
例:
JSONに与えられたVase64でJoinRrequest Phypayloadを取得して、値が渡されます。
python3 PacketCrafter.py -j '{"mhdr":{"mType":"JoinRequest","major":"LoRaWANR1"},"macPayload":{"joinEUI":"55d239ac716f234d","devEUI":"b827eb891cf50003","devNonce":51639},"mic":"7005c4a5"}'
このスクリプトは、base64に単一のロラワンファイパイロードデータを解析および印刷します。 Packetcrafter.pyとして逆を行うため、このスクリプトの出力はここで使用でき、その逆も同様です。
オプションの引数:
-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
必要な議論:
-d DATA, --data DATA Base64 data to be parsed. eg. -d
AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
例:
上記の例からJSON形式のJoinRrequestを取得します。
python3 PacketParser.py -d AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU=
このスクリプトは、base64のjoinacceptとJoinRequest、およびセッションキーを生成するためのAppKeyを受信します。使用法の例:
オプションの引数:
-h, --help show this help message and exit
必要な議論:
-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
例:
次の結合データを使用して、AppSkeyとnwkskeyを取得します。
python3 SessionKeysGenerator.py -r AE0jb3GsOdJVAwD1HInrJ7i3yXAFxKU= -a IB1scNmwJRA32RfMbvwe3oI= -k f5a3b185dfe452c8edca3499abcd0341
これらは、 UdpSender.pyおよびUdpProxy.pyが使用する補助機能です。 Fuzzer.pyでは、ファジングモードが実装されていることがわかります。
このディレクトリの一般的な目的は、ロラワンパケットを収集してトラフィックのさまざまな側面を分析することと、AppKeyをブルートフォースしようとするキーのセットを試すことです。
このディレクトリには、さまざまなソース(つまり、Gateway Packet_forwarder、Thing Thing Networkなど)からLorawanパケットを受信し、標準形式のファイルに保存するスクリプトのセットが含まれています。このファイルは、Script /auditing/analyzers/LafProcessData.py analyzers/lafprocessdata.pyによって後でフェッチする必要があります。
このスクリプトは、MQQTブローカーに接続し、すべてのトピックを取得し、指定されたフィールドのファイルにメッセージを保存します。ファイル名は、このスクリプトが開始された日付で構成されています。
オプションの引数:
-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 "#.
必要な議論:
--ip IP MQTT broker ip, eg. --ip 192.168.3.101.
--port PORT MQTT broker port, eg. --port 623.
例:
デフォルトポート(1883)でIP 200.200.200.200でブローカーをMQTTに接続します。
python3 GenericMqttCollector.py --ip 200.200.200.200 --port 1883
このスクリプトは、loraserver.io mqqtブローカーに接続し、メッセージをDBに保存します。ユニークなCollectorIDを指定する必要があり、説明するトピックを指定できます。
オプションの引数:
-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 "#.
必要な議論:
--ip IP MQTT broker ip, eg. --ip 192.168.3.101.
このスクリプトは、Gateway Packet_forwarder形式のUDPプロキシからUDPパケットを受信し、それらを維持します。
オプションの引数:
-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
必要な議論:
-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.
例:
ローカルポート1700に送信するゲートウェイと、(LocalHost、1701)のネットワークXserverのリスニングとの間のデータを記録します。データを./ディレクトリに保存します。
python3 PacketForwarderCollector.py --name semtech_collector --port 1700
このスクリプトは、ファイルまたはファイルまたはstdinからAを読み取り、異なるサブツールを実行します。選択したオプションに応じて、Lorawanトラフィックの分析を実行したり、Appkeyをブルートフォースしたり、受信したすべてのパケットを解析したりできます。これらのオプションを組み合わせることができます。
オプションの引数:
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.
例:
パケットID 1000から始まるDBのパケットを処理し、トラフィック分析を実行し、my-keys.txtで与えられたアプリケイをクラックしようとしますが、ディナミーに多くのキーを生成しないでください。
python3 LafProcessData.py -a -b -k my-keys.txt --no-gen --from-id 1000
これらのスクリプトは、lafprocessdata.pyがオーケストした機能を提供します。以下では、 LafPacketAnalysis.pyおよびLafBruteForcer.pyによって実装されているアラート:
| id | タイトル | アナライザ | リスクレベル | 説明 | 推奨アクション |
|---|---|---|---|---|---|
| LAF-001 | devnonceが繰り返されました | lafpacketanalysis.py | 低い | 各デバイスのdevnoncesは、衝突しないほどランダムでなければなりません。同じdevnonceが多くのメッセージで繰り返された場合、デバイスがリプレイ攻撃の下にあると推測できます。これは、JoinRrequestをキャプチャし、もう一度ゲートウェイに送信しようとしている攻撃者です。 | devnoncesの生成方法を確認します。それらを生成する関数は、ランダムライブラリを使用して実装する必要があります。さらに、サーバーが以前にデバイスから送信された古い有効なJoinRequestを受け入れず、したがって新しいセッションを生成するために、サーバーが歴史的なDevnonces(DBで持続する必要がある)を確認する必要があります。 |
| LAF-002 | 同じdevaddrを共有するdeveuis | lafpacketanalysis.py | 情報 | 2つの異なるデバイスに同じdevaddrが割り当てられている可能性があります。これはセキュリティの脅威ではありません。 | デバイスがAIR ACTACTATED(OTAA)を超えている場合:DevADDRを割り当てるために使用されるロジックを確認し、サーバーが同じデバイスに同じDevADDRを割り当てないことを確認します。デバイスがパーソナライズによってアクティブ化されている場合(ABP):デバイスのファームウェアで構成されたDevAddrがLorawanネットワークで一意であることを確認します。 |
| LAF-003 | リプレイに参加してください | トト | 中くらい | 重複した結合リクエストパケットが検出されました。これは、ロラワンサーバーがリプレイ攻撃を受けていることを意味する場合があります。これは、新しいセッションを生成しようとするために、以前のJoin Requestパケットをキャプチャし、ロラワンサーバーに再度送信している可能性のある攻撃者です。 | devnoncesの生成方法を確認します。それらを生成する関数は、ランダムライブラリを使用して実装する必要があります。さらに、サーバーが以前にデバイスから送信された古い有効なJoinRequestを受け入れず、したがって新しいセッションを生成するために、サーバーが歴史的なDevnonces(DBで持続する必要がある)を確認する必要があります。 |
| LAF-004 | アップリンクデータパケットのリプレイ | トト | 中くらい | 重複したアップリンクパケットが検出されました。これは、ロラワンサーバーがリプレイ攻撃を受けていることを意味する場合があります。これは、アップリンクパケット(デバイスから送信)をキャプチャし、ロラワンサーバーに再び送信している可能性のある攻撃者です。 | オーバーエアアクティブ化された(OTAA)デバイス:この攻撃からの効果を回避するために、デバイスをすべてリセットまたはカウンターオーバーフローするたびに、セッションキーが再生されることを確認してください。 Lorawan v1.0。*のパーソナライゼーション(ABP)デバイスによってアクティブ化された場合、デバイスをOTAAに切り替えることを除いて、リプレイ攻撃を防ぐことはできません。 |
| LAF-005 | ダウンリンクデータパケットリプレイ | トト | 高い | 重複したダウンリンクパケットが検出されました。サーバーはリプレイ攻撃に応答しているか、非定型トラフィックをデバイスに生成しています | サーバーのログを確認し、以前の推奨アクションが実装されていることを確認します |
| LAF-006 | 可能なABPデバイス(カウンターリセットと結合なし) | lafpacketanalysis.py | 高い | カウンターがリセットされた場合(0に戻ってきた)、devaddrは同じに保たれ、以前の結合プロセスが検出されなかった場合、デバイスがパーソナライズ(ABP)によってアクティブ化されることを意味する場合があります。結合プロセスが行われないため、ABPデバイスの実装は落胆します。つまり、セッションキーは永久に同じに保たれます。セッションキーを変更しないデバイスは、eaveasdropやリプレイなど、さまざまな攻撃を受けやすいです。 | すべてのパーソナライズ(ABP)デバイスによってアクティブ化されたすべては、可能であれば、オーバーエアアクティブ化(OTAA)デバイスに交換する必要があります。 ABPデバイスの実装は落胆します。 |
| LAF-007 | 予想よりも小さなカウンターを受け取りました(0とは異なります) | lafpacketanalysis.py | 中くらい | 攻撃者が一対のセッションキーを取得した場合(OTAAデバイスでAppKeyまたはABPデバイスでAppSkey/NWKSEYを盗んだため)、彼/彼女は偽の有効なデータをサーバーに送信できます。サーバーがスプーフィングされたメッセージを受け入れるには、メッセージのFCNT(フレームカウンター)が送信された最後のメッセージのFCNTよりも高くなることが必要です。元のスプーフィングされたデバイスがメッセージを送信し続けるシナリオでは、サーバーはより小さいFCNTを持つため、(有効な)メッセージを破棄し始めます。したがって、Lorawanサーバーが予想されるよりも小さいFCNT値を持つメッセージが受信されている場合、並列セッションが確立されたと推測することができます。 | デバイスがAIRアクティベーションデバイス(OTAA)を介している場合、おそらく妥協されたため、AppKeyを変更します。パーソナライズによってアクティブ化されている場合は、AppSkeyとNwkskeyを変更してください。さらに、Lorawanサーバーが更新されており、複製されたメッセージを受け入れていないことを確認してください。 |
| LAF-008 | JoinRequestで割れたパスワード | lafbruteforcer.py | 高い | 既知のAppKeyを使用してJoinRrequestメッセージを復号化することができました。 | ベンダーが提供するものとは異なるAppKeyを使用するか、より多くのランダムキーを使用します。 |
| LAF-009 | パスワードがクラックされています | lafbruteforcer.py | 高い | デバイスのAppkeyは、よく知られている弦または非ランダムな文字列で試してみました。一対の参加メッセージ(リクエストと受け入れ)を使用して復号化されました。 | ベンダーが提供するものを使用する代わりに、AppKeyにランダムなキージェネレーターを使用します。さらに、同じAppKeyを複数のデバイスに設定しないでください。予測可能なロジック(たとえば、インクリメンタル値、特定のバイトをフリップするなど)を使用してAppKeyを生成しないでください。 |
| LAF-010 | ゲートウェイは場所を変更しました | lafpacketanalysis.py | 中くらい | ゲートウェイがその場所を変更することになっていない場合。盗まれたり、移動したり、偽のゲートウェイが合法的なゲートウェイになりすまそうとしている可能性があります。 | 物理的または論理的にゲートウェイが改ざんされていないことを確認してください。 |
このディレクトリは、Golangで書かれたライブラリhttps://github.com/brocaar/lorawan/のラッパーのセットを提供します。これらの関数はツールによって実装されます。
ここでは、さまざまなタスクを自動化することを目的とした一連のスクリプトがあります。必要に応じて、必ず実行許可を与えてください(Linux/macosのchmod +x your_script )。
ゲートウェイを簡単にセットアップし、スニッフィング目的でチャネルを切り替えます。それらの使用方法の詳細については、このディレクトリのREADMEを確認できます。
このスクリプトは、コネクテッドロラ濃縮器(IC980-SPI、RHF0M301-SPI、RAK831-SPIなど)と組み合わせてLorawanゲートウェイを構築するために、Raspberry Piに必要なすべてのソフトウェアパッケージをインストールするために使用されます。
どの周波数LORAデバイスが動作しているかを知ることはできないため、Sniffing目的でUS915およびEU868周波数帯域からゲートウェイチャネルを切り替えることができるスクリプトを作成しました。 32または64のチャネルをサポートするプロフェッショナルで高価なゲートウェイがありますが、ほとんどのゲートウェイは最大8チャネルをサポートしています。このスクリプトは、この種のゲートウェイで実行することを目的としています。
少なくともUS915周波数帯域では、最初の8チャネルが最も使用されています。しかし、たとえば、アップリンク通信にチャネルの2番目のグループ(8-15)を使用するものなど、別のチャネルのグループを使用する有名な実装があります。
現在、他の周波数帯域をサポートしていませんが、これらのスクリプトに変更が少ないため、自分でこれを行うことができます:)。
このフレームワークの動作のビデオをアップロードしました(Blackhat 2019で提示されたのと同じシナリオ):https://youtu.be/mm6a2rvnocs。デモの詳細な手順は、YouTubeビデオの説明にあります。
トト
このプロジェクトは、BSD-3-Clauseライセンスの下でライセンスされています。