Nmap支持的TCP/IP指纹识别方法
Nmap操作系统指纹识别通过向目标机器的已知打开和关闭端口发送多达16个TCP、UDP和ICMP探测来工作。这些探测是专门设计来利用标准协议rfc中的各种歧义。然后Nmap监听响应。这些响应中的数十个属性被分析和组合以生成指纹。每个探测包都被跟踪,如果没有响应,则至少重发一次。所有的报文都是IPv4报文,IP ID值是随机的。如果没有找到打开的TCP端口,则跳过对该端口的探测。对于关闭的TCP或UDP端口,Nmap将首先检查是否找到了这样的端口。如果没有,Nmap将随机选择一个端口,并希望得到最好的结果。
下面的部分技术性很强,揭示了Nmap操作系统检测的隐藏工作原理。即使不理解这一点,也可以有效地使用Nmap,尽管这些材料可以帮助您更好地理解远程网络,并检测和解释某些异常。另外,其中一些技术非常酷。匆忙的读者可能会跳到“处理错误识别和身份不明的宿主”一节。但是对于那些已经准备好了解TCP显式拥塞通知,保留UDP报头位,初始序列号,伪造标志和圣诞树数据包的人:请继续阅读!
图8.1 ICMP回声请求或应答报头布局
图8.2 ICMP目的不可达报头布局
探测器发送
本节描述Nmap作为TCP/IP指纹识别的一部分发送的每个IP探测。它指的是Nmap响应测试和TCP选项,这些将在下一节中解释。
序列生成(SEQ, OPS, WIN, T1)
发送一系列6个TCP探测来生成这4条测试响应行。两个探测器的发送间隔正好是100毫秒,所以总共花费的时间是500毫秒。精确的定时非常重要,因为我们检测到的一些序列算法(初始序列号、IP id和TCP时间戳)与时间有关。选择这个计时值为500 ms,这样我们就可以可靠地检测到常见的2 Hz TCP时间戳序列。
每个探针都是一个TCP SYN包,发送到远程机器上被检测到的开放端口。序列和确认号是随机的(但是保存了以便Nmap可以区分响应)。检测精度要求探针一致性,因此即使用户请求带有-data-length的数据有效负载,也没有数据有效负载。
这些数据包所使用的TCP选项和TCP窗口字段值各不相同。下面的列表提供了所有六个数据包的选项和值。列出的窗口字段值不反映窗口缩放。EOL是结束选项列表选项,许多嗅探工具默认情况下不显示该选项。
Packet 1: window scale (10), NOP, MSS (1460), timestamp (TSval: 0xFFFFFFFF; TSecr: 0), SACK permitted. The window field is 1.
Packet 2: MSS (1400), window scale (0), SACK permitted, timestamp (TSval: 0xFFFFFFFF; TSecr: 0), EOL. The window field is 63.
Packet 3: Timestamp (TSval: 0xFFFFFFFF; TSecr: 0), NOP, NOP, window scale (5), NOP, MSS (640). The window field is 4.
Packet 4: SACK permitted, Timestamp (TSval: 0xFFFFFFFF; TSecr: 0), window scale (10), EOL. The window field is 4.
Packet 5: MSS (536), SACK permitted, Timestamp (TSval: 0xFFFFFFFF; TSecr: 0), window scale (10), EOL. The window field is 16.
Packet 6: MSS (265), SACK permitted, Timestamp (TSval: 0xFFFFFFFF; TSecr: 0). The window field is 512.
ICMP echo(IE)
IE测试包括向目标设备发送两个ICMP echo - request报文。第一个具有IP DF位设置、服务类型(TOS)字节值0、代码9(即使它应该是0)、序列号295、随机IP ID和ICMP请求标识符,以及120字节的数据有效负载0x00。
第二个ping查询与此类似,只是使用了TOS 4 (IP_TOS_RELIABILITY),代码为0,发送150字节的数据,并且ICMP请求ID和序列号比前一个查询值增加1。
这两种探针的结果被合并成一条IE行,其中包含R、DFI、T、TG和CD测试。只有当两个探测都引起响应时,R值才为真(Y)。T和CD值仅用于对第一次探测的响应,因为它们极不可能不同。DFI是针对这种特殊的双探测ICMP情况的自定义测试。
这些ICMP探测紧跟在TCP序列探测之后,以确保共享IP ID序列号测试的有效结果(参见“共享IP ID序列布尔值(SS)”一节)。
TCP显式拥塞通知
该探测测试目标TCP栈中是否支持显式拥塞通知(ECN)。ECN是一种提高互联网性能的方法,它允许路由器在开始丢弃数据包之前发出拥塞问题的信号。它在RFC 3168中有文档记录。Nmap通过发送一个设置了ECN CWR和ECE拥塞控制标志的SYN包来测试这一点。对于不相关的(与ECN)测试,即使没有设置紧急标志,也使用0xF7F5的紧急字段值。确认号为零,序列号为随机,窗口大小字段为3,并设置紧接在CWR位之前的保留位。TCP选项有:WScale(10)、NOP、MSS(1460)、SACK allowed、NOP、NOP。探针被发送到一个开放的端口。
如果收到响应,则执行R、DF、T、TG、W、O、CC和Q测试并记录。
TCP (T2–T7)
6个T2 ~ T7测试分别发送1个TCP探测报文。除了一个例外,每种情况下的TCP选项数据都是(十六进制)03030a0102040109080affffff000000000402。这20个字节对应于窗口尺度(10),NOP, MSS(265),时间戳(TSval: 0xFFFFFFFF;TSecr: 0),则允许SACK。唯一的例外是T7使用的Window scale值为15而不是10。每个探头的可变特性描述如下:
T2 sends a TCP null (no flags set) packet with the IP DF bit set and a window field of 128 to an open port.
T3 sends a TCP packet with the SYN, FIN, URG, and PSH flags set and a window field of 256 to an open port. The IP DF bit is not set.
T4 sends a TCP ACK packet with IP DF and a window field of 1024 to an open port.
T5 sends a TCP SYN packet without IP DF and a window field of 31337 to a closed port.
T6 sends a TCP ACK packet with IP DF and a window field of 32768 to a closed port.
T7 sends a TCP packet with the FIN, PSH, and URG flags set and a window field of 65535 to a closed port. The IP DF bit is not set.
在每种情况下,指纹上都会添加一行,其中包含R、DF、T、TG、W、S、a、F、O、RD和Q测试的结果。
UDP (U1)
该探测是发送到关闭端口的UDP报文。字符' C ' (0x43)在数据字段中重复300次。对于允许我们进行设置的操作系统,IP ID值设置为0x1042。如果端口确实关闭,并且没有设置防火墙,Nmap期望收到ICMP端口不可达消息作为返回。然后对该响应进行R、DF、T、TG、IPL、UN、RIPL、RID、RIPCK、RUCK和RUD测试。
响应测试
前一节描述了Nmap发送的探测,这一节通过描述对响应执行的测试弹幕来完成这个谜题。为节省空间,此处使用的短名称为nmap-os-db指纹数据库中的短名称,如DF、R、RIPCK等。除非另有说明,所有数值测试值均以十六进制表示,不带前导零。这些测试的记录顺序大致与它们出现在指纹中的顺序一致。
TCP ISN最大公约数
SEQ测试向目标机器的一个开放端口发送6个TCP SYN包,并收集返回的SYN/ACK包。每个SYN/ACK包都包含一个32位的初始序列号(ISN)。这个测试试图确定目标主机增加这些值的最小值。例如,许多主机(尤其是老主机)总是以64,000的倍数增加ISN。
计算这个值的第一步是创建探针响应之间的差异数组。第一个元素是第一个和第二个探针响应isn之间的差异。第二个要素是第二种和第三种反应之间的差异。如果Nmap接收到所有六个探测的响应,则有五个元素。由于接下来的几节将引用该数组,因此我们将其称为diff1。如果一个ISN小于前一个ISN, Nmap将查看从第一个值中减去的值的数量以获得第二个值,以及必须计算的值的数量(包括将32位计数器包装回零)。这两个值中较小的值存储在diff1中。所以0x20000和0x15000之间的差是0xB000。0xFFFFFF00与0xC000的差值为0xC0FF。这个测试值然后记录所有这些元素的最大公约数。该GCD也用于计算SP结果。
TCP ISN计数器速率(ISR)
该值报告返回的TCP初始序列号的平均增长率。回想一下,在每两个连续的探测响应之间取一个差值,并存储在前面讨论的diff1数组中。这些差异分别除以发送产生它们的两个探测器之间经过的时间(以秒为单位,通常约为0.1)。结果是一个数组,我们将其称为seq_rates,其中包含ISN计数器每秒增加的速率。对于每个diff1值,数组有一个元素。取数组值的平均值。如果该平均值小于1(例如使用常数ISN),则ISR为零。否则,ISR是该平均值的二进制对数(以2为底的对数)的8倍,四舍五入到最接近的整数。
TCP ISN序列可预测性索引(SP)
当ISR测试测量初始序列号增量的平均速率时,这个值测量ISN可变性。它粗略地估计了从已知的六个探测器响应序列中预测下一个ISN的困难程度。该计算使用上一节中讨论的差值数组(seq_rates)和GCD值。
只有在至少看到四个响应时才执行此测试。如果先前计算的GCD值大于9,则先前计算的seq_rates数组的元素除以该值。我们不会对较小的GCD值进行除法,因为这些值通常是偶然产生的。然后取结果值数组的标准偏差。如果结、小于等于1,则SP为0。否则,计算结果的二进制对数,然后将其乘以8,四舍五入到最接近的整数,并存储为SP。
请记住,此测试仅用于OS检测目的,而不是对目标ISN生成器的全面审计。存在许多算法弱点,即使具有高SP值也容易预测。
IP ID序列生成算法(TI, CI, II)
有三个测试检查响应的IP报头ID字段。TI基于对TCP SEQ探测的响应。CI来自对发送到一个关闭端口(T5、T6和T7)的三个TCP探测的响应。II来自对两个IE ping探测的ICMP响应。对于TI,必须至少收到三个回复才能包括测试;对于CI,至少需要两个响应;对于II,两个ICMP响应都必须被接收。
对于这些测试中的每一个,目标的IP ID生成算法都基于下面的算法进行分类。注意到测试之间的细微差异。注意,差值假设计数器可以换行。因此,IP ID为65100与值为700之间的差值为1136。2000跟1100的差是64636。以下是计算细节:
1.如果所有ID号都为0,则测试例的值为Z。
2.如果IP ID序列至少增加20,000,则该值为RD(随机)。这个结果对于II来说是不可能的,因为没有足够的样本来支持它。
3.如果所有的IP id都相同,则设置为十六进制的值。
4.如果两个连续id之间的任何一个差值超过1000,并且不能被256整除,则测试的值为RI(随机正增量)。如果差值可以被256整除,那么它必须至少为256,000才能产生这个RI结果。
5.如果所有的差都能被256整除且不大于5120,则测试设置为BI(破碎增量)。这种情况发生在像Microsoft Windows这样的系统中,其中IP ID是以主机字节顺序而不是网络字节顺序发送的。它工作得很好,没有任何形式的RFC冲突,尽管它确实泄露了主机架构的细节,这对攻击者很有用。
6.如果所有的差值都小于10,则值为I(增量)。我们在这里允许最大差异为10(而不是要求顺序排序),因为来自其他主机的流量可能会导致序列间隙。
7.如果以上步骤都没有识别出生成算法,则从指纹中省略该测试项。
共享IP ID序列布尔值(SS)
该布尔值记录目标器是否在TCP协议和ICMP协议之间共享其IP ID序列。如果我们的六个TCP IP ID值是117、118、119、120、121和122,那么我们的ICMP结果是123和124,很明显,不仅两个序列都是增量的,而且它们都是同一个序列的一部分。另一方面,如果TCP的IP ID值为117 ~ 122,而ICMP的IP ID值为32917和32918,则表示使用了两种不同的序列。
只有当II是RI, BI,或者I和TI相同时才包括此测试。如果包含SS,则如果序列是共享的,结果是S,如果不是,结果是O(其他)。该决定是由以下算法: 设avg为最后一个TCP序列响应IP ID减去第一个TCP序列响应IP ID,除以探针数的TS是另一种测试,它试图根据如何生成一系列数字来确定目标操作系统的特征。它将查看对SEQ探测的响应中的TCP时间戳选项(如果有的话)。它检查TSval(选项的前四个字节)而不是回显的TSecr(最后四个字节)值。它取每个连续TSval之间的差值,并将其除以Nmap发送生成这些响应的两个探测之间所经过的时间。结果值给出了时间戳每秒增量的速率。Nmap计算所有连续探测的平均每秒增量,然后计算TS如下:
1.如果任何响应都没有时间戳选项,则TS设置为U(不支持)。
2.如果任何一个时间戳值为零,则TS被设置为0。
3.如果平均每秒增量在0 ~ 5.66、70 ~ 150或150 ~ 350之间,则TS分别设置为1、7或8。这三个范围得到特殊处理,因为它们对应于许多主机使用的2hz, 100hz和200hz频率。
4.在所有其他情况下,Nmap记录每秒平均增量的二进制对数,四舍五入到最接近的整数。由于大多数主机使用1000hz频率,所以A是常见的结果。差值。如果探针1返回的IP ID为10000,探针6返回的IP ID为20000,则avg =(20000−10000)/(6−1),即2000。
5.如果第一个ICMP回声响应IP ID小于最后一个TCP序列响应IP ID加上3倍的平均值,则SS结果为s,否则为0。
TCP时间戳选项算法(TS)
TS是另一种测试,它试图根据如何生成一系列数字来确定目标操作系统的特征。它将查看对SEQ探测的响应中的TCP时间戳选项(如果有的话)。它检查TSval(选项的前四个字节)而不是回显的TSecr(最后四个字节)值。它取每个连续TSval之间的差值,并将其除以Nmap发送生成这些响应的两个探测之间所经过的时间。结果值给出了时间戳每秒增量的速率。Nmap计算所有连续探测的平均每秒增量,然后计算TS如下:
1.如果任何响应都没有时间戳选项,则TS设置为U(不支持)。
2.如果任何一个时间戳值为零,则TS被设置为0。
3.如果平均每秒增量在0 ~ 5.66、70 ~ 150或150 ~ 350之间,则TS分别设置为1、7或8。这三个范围得到特殊处理,因为它们对应于许多主机使用的2hz, 100hz和200hz频率。
4.在所有其他情况下,Nmap记录每秒平均增量的二进制对数,四舍五入到最接近的整数。由于大多数主机使用1000hz频率,所以A是常见的结果。
TCP 选项(O, O1–O6)
该测试记录报文中的TCP头选项。它保留了原来的顺序,还提供了一些关于选项值的信息。由于RFC 793不要求任何特定的排序,因此实现通常会提出唯一的排序。有些平台没有实现所有选项(当然,它们是可选的)。当您将所有这些排列与实现使用的不同选项值的数量结合起来时,该测试提供了真正的信息宝库。这个测试的值是一个字符串,表示正在使用的选项。有几个选项接受紧接在字符后面的参数。支持的选项和参数都显示在表8.1中。
| 选项名 | 字符 | Argument (if any) |
|---|---|---|
| End of Options List (EOL) | L | |
| No operation (NOP) | N | |
| Maximum Segment Size (MSS) | M | 附加该值。许多系统都回显相应探针中使用的值。 |
| Window Scale (WS) | W | 附加实际值 |
| Timestamp (TS) | T | 后面跟着两个二进制字符,分别表示TSval和TSecr值。如果字段为0,则字符为0,否则为1 |
| Selective ACK permitted (SACK) |
Table 8.1. 0test 值 Option Name Character Argument (if any) End of Options List (EOL) L No operation (NOP) N Maximum Segment Size (MSS) M The value is appended. Many systems echo the value used in the corresponding probe. Window Scale (WS) W The actual value is appended. Timestamp (TS) T The T is followed by two binary characters representing the TSval and TSecr values respectively. The characters are 0 if the field is zero and 1 otherwise. Selective ACK permitted (SACK) S
例如,字符串M5B4NW3NNT11表示数据包包含MSS选项(值0x5B4),后跟NOP。接下来是一个窗口缩放选项,其值为3,然后是两个nop。最后一个选项是时间戳,它的两个字段都不为零。如果响应中没有TCP选项,则测试将存在,但值字符串将为空。如果没有返回探针,则省略该测试。
虽然这个测试通常被命名为O,但是为序列生成目的发送的6个探针是一个特例。它们被插入到特殊的OPS测试线路中,并以O1到O6的名称来区分它们与哪个探测包相关。“O”代表“options”。尽管名称不同,但每个测试O1到O6的处理方式与其他O测试完全相同。
TCP初始窗口大小(W, W1-W6)
该测试只记录收到报文的16位TCP窗口大小。它非常有效,因为已知至少有一个操作系统可以发送80多个值。缺点是一些操作系统本身就有十几个可能的值。这将导致假阴性结果,直到我们收集操作系统使用的所有可能的窗口大小。
虽然这个测试通常被命名为W,但是为序列生成目的发送的6个探针是一个特例。它们被插入到一个特殊的WIN测试行上,并取W1到W6的名称。记录所有序列号探测的窗口大小,因为它们在TCP MSS选项值上不同,这导致一些操作系统发布不同的窗口大小。尽管名称不同,但每个测试的处理方式完全相同。
响应性(R)
该测试只是记录目标是否响应给定的探测。取值为Y和n。如果没有应答,则省略测试的其余字段。
此测试的风险包括被防火墙丢弃的探测。这导致受试者指纹中的R=N。然而,如果目标操作系统经常应答,则nmap-os-db中的参考指纹可能具有R=Y。因此,防火墙可能会阻止正确的操作系统检测。为了减少这个问题,参考指纹通常会从IE和U1探针中省略R=Y测试,这是最可能被丢弃的探针。此外,如果Nmap缺少一个目标的关闭TCP端口,即使它尝试的端口没有响应,它也不会为T5、T6或T7测试设置R=N。毕竟,缺少一个关闭端口可能是因为它们都被过滤了。
IP不分段位(DF)
IP报头包含一个比特,它禁止路由器对数据包进行分片。如果数据包太大,路由器无法处理,它们将不得不丢弃它(理想情况下返回“目的地不可达,需要分片”响应)。如果设置了位,该测试记录Y,如果没有设置,则记录N
不分段(ICMP) (DFI)
这只是用于特殊IE探针的DF测试的修改版本。比较了发送的两个ICMP回声请求探测的不分段位的结果。它有四个可能的值,如表8.2所示。
表8.2 DFI 测试值
| 值 | 描述 |
|---|---|
| N | 两个ping响应都没有设置DF位。 |
| S | 两个响应都响应探针的DF值。 |
| Y | 两个响应DF位都被设置。 |
| O | 剩下的另一个组合——两个响应都切换了DF位。 |
IP初始生存时间(T)
IP数据包包含一个名为生存时间(TTL)的字段,该字段在每次通过路由器时递减。如果该字段为零,则必须丢弃该报文。这可以防止数据包无休止地循环。因为操作系统的TTL起始值不同,所以它可以用于操作系统检测。Nmap通过检查对U1探测的ICMP端口不可达响应来确定它离目标有多少跳。该响应包括目标接收到的原始IP数据包,包括已经递减的TTL字段。通过从发送的TTL中减去这个值,我们就知道机器离我们有多少跳。然后,Nmap将该跳距离添加到探测响应TTL中,以确定发送ICMP探测响应包时的初始TTL是多少。初始TTL值作为T结果存储在指纹中。
尽管像TTL这样的8位字段永远不能保存大于0xFF的值,但这个测试偶尔会得到0x100或更高的值。当系统(可能是源系统、目标系统或介于两者之间的系统)损坏或无法正确减少TTL时,就会发生这种情况。它也可能由于不对称路由而发生。
当跳距为零(本地主机扫描)或1(在同一网段上)时,Nmap还可以从系统接口和路由表中学习。当Nmap为用户打印跳距离时使用此值,但不用于T结果计算。
IP初始生存时间猜测(TG)
Nmap没有收到对U1探测的响应是很常见的,这使得Nmap无法了解目标的跳数。防火墙和NAT设备喜欢阻止未经请求的UDP数据包。但是,由于常见的TTL值分布得很广,而且目标之间的距离很少超过20跳,因此Nmap无论如何都可以做出很好的猜测。大多数系统发送的数据包的初始TTL分别为32、60、64、128或255。因此,响应中接收到的TTL值将四舍五入到32、64、128或255中的下一个值。60不在这个列表中,因为它不能可靠地与64区分开来。反正也很少见到。结果猜测存储在TG字段中。如果发现了实际的TTL (T)值,则不会在对象指纹中打印此TTL猜测字段。
显式拥塞通知(CC)
此测试仅用于ECN探针。该探测是一个SYN包,其中包括CWR和ECE拥塞控制标志。当收到响应SYN/ACK时,检查这些标志以设置CC(拥塞控制)测试值,如表8.3所示。
表8.3 CC 测试值
| 值 | 描述 |
|---|---|
| Y | 只设置ECE位(不设置CWR)。该主机支持ECN。 |
| N | 这两个位都没有设置。目标不支持ECN。 |
| S | 两个位都设置好了。目标不支持ECN,但它会回显它认为是保留位的内容。 |
| O | 这两个比特的剩余组合(其他)。 |
TCP杂项特性(Q)
这将测试一些实现在其TCP堆栈中存在的两个杂项。首先,TCP报头中的保留字段(就在报头长度之后)是非零的。这特别可能发生在响应ECN测试时,因为它在探针中设置了保留位。如果在数据包中看到这种情况,则在Q字符串中记录一个“R”。
当没有设置URG标志时,Nmap测试的另一个奇怪的地方是非零的紧急指针字段值。这也特别可能出现在ECN探针的响应中,它设置了一个非零的紧急字段。当看到这种情况时,会在Q字符串后面添加一个“U”。
Q字符串必须始终按字母顺序生成。如果没有杂项,Q测试是空的,但仍然显示。
TCP序列号(S)
该测试检查TCP报头中的32位序列号字段。这个测试不像其他测试那样记录字段值,而是检查它与引发响应的探测的TCP确认号的比较。然后记录相应的值,如表8.4所示。
表8.4 S 测试值
| 值 | 描述 |
|---|---|
| Z | 序号为0。 |
| A | 序列号与探针中的确认号相同。 |
| A+ | 序号等于探针中的确认号加1。 |
| O | 序列号是别的东西(其他)。 |
TCP确认号(A)
这个测试与S相同,只是它测试响应中的确认号与各自探测中的序列号的比较情况。表8.5给出了四个可能的值。
表8.5 A 测试值
| 值 | 描述 |
|---|---|
| Z | 确认号为零。 |
| S | 确认号与探针中的序列号相同。 |
| S+ | 确认号与探针中的序列号加1相同。 |
| O | 确认号是别的东西(其他)。。 |
TCP标志(F)
该字段记录响应中的TCP标志。每个字母代表一个标志,它们出现的顺序与TCP数据包中的顺序相同(从左边的高位到低位)。因此,AS值代表ACK和SYN位的设置,而SA值是非法的(顺序错误)。可能的标志见表8.6。
表8.6 F 测试值
| 字符 | 标志名称 | 标志位值 |
|---|---|---|
| E | ECN Echo (ECE) | 64 |
| U | Urgent Data (URG) | 32 |
| A | Acknowledgment (ACK) | 16 |
| P | Push (PSH) | 8 |
| R | Reset (RST) | 4 |
| S | Synchronize (SYN) | 2 |
| F | Final (FIN) | 1 |
TCP RST数据校验和(RD)
一些操作系统返回ASCII数据,例如重置包中的错误消息。这是RFC 1122的4.2.2.12节明确允许的。当Nmap遇到这样的数据时,它执行CRC32校验和并报告结果。当没有数据时,RD置零。少数几个可能在其重置包中返回数据的操作系统是HP-UX和Mac OS X之前的Mac OS版本。
IP总长(IPL)
该测试记录IP报文的总长度,单位为8字节。仅用于U1测试触发的端口不可达响应。这个长度因实现而异,因为它们可以选择包含多少来自原始探测的数据,只要它们满足RFC 1122的最低要求。该要求包括原始IP报头和至少8个字节的数据。
未使用的端口不可达字段非零(UN)
ICMP端口不可达消息头有8个字节长,但只使用前4个字节。RFC 792规定最后四个字节必须为零。一些实现(主要是以太网交换机和一些专门的嵌入式设备)设置了它。最后四个字节的值记录在这个字段中
返回探针IP总长度值(RIPL)
ICMP端口不可达消息(作为对U1探测的响应而发送)需要包含生成它们的IP头。这个报头应该在他们收到它的时候返回,但是一些实现由于在IP处理期间所做的更改而返回一个损坏的版本。这个测试只记录返回的IP总长度值。如果返回正确的值0x148(328),则存储值G(永久)而不是实际值。
返回的探测IP ID值(RID)
U1探针的静态IP ID值为0x1042。如果在端口不可达消息中返回该值,则为该测试存储值G。否则,将存储返回的确切值。有些系统,比如Solaris,会对Nmap发送的原始IP数据包的IP ID值进行操作。在这种情况下,跳过此测试。我们发现一些系统,特别是HP和Xerox打印机,会翻转字节并返回0x4210。
返回的探测IP校验和值的完整性(RIPCK)
IP校验和是一个我们不希望在端口不可达消息中返回时保持不变的值。毕竟,传输过程中的每个网络跳都会随着TTL的减小而改变校验和。然而,我们收到的校验和应该与封装的IP数据包匹配。如果是,则为该测试存储值G (good)。如果返回值为零,则存储Z。否则结果为I(无效)。
返回探测UDP校验和完整性(RUCK)
UDP报头校验和值应该与发送时完全一样返回。如果是,则为本次测试记录G。否则,记录实际返回的值。
返回UDP数据的完整性(RUD)
这个测试检查返回的UDP有效载荷的完整性(可能被截断)。如果所有有效载荷字节都是预期的' C ' (0x43),或者有效载荷被截断为零长度,则记录G;否则,记录I (invalid)。
ICMP响应码(CD)
ICMP回显应答(类型为0)报文的码值应该为0。但是有些实现错误地发送了其他值,特别是当echo请求具有非零代码时(就像IE测试中的一个那样)。两个探针的响应码值组合成一个CD值,如表8.7所示。
表8.7 CD 测试值
| 值 | 描述 |
|---|---|
| Z | 两个代码值都为零。 |
| S | 这两个代码值与相应探测中的值相同。 |
| 当它们都使用相同的非零数字时,显示在这里。 | |
| O | 任何其他组合。 |