
Analizzatore WiFi e Bluetooth di nuova generazione basato su GUI per Linux
Sparrow-WiFi è uno strumento di consapevolezza spettrale WiFi e Bluetooth a 2.4 GHz e 5 GHz per Linux. Integra scansione WiFi, scoperta Bluetooth Low Energy e Classic, analisi spettrale tramite software-defined radio (HackRF, Ubertooth), tracciamento GPS, rilevamento remoto FAA RemoteID, operazioni remote su droni/rover, e indicizzazione ECS 8.17 in Elasticsearch o OpenSearch in un'unica piattaforma. Scritto interamente in Python 3.
Il progetto include quattro componenti che funzionano autonomamente o insieme:
| Componente | Interfaccia | Scopo |
|---|---|---|
| Sparrow-WiFi | PyQt5 desktop GUI | Scansione WiFi/BT, analisi spettrale, tracciamento delle sorgenti, wardriving |
| Sparrow Agent | Server HTTP headless | Scansione remota, distribuzioni su droni/rover, integrazione di terze parti |
| Sparrow DroneID | Web-based (browser) | Rilevamento droni FAA RemoteID tramite WiFi e Bluetooth LE |
| Sparrow Elastic Bridge | Servizio CLI headless | Indicizzazione ECS 8.17 delle osservazioni WiFi/BT in Elasticsearch / OpenSearch |
Sparrow Agent e Sparrow DroneID espongono API REST JSON che permettono ad altre applicazioni di interrogare i risultati delle scansioni, attivare scansioni, recuperare rilevamenti di droni e integrare la consapevolezza wireless/dei droni nei propri flussi di lavoro. L'Elastic Bridge consuma l'API REST dell'agente e produce documenti ECS 8.17 con dashboard Kibana incluse.
Questa versione include tre miglioramenti significativi rispetto alla versione precedente:
/wireless/networks/<iface> contemporaneamente, l'agent attivava N chiamate iw scan ridondanti che serializzavano sul lock per interfaccia, moltiplicando la latenza di scansione per il numero di client. La prima richiesta ora è il "leader" che effettua la scansione; le richieste concorrenti attendono su un threading.Event e condividono il risultato del leader. Include anche una correzione TOCTOU nella creazione del lock e sicurezza delle eccezioni sui lock per interfaccia.droneid.* personalizzato), e un'interfaccia web reattiva multi-dispositivo. Vedi la sezione Sparrow DroneID qui sotto.sparrow-elastic.py è stato riscritto per produrre documenti ECS 8.17 (era ECS 1.5), ora supporta sia Elasticsearch 8.x che OpenSearch 2.x, avvia automaticamente modelli di indice componibili con politiche del ciclo di vita ILM/ISM e alias di rollover, esegue arricchimento OUI dei vendor e classificazione dei dispositivi basata su regole (con fingerprinting opzionale Fingerbank), e fornisce quattro dashboard Kibana incluse più sei visualizzazioni legacy preservate. Il ponte legacy ECS 1.5 è preservato in legacy/sparrow-elastic.py. Vedi .L'applicazione Sparrow originale fornisce un'interfaccia GUI completa che sostituisce strumenti come inSSIDer e LinSSID, con capacità ben oltre la scansione di base:
sparrowwifiagent.py) per scansione distribuita, operazioni su droni/rover e distribuzioni su Raspberry Piiw scan
Un sistema autonomo basato su web per il rilevamento e tracciamento dei droni che decodifica le trasmissioni di Identificazione Remota (RemoteID) obbligatorie per FAA. Funziona come server HTTP Python con un'interfaccia utente basata su browser accessibile da qualsiasi dispositivo sulla rete.
L'interfaccia web è disponibile all'indirizzo http://localhost:8097 una volta avviata. Vedi Installazione più sotto per la configurazione, e il riferimento API per l'accesso programmatico.
Oltre ai webhook Slack, Sparrow DroneID può inviare ogni allerta attivata tramite POST a un endpoint generico esterno di ingest delle allerte. Il canale è disabilitato per impostazione predefinita; configuralo in Impostazioni → Allerte → Alerting basato su API:
http://MY_API_HOST:PORT/API_ROOTAuthorization: Bearer ...; mascherato nell'interfaccia una volta salvatorule.category: "test", seriale TEST-0000) in modo che il ricevitore possa essere testato end-to-end senza attendere un drone realeSparrow DroneID effettua due chiamate all'URL radice configurato:
Entrambe le chiamate inviano Authorization: Bearer <token> e 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` è incluso quando il ricevitore ha un fix GPS; `source.geo.location` è incluso quando il drone sta trasmettendo una posizione. La severità segue la convenzione ECS (più bassa = più urgente): avvisi (`new_drone`, `altitude_max`, `speed_max`) sono `40`, eventi informativi (`signal_lost`) sono `70`. I droni contrassegnati come amici non generano avvisi quando l'interruttore "Avvisa su droni amici" lato operatore è disattivato, quindi non raggiungono nemmeno questo endpoint.
Gli avvisi di test sintetici emessi dal pulsante **Invia Messaggio di Test** usano `rule.category: "test"`, `event.action: "test"`, `event.severity: 70`, e seriale `TEST-0000` in modo che il ricevitore possa riconoscerli ed escluderli dai dashboard operativi.
---
## Requisiti di Sistema
| Requisito | Sparrow-WiFi (GUI) | Sparrow DroneID (Web) |
|-------------|-------------------|----------------------|
| **Sistema Operativo** | Ubuntu 20.04+, Kali 2020.3+, Debian 11+ | Ubuntu 20.04+, Kali, Debian 11+, Raspberry Pi OS |
| **Python** | 3.8+ | 3.8+ |
| **Root** | Richiesto (iw scan) | Richiesto (modalità monitor, BLE) |
| **Adattatore WiFi** | Qualsiasi con supporto `iw` | Con supporto modalità monitor (es. rtl8812au, Intel AX200) |
| **Bluetooth** | Opzionale (adattatore hci, Ubertooth) | Opzionale (qualsiasi adattatore BLE per RemoteID) |
| **GPS** | Opzionale (gpsd) | Opzionale (gpsd o coordinate statiche) |
| **Display** | Desktop X11/Wayland | Headless OK (browser web su qualsiasi dispositivo) |
---
## Installazione
### Sparrow-WiFi (GUI desktop)```bash
git clone https://github.com/ghostop14/sparrow-wifi
cd sparrow-wifi
Pacchetti di 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
> **Utenti Kali:** PyQt5, PyQtChart e aircrack-ng (per il plugin Falcon) sono solitamente preinstallati. Per lo più avrai solo bisogno di `gpsd`, `gpsd-clients` e delle dipendenze Python qui sotto.
Dipendenze Python — scegli uno dei due approcci:
**Opzione A: Installazione a livello di sistema con `--break-system-packages`** — la più semplice, si adatta a come vengono avviati la GUI/agent (script di proprietà di 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
Opzione B: Ambiente virtuale — isolato, nessun avviso di pip di sistema, preferito da alcuni operatori:```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
sudo venv/bin/python3 ./sparrow-wifi.py
In ogni caso, esegui:```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
Apri `http://localhost:8097` in un browser. Configura l'interfaccia di monitoraggio e il GPS nelle Impostazioni, quindi clicca su Start.
### Elasticsearch / OpenSearch Bridge (opzionale)```bash
sudo pip3 install --break-system-packages -r requirements-elastic.txt
# or via venv as above
Vedi Integrazione Elasticsearch / OpenSearch di seguito.
La maggior parte degli adattatori WiFi funziona per la scansione di base. Sparrow-WiFi supporta più back-end di enumerazione delle interfacce (iw, iwconfig, nmcli) quindi funziona su sistemi che potrebbero non avere iw installato (ad esempio, RHEL/Fedora con solo NetworkManager).
Per la modalità monitor (richiesta da Sparrow DroneID e dal plugin Falcon), il supporto di adattatore e driver varia:
iw phy <phy> info | grep monitor o iwconfig <iface> per verificare le capacitàPer Sparrow DroneID in particolare, l'adattatore deve fornire frame 802.11 grezzi in modalità monitor. Alcuni adattatori Intel segnalano la modalità monitor come supportata ma scartano silenziosamente i frame a livello firmware. L'applicazione lo rileva e ti avvisa.
Sparrow-WiFi supporta diverse modalità di scansione Bluetooth:
Un adattatore Bluetooth standard integrato o USB è sufficiente per la scansione degli annunci BLE e il rilevamento di droni RemoteID. Testa il tuo adattatore con bluetoothctl scan on.
Per la scoperta promiscua completa di dispositivi sia Classic che BLE, avrai bisogno di un Ubertooth One e Blue Hydra installati in /opt/bluetooth/blue_hydra. Questo è opzionale e non richiesto per la scansione BLE di base o RemoteID.
Sovrapposizioni spettrali in tempo reale sulle viste dei canali WiFi:
ubertooth-specan-uihackrf_sweep
Entrambe le applicazioni usano gpsd per il GPS. Configurazione rapida:```bash
sudo apt install gpsd gpsd-clients
sudo gpsd -D 2 -N /dev/ttyUSB0
xgps # or: cgps -s
Per la produzione, configura `/etc/default/gpsd` con il percorso del dispositivo e riavvia il servizio.
Sparrow DroneID supporta anche coordinate statiche (configurate in Impostazioni) per installazioni in siti fissi senza ricevitore GPS.
---
## Agente Remoto e Integrazione API
L'agente Sparrow (`sparrowwifiagent.py`) è un server HTTP senza interfaccia grafica che espone tutte le capacità di scansione WiFi e Bluetooth di Sparrow come API REST basate su JSON. È così che l'interfaccia GUI di Sparrow-WiFi comunica con i sensori remoti, ma l'API è aperta per qualsiasi applicazione.
**Casi d'uso:**
- Distribuibile su Raspberry Pi, drone o rover per scansione remota/mobile
- Integra la consapevolezza situazionale WiFi e Bluetooth nelle tue applicazioni
- Alimenta i dati di scansione in SIEM, dashboard o pipeline di allerta
- Automatizza la scansione con script (avvia scansioni, recupera risultati tramite curl/Python/ecc.)
Anche Sparrow DroneID ha una propria API REST ([riferimento API](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow-droneid/sparrow_drone_id_api.md)), che fornisce accesso programmatico a rilevamenti di droni, gestione degli allarmi, geozone e configurazione di sistema.
### Esecuzione dell'Agente```bash
sudo ./sparrowwifiagent.py
Ascolta sulla porta 8020 di default. Opzioni principali:
Vedi --help per l'elenco completo.
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
Per Sparrow DroneID, consultare il [riferimento API](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow-droneid/sparrow_drone_id_api.md) dedicato.
> **Nota per la produzione:** l'agente ascolta su tutte le interfacce per impostazione predefinita. Per distribuzioni al di fuori di una rete affidabile, utilizzare `--allowedips` per limitare i chiamanti, eseguire dietro un proxy inverso con TLS, o associare solo a un'interfaccia privata.
---
## Plugin Falcon / Aircrack-ng
Integrazione avanzata per test di penetrazione wireless. Fornisce accesso point-and-click a:
- Scoperta di SSID nascosto tramite airodump-ng
- Enumerazione delle stazioni client (AP connesso, SSID sondati)
- Deautenticazione mirata e broadcast
- Cattura IV WEP
- Cattura handshake WPA con estrazione automatica dell'hash (richiede JTR `wpapcap2john`)
### Prerequisiti```bash
# Kali users: aircrack-ng + JTR are usually pre-installed.
# Ubuntu / Debian / Raspberry Pi OS:
sudo apt install aircrack-ng john
Verifica che airmon-ng, airodump-ng e wpapcap2john siano presenti nel tuo PATH dopo l'installazione.
I test di penetrazione attivi sono soggetti a normative legali. È tua responsabilità ottenere l'autorizzazione appropriata prima di utilizzare questi strumenti.
Il pacchetto sparrow_elastic fornisce un ponte ECS 8.17 che interroga l'agente Sparrow WiFi e indicizza in blocco le osservazioni WiFi e Bluetooth in Elasticsearch 8.x o OpenSearch 2.x. Avvia automaticamente modelli di indice componibili, politiche del ciclo di vita ILM/ISM e alias di scrittura rollover; esegue l'arricchimento del fornitore OUI e la classificazione dei dispositivi basata su regole (con fingerprinting opzionale di Fingerbank); e fornisce dashboard Kibana predefiniti.
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 ''
> **Igiene delle credenziali:** includere `user:pass@` in `--elasticserver` è comodo, ma l'URL diventa visibile in `ps`, `journalctl` e nella cronologia della shell. Per la produzione, usa i flag `--username`/`--password`, le variabili d'ambiente (`SPARROW_ES_USERNAME`, `SPARROW_ES_PASSWORD`), o il pattern `EnvironmentFile=` nell'esempio di unità systemd incluso.
### Cosa include il bridge
- **5 dashboard Kibana** — Consapevolezza Situazionale, Pattern di Vita, Rilevamento di Nuovi Dispositivi, Pianificazione dello Spettro (con mappa di calore SSID × Canale dell'intensità del segnale) e Consapevolezza Situazionale Bluetooth (con pannello Vega per dispositivi veramente nuovi e tabella di prossimità con distanza stimata)
- **6 visualizzazioni preservate dalla versione legacy** — cloni rinominati delle vecchie visualizzazioni `Sparrow*` per mantenere funzionante la memoria muscolare
- **Classificatore di dispositivi** — tabella seed con 64 regole che coprono controller di droni (DJI/Autel/Skydio/Parrot/Yuneec), BT Class of Device, GAP Appearance, sottotipi Apple Continuity e euristiche OUI del venditore
- **Aggiornamento dei dati di riferimento** — file `manuf` di Wireshark, ID aziendali BT SIG, UUID di servizio, valori GAP Appearance e tabelle dei sottotipi Apple Continuity, con un thread in background di auto-aggiornamento a 30/90 giorni
- **Controllo di compatibilità pre-avvio** — rifiuta di scrivere in indici ECS 1.5 legacy e stampa chiari passaggi di correzione invece di corrompere silenziosamente i dati
Per la documentazione operativa completa (selezione del motore, modalità di autenticazione, importazione delle dashboard, dati di riferimento, riferimento CLI completo) consulta [sparrow_elastic/README.md](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow_elastic/README.md).
I file di configurazione di esempio si trovano nella radice del repository e in `init.d_scripts/`:
- `sparrow-elastic.conf.example` — configurazione in stile INI con tutte le chiavi supportate
- `sparrow-elastic.env.example` — file env in formato shell per distribuzioni systemd
- `init.d_scripts/sparrow-elastic.service.example` — template di unità systemd
### Migrazione dal bridge legacy ECS 1.5
Il bridge precedente al 2026 scriveva documenti ECS 1.5 in indici denominati dall'operatore tramite `--wifiindex` / `--btindex`. Il nuovo bridge scrive documenti ECS 8.17 in alias di scrittura gestiti da rollover (predefiniti `sparrow-wifi` / `sparrow-bt`).
**Lo script legacy è conservato in `legacy/sparrow-elastic.py`** insieme al suo template `.txt` e ai file delle policy ILM. Per eseguirlo è ancora necessario l'ambiente legacy (impostazione manuale di template e ILM).
**Modifiche ai flag (con retrocompatibilità):**
| Flag legacy | Nuovo flag | Note |
|---------------------|--------------------|--------------------------------------------------------|
| `--wifiindex NAME` | `--wifi-alias NAME`| La grafia legacy è ancora accettata come alias deprecato. |
| `--btindex NAME` | `--bt-alias NAME` | La grafia legacy è ancora accettata come alias deprecato. |
| `--dont-create-indices` | invariato | Salta il bootstrap. |
| `--elasticserver`, `--sparrowagent`, `--sparrowport`, `--wifiinterface`, `--scandelay` | invariati | |
Un'invocazione legacy come:```bash
./sparrow-elastic.py --elasticserver=http://user:pass@host:9200 \
--wifiinterface=wlan1 \
--wifiindex=sparrowwifi-home \
--btindex=sparrowbt-home
ancora analizza e funziona — ma il bridge ora rifiuta di scrivere in un indice preesistente la cui mappatura non contiene il marcatore dello schema ECS 8.17, uscendo con tre opzioni di remediation (usa un alias diverso, cancella e riavvia, o esegui il bridge legacy). Per un'installazione pulita, basta rimuovere --wifiindex / --btindex e accettare i nuovi valori predefiniti.
L'agente remoto può essere distribuito su un Raspberry Pi montato su un drone o rover per il rilevamento wireless mobile. Testato su un drone Solo 3DR con integrazione GPS tramite MAVLink.
sudo python3 ./sparrowwifiagent.py --userpileds --sendannounce --mavlinkgps 3dr --recordinterface wlan0
Indicatori LED (Raspberry Pi):
1. Entrambi spenti — Inizializzazione
2. Battito rosso — GPS presente, non sincronizzato
3. Rosso fisso — GPS sincronizzato
4. Verde fisso — Agente pronto, serve richieste
Le registrazioni possono essere recuperate tramite l'interfaccia di gestione degli agenti della GUI di Sparrow-WiFi.
### Note di Configurazione del Pi
- Usa Raspberry Pi OS (Bookworm o successivo) con Python 3.8+
- Disabilita il WiFi integrato per abilitare la scansione a 5 GHz con adattatori USB: aggiungi `dtoverlay=disable-wifi` a `/boot/firmware/config.txt` su Bookworm e successivi, o `/boot/config.txt` su versioni precedenti
- Installa i prerequisiti: `sudo pip3 install --break-system-packages -r requirements.txt` (oppure usa un venv come nella sezione [Installazione](#installation))
---
## Struttura del Progetto```
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
Questo progetto è concesso in licenza secondo i termini inclusi nel repository. Vedi il file LICENSE per i dettagli.
| Verbo | Percorso | Scopo |
|---|
POST | {root}/v1/alerts/verify | Controllo credenziali — corpo {"domain": "<configurato>"}. Il ricevitore dovrebbe rispondere con 200 {"status":"ok"} in caso di successo, 401 per token errato. |
POST | {root}/v1/alerts | Attivare un'allerta — il corpo è il JSON sottostante. Il ricevitore dovrebbe rispondere con 201 {"alert_id":"..."} in caso di successo. Le risposte 503 vengono ritentate con backoff esponenziale (3 tentativi); 4xx interrompe senza ritentare. Un 200 {"status":"dropped"} indica che il dominio è disabilitato a monte. |
| Modalità | Hardware | Cosa Vedi |
|---|
| Scansione annunci BLE | Adattatore BT standard | Dispositivi LE che stanno attivamente annunciando |
| Scansione promiscua | Ubertooth One + Blue Hydra | Tutti i dispositivi BLE e Classic BT nel raggio |
| Annunci iBeacon | Adattatore BT standard | Annuncia i tuoi iBeacon |
| Scansione RemoteID | Adattatore BT standard | Identificazione drone conforme FAA (solo Sparrow DroneID) |
| Flag | Scopo |
|---|
--port PORT | Porta di ascolto HTTP |
--allowedips IP1,IP2 | Limita connessioni client |
--staticcoord LAT,LON,ALT | Usa coordinate GPS fisse |
--mavlinkgps 3dr | Recupera GPS dal drone Solo 3DR |
--recordinterface IFACE | Registrazione automatica all'avvio (headless) |
--userpileds | Usa LED Raspberry Pi per stato |
--sendannounce | Broadcast UDP per scoperta agenti |