TechByDami/vulnerability-cve-scanner

GitHub: TechByDami/vulnerability-cve-scanner

一个轻量级 Python 漏洞扫描工具,通过服务发现与 NVD 数据库交叉比对生成风险评级报告。

Stars: 1 | Forks: 0

# 漏洞与 CVE 扫描器 一个轻量级、模块化的 Python 工具,用于**防御性漏洞评估**:它会发现运行中的网络服务,通过 banner grabbing 对其软件/版本进行指纹识别,与 NVD(National Vulnerability Database)进行交叉比对,并生成经过分类、风险评级的安全报告,支持 CLI、JSON 和 HTML 格式。 作为一个教育性质的作品集项目而构建,旨在展示在**网络编程、API 集成、漏洞分类和安全报告**方面的实用技能。 ## 功能 - 通过原生 TCP socket 进行**服务发现与 banner grabbing**(支持 SSH、FTP、SMTP、HTTP/HTTPS、MySQL/MariaDB、PostgreSQL),配备线程池,使得多端口扫描可在几秒钟内完成,而不是几分钟。 - 通过一个小型、可扩展的正则表达式签名库 (`config/settings.py`) 进行**版本指纹识别**,可将 "SSH-2.0-OpenSSH_8.9p1" 转换为 `OpenSSH 8.9p1`。 - **NVD API 集成**(CVE API 2.0),支持磁盘缓存、指数退避和客户端速率限制,确保该工具绝不会超出 NVD 公布的请求限制。 - **风险评级的漏洞匹配**,将每个候选 CVE 的 CVSS 分数映射到“严重 / 高危 / 中危 / 低危 / 信息性”,并为每个发现提供诚实客观的置信度说明(参见[方法论](#methodology--limitations))。 - 基于同一共享数据模型生成**三种报告格式**:实时的 CLI 摘要、机器可读的 JSON 报告,以及自包含、带样式的 HTML 报告。 - **内置授权关卡** — CLI 要求在任何网络活动开始前,输入 `yes` 进行确认(或在脚本/CI 环境中使用显式的 `--yes` 标志)。 - **41+ 个单元测试**,全部针对 mock 的 socket/API 调用运行 — 无需真实的网络访问即可验证逻辑。 ## 安装 要求 **Python 3.10+** ``` git clone https://github.com/TechByDami/vulnerability-cve-scanner.git cd vulnerability-cve-scanner pip install -r requirements.txt ``` 可选:将 NVD API key 设置为环境变量,可将速率限制从每 30 秒 5 次请求提升至每 30 秒 50 次请求([在此处免费申请](https://nvd.nist.gov/developers/request-an-api-key)): ``` export NVD_API_KEY="your-key-here" ``` 如果没有 key,该工具也能正常工作 — 只是会进行更严格的自我限流。 ## 用法 ``` python main.py --target example.com ``` 在任何扫描开始之前,系统会要求您确认授权: ``` You are about to scan: example.com Only scan systems you own or have EXPLICIT WRITTEN PERMISSION to test. Unauthorized scanning may be illegal in your jurisdiction. Type 'yes' to confirm you are authorized to scan this target: ``` ### 常用选项 ``` # 仅扫描特定端口 python main.py --target 192.168.1.10 --ports 22,80,443 # 自定义输出目录 python main.py --target 192.168.1.10 --output-dir ./my-reports # 跳过确认提示(适用于 scripted/CI 使用,前提是您已验证授权) python main.py --target 192.168.1.10 --yes # 仅生成 JSON 报告(跳过 HTML) python main.py --target 192.168.1.10 --no-html # Verbose / debug 日志 python main.py --target 192.168.1.10 -v ``` 完整选项列表:`python main.py --help` ## 示例输出 ### CLI 摘要 ``` ====================================================================== VULNERABILITY / CVE SCAN SUMMARY ====================================================================== Target: 192.0.2.10 Scan time (UTC): 2026-06-25T17:15:10.181461+00:00 Services detected: 3 Potential findings: 3 ====================================================================== DETECTED SERVICES: [22/tcp] ssh -> OpenSSH 7.2p2 [80/tcp] http -> Apache HTTP Server 2.4.49 [21/tcp] ftp -> ftp POTENTIAL VULNERABILITIES (sorted by risk): [CRITICAL ] CVE-2016-10009 (CVSS 9.8) -- OpenSSH 7.2p2 (port 22) [HIGH ] CVE-2021-41773 (CVSS 7.5) -- Apache HTTP Server 2.4.49 (port 80) [MEDIUM ] CVE-2016-10708 (CVSS 5.3) -- OpenSSH 7.2p2 (port 22) NOTE: All findings above are potential matches based on automated keyword/version comparison. Manually verify each before acting on it -- see the full report for details, references, and mitigation guidance. ====================================================================== ``` ### JSON 报告(节选) ``` { "scan_metadata": { "target": "192.0.2.10", "tool": "Educational Vulnerability & CVE Scanner", "disclaimer": "This report lists POTENTIAL vulnerabilities based on automated version/keyword matching against public CVE data. Every finding requires manual verification before any action is taken..." }, "summary": { "services_detected": 3, "total_findings": 3, "risk_breakdown": { "Critical": 1, "High": 1, "Medium": 1, "Low": 0, "Informational": 0 } }, "findings": [ { "cve_id": "CVE-2016-10009", "risk_level": "Critical", "cvss_score": 9.8, "service": "OpenSSH 7.2p2", "confidence_note": "Detected version '7.2p2' appears referenced in the CVE description text...", "mitigation": "Check the vendor's security advisories for OpenSSH and upgrade to the latest patched version..." } ] } ``` ### HTML 报告 HTML 报告是一个自包含的独立文件(不含外部 CSS/JS),包含摘要表格、检测到的服务表格,以及每个 CVE 对应的带颜色标记的发现卡片,可离线阅读或直接作为附件发送至工单/邮件。 ## 方法论与局限性 该工具执行的是**自动化分类**,而非漏洞确认。在实践中,清楚说明其具体含义非常重要: - **基于 banner 的指纹识别可能会出错。** 管理员可能会禁用、自定义或故意伪造 banner。“检测到”的版本只是服务对其自身的声明,并未经过独立验证。 - **CVE 匹配是基于关键字和文本的,而非真正的版本范围解析器。** NVD 描述是通过关键字搜索以及对检测到的版本进行轻量级子字符串检查来匹配的。这是一个有用的分类信号,但并非绝对保证 —— 供应商通常会在不更改版本字符串的情况下直接移植安全补丁,而且 CVE 描述并不总是以一致的、可解析的格式声明受影响的范围。 - **每个发现都附带一份置信度说明**,准确解释了其出现的原因(在 CVE 文本中是精确的版本匹配,还是仅产品名称匹配),以便人工审查者知道应给予其多少权重。 - **这是分析师的起点,而非最终结论。** 在采取任何修复行动之前,应将每份报告视为一个待人工检查的优先级排序列表 —— 并结合供应商自己的安全公告进行比对。 ## 安全与负责任的使用 ### 仅扫描您拥有或被明确授权测试的系统 未经授权扫描您不拥有或没有书面测试许可的系统可能是非法的 —— 在美国,这可能触犯《计算机欺诈和滥用法》(CFAA);大多数其他司法管辖区也有同等的计算机滥用法律。`main.py` 在任何扫描开始前都要求输入授权确认,正是为了让这成为一个深思熟虑的、有意识的步骤,而不是在无意中发生的事情。 适合用于学习和测试的安全目标: - 您自己的机器/家庭实验室,且位于您控制的网络中。 - 专门为此目的构建的、包含已知漏洞的练习环境:[OWASP Juice Shop](https://owasp.org/www-project-juice-shop/)、[DVWA](https://github.com/digininja/DVWA)、[Metasploitable](https://docs.rapid7.com/metasploit/metasploitable-2/)、[HackTheBox](https://www.hackthebox.com/)、[TryHackMe](https://tryhackme.com/)。 - 您已签署明确的工作范围/渗透测试授权的目标。 ### 漏洞发现与漏洞利用 这是两个截然不同的学科,在法律和道德层面上的分量大不相同: - **发现 / 评估**(即本工具所做的工作):识别出服务*对外宣称*的版本是否与已知的 CVE 相对应。偏向被动、风险低,是任何安全程序标准的必要第一步。 - **利用**:实际触发漏洞以确认其真实存在,并查看攻击者能实现什么目标。这需要明确的授权、更加谨慎的操作,理想情况下还需要一个受控的环境 —— 本工具故意不涉及此项操作。 如果一个扫描器发现“此服务似乎容易受到 CVE-X 的攻击”,它已经告诉了您真实且有用的信息。而更进一步——实际去利用它——则是另一种风险更高的活动,本项目刻意避免涉足。 ### 负责任的漏洞披露简述 如果您在不受您控制的软件或系统中发现了真实且已确认的漏洞: 1. **不要进一步利用它,也不要访问超出证明该问题存在所必需的数据。** 2. **首先私下向**供应商/维护者报告 —— 大多数供应商都有 `security@` 邮箱或 `SECURITY.md` / `security.txt` 政策。许多供应商还运营漏洞赏金计划(如 HackerOne、Bugcrowd),并规定了明确的范围和奖励。 3. **在进行任何公开披露之前,给予他们合理的时间来修复** —— 90 天是业界常见的默认时间(Google Project Zero 等机构采用),尽管具体政策可能有所不同。 4. **在补丁发布前,避免公开披露**,除非供应商在较长时间内无响应,或者野外已经出现了主动利用的情况。 5. 如果尚未存在 CVE ID,一旦问题得到确认,请通过供应商、CNA(CVE Numbering Authority)或 MITRE **申请获取 CVE ID**。 ### 基础的漏洞分类工作流 该工具的输出旨在融入的流程大致如下: 1. **检测** — 实际运行的是什么,它声称的版本是什么? *(本工具)* 2. **关联** — 该版本/产品是否与已知的 CVE 匹配? *(本工具)* 3. **验证** — 手动确认版本,对照供应商安全公告检查 CVE 实际受影响的版本范围,并排除误报。 *(人工分析师 — 本工具刻意在此步骤前停止)* 4. **确定优先级** — 将 CVSS 严重性与现实环境相结合:该服务是否暴露在互联网上?它是否存储敏感数据?是否存在公开的漏洞利用? 5. **修复** — 打补丁、升级,或应用供应商建议的变通方法/缓解措施。 6. **重新验证** — 确认修复措施确实填补了安全漏洞。 ## 测试 ``` python -m unittest discover -s tests -v ``` 所有测试都 mock 了 socket 和 HTTP 调用 — 测试套件不需要也不会执行真实的网络访问,运行它绝不会扫描或联系真实的主机。 ## 使用的技术 - **Python 3.10+** — `socket` / `ssl` 用于 banner grabbing,`concurrent.futures` 用于并行端口扫描,`dataclasses` 用于类型化数据模型,`argparse` 用于 CLI,全局贯穿 `logging` - **requests** — NVD API 通信 - **NVD CVE API 2.0** — 公共漏洞数据源 ([nvd.nist.gov](https://nvd.nist.gov/developers/vulnerabilities)) - **unittest** + **unittest.mock** — 完全 mock 的测试套件 ## 未来改进 关于进一步完善此项目的想法(非常适合作为后续提交或 v2 版本的内容): - **真正的版本范围解析** — 从 NVD 提取 CPE/配置数据(包含在 API 响应中,只是尚未使用),以进行实际受影响范围的比较,而不是对描述文本进行子字符串匹配。 - **基于 CPE 的查询**,以取代纯文本的 `keywordSearch`,这将显著提高匹配精度。 - **更多的漏洞数据源** — OSV.dev、特定供应商的安全公告(Apache、OpenSSH)、来自 Exploit-DB 的漏洞利用可用性信号(仅供参考,绝不自动获取/运行)。 - **Async I/O** (`asyncio` + `aiohttp`),以取代线程池,从而更高效地扫描更大的端口范围。 - **TLS 证书检查**(过期时间、弱加密算法、协议版本),作为服务版本 CVE 之外的一个额外发现类别。 - **SARIF 或 CSV 导出**,用于 CI/CD pipeline 集成。 - **基于 SQLite 的本地小型 CVE 镜像**,以减少对实时 NVD API 可用性/速率限制的依赖。 - **Docker 镜像**,实现一键运行,免除环境配置烦恼。 - **经过认证/凭证的扫描模式**,用于更深度的内部检查(包管理器版本查询等)—— 范围明确且仅限主动选择开启。 ## 许可证 MIT — 详见 `LICENSE`。请负责任地使用。 ## 免责声明 本项目仅供**教育和授权的防御性安全用途**。作者不对任何滥用行为负责。使用此工具即表示您同意仅扫描您拥有或获得明确书面测试授权的系统,并遵守您所在司法管辖区的所有适用法律。
标签:CVE, NVD, Python, 云存储安全, 插件系统, 数字签名, 无后门, 网络扫描, 逆向工具