
Прошивка ESP32, которая перехватывает пакеты PROBE REQUEST, отправляемые смартфонами в поисках Wi-Fi-соединения, для извлечения различных типов информации
Этот проект использует Espressif IoT Development Framework (ESP-IDF) и был протестирован на модуле ESP-WROOM-32 и esp-idf v3.2.
Обзор всего проекта (то есть прошивки ESP32, сервера и графического интерфейса) можно найти здесь.
Эта прошивка написана с целью перехвата пакетов Probe Request, отправляемых смартфонами, которые ищут Wi-Fi-соединение. Когда Wi-Fi-соединение на смартфоне активно, он широковещательно (на всех частотах каналов) отправляет сообщение probe request с запросом о наличии свободных Wi-Fi-сетей или известных ему сетей (то есть сетей, пароль к которым смартфон знает). ESP32 перехватит его и извлечёт различные типы информации.
Из каждого перехваченного пакета извлекается следующая информация:
Каждую минуту эта информация отправляется на сервер и обрабатывается. Наконец, обработанную информацию (местоположение смартфонов в реальном времени, частоту смартфонов и т. д.) можно увидеть через графический интерфейс.
Прошивка состоит из двух основных потоков/задач:
Задача Sniffer
Задача Wi-Fi
lock.ESP32 настроен в режиме WIFI_MODE_APSTA: то есть он создаёт "soft-AP and station control block" и запускает "soft-AP and station". Благодаря этому ESP32 способен одновременно перехватывать и отправлять информацию на сервер, избегая потери информации о пакетах во время передачи данных.
Ниже приведён полный список информационных полей, которые могут присутствовать в Probe Request (источник IEEE 802.11-2012):

А ниже — пакет, перехваченный в Wireshark, в котором для каждого поля видны количество бит и их позиция внутри пакета:

Этот раздел может быть устаревшим; посетите официальный сайт, чтобы получить больше информации и актуальное руководство по началу работы с ESP-IDF.
Установка Toolchain
Получите ESP-IDF
Помимо инструментальной цепочки (которая содержит программы для компиляции и сборки приложения), вам также нужны специфичные для ESP32 API / библиотеки.
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
Переключитесь на версию v3.x
cd esp-idf
git checkout release/v3.2
Настройте путь к ESP-IDF
Программы инструментальной цепочки обращаются к ESP-IDF через переменную окружения IDF_PATH.
Эта переменная должна быть настроена на вашем ПК, иначе проекты не будут собираться.
Установите необходимые пакеты Python
python -m pip install --user -r $IDF_PATH/requirements.txt
Убедитесь, что вы экспортировали путь
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
Клонируйте репозиторий
git clone https://github.com/ETS-PoliTO/esp32-sniffer.git
cd esp32-sniffer
Установите последовательное соединение между ESP32 и вашим ПК
make menuconfig
Перейдите в Serial flasher config, затем в Default serial port и задайте порт, к которому подключена ESP32
Обратите внимание: если вы используете переходник, вероятно, вам потребуется скачать драйвер:
Здесь приведено руководство по установке последовательного соединения между ESP32 и ПК.
Соберите код и прошейте ESP32
make all && make flash
Просмотрите логи
make monitor
Файл /main/Kconfig.projbuild содержит два разных меню:
SPIFFS (SPI Flash File System)
Он содержит важную информацию о разделе SPIFFS:
SPIFFS — это файловая система, которая поддерживает выравнивание износа, проверки целостности файловой системы и многое другое.
Конфигурации
Он содержит различные переменные:
ESP32_ID: ID ESP32WIFI_SSID: SSID WiFi (имя сети)WIFI_PASS: пароль WiFi (WPA или WPA2)BROKER_ADDR: IP-адрес MQTT-брокераBROKER_PSW: пароль MQTT-брокераBROKER_PORT: порт MQTT-брокераCHANNEL: канал, на котором ESP32 будет перехватывать PROBE REQUESTSNIFFING_TIME: время перехватаЧтобы настроить переменные выше:
Откройте терминал в папке проекта и выполните
make menuconfig
Выберите меню, которое хотите изменить
Отредактируйте переменные по своему усмотрению
Вы также можете добавлять разные меню с разными переменными:
Откройте Kconfig.projbuild
Начните новое меню
menu YOUR_MENU_NAME
Добавьте нужные вам переменные
Завершите меню
endmenu