0xsimaa/Stealth_Pi
GitHub: 0xsimaa/Stealth_Pi
一款基于树莓派 5 的便携式授权网络评估工具,结合 Scapy 低噪声扫描与 Ollama AI 漏洞分析,自动生成安全报告。
Stars: 0 | Forks: 0
# StealthPi
**StealthPi** 是一个便携式的双应用网络评估系统,作为在 **国家 CERT,伊斯兰堡** — 渗透测试与研究部门的实习项目而开发。
所有扫描**仅**在明确的书面授权范围内,针对授权网络和实验室目标执行。这是一个受监督的、合法的安全评估工具 — **严禁用于未经授权的用途**。
## 架构
StealthPi 由两个完全解耦的 Python Flask 应用程序组成,它们**仅**通过 REST API 进行通信:
| 应用程序 | 主机 | 职责 |
|---|---|---|
| **Scanner App** (`scanner_app/`) | Ubuntu Server 24.04 / Raspberry Pi 5 | 主动网络交互:Scapy 发现、DPI、PCAP 捕获、Web 爬取/镜像/测试、本地 SQLite、REST API |
| **Dashboard App** (`dashboard_app/`) | 操作员工作站 | 扫描后分析:从 Scanner 同步、SHA-256 校验、警报、PCAP 汇总、Ollama/Mistral 报告、服务器渲染的 UI |
Scanner App 对 Dashboard 是否在线有**零依赖**。Dashboard **绝不**直接写入 Scanner 数据库。
```
┌─────────────────────┐ REST API ┌──────────────────────┐
│ Scanner App │ ◄────────────────────── │ Dashboard App │
│ (Pi / VM) │ Bearer token auth │ (Operator PC) │
│ │ PCAP + scan records │ │
│ Scapy · SQLite │ │ pyshark · Ollama │
│ PCAPManager │ │ Jinja2 UI │
└─────────────────────┘ └──────────────────────┘
```
## Scanner App — 当前状态
| 阶段 | 模块 | 状态 |
|---|---|---|
| 1 | `config.py`, `database.py`, `auth.py`, `app.py` | 完成 |
| 2 | `scan_engine.py` — ARP 主机发现 | 完成 |
| 3 | `scan_engine.py` — 端口扫描,`dpi_module.py` | 完成 |
| 4 | `pcap_manager.py`, `scan_worker.py` | 完成 |
| 5 | `api_routes.py` | 完成 |
| 6 | `dashboard_app/` — 配置,数据库,sync_client | 完成 |
| 7 | Dashboard UI,警报,PCAP 汇总,AI 报告 | 完成 |
| 8 | `web_crawler.py`, `web_mirror.py` | 完成 |
| 9 | `active_tester.py`(确认受控) | 完成 |
| 10 | `storage_monitor.py`,systemd 单元,`SETUP.md` | 完成 |
### 关键模块
- **`scan_engine.py`** — 独立的 Scapy 引擎(`discover_hosts`,`scan_ports`)。在特权子进程中运行,从不被 Flask 导入。
- **`pcap_manager.py`** — `PCAPManager` 实现了 `writer` 协议:实时 `PcapWriter`(`sync=True`),500 MB 轮转并使用 gzip 归档,SHA-256 最终化。
- **`scan_worker.py`** — `network`、`web_static` 和 `web_active` 模式的子进程入口点。
- **`dpi_module.py`** — 离线/实时数据包分析:明文凭据、弱 TLS、过时的 banner、异常的 TCP flags、重叠的分片。
- **`web_crawler.py` / `web_mirror.py`** — 授权的 Web 爬取和用于静态/主动评估的 Podman nginx 镜像。
- **`active_tester.py`** — 仅针对本地镜像的确认受控主动测试。
- **`storage_monitor.py`** — 磁盘阈值检查;当存储空间不足时阻止新扫描。
## 环境要求
- Python **3.11+**
- Scanner:Flask,Scapy,python-dotenv,requests,beautifulsoup4
- Dashboard:Flask,python-dotenv,requests,pyshark,markdown
- **tshark**(Wireshark CLI)用于 PCAP 汇总:`sudo apt install tshark`
- **podman** + **wget** 用于 Web 镜像模式
- **Ollama** + **DeepSeek R1**(默认为 `deepseek-r1:7b`)用于带有推理轨迹的 AI 报告
- 运行 `bash scripts/setup-ollama.sh` 一次以安装/修复 Ollama 并拉取模型
- 需要 Root/CAP_NET_RAW 权限进行实时扫描(开发环境中 `SCAN_WORKER_SUDO=true`;生产环境中使用 systemd `AmbientCapabilities`)
有关生产部署、systemd 单元和 LUKS 指南,请参阅 **`SETUP.md`**。
首次使用前请运行 **`bash scripts/preflight.sh`**。
## 快速开始 (Scanner App)
### 1. 克隆并配置
```
git clone stealthpi
cd stealthpi
cp .env.example .env
cp dashboard_app/.env.example dashboard_app/.env
```
为您的实验室环境编辑 `.env`:
```
# 示例 — 本地 VMware 开发
MANAGEMENT_INTERFACE_IP=127.0.0.1
SCANNING_INTERFACE=ens33
MANAGEMENT_INTERFACE=ens33
PCAP_STORAGE_DIR=/home/you/stealthpi/storage/pcaps
DB_PATH=/home/you/stealthpi/storage/scanner.db
FLASK_PORT=9000
SCAN_WORKER_SUDO=true
SCANNER_APP_URL=http://127.0.0.1:9000
```
创建存储目录(只需一次):
```
mkdir -p storage/pcaps storage/dashboard_pcaps
```
如果之前运行过 `sudo` 导致扫描出现权限错误:
```
bash scripts/fix-storage.sh
```
### 2. 虚拟环境
```
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
### 3. 运行 Scanner API(非特权)
**终端 1:**
```
bash scripts/start-scanner.sh
```
或者:`python scanner_app/app.py`
- **Web 状态页面:** http://127.0.0.1:9000/
- **API 健康状态:** http://127.0.0.1:9000/api/health
您应该会看到 `Running on http://127.0.0.1:9000`。如果 9000 端口被占用,请停止旧进程(`lsof -i :9000`)或在 `.env` 中更改 `FLASK_PORT`。
通过 API 启动扫描(需要 Bearer token;`SCAN_WORKER_SUDO=true` 对 Scapy 使用 sudo):
```
curl -X POST http://127.0.0.1:9000/api/scans \
-H "Authorization: Bearer $STEALTHPI_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target_subnet":"192.168.142.0/24","mode":"network"}'
```
### 4. 运行网络扫描(特权子进程)
仅 ARP 发现(旧版 CLI):
```
cd scanner_app
sudo ../.venv/bin/python scan_engine.py --subnet 192.168.142.0/24 --out test.pcap
```
使用 `PCAPManager` + 数据库更新的完整网络扫描:
```
sudo ../.venv/bin/python scan_worker.py \
--scan-id "$(uuidgen)" \
--subnet 192.168.142.0/24 \
--intensity low
```
或者通过带有 `--scan-id` 的 `scan_engine.py`(插入扫描行,然后委托给 `scan_worker`):
```
sudo ../.venv/bin/python scan_engine.py \
--scan-id "$(uuidgen)" \
--subnet 192.168.142.0/24
```
### 5. 运行单元测试
请务必使用 **venv** 中的 Python(系统 Python 没有安装 Scapy):
```
source .venv/bin/activate
python run_tests.py
```
## 快速开始 (Dashboard App)
**终端 2**(Scanner 必须先在终端 1 中运行):
```
bash scripts/start-dashboard.sh
```
在浏览器中打开:**http://127.0.0.1:5002**
从 Scanner UI 同步扫描记录(**Sync Now** 按钮)或通过 CLI:
```
bash scripts/sync-dashboard.sh
```
## 安全模型
1. 除了 `/api/health` 之外,每个 Scanner API endpoint 都需要 **Bearer token**。
2. Flask 仅绑定到 `MANAGEMENT_INTERFACE_IP` — 绝不绑定 `0.0.0.0`。
3. Scapy 在具有 `CAP_NET_RAW` 的 **子进程** 中通过 systemd 运行;Flask 以非特权用户 `stealthpi` 运行。
4. 主动 Web 模式(`web_active`)需要在请求体中设置 `confirm=true`。
5. 所有来自 `.env` 的密钥均通过 `python-dotenv` 加载 — 绝不硬编码。
6. Pi 数据分区应使用 **LUKS 加密**(参见 `SETUP.md`)。
## PCAP 管理
`PCAPManager` 写入到:
```
{PCAP_STORAGE_DIR}/{scan_id}/{scan_id}_seg001.pcap
```
当单个分片大小达到 **500 MB** 时,将被 gzip 压缩,未压缩文件会被删除,并打开一个新的分片。在扫描结束时,`finalise()` 会关闭 writer 并返回最终分片(以 8 KB 数据块流式传输)的 SHA-256 摘要。
## 项目结构
```
stealthpi/
├── scanner_app/
│ ├── app.py # Flask entrypoint + spawn_network_scan()
│ ├── scan_engine.py # Host/port discovery (Scapy)
│ ├── scan_worker.py # Subprocess scan orchestration
│ ├── pcap_manager.py # PCAP capture, rotation, hashing
│ ├── dpi_module.py # Deep packet inspection
│ ├── database.py # SQLite persistence
│ ├── auth.py # Bearer token decorator
│ ├── config.py # Environment configuration
│ ├── port_lists.py # Nmap top-1000 + UDP ports
│ ├── requirements.txt
│ └── tests/
├── dashboard_app/
│ ├── config.py # Dashboard environment config
│ ├── database.py # Local SQLite (synced scans, alerts, reports)
│ ├── sync_client.py # Pull + SHA-256 verify from Scanner API
│ ├── requirements.txt
│ └── tests/
├── requirements.txt # All deps (Scanner + Dashboard)
├── run_tests.py # Run both test suites
├── scripts/fix-storage.sh # Fix pcaps ownership after sudo scans
├── .env.example
├── .gitignore
└── README.md
```
### 6. 端到端验证(手动)
```
bash scripts/preflight.sh
E2E_TARGET=192.168.142.0/24 .venv/bin/python test_e2e.py --auto-start
```
## 许可证与使用
本工具旨在用于 PkCERT 监督下的**授权安全评估**。未经授权扫描您不拥有或未获得明确测试许可的网络,可能会违反当地及国际法律。
## 作者
PkCERT — 渗透测试与研究
国家 CERT,伊斯兰堡
标签:AI风险缓解, 逆向工具