
Este proyecto pretende proporcionar una serie de herramientas para crear, procesar, enviar, analizar y descifrar un conjunto de paquetes LoRaWAN con el fin de auditar o realizar pruebas de penetración de la seguridad de una infraestructura LoRaWAN.
Las implementaciones de IoT siguen creciendo y una parte de ese crecimiento significativo está compuesta por millones de sensores LPWAN (red de área amplia de baja potencia) desplegados en cientos de ciudades (Smart Cities) alrededor del mundo, también en industrias y hogares. Una de las tecnologías LPWAN más utilizadas es LoRa, para la cual LoRaWAN es el estándar de red (capa MAC). LoRaWAN es un protocolo seguro con cifrado incorporado, pero problemas de implementación y debilidades afectan la seguridad de la mayoría de las implementaciones actuales.
Este proyecto tiene como objetivo proporcionar una serie de herramientas para crear, analizar, enviar, analizar y descifrar un conjunto de paquetes LoRaWAN con el fin de auditar o realizar pruebas de penetración en la seguridad de una infraestructura LoRaWAN.
A continuación, la estructura de este repositorio:
|-- 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
Ofrecemos diferentes opciones para tener tu LoRaWAN Auditing Framework listo y funcionando:
tools/, para evitar problemas con el mapeo de puertos de Docker.localhost. Consulta las instrucciones a continuación para configurar Docker.Estas instrucciones te darán una copia del proyecto y sus dependencias en tu máquina local. Los comandos a continuación son para un entorno basado en Debian:
Clona este repositorio: git clone --recurse-submodules https://github.com/IOActive/laf.git
Instala python3:
sudo apt-get updatesudo apt-get install python3.6Descarga e instala las dependencias de Python:
sudo pip3 install paho-mqtt && sudo pip3 install sqlalchemy && sudo pip3 install psycopg2-binary &&sudo pip3 install python-dateutilEstablece PYTHONPATH y ENVIRONMENT
cd laf && export PYTHONPATH=$(pwd) && export ENVIRONMENT='DEV'Instala y configura golang:
cd ~/Downloadssudo tar -C /usr/local -xvzf TU_ARCHIVO_GOLANGexport PATH=$PATH:/usr/local/go/binexport GOPATH="$HOME/go"Compila la biblioteca go:
cd laf/lorawanwrapper/utilsgo build -o lorawanWrapper.so -buildmode=c-shared jsonUnmarshaler.go lorawanWrapper.go micGenerator.go sessionKeysGenerator.go hashGenerator.goDependiendo de la base de datos que desees usar:
a. PostgreSQL: Sigue las instrucciones 'Instalar LAF usando Docker' hasta el paso 3.
b. SQLite:
cd laf/auditing/db__init__.py con tu editor de texto preferido y comenta las líneas para usar con Postgres (conexión DB y variables de entorno) y descomenta la línea para usar con sqlite.¡Y eso es todo!
Este método evita lidiar con la instalación de dependencias e inicia una base de datos PostgreSQL donde las herramientas guardan paquetes y datos. Contenedores:
Pasos:
git clone https://github.com/IOActive/laf.gitcd laf/docker-compose up --builddocker exec -ti laf_tools_1 /bin/bashPuedes revisar los datos en la base de datos usando pgAdmin:
Primero, accede a pgAdmin:
Luego, debes agregar el servidor:
Aquí se describe el contenido de los directorios y las herramientas/funciones dentro de ellos.
El propósito principal de las herramientas proporcionadas en este directorio es facilitar la ejecución de una prueba de penetración a una infraestructura LoRaWAN.
Esta herramienta está diseñada para enviar paquetes uplink (hacia el servidor de red o gatewayBridge, dependiendo de la infraestructura) o paquetes downlink (hacia el packet-forwarder). Opcionalmente, los paquetes pueden ser sometidos a fuzzing y se puede calcular un MIC válido.
Argumentos opcionales:
-h, --help muestra este mensaje de ayuda y sale
--lcl-port LCL_PORT Puerto de origen, ej. --lcl-port=623.
--timeout TIMEOUT Tiempo en segundos entre cada paquete enviado. Por defecto es
1s. Durante este tiempo, el remitente escuchará respuestas.
--repeat Enviar mensaje/s varias veces
--fuzz-out FUZZ_OUT [FUZZ_OUT ...]
Datos de fuzzing enviados al puerto de destino (consulta los modos de fuzzing en
utils/fuzzer.py), ej. --fuzz-out 1 2.
--key KEY Ingresa la clave (en formato hex, un total de 32 caracteres
/ 16 bytes) para firmar paquetes (calcular y agregar un nuevo
MIC). Ten en cuenta que para JoinRequests debe ser la
AppKey, y NwkSKey para paquetes de datos. Esto no puede
ser validado de antemano por este programa. ej.
00112233445566778899AABBCCDDEEFF
-a DEVADDR, --devaddr DEVADDR
Dirección de dispositivo a suplantar, en formato hex (8 caracteres
en total), ej. AABB0011.
--fcnt FCNT El contador de trama a establecer en el paquete de datos dado.
Esto no funcionaría en un JoinRequest/JoinAccept ya que
estos paquetes no tienen un fCnt
Argumentos requeridos: