ICMP隐蔽隧道攻击分析与检测(一)
• ICMP协议介绍
一、定义

- 网际控制报文协议ICMP(Internet Control Message Protocol),是一种面向无连接协议,用于传输出错报告控制信息;
 - 在TCP/IP协议簇中是一个重要子协议,通常被IP层或者更高层协议(TCP/UDP)使用,属于网络层协议;
 - 主要用于IP主机和路由器之间传递控制消息,包括网络通不通,主机是否可达,路由是否可用等网络状态。
 
举例:ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。
二、原因
- 由于IP协议数据传输天然存在不可靠、无连接等特点,为了解决数据传输出现的问题,引入了ICMP协议;
 - 这些控制消息并不传输用户数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有直观重要的作用;
 - 在数据传输的过程中,IP提供尽力而为的服务,为了把数据包发送到目的地址尽最大努力,它并不对目的主机是否收到数据包进行验证,无法进行流量控制和差错控制。因此在数据包传输过程中,产生各种错误在所难免,为了更有效的转发IP数据包,提供数据包交付成功寄回,ICMP应运而生。
 
思考1:ICMP协议介于传输层和网络层之间,通常被IP层或者更高层协议(TCP/UDP)使用,那为啥属于网络层而不是传输层?
- ICMP 报文被封装在IP数据报中,作为IP数据报的数据部分,通过互联网传递
 - 传输层协议关注从端到端发送数据并确保可靠性,而ICMP目的是确保将数据路由到正确的位置,实际上并不路由数据
 
三、ICMP数据帧

- 
Type (类型):标识ICMP报文的类型;占用1字节
 - 
Code(代码):标识对应ICMP报文的代码,它与类型字段一起共同标识了ICMP报文的详细类型;占用1字节
 - 
Checksum(校验和):对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错,其计算方法和IP报头中的校验和计算方法一致;占用2字节
 - 
Header Other(首部其他部分):根据不同的报文类型而有不同的格式,有的是全0,有的则有其他的特殊格式。占用4字节,ICMP始终有8个字节的头部长度
 - 
Packet Content(数据部分):不同类型和子类型有不同的内容,占用4字节
 
目前定义类型详见下表,从类型值来看ICMP报文可以分为两大类:第一类是差错报文,第二类是查询报文
Type | 
Code | 
描述 | 
报文类型 | 
|---|---|---|---|
0-Echo响应 | 
0 | 
Echo响应报文 | 
查询 | 
3-目的不可达 | 
0 | 
目标网络不可达报文 | 
差错 | 
1 | 
目标主机不可达报文 | 
差错 | 
|
2 | 
目标协议不可达报文 | 
差错 | 
|
3 | 
目标端口不可达报文 | 
差错 | 
|
4 | 
要求分段并设置DF flag标志报文 | 
差错 | 
|
5 | 
源路由失败报文 | 
差错 | 
|
6 | 
未知的目标网络报文 | 
差错 | 
|
7 | 
未知的目标主机报文 | 
差错 | 
|
8 | 
源主机隔离报文 | 
差错 | 
|
9 | 
禁止访问的网络报文 | 
差错 | 
|
10 | 
禁止访问的主机报文 | 
差错 | 
|
11 | 
对特定的TOS网络不可达报文 | 
差错 | 
|
12 | 
对特定的TOS主机不可达报文 | 
差错 | 
|
13 | 
由于过滤 网络流量被禁止报文 | 
差错 | 
|
14 | 
主机越权报文 | 
差错 | 
|
15 | 
优先权终止生效报文 | 
差错 | 
|
5-重定向 | 
0 | 
重定向网络报文 | 
差错 | 
1 | 
重定向主机报文 | 
差错 | 
|
2 | 
基于TOS的网络重定向报文 | 
差错 | 
|
3 | 
基于TOS的主机重定向报文 | 
差错 | 
|
8-Echo请求 | 
0 | 
Echo请求报文 | 
查询 | 
9-路由器通告 | 
0 | 
路由通告报文 | 
查询 | 
10-路由器请求 | 
0 | 
路由器的发现/选择/请求报文 | 
查询 | 
11-ICMP超时 | 
0 | 
TTL超时报文 | 
差错 | 
1 | 
分片重组超时报文 | 
差错 | 
|
12-参数问题 | 
0 | 
IP报首部参数错误报文 | 
差错 | 
1 | 
丢失必要选项报文 | 
差错 | 
|
2 | 
不支持的长度报文 | 
差错 | 
|
13-时间戳请求 | 
0 | 
时间戳请求报文 | 
查询 | 
14-时间戳应答 | 
0 | 
时间戳应答报文 | 
查询 | 
15-信息请求 | 
0 | 
信息请求报文 | 
查询 | 
16-信息应答 | 
0 | 
信息应答报文 | 
查询 | 
四、ICMP请求/应答帧格式
Type(类型):表示ICMP报文类型,8表示Echo(ping)request


0表示Echo(ping)reply


Code(代码):标识对应ICMP报文的代码,它与类型字段一起共同标识了ICMP报文的详细类型


Checksum(校验和):对ICMP报文数据部分在内的整个ICMP数据报的校验和


Identifier(标识符):用于表示ICMP进程,占用2字节(单进程内请求与应答报文Identifier字段保持一致


Sequence Number(序列号):用于关联请求报文和应答报文(对应请求和应答报文的序列号相同),占用2字节


思考2:Identifier和Sequence number为何有BE、LE之分?
wireshark考虑到window系统与Linux系统发出的ping报文(主要指ping应用字段而非包含IP头的ping包)的字节顺序不一样(windows为LE:little-endian byte order,Linux为BE:big-endian),为了体现wireshark的易用性,开发者将其分别显示出来。
Packet Content(数据部分):标识ICMP的相关数据部分


                    
                

                
            
        
浙公网安备 33010602011771号