1. 项目概述
1.1 项目背景与需求分析
在网络安全领域,主机发现与端口扫描是最基础却至关重要的环节。传统工具如Nmap虽然功能强大,但在某些特定场景下存在明显不足:部署复杂(需要编译安装)、自定义程度低(规则修改困难)、输出结果不易集成(需要额外解析)。这些痛点促使我开发了PolyScan——一个基于Python的轻量级网络扫描系统。
PolyScan的设计初衷是解决以下三类典型问题:
- 快速部署需求:在临时性安全评估中,需要即装即用的工具
- 定制化扫描:针对特定业务场景的协议和端口组合
- 结果可视化:实时展示扫描进度和风险等级
1.2 核心功能设计
1.2.1 多维度探测体系
- 网络层探测:采用ICMP Echo Request实现基础存活检测,通过TTL值反推操作系统类型(误差率<15%)
- 传输层扫描:
- TCP SYN扫描(半开连接):发送SYN包后根据SYN-ACK/RST响应判断端口状态
- TCP全连接扫描:建立完整TCP三次握手,适用于权限受限环境
- 应用层识别:
- 服务指纹采集:建立TCP连接后读取前1024字节Banner信息
- 协议交互模拟:对HTTP/MySQL等常见协议发送特征探针
1.2.2 智能风险评估引擎
实现三级风险评估模型:
python复制def evaluate_risk(port, banner):
risk = "INFO"
if port in [22, 3389, 445]: # 高危端口列表
risk = "HIGH"
if "Apache/2.4.1" in banner: # 已知漏洞版本
risk = "CRITICAL"
return risk
1.2.3 可视化交互设计
采用PyQt5构建的GUI界面包含:
- 实时日志面板(支持关键词高亮)
- 扫描结果表格(按风险等级着色)
- 拓扑图展示(需额外安装graphviz)
2. 系统架构实现
2.1 技术栈选型考量
选择Python+Scapy组合主要基于:
- 开发效率:Scapy提供完整的网络层协议构造能力,避免从零实现ARP/ICMP/TCP等协议
- 跨平台性:Python解释器在Windows/Linux/macOS均有稳定支持
- 扩展便利:模块化设计便于集成新功能(如后续计划添加UDP扫描)
注意:Scapy在Windows平台需要安装WinPcap/Npcap驱动,这是唯一的外部依赖
2.2 关键模块交互流程
mermaid复制graph TD
A[UI线程] -->|启动扫描| B[扫描控制器]
B --> C[主机发现模块]
C -->|存活主机列表| D[端口扫描器]
D -->|开放端口| E[Banner抓取]
E --> F[漏洞匹配]
F -->|结果对象| G[数据持久化]
2.3 性能优化方案
- 连接池技术:复用TCP连接进行连续Banner抓取,减少三次握手开销
- 异步I/O模型:使用select/poll监控多个socket状态
- 智能超时设置:
- 内网环境:默认超时500ms
- 跨网段扫描:动态调整为2s
3. 核心模块实现细节
3.1 主机发现模块
3.1.1 ICMP探测实现
python复制def icmp_ping(target_ip):
packet = IP(dst=target_ip)/ICMP()
response = sr1(packet, timeout=2, verbose=0)
if response:
ttl = response[IP].ttl
os_type = infer_os(ttl) # TTL推断操作系统
return True, os_type
return False, None
3.1.2 操作系统推断逻辑
| TTL范围 | 可能系统 | 修正值 |
|---|---|---|
| 64-68 | Linux/Unix | 64 |
| 128-132 | Windows | 128 |
| 255 | 网络设备 | 255 |
经验:虚拟机环境可能干扰TTL判断,建议直接指定物理网卡
3.2 端口扫描引擎
3.2.1 SYN扫描实现要点
python复制def syn_scan(target_ip, port):
packet = IP(dst=target_ip)/TCP(dport=port, flags="S")
response = sr1(packet, timeout=1, verbose=0)
if response and response.haslayer(TCP):
if response[TCP].flags == 0x12: # SYN-ACK
send_rst(target_ip, port) # 发送RST关闭连接
return "OPEN"
elif response[TCP].flags == 0x14: # RST
return "CLOSED"
return "FILTERED"
3.2.2 扫描策略对比
| 扫描类型 | 所需权限 | 速度 | 隐蔽性 | 可靠性 |
|---|---|---|---|---|
| TCP SYN | root/admin | 快 | 高 | 高 |
| TCP Connect | 无 | 慢 | 低 | 极高 |
| UDP | root/admin | 极慢 | 中 | 低 |
3.3 服务指纹识别
3.3.1 Banner抓取优化技巧
- 编码处理:自动检测响应编码(UTF-8/GBK等)
- 脏数据过滤:正则表达式移除不可打印字符
python复制clean_banner = re.sub(r'[^\x20-\x7E]', '', raw_banner)
3.3.2 协议特定探针
python复制PROBES = {
"HTTP": b"GET / HTTP/1.0\r\n\r\n",
"FTP": b"USER anonymous\r\n",
"MySQL": b"\x0a\x00\x00\x01\x85\xa6\x0f\x20\x00..." # 握手包
}
4. 典型问题解决方案
4.1 Windows平台常见异常
问题现象:
- Wireshark可见发送包但无响应
- 提示"No route found for IPv6 destination"
解决方案:
- 关闭IPv6协议栈(控制面板→网络适配器属性)
- 以管理员身份运行CMD后执行:
batch复制netsh interface ipv6 set global randomizeidentifiers=disabled
netsh interface ipv6 set global randomizeidentifiers=disabled
4.2 扫描结果不准确排查
检查清单:
- 确认目标主机防火墙未拦截ICMP/TCP包
- 检查本地杀毒软件是否过滤原始套接字
- 测试网络设备(交换机/路由器)是否启用端口安全策略
4.3 性能调优记录
在100Mbps局域网环境下测试结果:
| 线程数 | 扫描速度(端口/秒) | CPU占用率 |
|---|---|---|
| 50 | 1200 | 35% |
| 100 | 2100 | 68% |
| 200 | 2500 | 92% |
建议:根据网络质量动态调整线程数,内网建议100-150线程
5. 扩展开发指南
5.1 添加新协议支持
以Redis协议为例:
- 在
service_probes.txt添加探针:
code复制Redis "*1\r\n$4\r\nPING\r\n"
- 在
cve_db.json添加漏洞规则:
json复制"Redis": [
{
"version_pattern": "3\\.2\\..*",
"cve_id": "CVE-2018-11218",
"severity": "HIGH"
}
]
5.2 集成漏洞数据库
推荐扩展方案:
- 使用SQLite替代JSON存储漏洞数据
- 定期从NVD数据库同步更新:
python复制import requests
nvd_data = requests.get("https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-2023.json.gz")
5.3 分布式扫描架构
原型设计:
python复制# Master节点
def dispatch_tasks():
while True:
target = get_unscanned_ip()
if not target:
break
celery.send_task('scan_task', args=(target,))
# Worker节点
@app.task
def scan_task(ip):
result = Scanner(ip).run()
save_to_shared_storage(result)
6. 实际应用案例
6.1 企业内网资产梳理
某制造企业实施案例:
- 扫描范围:192.168.1.0/24
- 发现异常:
- 打印机开放9100端口(可执行任意代码)
- 老旧Windows Server 2008(CVE-2019-0708)
- 整改措施:
- 关闭非必要端口
- 划分VLAN隔离办公与生产网络
6.2 渗透测试实战
在某次授权测试中发现:
- 通过Banner识别出Apache Struts 2.3.15
- 匹配到CVE-2017-5638(远程代码执行)
- 利用漏洞获取服务器控制权限
重要提示:所有扫描必须获得书面授权,禁止未授权测试
7. 后续优化方向
-
协议识别增强:
- 集成机器学习模型分析网络流量特征
- 实现JA3/JA3S指纹识别
-
性能提升:
- 采用异步IO(asyncio)重构核心引擎
- 实现无状态扫描(不维护TCP状态表)
-
报告生成:
- 支持PDF格式报告自动生成
- 增加风险统计图表(Pie/Bar Chart)
这个项目持续维护了两年多,期间处理过各种网络环境下的兼容性问题。最深刻的体会是:网络扫描工具的开发不仅是技术实现,更需要深入理解各种网络设备的特性差异。建议使用者先在小范围测试环境验证扫描策略,确认无误后再开展大规模扫描。