预备知识
ICMP协议概述
ICMP是Internet Control Message Protocol的缩写,即互联网控制报文协议。它是TCP/IP协议族的一个子协议,用于IP主机、路由器直接传递控制信息。控制信息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些消息虽然并不传输用户数据,但是对于用户数据的传递起着非常重要的作用。
学习ICMP的重要性
学习ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点就决定了它非常容易被用于攻击网络上的路由器和主机。例如,用户可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定,向主机发起Ping of Death(死亡之Ping)攻击。Ping of Death攻击的原理就是当ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,导致主机死机。 此外,向目标主机长时间、连续、大量的发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理,疲于奔命。
Echo请求与响应
ICMP因为其ping功能而著名。ping是用来检测一个设备的可连接性,大部分人都会对ping很熟悉。在命令行中输入ping <ip地址>。如果目标设备在线,用户的计算机就会收到目标主机的响应,并且没有防火墙影响。 基本上来说,ping每次向一个设备发送一个数据包,并等待回复,以确定设备是否可连接。例如,当主机A向主机B发送一个Echo Ping请求包时,主机B就会向主机A发送一个Echo ping响应包。
路由跟踪
路由跟踪功能是用来识别一个设备到另一个设备的网络路径。在一个简单的网络上,这个网络路径可能只经过一个路由器,甚至一个都不经过。但在复杂的网络中,数据包可能会经过数十个路由器才会到达最终目的地。在通信过程中,出现故障时可能无法判断问题出在哪,这时候就可以通过路由跟踪功能,找出网络故障的位置。
实验目的
1)熟悉并掌握Wireshark的基本操作。 2)加深对常用网络协议的理解,提高就业机会。 3)培养学生理论联系实践的研究兴趣。
实验环境
服务器:windows系统,IP地址:10.1.1.33 测试者:windows系统,IP地址:10.1.1.142 在网络中典型使用ICMP协议的程序就是ping命令。所以,需要选择两台主机进行ping通信。在本次实验中,在测试者机器上开启Wireshark工具捕获数据包。
实验步骤一
任务描述:获取正常的ICMP数据包、请求超时的数据包、主机不可达的数据包。 首先运行命令:
netsh interface ip set address "本地连接 4" static 10.1.1.142 255.255.255.0 10.1.1.90 0
这时会断一下连接,是正常情况。
一、捕获正常的ICMP数据包
在这里,我们通过ping命令来获取,先启动Wireshark,并在Filter里输入icmp进行过滤,如下: 使用测试者机器,ping服务器的IP,如下: 以上输出的信息就是ping命令运行后的结果。在Windows操作系统中,ping默认响应4个数据包。执行完以上命令后,返回到Wireshark界面,如下: 从该界面可以很清楚的看到,现在捕获到了ICMP协议数据包。在Wireshark的状态栏中,可以看到共捕获了8个数据包。这是因为包括4个ping请求包和4个ping响应包。在Windows和Linux下执行ping命令后,只能看到响应的数据包。所以,在前面仅看到了4个数据包。 在前面介绍ICMP协议时,提到ICMP协议实际是用来判断网络的链接情况的,如网络不通、目标主机不可达、请求超时等。通过Wireshark都可以详细分析这些数据包。上面的数据包是网络正常通行情况下的数据包,下面来介绍捕获一些出错的数据包。
二、捕获请求超时和主机不可达的数据包
当网络连接性不好时,执行ping命令,通常会返回请求超时的数据包,默认情况下ping命令发出的Echo ping请求后,如果2秒内没有收到Echo ping响应的话,就会收到请求超时的数据包。下面演示捕获请求超时的数据包。 启动Wireshark,并配置过滤icmp条件,与前面相同,此时通过执行tracert命令,捕获响应超时的数据包,如下(因为实验环境无法访问互联网,这里会显示无法访问目标主机,这一步可以在自己的电脑上完成): 执行以上命令后,Wireshark将捕获到相关的数据包。在以上命令中,tracert是一个路由跟踪命令。所以,如果访问一个互联网地址(4.2.2.1),会经过好多个路由,这时候也就容易产生响应超时和主机不可达的数据包。另外需要注意的是,tracert命令执行后,会根据当时的网络情况,出现不同的信息显示,这里不多介绍此命令。 返回到Wireshark主界面,如下: 从Wireshark的Packet List面板中的info列中可以看到某些包的信息为Time-to-live execded(超时),这表示该包响应超时。信息为Destination unreachable,表示为目标不可达的帧数据。 这里给大家简单科普下目标主机不可达的一般情况:当中间路由器不能给数据包找到路由器或目的主机不能交付数据包时,中间路由器或目的主机将会丢弃这个数据包。然后,发送这个数据包的源点发送目标主机不可达的报文。由此可以知道,其他方法也可以获取目标主机不可达的数据包,比如ping一个不存在的主机等方法,因为无法访问互联网,这里的4.2.2.1就会返回不可达。
实验步骤二
任务描述:分析ICMP数据包。 按照惯例,这里先介绍下ICMP的首部结构,让学生有个大致的了解。
一、ICMP首部
ICMP协议首部格式: 在上面的表中,ICMP首部的各字段含义如下所示: 类型(Type):ICMP消息基于RFC规范的类型域分类。 代码(Code):ICMP消息基于RFC规范的子类型。 校验和(Checksum):用来保证ICMP头和数据在抵达目的地时的完整性。 可变域(Variable):依赖于类型和代码域的部分。 在上表中有个ICMP类型字段,这里详细介绍一下ICMP中可用的类型。
1.ICMP请求报文类型
ICMP请求报文可用的类型如下: ICMP请求报文类型:
2.ICMP响应报文类型
ICMP请求报文可用的类型如下: ICMP响应报文类型:
3.ICMP协议提供的诊断报文类型
ICMP协议提供的诊断报文类型:
二、分析ICMP数据包——Echo Ping请求包
下面以捕获的icmp-echo ping.pcapng文件为例,分析ICMP数据包。打开icmp-echo ping.pcapng,如下: 在该文件中包含8个数据包,这里我们以前两个数据帧为例(帧号为2和3),分别分析Echo Ping请求包和Echo Ping响应包。Echo Ping请求包如下: 以上信息显示了Echo Ping请求包的详细信息。在Wireshark的Packet Details面板中,可以看到四行信息。学习过以前Wireshark抓包分析的同学,可能对前三行信息都比较熟悉,这里不过多重复。我们来直接看ICMP首部的详细信息,并对其内容进行详细介绍,如下:
Internet Control Message Protocol
Type: 8 (Echo (ping) request) #类型
Code: 0 #代码
Checksum: 0x4d35 [correct] #校验和
Identifier (BE): 1 (0x0001) #标识符(BE)
Identifier (LE): 256 (0x0100) #标识符(LE)
Sequence number (BE): 38 (0x0026) #序列号(BE)
Sequence number (LE): 9728 (0x2600) #序列号(LE)
Response frame: 3 #响应帧
Data (32 bytes) #数据
Data: 6162636465666768696a6b6c6d6e6f707172737475767761...
Length: 32
以上是ICMP首部的详细介绍。从以上信息中,可以看到Echo Ping请求包的类型为8,代码为0,还有校验和、标识符、序列号等信息。包中的序列号是用来匹配请求和响应包的,请求包和响应包的序列号是相同的。 这里需要注意的是,echo和ping经常会被混淆,大家请记住,ping实际上是一个工具的名字,ping工具用来发送ICMP echo请求数据包。 将该首部中的每个字段添加到ICMP首部,显示结果如下: ICMP协议首部格式:
三、分析ICMP数据包——Echo Ping响应包
Echo Ping响应包如下图: 我们还是直接来分析ICMP首部,如下:
Internet Control Message Protocol
Type: 0 (Echo (ping) reply) #类型
Code: 0 #代码
Checksum: 0x5535 [correct] #校验和
Identifier (BE): 1 (0x0001) #标识符(BE)
Identifier (LE): 256 (0x0100) #标识符(LE)
Sequence number (BE): 38 (0x0026) #序列号(BE)
Sequence number (LE): 9728 (0x2600) #序列号(LE)
Response frame: 2 #请求帧
Response time: 1.743 ms #响应时间
Data (32 bytes) #数据
Data: 6162636465666768696a6b6c6d6e6f707172737475767761...
Length: 32
从以上信息中,可以看到类型为0,代码为0,表示该包是一个Echo响应包。在该数据包中的序列号和帧号为2的数据包的序列号是相同的,说明这个数据包是响应帧数为2的数据包的Echo请求的。 将该首部中的每个字段添加到ICMP首部,显示结果如下: ICMP协议首部格式:
四、分析ICMP数据包——请求超时数据包
下面以icmmp.pcapng文件为例,来分析请求超时数据包,打开icmmp.pcapng文件,如下: 可以看到,在info列中,很多的数据包都是超时的,我们以帧数为26,对ICMP首部进行分析,如下: 协议内容较多,不着急慢慢来看。
Internet Control Message Protocol #ICMP协议
Type: 11 (Time-to-live exceeded) #类型为11,表示超时
Code: 0 (Time to live exceeded in transit) #代码为0
Checksum: 0xf4ff [correct] #校验和
Internet Protocol Version 4, Src: 10.1.1.142 (10.1.1.142), Dst: 4.2.2.1 (4.2.2.1) #IPv4首部信息
Version: 4 #IP协议版本
Header Length: 20 bytes #首部长度
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport)) #服务标识符
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
Total Length: 92 #总长度
Identification: 0x6eaa (28330) #标识符
Flags: 0x00 #标志
0... .... = Reserved bit: Not set
.0.. .... = Don't fragment: Not set
..0. .... = More fragments: Not set
Fragment offset: 0 #分片偏移
Time to live: 1 #生存期
Expert Info (Note/Sequence): "Time To Live" only 1
"Time To Live" only 1
Severity level: Note
Group: Sequence
Protocol: ICMP (1) #协议为ICMP
Header checksum: 0x3966 [validation disabled] #首部校验和
Good: False
Bad: False
Source: 10.1.1.142 (10.1.1.142) #源IP地址
Destination: 4.2.2.1 (4.2.2.1) #目标IP地址
Source GeoIP: Unknown #源IP地址地理位置
Destination GeoIP: Unknown #目标IP地址地理位置
Internet Control Message Protocol #ICMP协议
Type: 8 (Echo (ping) request) #类型
Code: 0 #代码
Checksum: 0xf7d4 #校验和
Identifier (BE): 1 (0x0001) #标识符(BE)
Identifier (LE): 256 (0x0100) #标识符(LE)
Sequence number (BE): 42 (0x002a) #序列号(BE)
Sequence number (LE): 10752 (0x2a00) #序列号(LE)
Data (64 bytes) #数据
Data: 000000000000000000000000000000000000000000000000...
Length: 64 #数据报的大小为64个字节
上面的信息比较多,同学们分析协议的时候,抓住重要部分即可。可以看出该包类型为11,代码为0,则表示该数据包是一个请求超时的数据包,并且还能发现这个数据包的TTL值为1,也就意味着这个数据包会在它遇到的第一个路由器处被丢掉。这就是因为主机(10.1.1.142)与4.2.2.1通信,之间会经过好多个路由器(至少会有一个),所以这个数据包将不会到达目的地。由此,就可以判断出该网络的链接情况了。
五、分析ICMP数据包——目标主机不可达数据包
接下来分析下主机不可达的数据包,也是本次实验的最后一部分内容。还是以icmmp.pcapng文件为例,如下: 可以看出,之前说的网络不通、主机不可达、请求超时等网络情况,很多时候都是集中出现。我们以帧号44为例,具体看下ICMP信息: 内容也不少,还是慢慢道来:
Internet Control Message Protocol #ICMP协议
Type: 3 (Destination unreachable) #类型为3,表示目标主机不可达
Code: 3 (Port unreachable) #代码为3,表示端口不可达。为1时,表示主机不可达
Checksum: 0x1a14 [correct] #校验和
Internet Protocol Version 4, Src: 10.1.1.142 (10.1.1.142), Dst: 172.19.104.2 (172.19.104.2)
Version: 4 #IP协议版本
Header Length: 20 bytes #首部长度
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport)) #服务标识符
0000 00.. = Differentiated Services Codepoint: Default (0x00)
.... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
Total Length: 78 #总长度
Identification: 0x6ec9 (28361) #标识符
Flags: 0x00 #标志
0... .... = Reserved bit: Not set
.0.. .... = Don't fragment: Not set
..0. .... = More fragments: Not set
Fragment offset: 0 #分片偏移
Time to live: 127 #生存期
Protocol: UDP (17) #协议使用UDP,此处也可以用TCP
Header checksum: 0xad31 [validation disabled] #首部校验和
Good: False
Bad: False
Source: 10.1.1.142 (10.1.1.142) #源IP地址
Destination: 172.19.104.2 (172.19.104.2) #目标IP地址
Source GeoIP: Unknown
Destination GeoIP: Unknown
User Datagram Protocol, Src Port: 137 (137), Dst Port: 137 (137)
Source Port: 137 (137) #源端口号
Destination Port: 137 (137) #目标端口号
Length: 58
Checksum: 0xe19c [unchecked, not all data available]
Good Checksum: False
Bad Checksum: False
Stream index: 6
根据以上介绍的重要字段可以看出,此包中的ICMP协议类型为3,代码为3,这表示该包是一个目标主机不可达的数据包。
|