Sparrow-WiFi 是一个用于 Linux 的 2.4 GHz 和 5 GHz WiFi 及蓝牙频谱感知工具。它集成了 WiFi 扫描、蓝牙低功耗(BLE)和经典蓝牙发现、软件定义无线电频谱分析(HackRF、Ubertooth)、GPS 追踪、FAA RemoteID 无人机检测、无人机/漫游车远程操作,以及将 ECS 8.17 索引到 Elasticsearch 或 OpenSearch,统一在一个平台上。完全使用 Python 3 编写。
该项目包含四个可独立或协同工作的组件:
| 组件 | 界面 | 用途 |
|---|---|---|
| Sparrow-WiFi | PyQt5 桌面 GUI | WiFi/BT 扫描、频谱分析、源追踪、战争驾驶 |
| Sparrow Agent | 无头 HTTP 服务器 | 远程扫描、无人机/漫游车部署、第三方集成 |
| Sparrow DroneID | 基于 Web(浏览器) | 通过 WiFi 和蓝牙低功耗进行 FAA RemoteID 无人机检测 |
| Sparrow Elastic Bridge | 无头 CLI 服务 | 将 WiFi/BT 观测数据以 ECS 8.17 索引到 Elasticsearch / OpenSearch |
Sparrow Agent 和 Sparrow DroneID 暴露 JSON REST API,允许其他应用程序查询扫描结果、触发扫描、获取无人机检测信息,并将无线/无人机感知集成到自己的工作流程中。Elastic Bridge 消耗代理的 REST API,并发送带有捆绑 Kibana 仪表板的 ECS 8.17 文档。
此版本相较于先前版本包含三项重大改进:
/wireless/networks/<iface> 时,代理先前会启动 N 个冗余的 iw scan 调用,这些调用在接口锁上串行化,导致扫描延迟随客户端数量倍增。现在第一个请求成为实际扫描的“领导者”;并发请求等待 threading.Event 并共享领导者的结果。还包含锁创建时的 TOCTOU 修复以及接口锁的异常安全性。droneid.* 命名空间),以及多设备响应式 Web UI。请参见下面的 Sparrow DroneID 部分。sparrow-elastic.py 桥接已被重写,现在生成 ECS 8.17 文档(之前为 ECS 1.5),同时支持 Elasticsearch 8.x 和 OpenSearch 2.x,自动引导可组合索引模板(含 ILM/ISM 生命周期策略和滚动写入别名),执行 OUI 供应商丰富和基于规则的设备分类(可选 Fingerbank 指纹识别),并打包四个捆绑的 Kibana 仪表板以及六个保留的旧版可视化。旧版 ECS 1.5 桥接保留在 legacy/sparrow-elastic.py。请参见 Elasticsearch / OpenSearch 集成。原始的 Sparrow 应用程序提供了一个全面的基于 GUI 的替代工具,如 inSSIDer 和 LinSSID,其功能远超基本扫描:
sparrowwifiagent.py),用于分布式扫描、无人机/漫游车操作以及 Raspberry Pi 部署iw scan 输出
一个独立的基于 Web 的无人机检测与追踪系统,能够解码 FAA 强制要求的远程识别(RemoteID)广播。作为 Python HTTP 服务器运行,带有基于浏览器的 UI,可从网络上的任何设备访问。
启动后 Web UI 运行在 http://localhost:8097。请参阅下面的 安装 了解设置,以及 API 参考 了解编程接口。
除了 Slack webhook,Sparrow DroneID 还可将每次触发的告警 POST 到 一个通用的外部告警接收端点。该通道默认禁用; 请在“设置” → “告警” → “基于 API 的告警”中配置:
http://MY_API_HOST:PORT/API_ROOTAuthorization: Bearer ... 头中发送;存储后在 UI 中隐藏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) | 必需(monitor mode, BLE) |
| **WiFi适配器** | 任何支持 `iw` 的适配器 | 支持监听模式(例如 rtl8812au、Intel AX200) |
| **蓝牙** | 可选(hci 适配器、Ubertooth) | 可选(任何支持 BLE 的适配器用于 RemoteID) |
| **GPS** | 可选(gpsd) | 可选(gpsd 或静态坐标) |
| **显示** | X11/Wayland 桌面 | 无头模式可用(任何设备上的网页浏览器) |
---
## 安装
### Sparrow-WiFi (桌面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的系统上工作(例如,仅使用NetworkManager的RHEL/Fedora)。
对于监控模式(Sparrow DroneID和Falcon插件需要),适配器和驱动支持各不相同:
iw phy <phy> info | grep monitor 或 iwconfig <iface> 验证能力对于Sparrow DroneID,适配器必须在监控模式下传递原始802.11帧。某些Intel适配器报告支持监控模式,但在固件级别静默丢弃帧。应用程序会检测到这一点并警告您。
Sparrow-WiFi支持多种蓝牙扫描模式:
标准的内置或USB蓝牙适配器足以进行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
For production, configure `/etc/default/gpsd` with your device path and restart the service.
Sparrow DroneID 也支持静态坐标(在设置中配置),用于没有GPS接收器的固定站点安装。
---
## Remote Agent and API Integration
Sparrow 代理(`sparrowwifiagent.py`)是一个无头 HTTP 服务器,将 Sparrow 的所有 WiFi 和蓝牙扫描能力以基于 JSON 的 REST API 方式暴露出来。这就是 Sparrow-WiFi GUI 与远程传感器通信的方式,但该 API 开放给任何应用程序使用。
**使用场景:**
- 部署在 Raspberry Pi、无人机或漫游车上进行远程/移动扫描
- 将 WiFi 和蓝牙态势感知集成到你自己的应用中
- 将扫描数据馈送到 SIEM、仪表盘或警报管道中
- 使用脚本自动化扫描(触发扫描,通过 curl/Python 等获取结果)
Sparrow DroneID 也有自己的 REST API([API 参考](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow-droneid/sparrow_drone_id_api.md)),提供对无人机检测、警报管理、地理围栏和系统配置的编程访问。
### Running the Agent```bash
sudo ./sparrowwifiagent.py
默认监听端口8020。关键选项:
参见 --help 获取完整列表。
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 插件
高级无线渗透测试集成。提供点选式访问,支持:
- 通过 airodump-ng 发现隐藏 SSID
- 客户端站点枚举(已连接 AP、探测到的 SSID)
- 定向和广播解除认证
- WEP IV 捕获
- WPA 握手捕获及自动哈希提取(需要 JTR `wpapcap2john`)
### 先决条件```bash
# Kali users: aircrack-ng + JTR are usually pre-installed.
# Ubuntu / Debian / Raspberry Pi OS:
sudo apt install aircrack-ng john
验证安装后 airmon-ng、airodump-ng 和 wpapcap2john 是否在您的 PATH 中。
主动渗透测试受法律法规约束。使用这些工具前,您有责任获得适当的授权。
sparrow_elastic 包提供了一个 ECS 8.17 桥接,用于轮询 Sparrow WiFi 代理并将 WiFi 和蓝牙观测数据批量索引到 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 ''
> **凭据卫生:** 在 `--elasticserver` 中嵌入 `user:pass@` 虽然方便,但 URL 会在 `ps`、`journalctl` 和 shell 历史记录中可见。生产环境请使用 `--username`/`--password` 标志、环境变量(`SPARROW_ES_USERNAME`、`SPARROW_ES_PASSWORD`),或所附 systemd 单元示例中的 `EnvironmentFile=` 模式。
### 桥接器附带的组件
- **5 个 Kibana 仪表板** — 态势感知、生活模式、新设备检测、频谱规划(附带 SSID × 信道信号强度热力图)以及蓝牙态势感知(附带真正新设备 Vega 面板和估计距离接近度表格)
- **6 个保留旧版的可视化** — 对原始 `Sparrow*` 可视化进行字段重命名的克隆,以便旧操作习惯继续适用。
- **设备分类器** — 包含 64 条规则的种子表,涵盖无人机控制器(DJI/Autel/Skydio/Parrot/Yuneec)、蓝牙设备类别、GAP 外观、Apple Continuity 子类型以及 OUI 厂商启发式规则。
- **参考数据刷新** — 附带的 Wireshark `manuf`、BT SIG 公司 ID、服务 UUID、GAP 外观值以及 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 年前的桥接器通过 `--wifiindex` / `--btindex` 将 ECS 1.5 文档写入操作员命名的索引。新桥接器将 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` | 未更改 | 跳过引导。 |
| `--elasticserver`, `--sparrowagent`, `--sparrowport`, `--wifiinterface`, `--scandelay` | 未更改 | |
像这样的旧调用:```bash
./sparrow-elastic.py --elasticserver=http://user:pass@host:9200 \
--wifiinterface=wlan1 \
--wifiindex=sparrowwifi-home \
--btindex=sparrowbt-home
仍能解析并运行—但桥接器现在拒绝写入一个预先存在的索引,其映射不包含 ECS 8.17 架构标记,退出时提供三种修复选项(使用不同的别名、擦除并重新引导、或运行旧版桥接器)。对于全新安装,只需去掉 --wifiindex / --btindex 并接受新的默认值。
远程代理可以部署在安装在无人机或漫游车上的树莓派上,用于移动无线勘测。已在配备 GPS 并通过 MAVLink 集成的 Solo 3DR 无人机上测试。
sudo python3 ./sparrowwifiagent.py --userpileds --sendannounce --mavlinkgps 3dr --recordinterface wlan0
LED indicators (Raspberry Pi):
1. Both off — Initializing
2. Red heartbeat — GPS present, not synchronized
3. Red solid — GPS synchronized
4. Green solid — Agent ready, serving requests
Recordings can be retrieved via the Sparrow-WiFi GUI's agent management interface.
### Pi Setup Notes
- Use Raspberry Pi OS (Bookworm or later) with Python 3.8+
- Disable the onboard WiFi to enable 5 GHz scanning with USB adapters: add `dtoverlay=disable-wifi` to `/boot/firmware/config.txt` on Bookworm and later, or `/boot/config.txt` on older releases
- Install prerequisites: `sudo pip3 install --break-system-packages -r requirements.txt` (or use a venv as in the [Installation](#installation) section)
---
## Project Structure```
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 广播扫描 | 标准蓝牙适配器 | 正在主动广播的LE设备 |
| 混杂模式扫描 | Ubertooth One + Blue Hydra | 范围内所有BLE和经典BT设备 |
| iBeacon 广播 | 标准蓝牙适配器 | 广播自己的iBeacons |
| RemoteID 扫描 | 标准蓝牙适配器 | 符合FAA的无人机识别(仅限Sparrow DroneID) |
| 标志 | 用途 |
|---|
--port PORT | HTTP监听端口 |
--allowedips IP1,IP2 | 限制客户端连接 |
--staticcoord LAT,LON,ALT | 使用固定GPS坐标 |
--mavlinkgps 3dr | 从Solo 3DR无人机获取GPS |
--recordinterface IFACE | 启动时自动录制(无头模式) |
--userpileds | 使用树莓派LED显示状态 |
--sendannounce | UDP广播用于代理发现 |