
このプロジェクトは、LoRaWANインフラストラクチャのセキュリティを監査またはペネトレーションテストするために、一連のLoRaWANパケットを作成、解析、送信、分析、クラックするためのツール群を提供することを目的としています。
IoTデプロイメントは成長を続けており、その大きな成長の一部は、世界中の何百もの都市(スマートシティ)や産業、家庭に展開された数百万のLPWAN(低消費電力広域ネットワーク)センサーで構成されています。最も使用されているLPWAN技術の1つがLoRaであり、LoRaWANはそのネットワーク標準(MAC層)です。LoRaWANは暗号化を組み込んだ安全なプロトコルですが、実装上の問題や脆弱性が現在のほとんどのデプロイメントのセキュリティに影響を与えています。
このプロジェクトは、LoRaWANインフラストラクチャのセキュリティを監査またはペネトレーションテストするために、一連の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
LoRaWAN監査フレームワークを稼働させるためのいくつかのオプションを提供します:
tools/ ディレクトリにあるペネトレーションテスティングツールを使用することである場合、dockerのポートマッピングの問題を避けるためにこのオプションをお勧めします。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とENVIRONMENTを設定:
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ライブラリをコンパイル:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.go使用するDBに応じて:
a. PostgreSQL: 3番目のステップまで 'Dockerを使ってLAFをインストール' の手順に従ってください。
b. SQLite:
cd laf/auditing/db__init__.py を開き、Postgres用の行(DB接続と環境変数)をコメントアウトし、sqlite用の行をコメント解除します。これで完了です!
この方法では、依存関係のインストールを回避し、ツールがパケットとデータを保存するPostgreSQLデータベースを起動します。 コンテナ:
手順:
git clone https://github.com/IOActive/laf.gitcd laf/ に移動docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashpgAdminを使用してデータベース内のデータを確認できます:
まず、pgAdminにアクセス:
次に、サーバーを追加:
以下は、ディレクトリとその中のツール/機能の説明です。
このディレクトリにあるツールの主な目的は、LoRaWANインフラストラクチャに対するペネトレーションテストの実行を容易にすることです。
このツールは、アップリンクパケット(インフラに応じてネットワークサーバーまたはゲートウェイブリッジへ)またはダウンリンクパケット(パケットフォワーダーへ)を送信するためのものです。オプションで、パケットをファズし、有効なMICを計算できます。
オプション引数:
-h, --help このヘルプメッセージを表示して終了
--lcl-port LCL_PORT ソースポート、例: --lcl-port=623
--timeout TIMEOUT 送信するパケット間の時間(秒)。デフォルトは
1秒。この間、送信者は応答を待ちます。
--repeat メッセージを複数回送信
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
送信先ポートに送信するデータをファズ(ファジングモードは
utils/fuzzer.py を参照)、例: --fuzz-out 1 2
--key KEY パケットに署名するための鍵(16進形式、合計32文字
/ 16バイト)を入力し、新しいMICを計算して追加します。
JoinRequestsの場合はAppKey、データパケットの場合はNwkSKeyでなければならないことに注意してください。
これは事前にこのプログラムで検証できません。例:
00112233445566778899AABBCCDDEEFF
-a DEVADDR, --devaddr DEVADDR
なりすますデバイスアドレス。16進形式(合計8文字)で指定、
例: AABB0011
--fcnt FCNT 指定されたデータパケットに設定するフレームカウンタ。
これはJoinRequest/JoinAcceptでは機能しません。これらのパケットにはfCntがないためです。
必須引数:
--dst-ip DST_IP 送信先IP、例: --dst-ip 192.168.3.101
--dst-port DST_PORT 送信先ポート、例: --dst-port 623
--data DATA UDPパケット。このスクリプトの最後にある "data" 配列にさらにパケットを追加することもできます。
パケットはバイト文字列でなければなりません(二重引用符はエスケープする必要があります)。
***例*** パケットフォワーダー形式: --data "b'\x02\xe67\x00\xb8\'\xeb\xff\xfez\x80
\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=\"}]}'" ***例*** gatevice [GV] 形式で即時モード、
BW125、周波数902.3で送信: "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から送信し、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'\x02\xe67\x00\xb8\'\xeb\xff\xfez\x80\xdb{\"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プロキシは主に、一連のゲートウェイ(パケットフォワーダー)とネットワークサーバーまたはゲートウェイブリッジ(評価中のインフラに応じて)の間に配置するためのものです。また、希望する方向(アップリンクまたはダウンリンク)でデータをファズする機能も提供します。
オプション引数: