本文面向对Nmap有高级用法的读者。
目录
- 指纹生成算法
- 指纹比对算法
- 如何自定义设备指纹
- 总结
一、指纹生成
Nmap在扫描网络中的设备期间,会发送 16 个探测包。同时将探测采集到的信息结果,做一定的变换,计算出下面的 28 个指标集合。这些指标计算的源码非常晦涩难懂,例如GCD就是计算最大公约数,W1就是计算窗口大小,可以看懂个大概。但是像TG、RD、RUCK和TS等的源码含义几乎看不懂。。。
GCD:用前六个非 T 类型探测包的 TCP 序列号差值,取这些差值的最大公约数。
ISR:计算探针返回包的 SEQ 差值与发送时间差的比率(即 SEQ 发送速率),取平均值后通过公式转换,反映系统响应速率特征。
C:对 SEQ 发送速率取以 2 为底的对数,再转换为无符号整数,用于量化速率特征。
SP:评估 TCP 序列号的可预测性程度,辅助判断操作系统的序列号生成策略。
ID:通过 TCP、UDP、ICMP 响应包的 IP ID 号,判断 IP ID 生成算法(如增量、随机、中断增量等),不同系统的生成规则不同。
SS:判断目标是否在 TCP 和 ICMP 协议中共享 IP ID 序列,用于辅助系统识别。
TS:分析 TCP 时间戳选项的增量速率,根据每秒增量值判断系统特征(如支持频率、是否不支持等)。
O 系列(O1-O6):记录 TCP 数据包的选项参数及顺序,不同系统对 TCP 选项的支持和实现存在差异。
W 系列(W1-W6):记录 TCP 连接的初始窗口大小,不同操作系统的默认窗口值具有特征性。
R:标记目标是否响应探测包(Y 为响应,N 为不响应),是后续指标分析的前提。
DF:检查 IP 包的 “不分片” 标志是否启用,用于判断网络层传输策略。
DFI:在两个 ICMP 请求中检查 “不分片” 标志的一致性,辅助识别系统网络栈特性。
T:记录初始生存时间(IP.TTL),不同系统的默认 TTL 值不同(如 Windows 通常为 128,Linux 为 64)。
TG:将初始 TTL 值归类为 32、64、128 或 255,简化 TTL 特征以匹配操作系统指纹。
CC:通过 ECN 探测包的 SYN/ACK 响应,判断系统对显式拥塞控制的支持情况(Y/S/N/O)。
Q:检测 TCP 包的异常特征(如保留字段非零、URG 指针异常),反映系统网络栈的实现 quirks。
S:对比返回包的 TCP 序列号与发送时的确认号关系,判断系统的序列号处理逻辑(Z/A/A+/O)。
A:对比返回包的 TCP 确认号与发送时的序列号关系,辅助识别系统响应特征(Z/S/S+/O)。
F:记录 TCP 响应包的标志位组合(如 ECE、URG、ACK 等),不同系统的标志位设置规则不同。
RD:计算 RST 包数据的 CRC32 校验和,某些系统在 RST 数据校验上存在特殊处理。
IPL:记录 IP 包头长度,用于验证数据包格式的一致性。
UN:检查 ICMP 端口不可达报文中未使用字段是否非零,部分系统存在该字段异常的特征。
RIPL:在 UDP 测试中,校验 ICMP 返回包的 IP 总长度,与预期值对比(如 328 字节对应 “G”)。
RID:校验 ICMP 返回包的 IP ID 是否与发送时一致,用于判断系统对 IP ID 的处理策略。
RIPCK:验证 ICMP 返回包的 IP 校验和完整性,判断系统是否修改了校验和。
RUCK:检查返回的 UDP 包校验和是否正确,反映系统对 UDP 校验的处理机制。
RUD:验证返回的 UDP 数据是否完整,辅助判断网络传输中的数据一致性。
CD:对比两个 ICMP 响应的代码值,判断其一致性(如相同值、与发送方一致或其他),用于识别系统响应模式。
在生成上面的指标之后,就获得了这个网络设备的指纹。但是现在还不知道这个设备是什么,需要拿着这些计算出的指标,在 nmap-os-db文件中查找比对。例如下面的这个指纹库的样例,如果计算出的指纹和如下数据值范围有可观的相似度,那么就说明当前扫描到的这个设备,是一个 3com 或者是一个 华为的交换机。
# 3Com Switch 4210 26-Port Software Version 3Com OS V3.01.01s56, Bootrom Version is 4.01
# Quidway S5624F, VRP software, Version 3.10, Release 1510P02
Fingerprint 3Com 4210, or Huawei Quidway S3928P-EI or S5624F switch (VRP 3.10)
Class 3Com | embedded || switch
Class Huawei | VRP | 3.X | switch
CPE cpe:/o:huawei:vrp:3.10 auto
SEQ(SP=FF-109%GCD=1-6%ISR=105-111%TI=I%II=I%SS=S%TS=U)
OPS(O1=M200%O2=M200%O3=M200%O4=M200%O5=M200%O6=M200)
WIN(W1=2000%W2=2000%W3=2000%W4=2000%W5=2000%W6=2000)
ECN(R=Y%DF=N%T=FB-105%TG=FF%W=2000%O=M200%CC=N%Q=)
T1(R=Y%DF=N%T=FB-105%TG=FF%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=N)
T3(R=Y%DF=N%T=FB-105%TG=FF%W=1FC4%S=O%A=O%F=A%O=%RD=0%Q=)
T4(R=Y%DF=N%T=FB-105%TG=FF%W=2000%S=A%A=Z%F=R%O=%RD=0%Q=)
T5(R=Y%DF=N%T=FB-105%TG=FF%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=N%T=FB-105%TG=FF%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T7(R=Y%DF=N%T=FB-105%TG=FF%W=0%S=Z%A=S%F=AR%O=%RD=0%Q=)
U1(DF=N%T=FB-105%TG=FF%IPL=38%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=0%RUD=G)
IE(DFI=S%T=FB-105%TG=FF%CD=S)
在计算的过程中,每个指标需要按照不同权重加和。权重表在 nmap-os-db 文件的最开始处。其内容如下所示。
MatchPoints
SEQ(SP=25%GCD=75%ISR=25%TI=100%CI=50%II=100%SS=80%TS=100)
OPS(O1=20%O2=20%O3=20%O4=20%O5=20%O6=20)
WIN(W1=15%W2=15%W3=15%W4=15%W5=15%W6=15)
ECN(R=100%DF=20%T=15%TG=15%W=15%O=15%CC=100%Q=20)
T1(R=100%DF=20%T=15%TG=15%S=20%A=20%F=30%RD=20%Q=20)
T2(R=80%DF=20%T=15%TG=15%W=25%S=20%A=20%F=30%O=10%RD=20%Q=20)
T3(R=80%DF=20%T=15%TG=15%W=25%S=20%A=20%F=30%O=10%RD=20%Q=20)
T4(R=100%DF=20%T=15%TG=15%W=25%S=20%A=20%F=30%O=10%RD=20%Q=20)
T5(R=100%DF=20%T=15%TG=15%W=25%S=20%A=20%F=30%O=10%RD=20%Q=20)
T6(R=100%DF=20%T=15%TG=15%W=25%S=20%A=20%F=30%O=10%RD=20%Q=20)
T7(R=80%DF=20%T=15%TG=15%W=25%S=20%A=20%F=30%O=10%RD=20%Q=20)
U1(R=50%DF=20%T=15%TG=15%IPL=100%UN=100%RIPL=100%RID=100%RIPCK=100%RUCK=100%RUD=100)
IE(R=50%DFI=40%T=15%TG=15%CD=100)
操作系统扫描的结果最多会有 10 个,且默认保留大于 0.85 的指纹数据。
指纹的自定义
如果发现Nmap扫描不准,例如把打印机识别成了智能马桶,可以将这个打印机的指纹添加到指纹库中,下次再扫描时就会显示正确的结果了。也可以贡献这些数据到nmap开源项目中。
原文始发于微信公众号(青木生长):网络安全对抗演练:扫描器 Nmap 的设备指纹算法
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论