u3ayman/custom_vulnerability_scanner
GitHub: u3ayman/custom_vulnerability_scanner
基于 Python 的轻量级网络漏洞扫描器,通过端口扫描、服务识别和 CVE 数据库交叉引用,帮助安全人员快速发现资产中的已知漏洞。
Stars: 0 | Forks: 0
# 自定义漏洞扫描器
一个基于 Python 的网络漏洞扫描器,用于发现开放端口、识别运行中的服务,并将它们与已知的 CVE 数据库进行交叉引用,从而揭示现实世界中的漏洞利用方式。
## 项目路线图
### 阶段 1:侦察(端口扫描)
在发现漏洞之前,我们需要知道有哪些“大门”是敞开的。
- **设置脚本** — 创建主要的 Python 入口点并导入原生 `socket` 库。
- **构建扫描器函数** — 接受目标 IP/主机名和端口范围(默认值:1–1024,即知名端口)。
- **尝试连接** — 遍历每个端口;如果 `socket.connect_ex()` 返回 `0`,则该端口开放。
- **调整超时** — 设置合理的单端口超时时间(例如 0.5 秒),以平衡速度与准确性。
- **升级:多线程扫描** — 原生顺序扫描速度较慢。使用 `concurrent.futures.ThreadPoolExecutor` 并行扫描多个端口(仍使用标准库,无需额外依赖)。
- **升级:Nmap 集成** — 可选引入 `python-nmap` 库,让 Nmap 处理操作系统检测、服务探测和性能调优。
### 阶段 2:服务枚举(Banner 抓取)
仅知道端口开放是不够的 —— 我们需要知道上面*运行着什么*。
- **监听问候信息** — 在每个开放端口上建立连接,发送小型探测包(HTTP 发送 `HEAD / HTTP/1.0\r\n\r\n`,SSH 发送空字节等)或等待服务 Banner。
- **捕获与清洗** — 使用 `socket.recv(1024)` 接收数据,解码为 UTF-8(带回退机制),并去除控制字符。
- **解析软件与版本** — 使用 Python `re` 提取结构化字段:
- 原始 Banner 示例:`SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.1`
- 提取结果:**service** = `OpenSSH`,**version** = `8.2p1`,**OS hint** = `Ubuntu`
- **协议感知探测** — 不同服务需要不同的“ nudges(助推)”。维护一个按常用端口号索引的小型探测表(22 → SSH,80/443 → HTTP,21 → FTP 等)。
### 阶段 3:武器化(CVE 交叉引用)
这是扫描器转变为*漏洞*扫描器的关键步骤。
- **选择 API**
| 来源 | 优点 | 缺点 |
|--------|------|------|
| [NIST NVD API v2](https://nvd.nist.gov/developers/vulnerabilities) | 黄金标准,免费,全面 | 有速率限制(无密钥时 30 秒内 5 次请求) |
| [Vulners API](https://vulners.com/docs) | 快速,侧重漏洞利用,良好的免费层级 | 需要 API 密钥 |
| [OSV.dev](https://osv.dev/) | 侧重开源,无需密钥 | 对网络服务的覆盖范围较窄 |
- **编写查询函数** — 使用 `requests` 将解析后的 CPE 字符串或关键字 + 版本发送到选定的 API。
- **处理 JSON 响应** — 提取:
- **CVE ID**(例如 `CVE-2021-41617`)
- **CVSS 评分**(0–10)和严重性标签(低 / 中 / 高 / 严重)
- **描述** — 解释漏洞利用方式的简短说明
- **参考链接** — 指向公告或 PoC 漏洞利用的链接
- **本地缓存** — 缓存 API 响应(SQLite 或纯 JSON),以避免冗余查询并遵守速率限制。
### 阶段 4:输出与报告
让数据易读且可操作。
- **格式化的终端输出**
- 按严重性进行颜色编码:🔴 严重,🟠 高,🟡 中,🔵 低(使用 `colorama` 或 `rich` 实现跨平台颜色显示)。
- 汇总表:扫描端口总数 → 开放端口 → 已识别服务 → 发现的 CVE。
- **文件导出**
- **JSON** — 机器可读,易于管道传输到其他工具。
- **TXT/Markdown** — 人类可读的报告,包含时间戳、目标和发现结果。
- **CSV** — 用于快速进行电子表格分析。
- **CLI 界面** — 使用 `argparse` 进行整洁的参数处理:
python scanner.py --target 192.168.1.1 --ports 1-1024 --output report.json --min-severity high
### 阶段 5:未来扩展
一旦 CLI 工具稳定后,即可对其进行扩展。
- **PostgreSQL 存储** — 持久化扫描结果,以跟踪资产的漏洞态势。
- **React 仪表板** — 可视化攻击面趋势、严重性分布和修复进度。
- **计划扫描** — 集成 Cron/Task Scheduler 进行持续监控。
- **多目标支持** — 接受 CIDR 表示法(`192.168.1.0/24`)或目标列表文件。
- **插件系统** — 允许用户插入自定义检查脚本(例如默认凭证检查、SSL/TLS 审计)。
## 技术栈
| 层级 | 技术 |
|-------|-----------|
| 语言 | Python 3.10+ |
| 端口扫描 | `socket` (stdlib) / `python-nmap` |
| Banner 解析 | `re` (stdlib) |
| CVE 查询 | `requests` → NIST NVD / Vulners API |
| CLI | `argparse` (stdlib) |
| 终端输出 | `rich` / `colorama` |
| 缓存 | `sqlite3` (stdlib) |
| 导出 | `json` / `csv` (stdlib) |
## 快速开始
```
# Clone
git clone https://github.com/u3ayman/custom_vulnerability_scanner.git
cd custom_vulnerability_scanner
# 安装依赖
pip install -r requirements.txt
# 设置你的 Vulners API key(CVE lookup 必需)
# 复制 .env.example → .env 并填入你的 key,或直接 export:
export VULNERS_API_KEY=your_key_here # Linux/macOS
$env:VULNERS_API_KEY="your_key_here" # PowerShell (Windows)
# Basic scan(顺序端口,启用 banner grabbing)
python scanner.py --target --ports 1-1024
# 带 severity filter 和 exports 的定向扫描
python scanner.py --target --ports 22,80,443 --min-severity medium --output report.json --output report.csv
# Full options
python scanner.py --target \
--ports 1-1024 \ # Port range / list (e.g. 22,80-90,443)
--threads 100 \ # Max concurrent threads (default: 100)
--timeout 0.5 \ # Per-port connect timeout in seconds (default: 0.5)
--banner-timeout 2.0 \ # Banner grab timeout in seconds (default: 2.0)
--min-severity medium \ # Severity filter: low | medium | high | critical
--output report.json \ # Export as JSON (repeat --output for multiple formats)
--output report.csv \ # Export as CSV
--output report.md \ # Export as Markdown
--no-cache \ # Disable local CVE cache
--allow-private \ # Allow scanning private/loopback IP ranges
--no-banners # Skip banner grabbing (port discovery only)
```
## CLI 参考
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--target` | *(必需)* | 要扫描的 IP 地址或主机名 |
| `--ports` | `1-1024` | 端口范围、列表或混合形式(例如 `22,80-90,443`) |
| `--threads` | `100` | 最大并发扫描线程数 |
| `--timeout` | `0.5` | 单端口连接超时(秒) |
| `--banner-timeout` | `2.0` | Banner 抓取超时(秒) |
| `--min-severity` | `medium` | 报告的最低 CVE 严重性(`low`/`medium`/`high`/`critical`) |
| `--output` | *(无)* | 输出文件路径;可重复指定以输出多种格式(`.json`, `.csv`, `.md`, `.txt`) |
| `--api-key` | *(env)* | 覆盖 `VULNERS_API_KEY` 环境变量 |
| `--no-cache` | `False` | 禁用本地 SQLite CVE 缓存 |
| `--allow-private` | `False` | 允许扫描私有/回环范围(RFC 1918) |
| `--no-banners` | `False` | 跳过 Banner 抓取;仅返回开放端口 |
## 免责声明
本工具仅用于**授权的安全测试和教育目的**。在扫描任何你不拥有的网络或系统之前,请务必获得明确的书面许可。未经授权的扫描可能违反当地法律法规。
## 许可证
MIT
标签:API哈希动态解析, Banner Grabbing, C2日志可视化, CVE数据库, DInvoke, Nmap, Python, Socket编程, 加密, 开源安全工具, 指纹识别, 插件系统, 数据统计, 无后门, 服务器安全, 服务枚举, 本地模型, 漏洞扫描器, 端口扫描, 网络安全, 虚拟驱动器, 逆向工具, 逆向工程平台, 隐私保护