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 构建。

## 功能
- **多线程 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绕过, 端口扫描, 逆向工具