
Анализатор Wi-Fi и Bluetooth нового поколения с графическим интерфейсом для Linux
Sparrow-WiFi — это инструмент для анализа спектра 2,4 ГГц и 5 ГГц WiFi и Bluetooth для Linux. Он объединяет в себе сканирование WiFi, обнаружение Bluetooth Low Energy и Classic, анализ спектра с помощью программно-определяемого радио (HackRF, Ubertooth), GPS-трекинг, обнаружение дронов FAA RemoteID, удаленное управление с дронов/роверов и индексацию ECS 8.17 в Elasticsearch или OpenSearch — все в одной платформе. Полностью написан на Python 3.
Проект включает четыре компонента, которые могут работать как отдельно, так и вместе:
| Компонент | Интерфейс | Назначение |
|---|---|---|
| Sparrow-WiFi | Графический интерфейс PyQt5 | Сканирование WiFi/BT, анализ спектра, отслеживание источников, вардрайвинг |
| Sparrow Agent | Headless HTTP-сервер | Удаленное сканирование, развертывание на дронах/роверах, интеграция со сторонними приложениями |
| Sparrow DroneID | Веб-интерфейс (браузер) | Обнаружение дронов FAA RemoteID через WiFi и Bluetooth LE |
| Sparrow Elastic Bridge | Headless CLI-сервис | Индексация наблюдений WiFi/BT в формате ECS 8.17 в Elasticsearch / OpenSearch |
Sparrow Agent и Sparrow DroneID предоставляют JSON REST API, позволяющие другим приложениям запрашивать результаты сканирования, запускать сканирование, получать обнаружения дронов и интегрировать функции беспроводного/дронного мониторинга в свои рабочие процессы. Elastic Bridge потребляет REST API агента и отправляет документы ECS 8.17 с встроенными панелями Kibana.
Этот выпуск включает три значительных улучшения по сравнению с предыдущей версией:
/wireless/networks/<iface>, агент ранее запускал N избыточных вызовов iw scan, которые сериализовались на блокировке интерфейса, умножая задержку сканирования на количество клиентов. Теперь первый запрос становится «лидером», который фактически выполняет сканирование; параллельные запросы ожидают на threading.Event и используют результат лидера. Также исправлена ошибка TOCTOU при создании блокировок и обеспечена безопасность исключений для блокировок интерфейсов.droneid.*) и адаптивный веб-интерфейс для нескольких устройств. См. раздел Sparrow DroneID ниже.sparrow-elastic.py переписан для создания документов ECS 8.17 (ранее ECS 1.5), теперь поддерживает как Elasticsearch 8.x, так и OpenSearch 2.x, автоматически создает компонуемые индексные шаблоны с политиками жизненного цикла ILM/ISM и псевдонимами для перезаписи, выполняет обогащение данных WIF-вендорами и классификацию устройств на основе правил (с опциональным Fingerbank), а также поставляет четыре встроенные панели Kibana и шесть сохраненных визуализаций из предыдущей версии. Устаревший мост ECS 1.5 сохранен в legacy/sparrow-elastic.py. См. .Оригинальное приложение Sparrow предоставляет комплексный графический интерфейс, заменяющий такие инструменты, как inSSIDer и LinSSID, с возможностями, далеко выходящими за рамки базового сканирования:
sparrowwifiagent.py) для распределенного сканирования, работы с дронов/роверов и развертывания на Raspberry Piiw scan
Автономная веб-система обнаружения и отслеживания дронов, декодирующая обязательную согласно FAA удаленную идентификацию (Remote Identification, RemoteID). Запускается как HTTP-сервер на Python с браузерным интерфейсом, доступным с любого устройства в сети.
После запуска веб-интерфейс доступен по адресу http://localhost:8097. Инструкции по настройке см. в разделе Установка, а программный доступ — в справочнике API.
Помимо вебхуков Slack, Sparrow Droneid может отправлять каждое сработавшее оповещение на внешнюю конечную точку приема оповещений. Канал по умолчанию отключен; настройка выполняется в Настройки → Оповещения → API-оповещения:
http://MY_API_HOST:PORT/API_ROOTAuthorization: Bearer ...; после сохранения маскируется в интерфейсеrule.category: "test", серийный номер TEST-0000), чтобы проверить приемник от начала до конца без ожидания реального дронаSparrow Droneid выполняет два вызова к настроенному корневому URL:
Оба вызова отправляют заголовки Authorization: Bearer <token> и Content-Type: application/json.
{ "domain": "", "alert": { "message": "", "observer": { "name": "<operator_name or 'Sparrow DroneID'>", "type": "drone-sensor", "geo": {"location": {"lat": 0.0, "lon": 0.0}} }, "rule": {"name": "", "category": "drone_detection"}, "event": { "severity": 40, "category": "network", "action": "new_drone" }, "labels": { "serial": "", "vendor": "", "ua_type": "", "alert_type": "new_drone | altitude_max | speed_max | signal_lost" }, "source": {"geo": {"location": {"lat": 0.0, "lon": 0.0}}}, "details": { "operator_id": "...", "registration_id": "...", "self_id_text": "...", "mac_address": "...", "protocol": "...", "rssi": -68, "range_m": 1234.5, "bearing_deg": 215.0, "bearing_cardinal": "SW", "speed_mps": 5.2, "direction_deg": 240.0, "altitude_m_agl": 42.0, "detail": "..." } } }
`observer.geo.location` включается, когда приёмник имеет GPS-фикс; `source.geo.location` включается, когда дрон транслирует своё местоположение. Серьёзность следует соглашению ECS (меньше = более срочно): предупреждения (`new_drone`, `altitude_max`, `speed_max`) имеют значение `40`, информационные события (`signal_lost`) — `70`. Дроны, помеченные как дружественные, не вызывают оповещения, когда на стороне оператора выключен переключатель «Оповещать о дружественных дронах», поэтому они также не попадают на эту конечную точку.
Синтетические тестовые оповещения, отправляемые кнопкой **Отправить тестовое сообщение**, используют `rule.category: "test"`, `event.action: "test"`, `event.severity: 70` и серийный номер `TEST-0000`, чтобы приёмник мог распознать и исключить их из операционных панелей.
---
## Системные требования
| Требование | Sparrow-WiFi (GUI) | Sparrow DroneID (Web) |
|-------------|-------------------|----------------------|
| **ОС** | Ubuntu 20.04+, Kali 2020.3+, Debian 11+ | Ubuntu 20.04+, Kali, Debian 11+, Raspberry Pi OS |
| **Python** | 3.8+ | 3.8+ |
| **Root** | Требуется (iw scan) | Требуется (режим монитора, BLE) |
| **WiFi-адаптер** | Любой с поддержкой `iw` | С поддержкой режима монитора (например, rtl8812au, Intel AX200) |
| **Bluetooth** | Опционально (адаптер hci, Ubertooth) | Опционально (любой адаптер с поддержкой BLE для RemoteID) |
| **GPS** | Опционально (gpsd) | Опционально (gpsd или статические координаты) |
| **Дисплей** | Рабочий стол X11/Wayland | Работает без дисплея (веб-браузер на любом устройстве) |
---
## Установка
### Sparrow-WiFi (Desktop GUI)```bash
git clone https://github.com/ghostop14/sparrow-wifi
cd sparrow-wifi
Системные пакеты (Ubuntu 22.04+ / Debian 12+ / Kali rolling):```bash
sudo apt install python3-pip python3-pyqt5 python3-pyqt5.qtchart
gpsd gpsd-clients python3-tk python3-setuptools
> **Пользователи Kali:** PyQt5, PyQtChart и aircrack-ng (для плагина Falcon) обычно предустановлены. Вам в основном понадобятся только `gpsd`, `gpsd-clients` и Python-зависимости ниже.
Python-зависимости — выберите один из способов:
**Вариант A: Установка в систему с `--break-system-packages`** — самый простой, подходит для способа запуска GUI/агента (скрипты от root):```bash
# Modern systems (Ubuntu 24.04+, Kali rolling 2023+, Debian 12+) require this
# flag because Python is marked externally-managed (PEP 668). Sparrow runs as
# root anyway, so system-wide install is consistent with how it executes.
sudo pip3 install --break-system-packages -r requirements.txt
Вариант B: Виртуальное окружение — изолированная среда, без предупреждений системного pip, предпочитается некоторыми операторами:```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
sudo venv/bin/python3 ./sparrow-wifi.py
В любом случае, выполните:```bash
sudo ./sparrow-wifi.py
cd sparrow-droneid
sudo apt install tcpdump bluez
sudo pip3 install --break-system-packages -r sparrow_droneid/requirements.txt
python3 -m venv venv && source venv/bin/activate && pip install -r sparrow_droneid/requirements.txt
sudo python3 sparrow_droneid/app.py
Откройте `http://localhost:8097` в браузере. Настройте интерфейс монитора и GPS в настройках, затем нажмите «Старт».
### Elasticsearch / OpenSearch Bridge (опционально)```bash
sudo pip3 install --break-system-packages -r requirements-elastic.txt
# or via venv as above
См. Интеграция с Elasticsearch / OpenSearch ниже.
Большинство WiFi-адаптеров работают для базового сканирования. Sparrow-WiFi поддерживает несколько бэкендов для перечисления интерфейсов (iw, iwconfig, nmcli), поэтому он работает в системах, где iw может быть не установлен (например, RHEL/Fedora только с NetworkManager).
Для режима мониторинга (требуется Sparrow DroneID и плагином Falcon) поддержка адаптеров и драйверов различается:
iw phy <phy> info | grep monitor или iwconfig <iface> для проверки возможностейДля Sparrow DroneID адаптер должен передавать сырые кадры 802.11 в режиме мониторинга. Некоторые адаптеры Intel сообщают о поддержке режима мониторинга, но молча отбрасывают кадры на уровне прошивки. Приложение обнаруживает это и предупреждает вас.
Sparrow-WiFi поддерживает несколько режимов сканирования Bluetooth:
Стандартного встроенного или USB Bluetooth-адаптера достаточно для сканирования BLE-рекламы и обнаружения дронов RemoteID. Проверьте свой адаптер с помощью bluetoothctl scan on.
Для полного неразборчивого обнаружения как классических, так и BLE-устройств вам понадобятся Ubertooth One и Blue Hydra, установленные в /opt/bluetooth/blue_hydra. Это опционально и не требуется для базового сканирования BLE или RemoteID.
Наложение спектральных данных в реальном времени на представления WiFi-каналов:
ubertooth-specan-uihackrf_sweep
Оба приложения используют gpsd для GPS. Быстрая настройка:```bash
sudo apt install gpsd gpsd-clients
sudo gpsd -D 2 -N /dev/ttyUSB0
xgps # or: cgps -s
Для производственной среды настройте `/etc/default/gpsd` с указанием пути вашего устройства и перезапустите службу.
Sparrow DroneID также поддерживает статические координаты (настраиваются в настройках) для стационарных установок без GPS-приемника.
---
## Удаленный агент и интеграция API
Агент Sparrow (`sparrowwifiagent.py`) — это безголовый HTTP-сервер, который предоставляет все возможности сканирования WiFi и Bluetooth Sparrow в виде REST API на основе JSON. Именно так GUI Sparrow-WiFi взаимодействует с удаленными датчиками, но API открыто для использования любым приложением.
**Варианты использования:**
- Развертывание на Raspberry Pi, дроне или ровере для удаленного/мобильного сканирования
- Интеграция ситуационной осведомленности по WiFi и Bluetooth в ваши собственные приложения
- Подача данных сканирования в SIEM, панели мониторинга или конвейеры оповещений
- Автоматизация сканирования с помощью скриптов (запуск сканирований, получение результатов через curl/Python и т.д.)
Sparrow DroneID также имеет собственный REST API ([справочник по API](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow-droneid/sparrow_drone_id_api.md)), обеспечивающий программный доступ к обнаружению дронов, управлению оповещениями, геозонам и конфигурации системы.
### Запуск агента```bash
sudo ./sparrowwifiagent.py
Listens on port 8020 by default. Key options:
See --help for the full list.
curl http://sensor:8020/wireless/interfaces
curl http://sensor:8020/wireless/networks/wlan0
curl "http://sensor:8020/wireless/networks/wlan0?frequencies=2412,2437,2462"
curl http://sensor:8020/gps/status
curl http://sensor:8020/bluetooth/discoverystarta
curl http://sensor:8020/bluetooth/discoverystatus
Для Sparrow DroneID см. специальную [справочную документацию по API](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow-droneid/sparrow_drone_id_api.md).
> **Примечание для продакшена:** по умолчанию агент прослушивает все интерфейсы. Для развёртывания вне доверенной сети используйте `--allowedips` для ограничения вызывающих, запускайте за обратным прокси с TLS или привязывайте только к приватному интерфейсу.
---
## Плагин Falcon / Aircrack-ng
Расширенная интеграция для тестирования беспроводных сетей на проникновение. Предоставляет доступ к следующему через точечные клики:
- Обнаружение скрытых SSID с помощью airodump-ng
- Перечисление клиентских станций (подключённые AP, пробованные SSID)
- Целевая и широковещательная деаутентификация
- Захват IV WEP
- Захват рукопожатия WPA с автоматическим извлечением хэша (требуется JTR `wpapcap2john`)
### Предварительные требования```bash
# Kali users: aircrack-ng + JTR are usually pre-installed.
# Ubuntu / Debian / Raspberry Pi OS:
sudo apt install aircrack-ng john
Verify airmon-ng, airodump-ng, and wpapcap2john are on your PATH after install.
Активное тестирование на проникновение регулируется законодательством. Вы обязаны получить соответствующее разрешение перед использованием этих инструментов.
Пакет sparrow_elastic предоставляет мост ECS 8.17, который опрашивает агент Sparrow WiFi и выполняет массовую индексацию наблюдений Wi-Fi и Bluetooth в Elasticsearch 8.x или OpenSearch 2.x. Он автоматически инициализирует компоновочные шаблоны индексов, политики жизненного цикла ILM/ISM и псевдонимы записи с переключением; выполняет обогащение вендоров OUI и классификацию устройств на основе правил (с опциональным снятием отпечатков Fingerbank); а также поставляет готовые панели мониторинга Kibana.
sudo ./sparrowwifiagent.py
sudo pip3 install --break-system-packages -r requirements-elastic.txt
./sparrow-elastic.py --elasticserver http://user:pass@host:9200 --wifiinterface wlan1
python3 install_dashboards.py --kibana-url http://kibana:5601
--username elastic --password ''
> **Гигиена учётных данных:** встраивание `user:pass@` в `--elasticserver` удобно, но URL становится видимым в `ps`, `journalctl` и истории оболочки. Для продакшена используйте флаги `--username`/`--password`, переменные окружения (`SPARROW_ES_USERNAME`, `SPARROW_ES_PASSWORD`) или шаблон `EnvironmentFile=` в прилагаемом примере systemd-юнита.
### Что поставляется с мостом
- **5 панелей мониторинга Kibana** — Ситуационная осведомлённость, Образ жизни, Обнаружение новых устройств, Планирование спектра (с тепловой картой силы сигнала SSID × Channel) и Ситуационная осведомлённость Bluetooth (с панелью Vega для действительно новых устройств и таблицей близости с оценкой дальности)
- **6 визуализаций, сохранённых для обратной совместимости** — переименованные клоны оригинальных визуализаций `Sparrow*`, чтобы старые привычные действия продолжали работать
- **Классификатор устройств** — начальная таблица из 64 правил, охватывающая контроллеры дронов (DJI/Autel/Skydio/Parrot/Yuneec), класс устройств BT, GAP Appearance, подтипы Apple Continuity и эвристики по OUI вендоров
- **Обновление эталонных данных** — встроенные `manuf` от Wireshark, идентификаторы компаний BT SIG, UUID сервисов, значения GAP appearance и таблицы подтипов Apple Continuity с фоновым потоком самообновления каждые 30/90 дней
- **Проверка совместимости перед запуском** — отказывается записывать в устаревшие индексы ECS 1.5 и выводит понятные шаги по устранению, вместо того чтобы молча повреждать данные
Полную документацию оператора (выбор движка, режимы аутентификации, импорт панелей мониторинга, эталонные данные, полная справка по CLI) см. в [sparrow_elastic/README.md](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow_elastic/README.md).
Примеры конфигурационных файлов находятся в корне репозитория и в `init.d_scripts/`:
- `sparrow-elastic.conf.example` — конфигурация в стиле INI со всеми поддерживаемыми ключами
- `sparrow-elastic.env.example` — файл окружения в формате shell для развёртывания systemd
- `init.d_scripts/sparrow-elastic.service.example` — шаблон systemd-юнита
### Миграция с устаревшего моста ECS 1.5
Мост до 2026 года записывал документы ECS 1.5 в индексы, названные оператором, через `--wifiindex` / `--btindex`. Новый мост записывает документы ECS 8.17 в псевдонимы записи, управляемые ротацией (по умолчанию `sparrow-wifi` / `sparrow-bt`).
**Старый скрипт сохранён в `legacy/sparrow-elastic.py`** вместе с его шаблоном `.txt` и файлами политик ILM. Для его запуска по-прежнему требуется устаревшее окружение (ручная настройка шаблона + ILM).
**Изменения флагов (с обратной совместимостью):**
| Устаревший флаг | Новый флаг | Примечания |
|-------------------------|----------------------|-------------------------------------------------------------|
| `--wifiindex NAME` | `--wifi-alias NAME` | Устаревшее написание всё ещё принимается как устаревший псевдоним. |
| `--btindex NAME` | `--bt-alias NAME` | Устаревшее написание всё ещё принимается как устаревший псевдоним. |
| `--dont-create-indices` | unchanged | Пропускает начальную настройку. |
| `--elasticserver`, `--sparrowagent`, `--sparrowport`, `--wifiinterface`, `--scandelay` | unchanged | |
Пример устаревшего вызова:```bash
./sparrow-elastic.py --elasticserver=http://user:pass@host:9200 \
--wifiinterface=wlan1 \
--wifiindex=sparrowwifi-home \
--btindex=sparrowbt-home
все равно анализирует и выполняется — но мост теперь отказывается записывать в уже существующий индекс, маппинг которого не содержит маркера схемы ECS 8.17, выходя с тремя вариантами исправления (использовать другой алиас, очистить и перезапустить, или запустить устаревший мост). Для чистой установки просто опустите --wifiindex / --btindex и примите новые значения по умолчанию.
Удаленный агент может быть развернут на Raspberry Pi, установленном на дроне или ровере, для мобильного беспроводного обследования. Протестировано на дроне Solo 3DR с GPS-интеграцией через MAVLink.
sudo python3 ./sparrowwifiagent.py --userpileds --sendannounce --mavlinkgps 3dr --recordinterface wlan0
LED-индикаторы (Raspberry Pi):
1. Оба выключены — Инициализация
2. Красное мигание — GPS обнаружен, не синхронизирован
3. Красный постоянно — GPS синхронизирован
4. Зеленый постоянно — Агент готов, обслуживает запросы
Записи можно получить через интерфейс управления агентами Sparrow-WiFi GUI.
### Примечания по настройке Pi
- Используйте Raspberry Pi OS (Bookworm или новее) с Python 3.8+
- Отключите встроенный Wi-Fi для включения сканирования в диапазоне 5 ГГц с USB-адаптерами: добавьте `dtoverlay=disable-wifi` в `/boot/firmware/config.txt` на Bookworm и новее, или в `/boot/config.txt` на старых версиях
- Установите необходимые зависимости: `sudo pip3 install --break-system-packages -r requirements.txt` (или используйте venv, как описано в разделе [Установка](#installation))
---
## Структура проекта```
sparrow-wifi/
sparrow-wifi.py # Desktop GUI entry point
sparrowwifiagent.py # Headless remote agent
sparrow-elastic.py # Elasticsearch / OpenSearch bridge (ECS 8.17)
install_dashboards.py # One-shot Kibana dashboard installer
requirements.txt # Python dependencies (GUI)
requirements-elastic.txt # Python dependencies (Elasticsearch bridge)
wirelessengine.py # WiFi scan engine (iw)
sparrowbluetooth.py # Bluetooth scan engine
sparrowhackrf.py # HackRF spectrum engine
sparrowmap.py # Map generation
plugins/ # Falcon and other plugins
sparrow_elastic/ # ES/OS bridge package
*.py # Client abstraction, document builder, classifier...
templates/ # Composable index templates (ES + OS variants)
policies/ # ILM (ES) and ISM (OS) lifecycle policy JSON
dashboards/ # Kibana NDJSON: 5 dashboards + legacy-preserved
data/ # Bundled reference data (manuf, BT SIG, classifier rules)
README.md # Full bridge operator documentation
legacy/ # Pre-2026 ECS 1.5 bridge, frozen for reference
sparrow-elastic.py # Legacy bridge (still runnable)
sparrow_elastic_*.txt # Legacy index templates and ILM policy
sparrow-droneid/ # DroneID web application
sparrow_droneid/
app.py # Entry point (sudo python3 app.py)
__main__.py # Allows: sudo python3 -m sparrow_droneid
requirements.txt # Python dependencies (DroneID)
backend/ # API server, capture engine, database
frontend/ # HTML, JS, CSS (served by backend)
sparrow_drone_id_api.md # REST API reference
Данный проект лицензирован на условиях, включенных в репозиторий. Подробности смотрите в файле LICENSE.
| Глагол | Путь | Назначение |
|---|
POST | {root}/v1/alerts/verify | Проверка учетных данных — тело {"domain": "<настроенный>"}. Приемник должен ответить 200 {"status":"ok"} в случае успеха, 401 при неверном токене. |
POST | {root}/v1/alerts | Отправка оповещения — тело представляет собой JSON, указанный ниже. Приемник должен ответить 201 {"alert_id":"..."} в случае успеха. Ответы 503 повторяются с экспоненциальной задержкой (3 повторные попытки); 4xx прерывают выполнение без повторной попытки. Ответ 200 {"status":"dropped"} означает, что домен отключен на стороне вышестоящего сервера. |
| Режим | Оборудование | Что вы видите |
|---|
| Сканирование BLE-рекламы | Стандартный BT-адаптер | LE-устройства, которые активно рекламируются |
| Неразборчивое сканирование | Ubertooth One + Blue Hydra | Все BLE и классические BT-устройства в зоне действия |
| Реклама iBeacon | Стандартный BT-адаптер | Рекламируйте свои собственные iBeacons |
| Сканирование RemoteID | Стандартный BT-адаптер | Идентификация дронов, соответствующая FAA (только Sparrow DroneID) |
| Flag | Purpose |
|---|
--port PORT | HTTP listen port |
--allowedips IP1,IP2 | Restrict client connections |
--staticcoord LAT,LON,ALT | Use fixed GPS coordinates |
--mavlinkgps 3dr | Pull GPS from Solo 3DR drone |
--recordinterface IFACE | Auto-record on startup (headless) |
--userpileds | Use Raspberry Pi LEDs for status |
--sendannounce | UDP broadcast for agent discovery |