在互联网端口扫描过程中寻找速度和准确度之间的平衡点
字数 2319 2025-08-26 22:11:40
互联网端口扫描中速度与准确度的平衡策略
1. 端口扫描概述
端口扫描是渗透测试和漏洞赏金活动中最重要的侦察阶段技术之一,用于识别目标主机和网络上的开放端口及运行的服务。
1.1 扫描器分类
面向连接(同步模式)扫描器:
- 特点:发送请求并等待响应,直到超时
- 优点:准确性高,能识别丢弃的数据包
- 代表工具:Nmap
无连接(异步模式)扫描器:
- 特点:不依赖当前端口探测完成即可启动下一个端口扫描
- 优点:扫描速度快
- 缺点:结果可能不太准确
- 代表工具:Masscan、Zmap
2. 主流扫描工具对比
2.1 Nmap特点
优点:
- 准确性高(使用同步模式)
- 功能丰富
- 支持域名和IP地址(IPv4和IPv6)
缺点:
- 扫描大量目标时速度慢
- 高速率扫描大端口范围时准确性下降
2.2 Masscan特点
优点:
- 速度极快(使用异步模式)
- 语法与Nmap相似
缺点:
- 不接受域名作为目标输入
- 不能自动调整传输速率
- 高速扫描大端口范围时准确性不足
3. 优化扫描策略
3.1 基本思路
结合Masscan的速度和Nmap的准确性:
- 使用Masscan进行初始全端口探测
- 使用Nmap对Masscan探测出的开放端口进行复扫和Banner识别
3.2 需要解决的问题
- Nmap扫描大量目标时的速度问题
- Masscan高速扫描大端口范围时的准确性问题
4. Masscan优化测试
4.1 测试用例与结果
测试用例#1:不同速率扫描所有TCP端口
- 速率设置:250kpps、100kpps、50kpps
- 结果:速率越慢,发现的开放端口越多,但耗时更长
测试用例#2:拆分目标子网并发扫描
- 将/16子网拆分为/20子网
- 并发任务设置:
- 5任务/100kpps(总500kpps)
- 5任务/50kpps
- 20任务/10kpps
- 结果:
- 比常规扫描快2-3倍,但开放端口较少
- 使用最大速率导致开放端口更少
- 少任务数+高扫描速率效果更好
测试用例#3:拆分端口范围并发扫描
四种拆分方式:
- 拆分为5个端口范围
- 拆分为2个端口范围
- 拆分为8个端口范围
- 拆分为4个端口范围
结果:
- 拆分端口范围能扫描出更多开放端口
- 更少的并行任务扫描出更多开放端口
- 拆分为5个端口范围效果最佳
4.2 Masscan结论
- 100% CPU利用率会导致端口开放性降低
- 使用最大速率容量扫描会导致更少开放端口
- 并发任务数越少,扫描出的开放端口越多
- 拆分端口范围优于拆分子网
- 拆分为5个或4个端口范围效果最佳
5. Nmap优化测试
5.1 测试用例与结果
测试用例#1:常规扫描所有TCP端口
- 结果:扫描4.5天未完成,性能太低
测试用例#2:并发任务扫描所有TCP端口
- 5并发任务:2.8天未完成
- 64并发任务:5天未完成
测试用例#3:扫描Masscan识别的开放端口和主机组合列表
- 方法:
- 获取主机列表:
grep "Host:" | cut -d " " -f2 | sort -V | uniq - 获取开放端口组合列表:
grep "Ports:" | cut -d " " -f4 | cut -d "/" -f1 | sort -n | uniq | paste -sd,
- 获取主机列表:
- 结果:
- 常规Nmap扫描发现更多开放端口
- 并发Nmap扫描发现较少开放端口
- 可能发现Masscan遗漏的端口
测试用例#4:扫描Masscan识别的特定主机上的特定端口
- 方法:
- 获取主机列表:
cat | grep Host | awk '{print $2,$5}' | sed 's@/.*@@' | sort -t ' ' -n -k2 | awk -F ' ' -v OFS=' ' '{x=$1;$1="";a[x]=a[x]","$0}END{for(x in a) print x,a[x]}' | sed 's/, /,/g' | sed 's/ ,/ /' | sort -V -k1 | cut -d " " -f1 - 获取各主机开放端口列表:
cat | grep Host | awk '{print $2,$5}' | sed 's@/.*@@' | sort -t ' ' -n -k2 | awk -F ' ' -v OFS=' ' '{x=$1;$1="";a[x]=a[x]","$0}END{for(x in a) print x,a[x]}' | sed 's/, /,/g' | sed 's/ ,/ /' | sort -V -k1 | cut -d " " -f2
- 获取主机列表:
- 结果:
- 比测试用例#3略快但发现端口较少
- 10和50并发任务差异不大
5.2 Nmap结论
- 测试用例#3(扫描Masscan识别的开放端口和主机组合列表)效果最佳
- 100% CPU利用率导致检测出更少开放端口
- 更少的并发任务数检测出更多开放端口
6. 推荐扫描方法
-
Masscan阶段:
- 运行2-3个并发Masscan任务
- 将65535个端口分为4-5个更小范围
- 示例命令:
masscan -p 1-13107 --rate 50000 --wait 0 --open TARGET_SUBNET -oG range1.gnmap masscan -p 13108-26214 --rate 50000 --wait 0 --open TARGET_SUBNET -oG range2.gnmap
-
结果处理:
- 获取主机列表:
grep "Host:" *.gnmap | cut -d " " -f2 | sort -V | uniq > HOSTS - 获取开放端口组合列表:
grep "Ports:" *.gnmap | cut -d " " -f4 | cut -d "/" -f1 | sort -n | uniq | paste -sd, > OPEN_PORTS
- 获取主机列表:
-
Nmap阶段:
- 使用常规Nmap扫描:
sudo nmap -sSV -p OPEN_PORTS -v --open -Pn -n --randomize-hosts -T4 -iL HOSTS -oA OUTPUT
- 使用常规Nmap扫描:
7. 注意事项
- 避免扫描时CPU过载
- 不要使用扫描机器的最大速率容量
- 避免运行过多并行任务
- 考虑使用多个IP地址进行扫描,避免单一IP被封锁
8. 研究限制
- 仅使用Nmap v7.70和Masscan v1.0.5-51-g6c15edc
- 仅涉及IPv4地址
- 不包括UDP端口扫描
- 仅测试4个/16目标网络
- 扫描机器不支持PF_RING,Masscan速率限制在250kpps
- 仅使用单一固定IP进行扫描