
Este projeto pretende fornecer um conjunto de ferramentas para criar, interpretar, enviar, analisar e quebrar um conjunto de pacotes LoRaWAN, a fim de auditar ou realizar pentest na segurança de uma infraestrutura LoRaWAN.
As implementações de IoT continuam crescendo e uma parte desse crescimento significativo é composta por milhões de sensores LPWAN (rede de longa distância de baixa potência) implantados em centenas de cidades (Cidades Inteligentes) ao redor do mundo, também em indústrias e residências. Uma das tecnologias LPWAN mais utilizadas é LoRa, para a qual LoRaWAN é o padrão de rede (camada MAC). LoRaWAN é um protocolo seguro com criptografia embutida, mas problemas de implementação e fraquezas afetam a segurança da maioria das implementações atuais.
Este projeto pretende fornecer uma série de ferramentas para criar, analisar, enviar, analisar e quebrar um conjunto de pacotes LoRaWAN, a fim de auditar ou testar a segurança de uma infraestrutura LoRaWAN.
Abaixo, a estrutura deste repositório:
|-- 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
Fornecemos diferentes opções para ter seu LoraWAN Auditing Framework em funcionamento:
tools/, para evitar problemas com mapeamento de portas do Docker.localhost. Veja as instruções abaixo para configurar o Docker.Estas instruções fornecerão uma cópia do projeto e suas dependências em sua máquina local. Os comandos abaixo são para um ambiente baseado em Debian:
Clone este repositório: git clone --recurse-submodules https://github.com/IOActive/laf.git
Instale python3:
sudo apt-get updatesudo apt-get install python3.6Baixe e instale as dependências python:
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilDefina PYTHONPATH e ENVIRONMENT
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'Instale e configure golang:
cd ~/Downloadssudo tar -C /usr/local -xvzf YOUR_GOLANG_FILEexport PATH=$PATH:/usr/local/go/binexport GOPATH="$HOME/go"Compile a biblioteca go:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goDependendo de qual banco de dados você deseja usar:
a. PostreSQL: Siga as instruções 'Instalar LAF usando Docker' até o 3º passo.
b. SQLite:
cd laf/auditing/db__init__.py com seu editor de texto preferido e comente as linhas a serem usadas com Postgres (conexão com o banco e variáveis de ambiente) e descomente a linha a ser usada com sqlite.E pronto!
Esta abordagem evita lidar com a instalação de dependências e inicia um banco de dados PostgreSQL onde as ferramentas salvam pacotes e dados. Contêineres:
Passos:
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashVocê pode verificar os dados no banco usando pgAdmin:
Primeiro, acesse pgAdmin:
Em seguida, você precisa adicionar o servidor:
Aqui está a descrição dos diretórios e das ferramentas/funções dentro deles.
O principal objetivo das ferramentas fornecidas neste diretório é facilitar a execução de um teste de penetração em uma infraestrutura LoRaWAN.
Esta ferramenta destina-se a enviar pacotes uplink (para o servidor de rede ou gatewayBridge, dependendo da infraestrutura) ou pacotes downlink (para o packet-forwarder). Opcionalmente, os pacotes podem ser "fuzzeados" e um MIC válido pode ser calculado.
Argumentos opcionais:
-h, --help show this help message and exit
--lcl-port LCL_PORT Porta de origem, ex. --lcl-port=623.
--timeout TIMEOUT Tempo em segundos entre cada pacote enviado. Padrão é
1s. Neste tempo, o remetente escutará por respostas.
--repeat Envia a mensagem/s várias vezes
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
Fuzzeia os dados enviados para a porta de destino
(veja modos de fuzzing em utils/fuzzer.py),
ex. --fuzz-out 1 2.
--key KEY Insira a chave (em formato hex, total de 32 caracteres
/ 16 bytes) para assinar pacotes (calcular e adicionar
um novo MIC). Observe que para JoinRequests deve ser o
AppKey, e para pacotes de dados o NwkSKey. Isso não
pode ser validado antecipadamente por este programa.
ex. 00112233445566778899AABBCCDDEEFF
-a DEVADDR, --devaddr DEVADDR
DeviceAddress para personificar, fornecido em formato
hex (8 caracteres no total), ex. AABB0011.
--fcnt FCNT O contador de quadro a ser definido no pacote de dados
fornecido. Isso não funcionaria em um
JoinRequest/JoinAccept, pois esses pacotes não
possuem fCnt
Argumentos obrigatórios: