mukidulislamzihad/scanpro
GitHub: mukidulislamzihad/scanpro
一款轻量级纯 Python 漏洞扫描器,将端口扫描、CVE 查询与 Web 安全审计整合为单一工具并提供多格式报告导出。
Stars: 1 | Forks: 0
# 🛡️ ScanPro
**一款轻量级、多合一的网络与 Web 应用漏洞扫描器 —— 使用纯 Python 编写,提供 CLI 和跨平台桌面 GUI。**
[](https://www.python.org/)
[](LICENSE)
[](#desktop-gui)
[](#contributing)
端口扫描 • 服务/banner 识别 • 自动化 CVE 查询 (NVD) • Web 头部与 TLS 审计 • HTML/JSON/PDF 报告 • 扫描历史
由 **[Mukidul Islam Zihad](https://github.com/mukidulislamzihad)** 打造 — [GitHub](https://github.com/mukidulislamzihad) · [LinkedIn](https://www.linkedin.com/in/mukidul-islam-zihad)
## 为什么选择 ScanPro?
`nmap` 是端口扫描的行业标准,本项目并不试图取代它。ScanPro 的存在是为了解决另一个问题:**围绕快速安全评估的手动拼接工作**。
典型的侦察工作流程如下:运行 `nmap` → 肉眼观察开放端口 → 为 Web 层单独运行 `nikto`/`whatweb` → 手动对照 CVE 数据库交叉比对版本 → 为客户撰写报告。对于一个单一目标来说,这需要使用 3-4 个工具并进行大量的复制粘贴。
ScanPro 将其简化为 **一条命令(或在 GUI 中点击一次)**:
| | ScanPro | 典型的多工具工作流 |
|---|---|---|
| 端口扫描 + banner 获取 | ✅ 内置 | `nmap` |
| 针对检测到的版本查询 CVE | ✅ 自动 (NVD API) | 手动 / 独立工具 |
| Web 安全头部与 TLS 审计 | ✅ 内置 | `nikto` / `testssl.sh` |
| 暴露的 `.git` / `.env` 检查 | ✅ 内置 | 手动 |
| 多目标扫描 | ✅ 逗号分隔列表 | 脚本循环 |
| 扫描历史 | ✅ 内置,本地化 | 手动记录 |
| 可直接发送的 HTML / PDF 报告 | ✅ 一键生成 | 独立的报告工具 |
| 安装 | `pip install -r requirements.txt` | 多个二进制文件/包 |
| 面向非 CLI 用户的 GUI | ✅ `gui.py` | ❌ |
**当你需要以下需求时,请使用 ScanPro:** 一款快速、单文件、无重度依赖的工具,用于授权的侦察、快速面向客户的报告、CTF 竞赛、学习漏洞扫描器的底层工作原理,或者作为 `nmap` + `nikto` 的初学者友好型替代品或辅助工具。
**当你需要以下功能时,请转而使用 `nmap`:** OS 指纹识别、隐蔽/规避扫描技术、IPv6,或过去 25 年间积累的数百个 NSE 脚本 —— ScanPro 并不试图在这些领域竞争。
## 功能
- 🔍 **端口扫描 + 服务/banner 识别** —— 无需 `nmap` 二进制文件,纯 Python sockets
- 🌍 **全局 IP 解析** —— 每次扫描(网络、Web、子域名)都会在主机名旁边显示解析到的 IP
- 🧬 **自动 CVE 查询** —— 通过 [NVD API](https://nvd.nist.gov/developers/vulnerabilities) 针对检测到的服务版本进行查询
- 🌐 **Web 应用检查** —— 缺失的安全头部、TLS/SSL 配置错误、证书过期、暴露的敏感路径(`.git/config`、`.env` 等)
- 🕵️ **Server 指纹回退机制** —— 如果 `Server` 头部被隐藏,ScanPro 会尝试一些低噪音的启发式方法(session cookie 名称、默认错误页面的措辞)来猜测底层的技术栈
- 🧭 **尽力而为的 OS 指纹识别** (`--os-detect`) —— 轻量级的基于 TTL 的 OS 家族猜测(Linux/Windows/其他),在思路上类似于 `nmap -O`,但并非绝对确定
- 🥷 **隐蔽/定时模式** (`--stealth`) —— 随机端口顺序、抖动延迟和较低的并发性,因此扫描在简单的基于速率的 IDS 看来不会像是一次单一的爆发(仅为定时规避,非包级别的 SYN 隐蔽扫描)
- 🖥️ **桌面 GUI**(Windows/macOS/Linux,Tkinter —— 无需额外的 GUI 依赖)与 CLI 并行提供
- 🎯 **多目标扫描** —— 在一次运行中扫描多个主机(在 GUI 中以逗号分隔)
- 🕘 **本地扫描历史** —— 每次扫描都会保存在你的机器上;可重新查看并重新导出任何过去的结果
- ☀️🌙 **GUI 中的亮色/暗色主题切换**
- 📊 **带有百分比的实时进度条**,感知阶段(网络 → CVE → Web)
- 🎨 彩色编码的终端和 GUI 输出,按严重程度排序(critical/high/medium/low)
- 📄 **可导出的 HTML / JSON / PDF / CSV / Markdown 报告** —— 随时准备附加到客户交付物中
- 🧭 **子域名枚举** —— 通过证书透明度日志(crt.sh,无需 API key)—— 每个活跃的子域名也会检查问题,而不仅仅是被发现
- 🩹 **内置修复建议器** —— 每个发现(头部问题、TLS 问题、CVE、nuclei 匹配)都带有一个简单的英文“如何修复”的建议,完全离线/基于规则
- 🧪 **可选的 `nuclei` 集成** —— 如果安装了 `nuclei`,ScanPro 会运行它并将结果整合到同一份报告/评分中
- 🧮 **总体安全评分(0-100,A-F 等级)** —— 一个汇总所有扫描类型中每一个发现的单一数值
- 🐳 **用于 CLI 的 Docker 镜像** —— 无需在本地安装 Python 即可运行 ScanPro
- ⚡ 多线程扫描,可配置的线程数与超时时间
- 📦 最小化依赖 —— 用于 PDF 导出的 `requests` + `fpdf2`
## 目录
- [安装](#installation)
- [桌面 GUI](#desktop-gui)
- [CLI 用法](#cli-usage)
- [CLI 选项](#cli-options)
- [报告示例](#sample-report)
- [项目结构](#project-structure)
- [路线图](#roadmap--ideas-for-contributors)
- [免责声明](#️-legal-notice)
- [贡献](#contributing)
- [作者](#author)
- [许可证](#license)
## 安装
```
git clone https://github.com/mukidulislamzihad/scanpro.git
cd scanpro
python3 -m venv venv && source venv/bin/activate # optional but recommended
pip install -r requirements.txt
```
## 桌面 GUI
ScanPro 自带了一个跨平台的桌面 GUI(Windows / macOS / Linux),
使用 Tkinter 构建 —— 无需额外的 GUI 依赖。
```
python3 gui.py
```
填入一个或多个目标(逗号分隔),调整端口/线程/超时/CVE
选项,点击 **Start Scan**,并观看实时彩色编码的结果流入
日志面板,同时显示实时的进度百分比。扫描完成后,使用
**Save HTML / Save JSON / Save PDF** 进行导出 —— 文件默认保存到你的 **Downloads**
文件夹。每次扫描也会保存到 **History** 选项卡中,你可以在此
重新查看并导出任何过去的结果。从窗口右上角切换 **☀ Light mode / 🌙 Dark mode**
以符合你的偏好。
### Docker (仅限 CLI)
包含了一个 `Dockerfile`,用于在无需本地安装 Python 的情况下运行 CLI
(GUI 需要显示器,因此未包含在镜像中):
```
docker build -t scanpro .
docker run --rm scanpro example.com --no-network # web-only scan, prints to terminal
docker run --rm -v "$PWD:/out" scanpro example.com -o /out/report.html # save report to host
```
### 构建独立可执行文件(可选)
为了在无需安装 Python 的情况下将 GUI 作为单个 `.exe` / `.app` / Linux 二进制文件进行分发,
请在目标操作系统上使用 [PyInstaller](https://pyinstaller.org/)
(PyInstaller 不进行交叉编译 —— 请在 Windows 上构建 Windows 的 `.exe`,在 macOS 上构建 macOS 的 `.app`,等等):
```
pip install pyinstaller
pyinstaller --noconsole --onefile --name ScanPro gui.py
```
打包后的二进制文件将在 `dist/` 目录下创建。
## CLI 用法
```
# Full scan (network + web) with default port range 1-1024
python3 main.py example.com
# Only web app scan
python3 main.py https://example.com --no-network
# Only network scan on specific ports
python3 main.py 192.168.1.10 --no-web --ports 22,80,443,3306
# Custom port range, more threads, save HTML report
python3 main.py example.com --ports 1-65535 --threads 200 -o report.html
# Save as JSON instead
python3 main.py example.com -o report.json
# Use an NVD API key for higher CVE lookup rate limits
python3 main.py example.com --nvd-api-key YOUR_KEY_HERE
# Also enumerate subdomains (via crt.sh) and check each one for issues
python3 main.py example.com --subdomains --subdomain-limit 50
# Also run nuclei (if installed) against the web target
python3 main.py example.com --nuclei --nuclei-severity critical,high
# Best-effort OS fingerprint (TTL-based) alongside the port scan
python3 main.py example.com --os-detect
# Stealth/timing mode: randomized port order, jittered delays, lower concurrency
python3 main.py example.com --stealth
# Export as CSV or Markdown instead of HTML/JSON
python3 main.py example.com -o report.csv
python3 main.py example.com -o report.md
```
## CLI 选项
| 标志 | 描述 |
|---|---|
| `--ports` | 用于网络扫描的端口范围/列表(默认 `1-1024`) |
| `--no-network` | 跳过网络/端口扫描 |
| `--no-web` | 跳过 Web 应用扫描 |
| `--no-cve` | 跳过 CVE 查询步骤 |
| `--threads` | 用于端口扫描的并发线程数(默认 `100`) |
| `--timeout` | Socket 超时时间(以秒为单位,默认 `1.0`) |
| `--os-detect` | 尽力而为的基于 TTL 的 OS 指纹识别(类似于轻量级的 `nmap -O` —— 并非绝对确定) |
| `--stealth` | 基于定时的规避:随机端口顺序、抖动延迟、较低的并发性(非包级别的 SYN 隐蔽扫描) |
| `-o, --output` | 将报告保存为 `.html`、`.json`、`.csv` 或 `.md` |
| `--nvd-api-key` | 可选的 NVD API key(每 30 秒请求从 5 次提升至 50 次) |
| `--subdomains` | 通过 crt.sh 枚举子域名并检查每个子域名是否存在问题 |
| `--subdomain-limit` | 主动探测的已发现子域名的最大数量(默认 `30`) |
| `--nuclei` | 如果已安装,则针对目标的 Web 应用运行 `nuclei` |
| `--nuclei-severity` | 传递给 nuclei 的逗号分隔的严重性级别,例如 `critical,high` |
现在,跨网络、Web、子域名和 nuclei 检查的每一个发现也都带有一条简短的**修复建议**,并且报告中包含一个总体的**安全评分(0-100,A-F 等级)**,将所有内容汇总为一个数字。
## 报告示例
运行扫描会生成一份彩色编码的终端摘要,并且配合 `-o report.html`,
生成一份独立的深色主题 HTML 报告,其中列出了开放端口、banner、匹配的 CVE
(带有 CVSS 分数),以及按严重性排序的 Web 层发现 —— 随时准备交给
客户或附在渗透测试报告中。
**运行中的桌面 GUI** —— 实时扫描输出、开放端口和实时流入的 CVE 匹配:

**扫描摘要** —— 按严重性排序的 Web 发现和一目了然的结果概述:

## 项目结构
```
scanpro/
├── main.py # CLI entry point
├── gui.py # Desktop GUI (Tkinter) entry point — "ScanPro"
├── modules/
│ ├── network_scan.py # Port scanning + banner grabbing
│ ├── cve_lookup.py # NVD API integration
│ ├── web_scan.py # HTTP headers, TLS, misconfig checks
│ ├── subdomain_enum.py# Subdomain discovery (crt.sh) + per-subdomain checks
│ ├── nuclei_scan.py # Optional nuclei integration
│ ├── remediation.py # Rule-based fix suggestions
│ ├── report.py # Console summary + HTML/CSV/Markdown report
│ └── colors.py # Terminal color helpers
├── screenshots/ # README screenshots
├── Dockerfile
└── requirements.txt
```
## ⚠️ 免责声明
**请仅对你拥有的或已获得明确书面授权测试的系统运行此工具。** 在大多数司法管辖区,未经授权扫描系统是非法的。此工具旨在用于授权的渗透测试、红蓝对抗演练以及针对你自己基础设施的安全研究。
## 作者
**Mukidul Islam Zihad**
GitHub: [github.com/mukidulislamzihad](https://github.com/mukidulislamzihad)
LinkedIn: [linkedin.com/in/mukidul-islam-zihad](https://www.linkedin.com/in/mukidul-islam-zihad)
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。标签:Claude, CVE检测, Python, Web安全, 加密, 密码管理, 插件系统, 数据统计, 无后门, 漏洞扫描器, 端口扫描, 网络安全, 蓝队分析, 请求拦截, 逆向工具, 隐私保护