emrekybs/signalops
GitHub: emrekybs/signalops
一个将 WiFi、蜂窝、CCTV、ADS-B、卫星及 SDR 等多源信号情报融合到统一战术地图上的安全研究平台。
Stars: 0 | Forks: 0
# Signal OPS
一个用于安全研究和训练的全频谱、全来源信号情报融合平台。Signal OPS 将数十个公开收集源——WiFi/Bluetooth/基站数据库、互联网暴露扫描器、摄像头索引、ADS-B 航班馈送、卫星 TLE 跟踪以及 SDR/APRS 网络——整合到单一的战术地图和 Flask API 中,将 RF、蜂窝、空域、轨道和监控领域关联为一个实时操作全景,并可选叠加 AI 辅助的威胁摘要。
## 功能
- **统一的 RF/OSINT 扫描** — 一次调用即可并行展开对 WiFi、Bluetooth、基站、IoT、摄像头和飞行器来源的扫描,对结果进行去重和评分。
- **摄像头发现** — 通过 Shodan、FOFA、BinaryEdge、Windy Webcams、OpenStreetMap 监控节点和 Insecam,支持按坐标或按国家查询。
- **蜂窝情报** — 基站查询(WiGLE、OpenCellID),具备离线 MCC/MNC -> 运营商/国家解析以及 IMSI-catcher / Stingray 启发式检测。
- **无线威胁检测** — 检测恶意 / evil-twin 接入点,识别 Bluetooth 跟踪器(AirTag、Tile、SmartTag 等)。
- **空域监控** — 通过 adsb.fi 和 OpenSky 获取实时 ADS-B,解码紧急应答机代码,进行无人机启发式检测,并生成源自飞行器 NAC-P 的 GPS 干扰热力图。
- **轨道跟踪** — 摄取 CelesTrak TLE 并进行 SGP4 传播,执行任务分类,并叠加 SatNOGS 地面站覆盖图。
- **SDR 与 APRS** — 公共 KiwiSDR 接收器地图和 APRS.fi 站台查询。
- **IP 威胁情报** — 多来源聚合(ipinfo、AbuseIPDB、CriminalIP、LeakIX、ZoomEye),包含轻量级端口扫描和综合风险评分。
- **监视列表与警报** — 跟踪特定的 BSSID、SSID、IP、MAC 或 ICAO hex,并在扫描期间获取命中结果。
- **AI 分析(可选)** — 当提供密钥时,Google Gemini 会将扫描结果总结为评估报告和风险等级。
几乎所有来源都是**可选的**。如果未设置密钥,该抓取器将被平滑跳过——免费来源(OpenStreetMap、Insecam、ipinfo.io、ADS-B、CelesTrak、KiwiSDR)无需任何密钥即可工作。
## 截图
### SIGINT 地图 — 统一的多源视图
主地图将同一区域内的 WiFi、Bluetooth、蜂窝、摄像头和飞行器图层进行融合,并为 OSM 摄像头、ALPR/Flock 网络和警察辖区提供可切换的叠加层。


### 监控与 CCTV
| 监控信号源 | CCTV 发现 |
|---|---|
|  |  |
监控列表会对每个设备进行评分(例如 *"可疑度 35/100:未授权的摄像头"*),并合并来自 WiGLE、Insecam 和 OSM 的路由器、电视和暴露的摄像头。CCTV 视图按来源对发现的摄像头进行分组,显示每个摄像头的风险以及实时/元数据状态。
### 基站情报与 SDR / APRS
| 基站热力图 | SDR / APRS 网络 |
|---|---|
|  |  |
## 基站情报通过 MCC/MNC 运营商查找绘制基站密度图;SDR 视图映射了公共 KiwiSDR 接收器和 APRS 站台,并支持呼号查找。
## 要求
- Python 3.9+
- 下方列出的 Python 包
核心依赖:
```
flask
requests
python-dotenv
```
推荐(启用完整功能 — 缓存、速率限制、卫星传播):
```
cachetools # bounded geo-cache (falls back to an unbounded dict if missing)
flask-limiter # request rate limiting
sgp4 # satellite position propagation for /api/satellites
google-genai # Gemini AI analysis (only if you use GEMINI_API_KEY)
```
安装所有内容:
```
pip install flask requests python-dotenv cachetools flask-limiter sgp4 google-genai
```
## 设置
### 1. 克隆并进入项目
```
git https://github.com/emrekybs/signalops.git
unzip signalops-v1.zip
```
### 2.(可选)创建虚拟环境
```
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
```
### 3. 安装依赖项
```
pip install -r requirements.txt
```
如果没有 `requirements.txt`,请使用上方“要求”部分中的 `pip install` 命令行。
### 4. 配置您的环境
复制示例文件并填入您拥有的密钥:
```
cp .env.example .env
```
然后打开 `.env` 并粘贴您的 API 密钥。**每个密钥都是可选的** — 将任意行留空(或删除它)即可禁用该来源。有关每个密钥的用途及获取位置,请参见下一节。
### 5.(可选)添加本地数据集
为了实现即时的离线摄像头和辖区查询,请将这些文件放置在 `data/` 目录下(或将 `DATA_DIR` 指向其他位置):
```
data/CAMERAS_WITH_NETWORK_DATA.geojson # Point features (cameras)
data/police_precincts_usa.geojson # Polygon features (US precincts)
data/camera_networks.json # network-sharing metadata
data/tiles/{z}/{x}/{y}.json # optional tiled camera dataset
```
如果缺少这些文件,应用程序将自动回退到实时的 OpenStreetMap Overpass 查询。
### 6. 运行
```
python app_v2.py
```
服务器将在 **http://0.0.0.0:8080** 上启动。在浏览器中打开 `http://localhost:8080`。
随时检查哪些提供商已成功加载:
```
GET /api/status # active vs. missing keys
GET /api/debug # per-key boolean + live WiGLE auth test
```
## 环境变量
在项目根目录中创建一个 `.env` 文件。以下是应用程序读取的完整列表。
### 数据源 API 密钥(均为可选)
| 变量 | 提供商 | 获取密钥地址 |
|---|---|---|
| `WIGLE_API_NAME` | WiGLE (WiFi/BT/蜂窝) — 用户名 | https://wigle.net/account |
| `WIGLE_API_TOKEN` | WiGLE — API token | https://wigle.net/account |
| `OPENCELLID_API_KEY` | OpenCellID(基站) | https://opencellid.org |
| `SHODAN_API_KEY` | Shodan(暴露 / 摄像头) | https://account.shodan.io |
| `CENSYS_API_ID` | Censys — API ID | https://search.censys.io/account/api |
| `CENSYS_API_SECRET` | Censys — API secret | https://search.censys.io/account/api |
| `ZOOMEYE_API_KEY` | ZoomEye | https://www.zoomeye.org/profile |
| `FOFA_EMAIL` | FOFA — 账户邮箱 | https://fofa.info |
| `FOFA_API_KEY` | FOFA — API key | https://fofa.info |
| `HUNTERHOW_API_KEY` | Hunter.how | https://hunter.how |
| `NETLAS_API_KEY` | Netlas | https://netlas.io |
| `LEAKIX_API_KEY` | LeakIX | https://leakix.net |
| `CRIMINALIP_API_KEY` | CriminalIP | https://www.criminalip.io |
| `BINARYEDGE_API_KEY` | BinaryEdge | https://www.binaryedge.io |
| `WINDY_API_KEY` | Windy Webcams | https://api.windy.com/keys |
| `ABUSEIPDB_API_KEY` | AbuseIPDB(IP 信誉) | https://www.abuseipdb.com/account/api |
| `ADSB_API_KEY` | adsb.fi(可选;无密钥也可工作) | https://adsb.fi |
| `APRS_FI_KEY` | APRS.fi(业余无线电台) | https://aprs.fi/page/api_key |
| `GEMINI_API_KEY` | Google Gemini(AI 分析) | https://aistudio.google.com/apikey |
### 应用配置
| 变量 | 默认值 | 描述 |
|---|---|---|
| `GEMINI_MODEL` | `gemini-2.0-flash` | 用于分析的 Gemini 模型 |
| `DATA_DIR` | `./data` | 本地 GeoJSON/JSON 数据集目录 |
| `FLASK_SECRET_KEY` | 每次运行随机生成 | Flask session 密钥;在生产环境中请设置固定值 |
### 无需密钥的来源(始终开启)
这些不需要配置:**OpenStreetMap Overpass**、**Insecam**、**EarthCam**、**ipinfo.io**、**ADS-B (adsb.fi / OpenSky)**、**CelesTrak TLE**、**SatNOGS** 和 **KiwiSDR**。
## `.env.example`
将其保存为仓库中的 `.env.example`,以便他人了解格式:
```
# ── Signal OPS 环境 ──
# 每个 key 都是可选的。留空以禁用该 source。
# WiFi / Bluetooth / Cell
WIGLE_API_NAME=
WIGLE_API_TOKEN=
OPENCELLID_API_KEY=
# Internet-exposure scanners
SHODAN_API_KEY=
CENSYS_API_ID=
CENSYS_API_SECRET=
ZOOMEYE_API_KEY=
FOFA_EMAIL=
FOFA_API_KEY=
HUNTERHOW_API_KEY=
NETLAS_API_KEY=
LEAKIX_API_KEY=
CRIMINALIP_API_KEY=
BINARYEDGE_API_KEY=
# Cameras & IP reputation
WINDY_API_KEY=
ABUSEIPDB_API_KEY=
# Aircraft & ham radio
ADSB_API_KEY=
APRS_FI_KEY=
# AI 分析
GEMINI_API_KEY=
GEMINI_MODEL=gemini-2.0-flash
# App config
DATA_DIR=./data
FLASK_SECRET_KEY=
```
## API 概览
暴露的部分端点(完整集合请参见源码):
| 端点 | 用途 |
|---|---|
| `GET /nearby?lat=&lon=&mode=` | 围绕某一点进行统一的 RF/OSINT 扫描 |
| `GET /api/cctv?lat=&lon=` 或 `?country=` | 按位置或国家发现摄像头 |
| `GET /api/search?type=&query=` | 按 SSID、IP、位置或国家进行搜索 |
| `POST /api/analyze` | 设备列表的 AI 摘要 |
| `GET /api/ip-intel?ip=` | 多源 IP 威胁情报 |
| `GET /api/adsb?lat=&lon=&radius=` | 实时飞行器 + 紧急情况检测 |
| `GET /api/satellites?categories=` | 卫星位置(TLE + SGP4) |
| `GET /api/gps-jamming?lat=&lon=` | 源自 ADS-B 的 GPS 干扰热力图 |
| `GET /api/sdr/kiwisdr` | 公共 KiwiSDR 接收器列表 |
| `GET /api/aprs/stations?lat=&lon=` | 附近的 APRS 站台 |
| `GET/POST /api/watchlist` | 管理被追踪的标识符 |
| `POST /api/watchlist/check` | 对照监视列表检查设备列表 |
| `GET /api/status` · `GET /api/debug` | 提供商健康状况 / 密钥诊断 |
## 注意事项与限制
- 某些提供商(例如 ZoomEye、CriminalIP)可能会受到特定 ISP 上 TLS 干扰的影响,默认情况下在某些扫描列表中已被禁用 — 请查看源码中的内联注释,以便在 VPN/代理后重新启用它们。
- 各提供商的速率限制差异很大;免费额度可能很小(例如,WiGLE 蜂窝查询约为 100 次/天)。应用程序会尽可能跳过或退避,但您有责任遵守每个提供商的限制。
- 本地数据集是可选的,但与实时的 Overpass 查询相比,它们能显著加快摄像头/辖区的查询速度。
## 许可证
在此处添加您选择的许可证(例如 MIT)。如果您未指定,代码默认为“保留所有权利”。
标签:ESC4, Flask, HTTP/HTTPS抓包, OSINT, Python, 信号情报, 威胁情报, 实时处理, 密码管理, 开发者工具, 态势感知, 无后门, 空间数据可视化, 逆向工具