
Этот проект предназначен для предоставления набора инструментов для создания, разбора, отправки, анализа и взлома набора пакетов LoRaWAN с целью аудита или тестирования на проникновение безопасности инфраструктуры LoRaWAN.
Развертывания IoT продолжают расти, и значительная часть этого роста состоит из миллионов LPWAN-сенсоров (маломощные сети с большим радиусом действия), развернутых в сотнях городов (Умные города) по всему миру, а также в промышленности и домах. Одной из наиболее используемых LPWAN-технологий является 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. Инструкции по настройке Docker ниже.Эти инструкции помогут вам получить копию проекта и его зависимостей на вашем локальном компьютере. Команды ниже предназначены для окружения на основе Debian:
Клонируйте этот репозиторий: git clone --recurse-submodules https://github.com/IOActive/laf.git
Установите python3:
sudo apt-get updatesudo apt-get install python3.6Загрузите и установите зависимости Python:
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilУстановите PYTHONPATH и 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В зависимости от того, какую БД вы хотите использовать:
a. PostgreSQL: Следуйте инструкциям «Установка LAF с помощью Docker» до 3-го шага.
b. SQLite:
cd laf/auditing/db__init__.py с помощью вашего текстового редактора, закомментируйте строки для использования с PostgreSQL (подключение к БД и переменные окружения) и раскомментируйте строку для использования с sqlite.Вот и всё!
Этот подход позволяет избежать установки зависимостей и запускает базу данных PostgreSQL, где инструменты сохраняют пакеты и данные. Контейнеры:
Шаги:
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashВы можете проверить данные в БД с помощью pgAdmin:
Сначала откройте pgAdmin:
Затем добавьте сервер:
Здесь приведено описание директорий и инструментов/функций внутри них.
Основная цель инструментов в этой папке — облегчить выполнение пентеста инфраструктуры LoRaWAN.
Этот инструмент предназначен для отправки восходящих пакетов (на сетевой сервер или gatewayBridge, в зависимости от инфраструктуры) или нисходящих пакетов (на packet-forwarder). Опционально пакеты могут быть фаззированы, а также может быть вычислен корректный 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 Укажите ключ (в шестнадцатеричном формате, всего 32 символа / 16 байт) для подписи пакетов (вычисление и добавление нового MIC). Обратите внимание, что для JoinRequests это должен быть AppKey, а для Data-пакетов — NwkSKey. Это не может быть проверено заранее этой программой. Например: 00112233445566778899AABBCCDDEEFF
-a DEVADDR, --devaddr DEVADDR
DeviceAddress для подмены, заданный в шестнадцатеричном формате (всего 8 символов), например AABB0011.
--fcnt FCNT Счетчик кадров, который будет установлен в данном пакете данных. Это не сработает для JoinRequest/JoinAccept, так как эти пакеты не имеют fCnt
Обязательные аргументы: