not-protocol/shadowport-scanner
GitHub: not-protocol/shadowport-scanner
一款基于 Python 和 Nmap 的模块化网络端口扫描器,提供多种扫描模式、双通道日志记录、变更检测和插件扩展,专为安全教育和实验室场景设计。
Stars: 1 | Forks: 0
# ShadowPort Scanner v2.1.0
一个基于 Python 和 Nmap 构建的模块化网络端口扫描器,专为道德黑客、网络安全学生和家庭实验室爱好者设计。
## v2.1.0 新特性
| 功能 | v2.0 | v2.1 |
|---|---|---|
| Database schema | 固定的 | **完整 schema + 通过 PRAGMA 迁移** |
| Excel 日志记录 | 损坏的 | **双重写入:每次扫描同时写入 SQLite + Excel** |
| SQL injection 防护 | 基础的 | **仅使用参数化查询,零 f-string SQL** |
| 线程安全 | 部分的 | **在 DB、Excel 和 UI 事件上使用 threading.Lock** |
| 服务知识库 | — | ✅ **17 个端口,包含用途、使用场景、风险等级** |
| 扫描配置 | 基础的 | ✅ **5 个 dataclass 配置:Fast、Deep、Web、Stealth、Vuln** |
| 变更检测 | 基础的 | ✅ **SQLite 端口表差异对比:新增/关闭/未更改** |
| 实时遥测监控 | — | ✅ **Textual 小部件:ScanStatusPanel + LiveEventsLog** |
| 服务情报插件 | — | ✅ **新插件:service_intel** |
| 日志一致性审计 | — | ✅ **启动健康检查:SQLite 与 Excel 计数对比** |
| 生产检查清单 | — | ✅ **PRODUCTION_CHECKLIST.md 包含 12 个部分** |
| 测试套件 | 4 个文件 | **6 个文件,80+ 个测试用例** |
## 文件夹结构
```
shadowport-v2.1.0/
├── main.py # Entry point
├── scanner.py # Nmap engine, validation, timeout, DNS pre-check
├── output.py # Terminal UI, progress bar, results table
├── reports.py # TXT / JSON / XML / HTML export
├── logger.py # Silent error logging → Log/error.log
│
├── config/
│ ├── __init__.py
│ └── settings.py # All constants, modes, profiles, service intel
│
├── db/
│ ├── __init__.py
│ └── database.py # SQLite: full schema, migration, thread-safe
│
├── core/
│ ├── __init__.py
│ ├── excel_logger.py # openpyxl dual-write logger, file lock, retry
│ ├── service_kb.py # Service Knowledge Base (17 ports)
│ ├── scan_profiles.py # 5 scan profile dataclasses
│ └── change_detector.py # Scan diff engine using ports table
│
├── ui/
│ ├── __init__.py
│ └── live_monitor.py # Textual: ScanStatusPanel + LiveEventsLog
│
├── plugins/
│ ├── __init__.py # Auto-discovery loader
│ ├── base.py # BasePlugin abstract class
│ ├── dns_lookup.py # DNS forward + reverse lookup
│ ├── banner_grabber.py # TCP banner grabbing (5s timeout)
│ └── service_intel.py # Service KB for every open port
│
├── tests/
│ ├── __init__.py
│ ├── test_validation.py # 30+ input validation cases + injection attempts
│ ├── test_database.py # save_scan, history, migration, SQL injection safety
│ ├── test_excel_logger.py # new file, append, auto-increment, missing dir
│ ├── test_change_detector.py# new/closed/unchanged port detection
│ └── test_service_kb.py # known ports, fallback, formatting
│
├── Log/ # Auto-created
│ ├── shadowport.db # SQLite scan history
│ ├── scannerhistory.xlsx # Excel scan log (dual-write)
│ └── error.log # Silent error log
│
├── reports/ # Auto-created — exported scan reports
├── PRODUCTION_CHECKLIST.md
├── requirements.txt
└── README.md
```
## 安装说明
### 1. 安装 Nmap
```
# Fedora / RHEL
sudo dnf install nmap
# Debian / Ubuntu / Kali
sudo apt install nmap
```
### 2. 安装 Python 依赖
```
sudo pip install -r requirements.txt --break-system-packages
```
### 3. 如有需要,修复权限
```
sudo chown -R $USER:$USER Log/ reports/
```
## 使用方法
```
python main.py # standard modes
sudo python main.py # full access: OS detect, SYN, Aggressive
```
## 扫描模式
| # | 模式 | 需要 Root? | 超时 |
|---|---|---|---|
| 1 | 快速扫描 | 否 | 60s |
| 2 | 完整 TCP 扫描 | 否 | 600s |
| 3 | 服务检测 | 否 | 180s |
| 4 | 操作系统检测 | **是** | 120s |
| 5 | 激进扫描 | **是** | 300s |
| 6 | 主机发现 | 否 | 30s |
| 7 | 隐蔽 SYN 扫描 | **是** | 120s |
| 8 | 漏洞脚本 | 否 | 300s |
## 扫描配置
在模式提示符下按 `p` 键:
| # | 配置 | 描述 |
|---|---|---|
| 1 | 快速实验室扫描 | 前 1000 个端口,快速分诊 |
| 2 | 深度枚举 | 所有 65535 个 TCP 端口 + 服务版本 |
| 3 | Web 服务器分析 | 端口 80/443/8080/8443 + HTTP 标头 |
| 4 | 隐蔽 SYN 扫描 | 半开 SYN,慢速时序(需要 root) |
| 5 | 漏洞审计 | NSE 漏洞脚本 + 服务检测 |
## 插件
扫描后按 `x` 键运行插件:
| 插件 | 描述 |
|---|---|
| `dns_lookup` | 正向和反向 DNS 解析 |
| `banner_grabber` | TCP banner 抓取(每个主机最多 5s) |
| `service_intel` | 每个开放端口的服务知识库 |
### 编写插件
```
# plugins/my_plugin.py
from plugins.base import BasePlugin
class MyPlugin(BasePlugin):
name = "my_plugin"
description = "Does something useful"
version = "1.0"
def run(self, target: str, scan_data: dict) -> dict:
return {"output": f"Hello from {target}!"}
```
将其放入 `plugins/` 目录 —— 它将在下次运行时自动加载。
## 变更检测
在模式提示符下按 `d` 键,对当前目标进行最近两次扫描的差异对比:
```
Change Detection: 192.168.1.1
Comparing scan #3 → #4
✚ New open ports:
→ 3306/tcp (mysql)
═ Unchanged: 22/tcp, 80/tcp
```
## Excel 日志
每次扫描都会立即写入 `Log/scannerhistory.xlsx`:
| 扫批 # | 日期 | 时间 | 目标 | 扫描类型 | 开放端口 | 总端口 | 风险评分 | 持续时间 (s) | 状态 |
|---|---|---|---|---|---|---|---|---|---|
## 运行测试
```
pytest tests/ -v --tb=short
```
## 安全说明
- 所有用户输入在到达 Nmap 之前都会进行验证
- 拒绝 Shell 元字符
- Subprocess 从不使用 `shell=True` 调用
- 永远不会以编程方式自动调用 `sudo`
- 在执行 SYN 和操作系统检测扫描之前强制进行 root 检查
## 免责声明
本工具仅供教育和授权的安全测试使用。未经授权的扫描可能违反地方、州或联邦法律。作者对任何滥用行为不承担任何责任。
标签:CTI, Nmap, Python, 安全规则引擎, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 虚拟驱动器, 逆向工具, 隐私保护