1、引言
1.1、ICMP简介
IP 协议本身没有提供直接的方法来发现那些发往目的地址失败的IP 数据包。
此外, IP 没有提供直接的方式来获取诊断信息(例如哪些路由器在沿途中被使用了或使用一种方法来估计往返时间)。
为了解决这些不足之处,将一个特殊的 Internet 控制报文协议( Internet Control Message Protocol,ICMP)[RFC0792][RFC4443]与IP 结合使用,以便提供与IP 协议层配置和IP 数据包处置相关的诊断和控制信息。
ICMP 通常被认为是IP 层的部分,它需要在所有IP 实现中存在。它使用IP 协议进行传输。因此,确切地说,它既不是一个网络层协议,也不是一个传输层协议,而是位于两者之间。
ICMP报文可以分类两类:
ICMP报文通常由IP层本身、上层的传输协议(例如TCP或UDP),甚至是用户应用触发的。
ICMP并不为IP网络提供可靠性,它只是表明某些类别的故障和配置信息,最常见的丢包(路由器缓冲区溢出)并不会触发任何ICMP信息。
鉴于此,黑客们已经在大量攻击中使用ICMP报文。由于担心这种攻击,网络管理员通常会使用防火墙封堵ICMP报文,特别是在边界路由器上。如果ICMP被封锁,大量的诊断程序(例如ping, traceroute)将无法正常工作。
1.2、ICMP报文格式
ICMP报文封装在IP数据报内
IPv4协议中,协议字段=1
IPV6协议中,下一个头部字段=58
ICMP头部=类型+代码+检验和组成
ICMP类型不同,ICMP数据格式不同
2、ICMP报文
2.1、ICMPv4类型
信息类报文: 回显请求(8)和回显应答(0);路由器通告(9)和路由器请求(10)等
差错报文: 目的不可达(3)、重定向(5)、超时(11)、参数问题(12)
2.2、ICMPv6类型
ICMPv6不仅有差错和信息类报文,还负责IPv6路由器和主机的配置
ICMPv6差错报文类型字段(0~127),信息类报文类型为128~255
2.3、报文处理
信息类请求将被操作系统自动处理,差错类报文传递给用户进程或传输层协议。
例外情况是:
重定向报文导致主机路由表自动更新
目的不可达—需要分片报文,用于路径MTU发现机制
ICMPv6对报文处理更加严格:
2.4、限制规则
目的:
限制生成ICMP差错报文的原因是防止出现广播风暴。
ICMPv4限制规则:
ICMPv6限制规则:
3、ICMP差错报文
3.1、总体流量水平规则
除了控制产生ICMP报文条件的规则,还有限制总体流量水平规则。一种推荐的方法是令牌桶。
随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了.新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务.
令牌桶的另外一个好处是可以方便的改变速度. 一旦需要提高速率,则按需提高放入桶中的令牌的速率. 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量.
3.2、ICMP差错报文数据包组成
包含一个完整的源自原始数据报的IP头部副本,再加上原始数据报的IP有效载荷区中的任何其他数据,同时保证生产恒的IP/ICMP数据报的大小不超过特定值(IPV4:576字节,IPV6最小的MTU,至少1280字节)
扩展的ICMP和多部报文
扩展结构用于ICMPv4的目的不可达、超时、参数问题报文,以及ICMPv6的不可达和超时报文。
通过在ICMP报文的尾部追加扩展数据结构的方法,扩展包括一个扩展头部和对象数据
ICMPv4头部的第6字节和ICMPv6头部的第5字节用来表示长度字段
3.3、ICMPv4主机不可达(1)和ICMPv6地址不可达(3):
由路由器或者主机产生,出现在当它被要求使用直接交付方法发送一个IP数据报到一个主机,但由于某些原因无法到达目的地。例如当最后一跳路由器试图发送一个ARP请求到已经不再或者关闭的主机时。
ICMPv6目的无路由(代码0)
ICMPv4管理禁止通信(代码3)和ICMPv6目的管理禁止通信(代码1)
ICMPv4端口不可达(代码3)和ICMPv6端口不可达(代码4)
结合traceroute命令分析
ICMPv4 PTB
数据大于选定的传出网络接口的MTU,则需要分片。如果到达的数据包在IP头部中设置了不分片(Don’t Fragement)字段,此时产生不可达PTB报文。已经用来作为MTU发现
ICMPv6 PTB
ICMPv6超出源地址范围
ICMPv6源地址失败进/出策略
ICMOv6拒绝路由到目的地
重定向(ICMPv4(5)/ICMPv6(137))
ICMP超时(ICMPv4(11)/ICMPv6(3))
结合traceroute命令分析
参数问题(ICMPv4(12)/ICMPv6(4))
3.4.、traceroute的原理
Traceroute命令利用了”TTL超时”以及“端口不可达”的报文。
它发送的用于探测网络路径的数据包的IP之上的协议可以是 UDP、TCP或ICMP。不同模式下,探测过程中设计的数据包如下:
3.5、traceroute详细过程
5.第2个路由器会像第1个路由器一样,抛弃这个数据包,并像第1个路由器那样返回一个ICMP消息。
6.该过程会一直持续,traceroute命令不停递增TTL值,而传输路径上的路由器不断递减该值,直到数据报最终抵达预期的目的地。
7.当目的计算机接收到ICMP Echo消息时,会回传一个ICMP Echo Reply消息地址掩码请求/应答(17/18)、时间戳请求/应答(13/14)、信息请求/应答(15/16)等已经不再使用。
3.6、回显请求/应答
回显请求/应答(ICMPv48/0 ICMPv6128/129)
4、ICMP查询/信息类报文
4、ICMP查询/信息类报文
本地代理地址发现请求/应答(ICMPv6 144/145)
发现本地代理
移动前缀请求、通告(ICMPv6 146/147)
用来通知一个移动中的节点其本身前缀已经改变了,一般使用Ipsec保护,防止假冒前缀通告的欺骗
移动IPv6快速切换报文(ICMPv6 154)
当一个移动节点从一个网络的接入点(AP)移动到另一个是,改善IP切换延迟
组播侦听查询/报告/完成(ICMPv6 130/131/132)
版本2组播侦听发现(ICMPv6 143)
组播路由器发现(IGMP 48/49/50 ICMPv6151/152/153)
5、IPv6中的邻居发现
NDP(Neighbor Discovery Protocol,邻居发现协议)是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。
5.1、路由器请求/通告(133/134)
路由器周期发送RA(route advertisement)消息。每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送RA报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。
主机发送RS(route solicitation),路由器回应RA(route advertisement)。 很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送RS报文,网络上的设备将回应RA报文。主机收到包含路由信息的RA报文后,会更新自己的路由表。当主机向其他设备发送报文时,通过查询该列表的路由信息,选择合适的路由发送报文
5.2、邻居请求/通告(135/136)
取代了IPv4的ARP(地址解析协议),主要目的是将IPv6地址转换为链路层地址,邻居请求NS(neighbor solicitation),邻居通告NA(neighbor advertisement)。
主机A发给主机B的报文为组播报文,主机B发给主机A的是单播报文,其他无关的路由器是不会回应的。
过程可以这样描述:
主机A:谁叫李法拉?你住在哪里?
主机B: 我叫李法拉,住在MAC地址的xxxxx。
主机C: 不是叫我,不管他。
5.3、邻居不可达检测(Neighbor Unreachable Detection)
检测同一个链路上的两个系统什么时候丢失了或者变得非对称了。
1、未完成(Incomplete,还有没有票?不知道啊)。表示正在解析地址,但邻居链路层地址尚未确定。
2、可达(Reachable,我就是今天的票!)表示地址解析成功,该邻居可达。
3、陈旧(Stale,我的这张旧船票还能登上你的破船吗?)表示可达时间耗尽,未确定邻居是否可达。
4、延迟(Delay,破船到底还有没有?),表示未确定邻居是否可达。DELAY状态不是一个稳定的状态,而是一个延时等待状态。
5、探查(Probe,这张票还能用吗?能到xx地方吗?),节点会向处于PROBE状态的邻居持续发送NS报文。
Empty表示邻居表项为空。
5.4、邻居不可达检测状态转换
① 在EMPTY状态时,如果有报文要发送给邻接节点,则在本地邻居缓存表建立该邻接节点的表项,并将该表项置于INCOMPLETE状态,同时向邻接节点以组播方式发送NS报文。
② 节点收到邻居回应的单播NA报文后,将处于INCOMPLETE状态的邻居缓存表项转化为REACHABLE状态。如果地址解析失败(发出的组播NS超时),则删除该表项。
③ 处于REACHABLE状态的表项,如果在REACHABLE_TIME时间内没有收到关于该邻居的“可达性证实信息”,则进入STALE状态。此外,如果该节点收到邻居节点发出的非S置位NA报文,并且链路层地址有变化,相关表项会进入STALE状态。
④ 处于STALE状态的表项,当有报文发往该邻居时,这个报文会利用缓存的链路层地址进行封装,并使该表项进入DELAY状态,等待收到“可达性证实信息”。
⑤ 进入DELAY状态后,如果DELAY_FIRST_PROBE_TIME时间之内还未收到关于该邻居的“可达性证实信息”,则该表项进入PROBE状态。
⑥ 在PROBE状态时,节点会周期性地用NS报文来探测邻居的可达性,探测最大时间间隔为RETRANS_TIMER,在最多尝试MAX_ UNICAST_SOLICIT次后,如果仍未收到邻居回应的NA报文,则认为该邻居已不可达,该表项将被删除。
5.5、重复地址检测DAD(Duplicate Address Detect)
是在接口使用某个IPv6单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行DAD检测是很必要的。
DAD机制通过NS和NA报文实现。
节点会发送NS报文(有人叫张拉拉吗?),其源地址为未指定地址,目的地址为接口配置的IPv6地址。
如果收到自己的报文(听到自己的回音,奥,自己的声音不管他),直接忽略。
在NS报文发送到链路上后,如果在规定时间内没有收到应答的NA报文,则认为这个单播地址在链路上是唯一的,可以分配给接口(好了,我就叫张拉拉了);
反之,如果收到应答的NA报文(一个响亮的声音回来,我就叫张拉拉!呀丫丫,有人和我同名啊,算了,改个名字吧),则表明这个地址已经被其他节点所使用,不能配置到接口。
5.6、重定向功能
当网关路由器发现更好的报文转发路径时候,会用重定向报文告诉主机
主机H1要发送数据到网络N2,经过路由器R1,由R1再转发到到R2。
但路由器R1发现R2和它是同一网段,并且R2是直接连接着网络N2,这时候路由器R1就发送重定向报文(ND redirect)告诉主机H1,以后再给网络N2的报文就直接给R2好了,别那么绕弯子,费劲!
在重定向功能中,只有主机才会处理重定向报文。在图例中,H1会更新自己的路由表,下次再发送到N2的报文便会直接转发到R2。
6、ICMPv4和ICMPv6转换
信息报文只有回显请求(8->128)和回显响应(0->129)转换了。
差错报文只有目的不可达(3)、超时(11)、参数问题(12)转换了
7、与ICMP相关的攻击
7.1、与ICMP相关的攻击
主要有3类:泛洪(flood)、炸弹(bomb)和信息泄露(information disclosure)
泛洪会造成大量流量,导致针对一台或多台计算机的有效的Dos攻击。
炸弹指的是发送经过特殊构造的报文,能够导致IP或者ICMP的处理崩溃或者终止。
信息泄露本身并不会造成伤害,但是能够保住其他攻击方法避免浪费时间或者被发现。
Smurf攻击:
一种早期的ICMP攻击,源IP设为受害者IP,目的地址设为广播地址,导致大量计算机响应,造成Dos攻击,这种攻击只需要在防火墙边界禁止传入的广播流量即可处理。
Ping of Death攻击:
采用ICMPv4回显请求/应答报文构建数据包分片,当他们重组时形成一个过大的数据报(大于最大值64KB),导致某些系统崩溃,形成另一种形式的Dos攻击
Land攻击:
将源地址和目的地址均设为受害者IP,收到这种报文时,有些实现有问题。
7.2、利用ICMP重定向功能
ICMP重定向功能可能导致终端使用一个错误的系统作为下一跳路由。可以沿着流量流插入一个中间人进行记录分析,修改导致不想要的动作。还可能会使受害者认为自身就是到达目的地址的最优网关,导致无线循环,间接锁定受害者的主机。
利用路由器通告和路由器请求报文
路由器通告和路由器请求报文能被用于创建类似重定向攻击,导致受害者修改他们的默认路由;被动接受这些报文可以使攻击者了解本地网络环境的拓扑结构。
使用ICMP作为入侵程序的通信通道,协调一组合作病毒的行动。
Smack或Bloop攻击:
ICMP目的不可达报文可造成现有连接的拒绝服务。
利用ICMP时间戳请求/应答报文
ICMP时间戳请求/应答报文能够获取主机的当前时间,进而预测与时间相关的伪随机序列。
利用PTB报文
PTB报文包含推荐MTU值的字段,攻击者修改这个值强制中断使用非常小的数据包运行,导致性能低下。
如果没有加密,欺骗或者伪装攻击仍然可能,使用加密方法的协议提供更高水平的安全性,但部署复杂,出问题时分析复杂。
8、参考文献
https://baijiahao.baidu.com/s?id=1609424059183543390&wfr=spider&for=pc
https://wenku.baidu.com/view/e6eff8660b4e767f5bcfce16.html
https://blog.csdn.net/zzucsliang/article/details/41407387
https://www.jianshu.com/p/75a5822d0eec
https://www.cnblogs.com/reaperhero/articles/10066611.html
感谢langgy