sanidhya19/Port-Scanner-Vulnerability-Assessment

GitHub: sanidhya19/Port-Scanner-Vulnerability-Assessment

一款集多线程 TCP/UDP 端口扫描、服务指纹识别、CVE 查找与 AI 驱动修复建议于一体的 Python 安全评估工具。

Stars: 4 | Forks: 0

# 端口扫描器 一个多线程 TCP/UDP 端口扫描器,具备服务指纹识别、CVE 查找、AI 驱动的修复建议以及 HTML 报告功能 —— 使用 Python 构建。 ![扫描报告](https://static.pigsec.cn/wp-content/uploads/repos/cas/52/5257a087759591075e06ca5c2b54b3d648090cdc069082273b595e10c34642dd.png) ## 功能 - **多线程 TCP 扫描** —— 使用 `ThreadPoolExecutor` 支持多达 100 个并发连接 - **UDP 扫描** —— 针对 DNS、NTP、SNMP、NetBIOS 等的特定协议探测 - **Banner 抓取** —— 读取服务 Banner 以指纹识别 SSH、HTTP、FTP、SMTP、MySQL、Redis 等 - **CVE 查找** —— 查询 NIST NVD API 以查找每个检测到的服务版本的已知漏洞 - **AI 修复建议** —— 使用您选择的 LLM,自动为每个检测到的漏洞生成按优先级排序的分步修复建议 - **多 LLM 提供商支持** —— 开箱即用支持 Anthropic (Claude)、OpenAI (GPT)、Groq (Llama) 和 Google Gemini - **HTML 报告** —— 包含开放端口、Banner、严重等级评定的 CVE 以及 AI 修复卡片的暗色模式报告 - **JSON 导出** —— 用于脚本编写或进一步分析的机器可读输出 - **灵活的端口输入** —— 范围 (`1-1024`)、列表 (`22,80,443`) 或预设 (`common`) ## 项目结构 ``` port_scanner/ ├── port_scanner.py # Core scanner — TCP/UDP scanning, CLI, orchestration ├── report.py # HTML report generator ├── cve_lookup.py # NIST NVD CVE lookup and service fingerprinting ├── ai_remediation.py # AI-powered remediation advice ├── llm.py # Multi-provider LLM client (Anthropic, OpenAI, Groq, Gemini) ├── .env.example # Environment variable template — copy to .env and fill in your key └── Readme.md ``` ## 环境要求 - Python 3.10+ - `python-dotenv` —— 用于从 `.env` 加载 API 密钥 - 以下任意一个 LLM 提供商 SDK(只需安装您想使用的那一个): - `anthropic` —— 用于 Claude - `openai` —— 用于 GPT - `groq` —— 用于通过 Groq 运行的 Llama / Mixtral - `google-generativeai` —— 用于 Gemini 如果您不需要 AI 功能,核心扫描器(TCP/UDP 扫描、CVE 查找、HTML 报告)在没有任何依赖项的情况下仍可正常工作。 ## 安装 ``` git clone https://github.com/sanidhya19/Port-Scanner-Vulnerability-Assessment.git cd Port-Scanner-Vulnerability-Assessment ``` ### 启用 AI 修复建议 **1. 安装依赖项** ``` pip install python-dotenv groq # swap groq for anthropic / openai / google-generativeai ``` **2. 设置您的 `.env` 文件** ``` cp .env.example .env ``` 打开 `.env` 并填入您的提供商和 API 密钥: ``` PROVIDER=groq GROQ_API_KEY=gsk_... ``` 只有您选择的提供商需要密钥。将其他的留空即可。 | 提供商 | 环境变量 | 安装 | |----------|----------------------|---------| | Anthropic (Claude) | `ANTHROPIC_API_KEY` | `pip install anthropic` | | OpenAI (GPT) | `OPENAI_API_KEY` | `pip install openai` | | Groq (Llama / Mixtral) | `GROQ_API_KEY` | `pip install groq` | | Google Gemini | `GEMINI_API_KEY` | `pip install google-generativeai` | ## 使用方法 ### 基础 TCP 扫描 ``` python3 port_scanner.py -p ``` ### 示例 ``` # 扫描 localhost 的常见端口 python3 port_scanner.py 127.0.0.1 # 扫描端口范围并保存 HTML 报告 python3 port_scanner.py 192.168.56.101 -p 1-9999 --html report.html # 扫描特定端口并进行 CVE 查询和 AI 修复建议 python3 port_scanner.py 192.168.56.101 -p 22,80,443,3306 --cve --html report.html # TCP + UDP 扫描并生成完整报告 sudo python3 port_scanner.py 192.168.56.101 -p 1-9999 --udp --cve --html report.html # 快速扫描 — 不抓取 banner,增加线程数 python3 port_scanner.py 192.168.56.101 -p 1-65535 --threads 200 --no-banner --timeout 0.5 # 将结果保存为 JSON python3 port_scanner.py 192.168.56.101 -p common -o results.json ``` ### 所有选项 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `target` | 必填 | 主机名或 IP 地址 | | `-p`, `--ports` | `common` | 要扫描的端口:`80`、`1-1024`、`22,80,443` 或 `common` | | `-t`, `--threads` | `100` | 并发线程数 | | `--timeout` | `1.0` | Socket 超时时间(秒) | | `--no-banner` | off | 跳过 Banner 抓取(速度更快) | | `--udp` | off | 同时扫描常见的 UDP 端口(需要 sudo) | | `--udp-ports` | `common-udp` | 要扫描的 UDP 端口:`53,123,161` 或 `common-udp` | | `--cve` | off | 通过 NIST NVD API 查找 CVE | | `--api-key` | 无 | 用于提高速率限制的 NVD API 密钥 | | `-o`, `--output` | 无 | 保存 JSON 报告 | | `--html` | 无 | 保存 HTML 报告 | ## 工作原理 ### TCP 扫描 每个端口通过尝试使用 `socket.create_connection()` 进行完整的 TCP 三次握手来检查。完成的握手表示端口开放。`ConnectionRefusedError` 表示端口已关闭。超时表示端口被过滤 —— 防火墙正在默默丢弃数据包。 ### UDP 扫描 UDP 没有握手过程,因此检测方式有所不同。扫描器会发送特定协议的探测数据包(向端口 53 发送真实的 DNS 查询,向端口 123 发送真实的 NTP 请求等),并侦听响应。有响应表示端口开放。ICMP "端口不可达" 消息表示端口已关闭。静默无响应表示 `open|filtered` —— 如果没有更多上下文,我们无法确切判断。 ### Banner 抓取 在确认端口开放后,扫描器会读取服务发送的第一批字节。SSH 和 FTP 会自动宣告自身信息。HTTP 端口会收到一个 `HEAD /` 请求以触发响应标头。系统会解析 Banner 以提取软件名称和版本(例如,将 `SSH-2.0-OpenSSH_8.9p1` 解析为 `OpenSSH 8.9`)。 ### CVE 查找 提取的版本字符串将被发送到 [NIST NVD API](https://nvd.nist.gov/developers/vulnerabilities)。结果按 CVSS 分数排序,并显示严重等级评定(CRITICAL / HIGH / MEDIUM / LOW)。扫描器会自动遵守 NVD 每 30 秒 5 次请求的速率限制。 ### AI 修复建议 一旦发现 CVE,扫描结果将发送到您配置的 LLM 提供商。模型会返回一个结构化的响应,包含总体风险摘要、引用特定 CVE ID 的各服务分步修复说明,以及前 3 个最高优先级的操作列表。这将被渲染为 HTML 报告底部的一张卡片。AI 部分仅在真正检测到 CVE 时才会运行 —— 对于干净无漏洞的扫描,不会进行任何 API 调用。 要添加新的 LLM 提供商,请在 `llm.py` 中添加一个 `_call_yourprovider()` 函数,并在 `get_completion()` 内部的 `dispatch` 字典中注册它。 ## 法律声明 仅扫描您拥有或获得明确书面测试许可的主机。 未经授权的端口扫描可能会触犯《计算机欺诈和滥用法》(美国)、《计算机滥用法》(英国)或您所在司法管辖区的同等法律。 适合练习的安全目标: - `127.0.0.1` —— 您自己的机器 - `scanme.nmap.org` —— Nmap 的公共测试主机,明确允许扫描 - 您自己的 VPS 或家庭网络 - 在本地运行的故意存在漏洞的虚拟机,例如 [Metasploitable](https://sourceforge.net/projects/metasploitable/) ## 测试对象 - `scanme.nmap.org` —— Nmap 的公共沙盒环境 - Metasploitable 2 —— 运行在隔离的 VirtualBox 仅主机网络中的故意存在漏洞的虚拟机 ## 运行测试 本项目包含 41 个单元测试,涵盖了核心扫描器逻辑、Banner 解析、UDP 扫描和 CVE 查找。 安装 pytest(仅一次): ``` pip3 install pytest ``` 运行测试: ``` python3 -m pytest tests.py -v ``` 或者不使用 pytest: ``` python3 tests.py ``` ### 测试内容 | 测试类 | 涵盖内容 | |------------|----------------| | `TestParsePorts` | 端口范围、列表、重复项、空格、`common` 预设 | | `TestGetServiceName` | 已知端口、未知端口、SSH、HTTP | | `TestGrabBanner` | 连接失败、Banner 长度上限、首行提取、HTTP 探测 | | `TestScanPort` | 关闭端口返回 None、开放端口返回正确的 dict、跳过时无 Banner | | `TestScanUdpPort` | ICMP 不可达、超时 → `open\|filtered`、响应 → `open` | | `TestBuildKeyword` | 针对 SSH、Apache、nginx、MySQL、Redis、FTP 的 Banner 解析 | | `TestParseCve` | CVE ID、分数、严重程度、年份、描述修剪、缺失指标 | ## 可能的扩展 - 通过 TTL 分析进行 OS 检测 - HTML 报告亮色/暗色模式切换 - CSV 导出 - 扫描对比 —— 对比两份报告的差异以发现新开放的端口 - 定时扫描与变更告警 ## 许可证 本项目基于 [MIT 许可证](LICENSE) 授权 —— 可自由使用、修改和分发,但需注明出处。
标签:DLL 劫持, Python, 人工智能, 大语言模型, 插件系统, 数据统计, 无后门, 用户模式Hook绕过, 端口扫描, 逆向工具