基于Python的多协议主机发现与服务指纹识别系统(端口扫描检测)
PolyScan是一款基于Python和Scapy开发的轻量级网络扫描工具,支持跨平台运行。核心功能包括多协议主机发现、灵活端口扫描、服务指纹识别及漏洞关联分析,通过可视化界面展示扫描结果。系统采用模块化设计,包含扫描引擎、数据处理和GUI界面三大组件,支持多线程并发扫描和本地漏洞库匹配。适用于企业内网资产普查、渗透测试信息收集等场景,提供CSV报告导出功能。相比传统扫描工具,PolyScan具有
·
目录
1. 项目概述
1.1 项目背景
PolyScan 是一款基于 Python 和 Scapy 开发的轻量级、跨平台网络扫描工具。旨在解决传统扫描器(如 Nmap)在特定场景下部署复杂、自定义程度低的问题,提供可视化的主机发现、端口扫描、服务指纹识别及漏洞关联分析功能。
1.2 核心功能
- 多协议主机发现: 支持 ICMP Ping 扫描,自动推断操作系统类型(基于 TTL)。
- 灵活端口扫描: 支持 TCP SYN(需管理员权限)和 TCP Connect 模式。
- 服务指纹识别: 基于端口号映射及服务 Banner 抓取。
- 智能风险评级: 根据端口敏感度、服务类型及已知 CVE 自动标记风险等级(INFO/HIGH/CRITICAL)。
- CVE 关联引擎: 本地轻量级漏洞库,正则匹配 Banner 版本以提示已知漏洞。
- 可视化界面: 基于 PyQt5/PySide6 的实时日志与结果表格展示。
- 报告导出: 支持 CSV 格式报告导出。
1.3 适用场景
- 企业内部局域网资产普查
- 渗透测试前期信息收集
- 网络安全教学与实验
- 个人实验室环境监控
2. 系统架构
2.1 技术栈
- 语言: Python 3.8+
- 核心库:
scapy(数据包构造与发送),threading(并发控制) - GUI 框架:
PyQt5或PySide6 - 数据处理:
json(配置与漏洞库),csv(报告),re(正则匹配)
2.2 目录结构
1PolyScan/ 2├── main.py # 程序入口 3├── config.py # 全局配置 (超时时间、线程数等) 4├── requirements.txt # 依赖列表 5├── core/ 6│ ├── __init__.py 7│ ├── scanner.py # 核心扫描逻辑 (Ping, SYN, Banner, CVE) 8│ └── models.py # 数据模型 (ScanResult) 9├── ui/ 10│ ├── __init__.py 11│ └── main_window.py # 主界面逻辑与事件处理 12├── data/ 13│ ├── service_probes.txt # (预留) 服务探针规则 14│ └── cve_db.json # 本地漏洞特征库 15├── reports/ # 导出的 CSV 报告存储目录 16└── docs/ # 文档目录
3. 环境依赖与安装
3.1 系统要求
- 操作系统: Windows 10/11, Linux (Kali/Ubuntu), macOS
- Python 版本: >= 3.8
- 权限要求:
- TCP SYN 扫描需要 管理员/root 权限。
- TCP Connect 扫描和普通 Ping 无需特殊权限。
3.2 安装步骤
1python -m venv venv 2# Windows 3venv\Scripts\activate 4# Linux/Mac 5source venv/bin/activate
1scapy>=2.5.0 2PyQt5>=5.15.0
- 运行程序
- 普通模式:
python main.py - 管理员模式 (推荐):
- Windows: 右键终端 -> "以管理员身份运行" ->
python main.py - Linux:
sudo python main.py
4. 核心模块详解
4.1 core/scanner.py (核心引擎)
类:HostScanner
负责执行所有网络探测任务。
__init__(self, callback_log, interface=None)callback_log: 日志回调函数,用于将日志推送到 UI。interface: 指定网卡接口名称(解决 Windows 多网卡/TTL 误判问题)。ping_host(self, ip)- 发送 ICMP Echo Request。
- TTL 推断逻辑:
60-68: Linux/Unix/MacOS125-132: Windows>=250: 网络设备- 返回
ScanResult对象。 scan_port_tcp_syn(self, ip, port)- 构造
IP/TCP(flags=S)包。 - 接收
SYN-ACK判定为开放,随即发送RST断开连接。 - 若收到
RST判定为关闭。 grab_banner(self, ip, port)- 建立 TCP 连接,发送空包或特定探针(如 HTTP GET, MySQL Handshake)。
- 读取前 1024 字节响应。
- 清洗不可见字符。
check_cves(self, result)- 加载
data/cve_db.json。 - 根据
service_name和banner内容,使用正则匹配版本号。 - 若匹配成功,将漏洞信息注入
result.vulnerabilities并提升risk_level。
4.2 core/models.py (数据模型)
类:ScanResult
标准化扫描结果的数据结构。
1class ScanResult: 2 def __init__(self, ip, port=None, status=None, protocol=None, ...): 3 self.ip = ip 4 self.port = port 5 self.service_name = "unknown" 6 self.banner = None 7 self.os_guess = "Unknown" 8 self.risk_level = "INFO" # INFO, MEDIUM, HIGH, CRITICAL 9 self.vulnerabilities = [] # List[Dict] 10 11 def add_vulnerability(self, cve_id, severity, description, fix): 12 # 添加漏洞并自动更新风险等级 13 pass
4.3 ui/main_window.py (用户界面)
- 网卡选择器: 调用
scapy.all.get_if_list()动态加载本机网卡,允许用户指定物理网卡以避免虚拟化网卡干扰。 - 实时日志区: 通过
Signal/Slot(PyQt) 或queue机制接收后端日志,避免界面卡顿。 - 结果表格: 动态渲染
ScanResult列表,根据risk_level自动着色行背景。 - 导出功能: 将
results列表序列化为 CSV。
5. 数据流与逻辑
5.1 扫描流程
- 初始化: 用户输入目标 IP,选择网卡,点击“开始”。
- 主机发现:
- 发送 ICMP 包 -> 获取 TTL -> 推断 OS -> 生成 Host UP 记录。
- 端口扫描 (并发线程池):
- 遍历端口列表 -> 发送 SYN 包 -> 判断状态 -> 生成 Port Open 记录。
- 深度探测 (仅对开放端口):
- 建立 TCP 连接 -> 抓取 Banner。
- CVE 分析: 比对本地漏洞库 -> 标记漏洞。
- 结果聚合: 所有结果存入
self.results列表。 - UI 更新: 刷新表格,高亮高危项,输出完成日志。
- 持久化: 用户可选择导出 CSV。
5.2 并发控制
- 使用
concurrent.futures.ThreadPoolExecutor管理端口扫描线程。 - 最大线程数由
config.py中的MAX_THREADS控制(默认 50),防止网络拥塞。 - 使用
threading.Lock保护共享资源(如日志列表、结果列表)的写入操作。
6. 配置说明
6.1 config.py
全局常量配置,修改后需重启程序。
1SCAN_CONFIG = {
2 "TIMEOUT": 2, # 单个包等待超时 (秒)
3 "MAX_THREADS": 50, # 端口扫描最大并发数
4 "DEFAULT_PORTS": [21, 22, 80, 443, 445, 3306, 3389], # 默认扫描端口
5 "LOG_LEVEL": "INFO" # 日志级别
6}
7
8# 操作系统 TTL 映射参考 (代码中已硬编码区间逻辑,此处仅作备注)
9OS_TTL_REF = {
10 "Linux": 64,
11 "Windows": 128,
12 "Cisco": 255
13}
6.2 data/cve_db.json
漏洞特征库,支持正则匹配。
1{
2 "services": {
3 "MySQL": [
4 {
5 "version_pattern": "5\\.5\\..*",
6 "cve_id": "CVE-2012-2122",
7 "severity": "HIGH",
8 "description": "认证绕过漏洞",
9 "fix": "升级到 5.6+"
10 }
11 ]
12 }
13}
version_pattern: Python 正则表达式,用于匹配 Banner 中的版本字符串。severity: 严重程度 (CRITICAL, HIGH, MEDIUM, LOW)。
7. 常见问题 (FAQ)
Q1: 为什么 Windows 本机扫描显示 OS 为 Linux?
A: 通常是因为 Scapy 默认使用了 WSL2 或 VMware 的虚拟网卡,这些网卡的协议栈表现为 Linux 特征(TTL=64)。
解决: 在界面顶部的“选择网卡”下拉框中,手动选择物理网卡(如 "Intel(R) Wi-Fi..." 或 "Realtek PCIe GBE...")。
Q2: SYN 扫描报错 "Permission denied" 或 "No MAC address"?
A: SYN 扫描需要构造原始套接字,必须使用管理员权限运行。
解决:
- Windows: 右键点击终端/IDE -> "以管理员身份运行"。
- Linux: 使用
sudo python main.py。 - 或者在代码中暂时切换为 TCP Connect 模式(无需权限,但速度慢且易被记录)。
Q3: 某些端口扫描结果为 "Filtered"?
A: 表示发送 SYN 包后未收到任何响应(既无 SYN-ACK 也无 RST)。通常是防火墙丢弃了数据包。
处理: 当前版本将其视为“未知/过滤”,不标记为开放。
Q4: 如何添加自定义漏洞规则?
A: 直接编辑 data/cve_db.json 文件,遵循现有 JSON 格式添加新条目即可,无需修改代码。
9. 附录:数据结构定义
ScanResult 对象字段说明

最终实现效果:

更多推荐
所有评论(0)