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编程, 加密, 开源安全工具, 指纹识别, 插件系统, 数据统计, 无后门, 服务器安全, 服务枚举, 本地模型, 漏洞扫描器, 端口扫描, 网络安全, 虚拟驱动器, 逆向工具, 逆向工程平台, 隐私保护