目录

  1. 项目概述
  2. 系统架构
  3. 环境依赖与安装
  4. 核心模块详解
  5. 数据流与逻辑
  6. 配置说明
  7. 扩展开发指南
  8. 常见问题 (FAQ)
  9. 附录:数据结构定义

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
  1. 运行程序
  • 普通模式: 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/MacOS
  • 125-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 扫描流程

  1. 初始化: 用户输入目标 IP,选择网卡,点击“开始”。
  2. 主机发现:
  • 发送 ICMP 包 -> 获取 TTL -> 推断 OS -> 生成 Host UP 记录。
  1. 端口扫描 (并发线程池):
  • 遍历端口列表 -> 发送 SYN 包 -> 判断状态 -> 生成 Port Open 记录。
  1. 深度探测 (仅对开放端口):
  • 建立 TCP 连接 -> 抓取 Banner。
  • CVE 分析: 比对本地漏洞库 -> 标记漏洞。
  1. 结果聚合: 所有结果存入 self.results 列表。
  2. UI 更新: 刷新表格,高亮高危项,输出完成日志。
  3. 持久化: 用户可选择导出 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 对象字段说明

最终实现效果:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐