
Firmware ESP32 que fareja pacotes PROBE REQUEST enviados por smartphones à procura de conexão Wi-Fi para extrair diferentes tipos de informação
Este projeto utiliza o Espressif IoT Development Framework (ESP-IDF) e foi testado no módulo ESP-WROOM-32 e no esp-idf v3.2.
Uma visão geral do projeto completo (ou seja, firmware ESP32, servidor e GUI) pode ser encontrada aqui.
Este firmware foi escrito com o propósito de farejar pacotes Probe Request enviados por smartphones que estão procurando conexão Wi-Fi. Quando a conexão Wi-Fi está ativa em um smartphone, ele enviará em broadcast (em todas as frequências de canais) uma mensagem probe request perguntando se há algum Wi-Fi livre ou algum conhecido (ou seja, o smartphone conhece a senha daquele Wi-Fi). O ESP32 irá farejá-la e extrair diferentes tipos de informações.
As seguintes informações são obtidas de cada pacote farejado:
Após cada minuto essas informações são enviadas para um servidor e processadas. Por fim, é possível ver as informações processadas (localização em tempo real do smartphone, frequência do smartphone, etc.) através de uma GUI.
O firmware consiste em duas threads/tarefas principais:
Sniffer Task
Wi-Fi Task
lock é usado para gerenciar a seção crítica para operações de I/O no arquivo.O ESP32 está configurado no modo WIFI_MODE_APSTA: ou seja, ele cria "soft-AP and station control block" e inicia "soft-AP and station". Graças a isso, o ESP32 é capaz de farejar e enviar informações ao servidor ao mesmo tempo, evitando perder informações de pacotes enquanto envia dados.
Aqui está a lista completa dos campos de informação que podem estar em um Probe Request (fonte IEEE 802.11-2012):

E abaixo um pacote farejado com o Wireshark no qual você pode ver, para cada campo, o número de bits e sua posição dentro do pacote:

Esta seção pode estar desatualizada, consulte o site oficial para mais informações e para o guia mais recente sobre como começar com o ESP-IDF.
Configurar Toolchain
Obtenha o ESP-IDF
Além do toolchain (que contém programas para compilar e construir a aplicação), você também precisa das APIs / bibliotecas específicas do ESP32.
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
Faça checkout para a versão v3.x
cd esp-idf
git checkout release/v3.2
Configure o caminho para o ESP-IDF
Os programas do toolchain acessam o ESP-IDF usando a variável de ambiente IDF_PATH.
Esta variável deve ser configurada no seu PC, caso contrário os projetos não serão compilados.
Instale os Pacotes Python Necessários
python -m pip install --user -r $IDF_PATH/requirements.txt
Certifique-se de que você exportou o caminho
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
Clone o repositório
git clone https://github.com/ETS-PoliTO/esp32-sniffer.git
cd esp32-sniffer
Estabeleça a conexão serial entre o ESP32 e seu PC
make menuconfig
Vá para Serial flasher config, depois Default serial port e defina a porta na qual o ESP32 está conectado
Observe que, se você estiver usando uma bridge, provavelmente precisará baixar algum driver:
Isto fornece um guia sobre como estabelecer a conexão serial entre o ESP32 e o PC.
Compile o código e faça o flash do ESP32
make all && make flash
Veja os logs
make monitor
O arquivo /main/Kconfig.projbuild contém dois menus diferentes:
SPIFFS (SPI Flash File System)
Ele contém algumas informações importantes sobre a partição SPIFFS:
SPIFFS é um sistema de arquivos que suporta wear leveling, verificações de consistência do sistema de arquivos e mais.
Configurações
Ele contém diferentes variáveis:
ESP32_ID: ID do ESP32WIFI_SSID: SSID do WiFi (nome da rede)WIFI_PASS: senha do WiFi (WPA ou WPA2)BROKER_ADDR: IP do broker MQTTBROKER_PSW: senha do broker MQTTBROKER_PORT: porta do broker MQTTCHANNEL: canal no qual o ESP32 irá sniffar PROBE REQUESTSNIFFING_TIME: tempo de sniffingPara configurar as variáveis acima:
Abra seu terminal dentro da pasta do projeto e execute
make menuconfig
Selecione o menu que você deseja modificar
Edite as variáveis como quiser
Você também pode adicionar menus diferentes com variáveis diferentes:
Kconfig.projbuild