TrixY-OppA/PortSi

GitHub: TrixY-OppA/PortSi

PortSi 是一款基于 Python 开发的企业级网络漏洞扫描与威胁情报工具,通过整合多层端口扫描、Nmap 服务识别和 NVD 实时 CVE 查询,自动生成专业的安全评估 PDF 报告。

Stars: 0 | Forks: 0

# PortSi - 专业漏洞评估工具 PortSi 是一款使用 Python 开发的高性能、经生产强化的网络安全审计工具。它结合了多层 socket 扫描能力与实时的国家漏洞数据库 (NVD) API 智能,以生成全面的基础边界防御评估报告。 该漏洞扫描器展示了清晰的架构、全面的安全分析以及执行级别的报告能力。 ## 核心功能 * **自适应扫描延迟:** 内置速率限制(0.1秒至0.2秒的连接步调控制),以确保快速的 socket 扫描不会触发网络防火墙,或对在线的企业资产模拟拒绝服务 攻击行为。 * **弹性威胁情报:** 与 NVD API 深度集成,包含结构化的 try-except 块、对 HTTP 424/429 速率限制的优雅处理、指数退避机制,并以清晰的警告替代程序崩溃。 * **自动化报告生成:** 使用 ReportLab 模板,即时将扫描结果编译为专业的、可用于生产环境的 PDF 漏洞日志,并带有自动化的 HTML/XML 转义机制,以安全处理原始的 API 响应。 ## 架构与技术栈 * **核心语言:** Python 3.12+(全面类型化并使用严格的 Type Hints) * **网络审计:** `nmap` 二进制文件与 `python-nmap` 集成 * **报告引擎:** 带有定制 flowables 和防御性样式的 `reportlab` * **API 集成:** 带有动态查询管理的 `requests` 库 ## 架构概述 ``` ┌─────────────────────────────────────────────────────────────┐ │ main.py (Orchestration) │ │ ├── Argument parsing (argparse) │ │ └── Pipeline coordination │ └─────────────────────────────────────────────────────────────┘ │ ↓ ┌────────────────────────────────────────────────────────────┐ │ scanner.py (Reconnaissance) │ │ ├── Target validation (socket, ipaddress, DNS) │ │ ├── Fast socket scan (multi-threaded) │ │ └── Nmap service fingerprinting (-sV -O -T4) │ └────────────────────────────────────────────────────────────┘ │ ↓ ┌────────────────────────────────────────────────────────────┐ │ vnum_checker.py (Vulnerability Analysis) │ │ ├── NIST NVD API v2 queries │ │ ├── Exponential backoff retry (rate limiting) │ │ └── Fallback to local vulnerability database │ └────────────────────────────────────────────────────────────┘ │ ↓ ┌────────────────────────────────────────────────────────────┐ │ reporter.py (Report Generation) │ │ ├── ReportLab PDF generation │ │ ├── Executive summary metrics │ │ ├── Detailed findings table │ │ └── CVE details with CVSS scores │ └────────────────────────────────────────────────────────────┘ │ ↓ ✓ scan_report_*.pdf ``` ## 模块详情 ### scanner.py (信息侦察) - **validate_target(target: str) → str** - 验证 IPv4/IPv6 地址和主机名 - 拒绝环回地址 (127.0.0.0/8, ::1) - 通过输入净化防止命令注入 - 为主机名执行 DNS 解析 - **fast_socket_scan(target: str, ports: List[int]) → List[int]** - 使用 ThreadPoolExecutor 进行多线程 TCP 连接扫描 - 默认:前 20 个最常见端口 - 超时:每个端口 2 秒 - 返回按数字排序的开放端口列表 - **run_nmap_scan(target: str, open_ports: List[int]) → Dict[int, Dict[str, Any]]** - 使用 Nmap 进行深度服务指纹识别 - 参数:`-sV` (服务版本)、`-O` (操作系统检测)、`-T4` (速度) - 返回:{port: {service, version, cpe, state}} ### vnum_checker.py (漏洞分析) - **fetch_cves_for_service(cpe_string: str, keyword: str) → List[Dict]** - 查询 NIST NVD API v2 端点 - 针对 HTTP 429(速率限制)的指数退避:1秒、2秒、4秒 - 在 API 持续失败时回退至本地数据库 - 返回:[{cve_id, cvss_score, severity, description}, ...] - **FallbackVulnerabilityDB()** - 包含已知严重漏洞的本地 JSON 数据库 - 覆盖:Apache、OpenSSL、MySQL、SSH、nginx - 在 NVD API 不可用时激活 ### reporter.py (报告生成) - **VulnerabilityReport.generate_pdf() → str** - 基于 ReportLab 的 PDF 生成 - 自定义调色板(深石板灰,深红色) - 部分: - 页眉:目标,时间戳 - 执行摘要:指标表 - 详细发现:端口、服务、CVE、CVSS 评分 - CVE 详情:完整漏洞列表 - 输出:`scan_report_[target]_[timestamp].pdf` ### main.py (编排调度) - **VulnerabilityScanner.execute()** - 协调完整的 pipeline - 阶段:验证 → socket 扫描 → nmap → CVE 分析 → 报告 - 优雅的错误处理 - 带有时间戳的详细日志记录 ### 虚拟环境设置与依赖安装 #### MacOS 设置 ``` # 激活现有虚拟环境 source env/bin/activate # 验证 Python 版本 python --version # Should be 3.12.4 # 安装 Dependencies pip install --upgrade pip pip install nmap requests pillow reportlab # 验证 Nmap 安装 which nmap nmap --version # Should show 7.x or later ``` #### Windows 设置 ``` # 激活现有虚拟环境 call env\Scripts\activate # 验证 Python 版本 python --version # 安装 Dependencies python -m pip install --upgrade pip pip install nmap requests pillow reportlab # 验证 Nmap 安装 where nmap nmap --version ``` #### Linux 设置 ``` # 激活现有虚拟环境 source env/bin/activate # 验证 Python 版本 python3 --version # 安装 Dependencies pip install --upgrade pip pip install nmap requests pillow reportlab # 验证 Nmap 安装 which nmap nmap --version ``` ## 用法 ### 基础扫描 ``` python main.py --target 192.168.1.1 ``` ### 自定义端口扫描 ``` python main.py --target example.com --ports 22,80,443,3306,5432 ``` ### 详细日志 ``` python main.py --target 10.0.0.5 --verbose ``` ### 主机名扫描 ``` python main.py --target example.com ``` ## 输出 ### 日志文件 - `vuln_scanner.log` - 带有时间戳的完整执行日志 ### PDF 报告 - `scan_report_[target]_[timestamp].pdf` - 示例:`scan_report_192.168.1.1_20260621_143022.pdf` ### 报告内容 ``` ┌─────────────────────────────────────┐ │ VULNERABILITY SCAN REPORT │ ├─────────────────────────────────────┤ │ Target: 192.168.1.1 │ │ Date: 2026-06-21 14:30:22 │ ├─────────────────────────────────────┤ │ EXECUTIVE SUMMARY │ │ ├─ Total Open Ports: 5 │ │ ├─ Total CVEs Found: 12 │ │ ├─ Critical: 2 │ │ ├─ High: 4 │ │ ├─ Medium: 5 │ │ └─ Low: 1 │ ├─────────────────────────────────────┤ │ DETAILED FINDINGS │ │ Port │ Service │ Version │ CVSS │ │─────────────────────────────────────│ │ 22 │ SSH │ 7.4 │ 7.5/H │ │ 80 │ HTTP │ 1.1 │ 9.8/C │ │ 443 │ HTTPS │ TLS 1.2 │ 5.3/M │ │ │ ... │ ... │ ... │ ├─────────────────────────────────────┤ │ CVE DETAILS │ │ CVE-2021-44228 │ 10.0 │CRITICAL│ │ CVE-2021-3129 │ 9.8 │CRITICAL│ │ ... │ ... │ ... │ └─────────────────────────────────────┘ ``` ## 安全特性 1. **输入验证** - 字符白名单(字母、数字、点、连字符、冒号) - 长度限制(最多 255 个字符) - IPv4/IPv6/主机名验证 - 环回地址拒绝 2. **防止命令注入** - 无原始 shell 执行 - 通过 python-nmap 库安全地向 Nmap 传递参数 - 在任何系统调用之前进行输入净化 3. **网络安全** - Socket 连接超时(2 秒) - 使用 context manager 进行资源清理 - 对 NVD API 查询使用 HTTPS - 为 API 请求提供 User-Agent 头 4. **数据完整性** - 结构化异常处理 - 在查找 CVE 之前验证服务版本 - 通过回退机制实现优雅降级 5. **日志与审计跟踪** - 全面的日志输出到文件和控制台 - 所有操作均带有时间戳 - 日志中不包含敏感数据 - 提供 DEBUG 和 INFO 级别以供诊断 ## 错误处理 ### 优雅降级 - 如果 Nmap 失败:仅报告 socket 扫描结果 - 如果 NVD API 失败:回退至本地漏洞数据库 - 如果服务版本未知:跳过 CVE 查找(避免误报) - 键盘中断 (Ctrl+C):干净退出并以零状态码退出 ### 异常处理层级 1. **ValueError** - 输入验证失败(被捕获并清晰报告) 2. **socket.gaierror** - DNS 解析失败 3. **nmap.PortScannerError** - Nmap 执行错误 4. **requests.RequestException** - 网络/API 错误 5. **KeyboardInterrupt** - 用户终止 ## 性能特征 - **Socket 扫描**:约 2-5 秒(10 个并发线程 × 2 秒超时) - **Nmap 扫描**:30-120 秒(取决于端口数量和时序模板) - **CVE 查找**:每个服务 5-15 秒(API 查询 + 重试) - **报告生成**:1-2 秒 - **总扫描时间**:5-15 分钟(典型网络,因系统数量而异) ## 日志格式 ``` 2026-06-21 14:30:22,123 - scanner - INFO - Validating target: 192.168.1.1 2026-06-21 14:30:22,456 - scanner - INFO - Valid IP address: 192.168.1.1 2026-06-21 14:30:22,789 - scanner - INFO - Starting fast socket scan on 192.168.1.1 for 20 ports 2026-06-21 14:30:25,012 - scanner - INFO - Fast socket scan completed. Open ports: [22, 80, 443] 2026-06-21 14:30:25,345 - scanner - INFO - Starting Nmap scan on 192.168.1.1 for ports: 22,80,443 ``` ## 故障排除 ### "Nmap: command not found" ``` brew install nmap # 验证 which nmap nmap --version ``` ### Socket 扫描时提示 "Permission denied" ``` # 某些端口需要提升权限 sudo python main.py --target 192.168.1.1 ``` ### NVD API 速率限制 (429 错误) - 自动指数退避:1秒、2秒、4秒延迟 - 重试后回退至本地数据库 - 检查日志以获取详细信息:`grep -i "rate limit" vuln_scanner.log` ### 执行 Nmap 时提示 "Connection refused" - 验证是否已安装 nmap:`which nmap` - 验证 nmap 是否可执行:`ls -la /usr/local/bin/nmap` - 如有需要请重新安装:`brew reinstall nmap` ## 代码质量标准 ✓ **Type Hints**:所有函数均已完全类型化(Python 3.12+) ✓ **日志记录**:使用专业的日志记录而非 print 语句 ✓ **错误处理**:带有上下文信息的全面异常处理 ✓ **安全性**:输入验证、注入防护、安全的 API 调用 ✓ **模块化**:在 4 个模块中实现了清晰的关注点分离 ✓ **文档**:包含 Docstrings、内联注释和全面的 README ✓ **资源管理**:全面使用 context manager (with 语句) ✓ **退出代码**:规范的退出代码(0=成功,1=失败) ## 作品集亮点 1. **企业级架构**:模块化设计,清晰的关注点分离 2. **安全工程**:输入验证、注入防护、安全的默认设置 3. **API 集成**:支持速率限制和回退机制的 NVD API v2 4. **并发编程**:多线程 socket 扫描 5. **专业报告**:使用 ReportLab 样式生成 PDF 6. **容错性**:指数退避,优雅降级 7. **日志与可观测性**:全面的审计跟踪 8. **Python 最佳实践**:Type hints、context manager、推导式 ## 参考 - [NVD API v2 文档](https://nvd.nist.gov/developers/vulnerabilities) - [python-nmap 文档](https://xael.org/pages/python-nmap-en.html) - [ReportLab 文档](https://www.reportlab.com/docs/reportlab-userguide.pdf) - [CVSS v3.1 规范](https://www.first.org/cvss/v3.1/specification-document) ## 许可证 本项目按“原样”提供,用于作品集展示目的。 ## 作者 VulnScanner 1.0 - 网络安全工程师作品集项目
标签:CTI, Python, 威胁情报, 字符串匹配, 实时处理, 开发者工具, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 逆向工具, 隐私保护