
Analizador de WiFi y Bluetooth de próxima generación basado en GUI para Linux
Sparrow-WiFi es una herramienta de conciencia espectral WiFi y Bluetooth (2.4 GHz y 5 GHz) para Linux. Integra en una sola plataforma el escaneo WiFi, la detección de Bluetooth Low Energy y Classic, el análisis espectral mediante radio definida por software (HackRF, Ubertooth), el seguimiento GPS, la detección de drones FAA RemoteID, operaciones remotas con drones/rovers y la indexación ECS 8.17 en Elasticsearch o OpenSearch. Escrito íntegramente en Python 3.
El proyecto incluye cuatro componentes que funcionan de forma independiente o conjunta:
| Componente | Interfaz | Propósito |
|---|---|---|
| Sparrow-WiFi | GUI de escritorio PyQt5 | Escaneo WiFi/BT, análisis espectral, seguimiento de fuentes, wardriving |
| Sparrow Agent | Servidor HTTP sin interfaz gráfica | Escaneo remoto, despliegues en drones/rovers, integración con terceros |
| Sparrow DroneID | Basado en web (navegador) | Detección de drones FAA RemoteID mediante WiFi y Bluetooth LE |
| Sparrow Elastic Bridge | Servicio CLI sin interfaz gráfica | Indexación ECS 8.17 de observaciones WiFi/BT en Elasticsearch / OpenSearch |
Sparrow Agent y Sparrow DroneID exponen APIs REST JSON que permiten a otras aplicaciones consultar resultados de escaneo, iniciar escaneos, recuperar detecciones de drones e integrar la conciencia inalámbrica/de drones en sus propios flujos de trabajo. Elastic Bridge consume la API REST del agente y envía documentos ECS 8.17 con paneles de Kibana incluidos.
Esta versión incluye tres mejoras significativas respecto a la anterior:
/wireless/networks/<iface>, el agente anterior lanzaba N llamadas iw scan redundantes que se serializaban en el bloqueo por interfaz, multiplicando la latencia de escaneo por el número de clientes. Ahora la primera solicitud es la "líder" que realmente escanea; las solicitudes concurrentes esperan en un threading.Event y comparten el resultado de la líder. También incluye corrección TOCTOU en la creación de bloqueos y seguridad ante excepciones en los bloqueos por interfaz.droneid.* personalizado) y una interfaz web responsive multidispositivo. Consulte la sección Sparrow DroneID a continuación.sparrow-elastic.py ha sido reescrito para producir documentos ECS 8.17 (antes ECS 1.5), ahora admite tanto Elasticsearch 8.x como OpenSearch 2.x, inicia automáticamente plantillas de índice componibles con políticas de ciclo de vida ILM/ISM y alias de escritura por rotación, realiza enriquecimiento de proveedores OUI y clasificación de dispositivos basada en reglas (con huella digital Fingerbank opcional), y envía cuatro paneles de Kibana incluidos más seis visualizaciones heredadas conservadas. El puente heredado ECS 1.5 se conserva en legacy/sparrow-elastic.py. Consulte .La aplicación original Sparrow proporciona una GUI integral que sustituye a herramientas como inSSIDer y LinSSID, con capacidades que van mucho más allá del escaneo básico:
sparrowwifiagent.py) para escaneo distribuido, operaciones montadas en drones/rovers y despliegues en Raspberry Piiw scan
Un sistema independiente de detección y seguimiento de drones basado en web que decodifica las transmisiones de Identificación Remota (RemoteID) obligatorias por la FAA. Se ejecuta como un servidor HTTP Python con una interfaz de usuario accesible desde cualquier dispositivo de la red.
La interfaz web se ejecuta en http://localhost:8097 una vez iniciada. Consulte Instalación a continuación para la configuración, y la referencia de API para acceso programático.
Además de los webhooks de Slack, Sparrow DroneID puede enviar cada alerta activada a un endpoint genérico externo de ingesta de alertas. El canal está deshabilitado por defecto; configúrelo en Configuración → Alertas → Alertas basadas en API:
http://MY_API_HOST:PORT/API_ROOTAuthorization: Bearer ...; se oculta en la interfaz una vez almacenadorule.category: "test", serie TEST-0000) para que el receptor pueda ser probado de extremo a extremo sin esperar un dron realSparrow DroneID realiza dos llamadas contra la URL raíz configurada:
Ambas llamadas envían Authorization: Bearer <token> y 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` se incluye cuando el receptor tiene una fijación GPS; `source.geo.location` se incluye cuando el dron está transmitiendo una posición. La severidad sigue la convención ECS (menor = más urgente): las advertencias (`new_drone`, `altitude_max`, `speed_max`) son `40`, los eventos informativos (`signal_lost`) son `70`. Los drones marcados como amigos no generan alertas cuando el interruptor "Alertar sobre drones amigos" del lado del operador está desactivado, por lo que tampoco llegan a este endpoint.
Las alertas de prueba sintéticas emitidas por el botón **Enviar mensaje de prueba** usan `rule.category: "test"`, `event.action: "test"`, `event.severity: 70`, y el serial `TEST-0000` para que el receptor pueda reconocerlas y excluirlas de los paneles operativos.
---
## Requisitos del sistema
| Requisito | Sparrow-WiFi (GUI) | Sparrow DroneID (Web) |
|-------------|-------------------|----------------------|
| **SO** | Ubuntu 20.04+, Kali 2020.3+, Debian 11+ | Ubuntu 20.04+, Kali, Debian 11+, Raspberry Pi OS |
| **Python** | 3.8+ | 3.8+ |
| **Root** | Requerido (iw scan) | Requerido (modo monitor, BLE) |
| **Adaptador WiFi** | Cualquiera con soporte `iw` | Capaz de modo monitor (p.ej., rtl8812au, Intel AX200) |
| **Bluetooth** | Opcional (adaptador hci, Ubertooth) | Opcional (cualquier adaptador compatible con BLE para RemoteID) |
| **GPS** | Opcional (gpsd) | Opcional (gpsd o coordenadas estáticas) |
| **Pantalla** | Escritorio X11/Wayland | Funciona sin pantalla (navegador web en cualquier dispositivo) |
---
## Instalación
### Sparrow-WiFi (GUI de escritorio)```bash
git clone https://github.com/ghostop14/sparrow-wifi
cd sparrow-wifi
Paquetes del sistema (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
> **Usuarios de Kali:** PyQt5, PyQtChart y aircrack-ng (para el plugin Falcon) suelen estar preinstalados. Mayormente solo necesitarás `gpsd`, `gpsd-clients` y las dependencias de Python a continuación.
Dependencias de Python — elige uno de los siguientes enfoques:
**Opción A: Instalación a nivel de sistema con `--break-system-packages`** — la más simple, se ajusta a cómo se lanzan la GUI/agente (scripts propiedad de 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
Opción B: Entorno virtual — aislado, sin advertencias de pip del sistema, preferido por algunos operadores:```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
sudo venv/bin/python3 ./sparrow-wifi.py
De cualquier manera, ejecuta:```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
Abre `http://localhost:8097` en un navegador. Configura la interfaz de monitorización y el GPS en Ajustes, luego haz clic en Iniciar.
### Elasticsearch / OpenSearch Bridge (opcional)```bash
sudo pip3 install --break-system-packages -r requirements-elastic.txt
# or via venv as above
Ver Integración con Elasticsearch / OpenSearch a continuación.
La mayoría de los adaptadores WiFi funcionan para escaneo básico. Sparrow-WiFi admite múltiples backends de enumeración de interfaces (iw, iwconfig, nmcli) por lo que funciona en sistemas que pueden no tener iw instalado (por ejemplo, RHEL/Fedora solo con NetworkManager).
Para el modo monitor (requerido por Sparrow DroneID y el plugin Falcon), la compatibilidad de adaptadores y controladores varía:
iw phy <phy> info | grep monitor o iwconfig <iface> para verificar capacidadesPara Sparrow DroneID específicamente, el adaptador debe entregar tramas 802.11 sin procesar en modo monitor. Algunos adaptadores Intel informan que el modo monitor es compatible pero silenciosamente descartan tramas a nivel de firmware. La aplicación detecta esto y te advierte.
Sparrow-WiFi admite varios modos de escaneo Bluetooth:
Un adaptador Bluetooth estándar integrado o USB es suficiente para el escaneo de anuncios BLE y la detección de drones RemoteID. Prueba tu adaptador con bluetoothctl scan on.
Para el descubrimiento promiscuo completo de dispositivos tanto Classic como BLE, necesitarás un Ubertooth One y Blue Hydra instalados en /opt/bluetooth/blue_hydra. Esto es opcional y no es necesario para el escaneo básico de BLE o RemoteID.
Superposiciones espectrales en tiempo real sobre vistas de canales WiFi:
ubertooth-specan-uihackrf_sweep
Ambas aplicaciones usan gpsd para GPS. Configuración rápida:```bash
sudo apt install gpsd gpsd-clients
sudo gpsd -D 2 -N /dev/ttyUSB0
xgps # or: cgps -s
Para producción, configure `/etc/default/gpsd` con la ruta de su dispositivo y reinicie el servicio.
Sparrow DroneID también admite coordenadas estáticas (configuradas en Ajustes) para instalaciones en sitios fijos sin receptor GPS.
---
## Agente Remoto e Integración de API
El agente Sparrow (`sparrowwifiagent.py`) es un servidor HTTP sin interfaz gráfica que expone todas las capacidades de escaneo WiFi y Bluetooth de Sparrow como una API REST basada en JSON. Así es como la interfaz gráfica Sparrow-WiFi se comunica con sensores remotos, pero la API está abierta para que cualquier aplicación la use.
**Casos de uso:**
- Desplegar en una Raspberry Pi, dron o rover para escaneo remoto/móvil
- Integrar la conciencia situacional WiFi y Bluetooth en sus propias aplicaciones
- Alimentar datos de escaneo en SIEM, paneles o tuberías de alerta
- Automatizar el escaneo con scripts (activar escaneos, obtener resultados mediante curl/Python/etc.)
Sparrow DroneID también tiene su propia API REST ([referencia de API](https://github.com/ghostop14/sparrow-wifi/blob/master/sparrow-droneid/sparrow_drone_id_api.md)), que brinda acceso programático a detecciones de drones, gestión de alertas, geozonas y configuración del sistema.
### Ejecutando el Agente```bash
sudo ./sparrowwifiagent.py
Escucha en el puerto 8020 por defecto. Opciones principales:
Consulte --help para la lista completa.
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
Para Sparrow DroneID, consulte la [referencia de API](https://github.com/ghostop14/sparrow-wifi/blob/master/sparrow-droneid/sparrow_drone_id_api.md) dedicada.
> **Nota de producción:** el agente escucha en todas las interfaces por defecto. Para implementaciones fuera de una red de confianza, use `--allowedips` para restringir los llamantes, ejecute detrás de un proxy inverso con TLS, o vincule solo a una interfaz privada.
---
## Falcon / Aircrack-ng Plugin
Integración avanzada de pruebas de penetración inalámbrica. Proporciona acceso con clic directo a:
- Descubrimiento de SSID ocultos mediante airodump-ng
- Enumeración de estaciones cliente (AP conectado, SSIDs sondeados)
- Desautenticación dirigida y de difusión
- Captura de IV WEP
- Captura de handshake WPA con extracción automática de hash (requiere JTR `wpapcap2john`)
### Requisitos previos```bash
# Kali users: aircrack-ng + JTR are usually pre-installed.
# Ubuntu / Debian / Raspberry Pi OS:
sudo apt install aircrack-ng john
Verifica que airmon-ng, airodump-ng y wpapcap2john estén en tu PATH después de la instalación.
Las pruebas de penetración activas están sujetas a regulaciones legales. Es tu responsabilidad obtener la autorización adecuada antes de utilizar estas herramientas.
El paquete sparrow_elastic proporciona un puente ECS 8.17 que consulta al agente Sparrow WiFi e indexa masivamente observaciones WiFi y Bluetooth en Elasticsearch 8.x u OpenSearch 2.x. Inicializa automáticamente plantillas de índices componibles, políticas de ciclo de vida ILM/ISM y alias de escritura con rollover; realiza enriquecimiento de proveedores OUI y clasificación de dispositivos basada en reglas (con Fingerbank opcional); e incluye dashboards preconstruidos de 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 ''
> **Higiene de credenciales:** incrustar `user:pass@` en `--elasticserver` es conveniente, pero la URL se vuelve visible en `ps`, `journalctl` y el historial del shell. Para producción, use los indicadores `--username`/`--password`, variables de entorno (`SPARROW_ES_USERNAME`, `SPARROW_ES_PASSWORD`), o el patrón `EnvironmentFile=` en el ejemplo de unidad systemd incluido.
### Lo que incluye el puente
- **5 paneles de Kibana** — Conciencia situacional, Patrón de vida, Detección de nuevos dispositivos, Planificación espectral (con mapa de calor de intensidad de señal SSID × Canal) y Conciencia situacional Bluetooth (con panel Vega de dispositivos realmente nuevos y tabla de proximidad de rango estimado)
- **6 visualizaciones preservadas de versiones anteriores** — clones renombrados de campos de las visualizaciones originales `Sparrow*` para que la memoria muscular anterior siga funcionando
- **Clasificador de dispositivos** — tabla semilla de 64 reglas que cubre controladores de drones (DJI/Autel/Skydio/Parrot/Yuneec), Clase de dispositivo BT, Apariencia GAP, subtipos de Continuidad de Apple y heurísticas de proveedor OUI
- **Actualización de datos de referencia** — incluye `manuf` de Wireshark, IDs de empresas BT SIG, UUIDs de servicio, valores de apariencia GAP y tablas de subtipos de Continuidad de Apple, con un hilo en segundo plano de autoactualización cada 30/90 días
- **Verificación de compatibilidad previa al vuelo** — se niega a escribir en índices heredados ECS 1.5 e imprime pasos claros de remediación en lugar de corromper datos silenciosamente
Para obtener la documentación completa del operador (selección de motor, modos de autenticación, importación de paneles, datos de referencia, referencia completa de la CLI) consulte [sparrow_elastic/README.md](https://github.com/ghostop14/sparrow-wifi/blob/master/sparrow_elastic/README.md).
Los archivos de configuración de muestra están en la raíz del repositorio y en `init.d_scripts/`:
- `sparrow-elastic.conf.example` — configuración estilo INI con todas las claves admitidas
- `sparrow-elastic.env.example` — archivo env en formato shell para implementaciones systemd
- `init.d_scripts/sparrow-elastic.service.example` — plantilla de unidad systemd
### Migración desde el puente heredado ECS 1.5
El puente anterior a 2026 escribía documentos ECS 1.5 en índices nombrados por el operador mediante `--wifiindex` / `--btindex`. El nuevo puente escribe documentos ECS 8.17 en alias de escritura gestionados por rollover (por defecto `sparrow-wifi` / `sparrow-bt`).
**El script heredado se conserva en `legacy/sparrow-elastic.py`** junto con su plantilla `.txt` y archivos de política ILM. Ejecutarlo aún requiere el entorno heredado (configuración manual de plantilla + ILM).
**Cambios de indicadores (con compatibilidad hacia atrás):**
| Indicador heredado | Nuevo indicador | Notas |
|----------------------|--------------------|--------------------------------------------------------|
| `--wifiindex NAME` | `--wifi-alias NAME`| La ortografía heredada aún se acepta como alias obsoleto. |
| `--btindex NAME` | `--bt-alias NAME` | La ortografía heredada aún se acepta como alias obsoleto. |
| `--dont-create-indices` | sin cambios | Omite bootstrap. |
| `--elasticserver`, `--sparrowagent`, `--sparrowport`, `--wifiinterface`, `--scandelay` | sin cambios | |
Una invocación heredada como:```bash
./sparrow-elastic.py --elasticserver=http://user:pass@host:9200 \
--wifiinterface=wlan1 \
--wifiindex=sparrowwifi-home \
--btindex=sparrowbt-home
todavía analiza y ejecuta — pero el puente ahora se niega a escribir en un índice preexistente cuyo mapeo no lleva el marcador de esquema ECS 8.17, saliendo con tres opciones de remediación (usar un alias diferente, limpiar y reiniciar, o ejecutar el puente heredado). Para una instalación limpia, simplemente omita --wifiindex / --btindex y acepte los nuevos valores predeterminados.
El agente remoto puede desplegarse en una Raspberry Pi montada en un dron o rover para realizar estudios inalámbricos móviles. Probado en un dron Solo 3DR con integración GPS mediante MAVLink.
sudo python3 ./sparrowwifiagent.py --userpileds --sendannounce --mavlinkgps 3dr --recordinterface wlan0
LED indicators (Raspberry Pi):
1. Ambos apagados — Inicializando
2. Latido rojo — GPS presente, no sincronizado
3. Rojo sólido — GPS sincronizado
4. Verde sólido — Agente listo, sirviendo solicitudes
Las grabaciones se pueden recuperar a través de la interfaz de gestión de agentes de la GUI de Sparrow-WiFi.
### Notas de configuración de Pi
- Use Raspberry Pi OS (Bookworm o posterior) con Python 3.8+
- Deshabilite el WiFi integrado para habilitar el escaneo de 5 GHz con adaptadores USB: agregue `dtoverlay=disable-wifi` a `/boot/firmware/config.txt` en Bookworm y posteriores, o `/boot/config.txt` en versiones anteriores
- Instale los prerrequisitos: `sudo pip3 install --break-system-packages -r requirements.txt` (o use un venv como en la sección [Instalación](#installation))
---
## Estructura del proyecto```
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
Este proyecto está licenciado bajo los términos incluidos en el repositorio. Consulte el archivo LICENSE para más detalles.
| Verbo | Ruta | Propósito |
|---|
POST | {root}/v1/alerts/verify | Verificación de credenciales — cuerpo {"domain": "<configurado>"}. El receptor debe responder 200 {"status":"ok"} en caso de éxito, 401 si el token es incorrecto. |
POST | {root}/v1/alerts | Disparar una alerta — el cuerpo es el JSON a continuación. El receptor debe responder 201 {"alert_id":"..."} en caso de éxito. Las respuestas 503 se reintentan con retroceso exponencial (3 reintentos); 4xx aborta sin reintento. Un 200 {"status":"dropped"} indica que el dominio está deshabilitado en el upstream. |
| Modo | Hardware | Lo que ves |
|---|
| Escaneo de anuncios BLE | Adaptador BT estándar | Dispositivos LE que están anunciándose activamente |
| Escaneo promiscuo | Ubertooth One + Blue Hydra | Todos los dispositivos BLE y Classic BT en el rango |
| Anuncios iBeacon | Adaptador BT estándar | Anuncia tus propios iBeacons |
| Escaneo RemoteID | Adaptador BT estándar | Identificación de drones conforme a la FAA (solo Sparrow DroneID) |
| Flag | Purpose |
|---|
--port PORT | Puerto de escucha HTTP |
--allowedips IP1,IP2 | Restringir conexiones de cliente |
--staticcoord LAT,LON,ALT | Usar coordenadas GPS fijas |
--mavlinkgps 3dr | Obtener GPS del dron Solo 3DR |
--recordinterface IFACE | Grabación automática al inicio (sin pantalla) |
--userpileds | Usar LEDs de Raspberry Pi para estado |
--sendannounce | Broadcast UDP para descubrimiento de agente |