ICMP协议安全
从ICMP协议开始
参考链接 https://www.cnblogs.com/bjlhx/p/10985384.html
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。 所以我们就需要一种协议来完成这样的功能–ICMP协议。
ICMP是控制协议,主要是因为IP协议有可能出现报文发送过程中的错误。譬如目标不可达,TTL过期,需要机制通知发送方错误原因。ICMP使得路由器和主机可以向发送方提供错误或者控制信息。
ICMP协议的功能主要有:
1. 确认IP包是否成功到达目标地址
2. 通知在发送过程中IP包被丢弃的原因
ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议。ICMP只能搭配IPv4使用,如果是IPv6的情况下, 需要是用ICMPv6。
ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。ICMP报头如下图所示。
ICMP报文格式
有多种不同的ICMP报文,每种报文都有自己的格式,但是所有的ICMP报文都有三个共同的字段:
TYPE(8-bit): identifies the message
CODE(8-bit): provides further information about the message type
CHECKSUM(16-bit)
In addition, ICMP messages that report errors always include the header and the first 64 data bits of the datagram causing the problem.
Type的类型及含义:
值得注意的是,ICMP ECHO (也即我们所熟悉的ping),
类型是0,是回复
类型是8,是请求
ping用于探测主机的可达性,报文格式如下:
Dst unreachable
ping命令比较简单,所以不需要更多指示信息,当Type=3(目的不可达unreachable)时,code字段可以指示更多信息
0:network unreachable
1:host unreachable
2:protocol unreachable
3:port unreachable
4:fragmentation needed and DF(don’t fragment) set
5: source route failed
TTL过期
再看TTL过期的例子。可以看出这是对ICMP echo request的回复。同样包括20个字节的IP包头;8字节的ICMP报文头;以及56字节的数据。Type=11(Time to live exceeded)
ICMP重定向报文
数据包:
路由器之间会经常交换信息,以适应网络拓扑的变化,保持最优路由。但是主机一般不会这样做。所以,一条基本的原则是:主机会假设路由器的信息更权威,路由器总是对的。
主机在路由设置的时候,最开始只有一条默认的路由信息,然后当,接收到路由器通知它改变路由的时候,会更新自己的路由表。
在什么情况下,路由器会向主机发送更新路由表的通知呢?
在以下情况下,网关会向主机发送重定向消息。
网关G1从网关所连接的网络上的主机接收互联网数据报。 网关G1检查其路由表,并在到数据报的因特网目的地网络X的路由上获得下一个网关G2的地址。
如果G2和由数据报的因特网源地址识别的主机在同一网络上,则向主机发送重定向消息。 重定向消息建议主机将其网络X的流量直接发送到网关G2,因为这是到目的地的较短路径。
网关将原始数据报的数据转发到其互联网目的地。
在上面的情况中,主机的IP地址是10.0.0.100;主机的路由表中默认网关是10.0.0.1;现在主机100要向网络X发送数据包。根据自己的默认网关,100将数据发给了G1。G1检查自己的路由表,发现要到达网络X,需要经过G2 10.0.0.2。G1会将数据包转发给G2,同时发现数据包的源地址10.0.0.100和G2在同一个网段上,因此G1会知道,100应该将到网络X的数据包直接发给G2。这样的话,100的路由距离会更短。
因为主机100相信G1,所以它会更新自己的路由表,将到达网络X的路由改成是G2。
利用ICMP协议攻击
Smurf Attack
Smurf攻击是一种分布式拒绝服务攻击,其中使用IP广播地址将具有预期受害者的欺骗源IP的大量互联网控制消息协议(ICMP)分组广播到计算机网络。 默认情况下,网络上的大多数设备都会通过向源IP地址发送回复来对此做出响应。 如果网络上接收和响应这些数据包的机器数量非常大,受害者的计算机将忙于处理ping回复包。 这可能会使受害者的计算机变慢,无法继续工作。
如何防止Smurf攻击呢?
配置各个主机和路由器不响应ICMP请求或广播;
或者配置路由器不转发定向到广播地址的数据包。 直到1999年,标准要求路由器默认转发此类数据包。 从那时起,默认标准被更改为不转发此类数据包。
Ping of death
如RFC 791中所定义的,包括IP报头的IPv4分组的最大分组长度是65,535(2^16-1)字节,这是因为在IP包头中使用16比特来描述总分组长度的限制。
底层数据链路层几乎总是限制最大帧大小(MTU)。在以太网中,这通常是1500字节。在这种情况下,大的IP分组被分成多个IP分组(也称为IP分段),因此每个IP分段将匹配强加的限制。 IP分段的接收器将它们重新组装成完整的IP分组,并将继续照常处理它。
当执行分段时,每个IP分段需要携带有关它包含的原始IP分组的哪个部分的信息。此信息保存在IP标头中的“片段偏移(FO)”字段中。该字段长度为13位,包含原始IP数据包中当前IP片段中数据的偏移量。偏移量以8个字节为单位给出。这允许最大偏移量为65,528(( [公式] -1)* 8)。然后,当添加20个字节的IP头时,最大值将为65,548字节,超过最大帧大小。这意味着具有最大偏移量的IP片段应该具有不大于7个字节的数据,否则它将超过最大分组长度的限制。恶意用户可以发送具有最大偏移量的IP片段,并且发送的数据远远超过8个字节(与物理层允许的数据量一样大)。
当接收器组装所有IP分段时,它将以一个大于65,535字节的IP数据包结束。这可能会溢出接收器为数据包分配的内存缓冲区,并可能导致各种问题。
从上面的描述中可以明显看出,该问题与ICMP无关,ICMP仅用作有效载荷。这是IP分段的重组过程中的问题,其可以包含任何类型的协议(TCP,UDP,IGMP等)。
纠正这个问题可以在重组过程中添加检查。检查每个传入的IP片段确保每个IP片段的IP头中的“片段偏移”和“总长度”字段的总和小于或等于65,535。如果总和更大,则数据包无效,并忽略IP片段。此检查由某些防火墙执行,以保护未修复错误的主机。解决该问题的另一个方法是使用大于65,535字节的内存缓冲区来重新组装数据包。 (这实际上违反了规范,因为它增加了对大于允许的数据包的支持。)