admin管理员组

文章数量:1546195

ICMP协议详解

一.ICMP协议

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

简介:

ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。 [3] 它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。 [1]

从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过ICMP向数据包的源端报告有关事件。

其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP重定向),资料流量控制。ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连线状况。

ICMP 是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。

二.报文格式

ICMP报文封装在IP数据报中

 

ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文,IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。 [3]


三.ICMP类型


已经定义的ICMP消息类型大约有10多种,每种ICMP数据类型都被封装在一个IP数据包中。主要的ICMP消息类型包括以下几种。

1.响应请求

我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。 [5]

2.目标不可到达、源抑制和超时报文

这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。 [5]

3.时间戳

时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。 [5]

4.全部消息类型

下表显示了完整的ICMP类型:

TYPECODEDescriptionQueryError
00Echo Reply——回显应答(Ping应答)x
30Network Unreachable——网络不可达x
31Host Unreachable——主机不可达x
32Protocol Unreachable——协议不可达x
33Port Unreachable——端口不可达x
34Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特x
35Source routing failed——源站选路失败x
36Destination network unknown——目的网络未知x
37Destination host unknown——目的主机未知x
38Source host isolated (obsolete)——源主机被隔离(作废不用)x
39Destination network administratively prohibited——目的网络被强制禁止x
310Destination host administratively prohibited——目的主机被强制禁止x
311Network unreachable for TOS——由于服务类型TOS,网络不可达x
312Host unreachable for TOS——由于服务类型TOS,主机不可达x
313Communication administratively prohibited by filtering——由于过滤,通信被强制禁止x
314Host precedence violation——主机越权x
315Precedence cutoff in effect——优先中止生效x
40Source quench——源端被关闭(基本流控制)
50Redirect for network——对网络重定向
51Redirect for host——对主机重定向
52Redirect for TOS and network——对服务类型和网络重定向
53Redirect for TOS and host——对服务类型和主机重定向
80Echo request——回显请求(Ping请求)x
90Router advertisement——路由器通告
100Route solicitation——路由器请求
110TTL equals 0 during transit——传输期间生存时间为0x
111TTL equals 0 during reassembly——在数据报组装期间生存时间为0x
120IP header bad (catchall error)——坏的IP首部(包括各种差错)x
121Required options missing——缺少必需的选项x
130Timestamp request (obsolete)——时间戳请求(作废不用)x
14Timestamp reply (obsolete)——时间戳应答(作废不用)x
150Information request (obsolete)——信息请求(作废不用)x
160Information reply (obsolete)——信息应答(作废不用)x
170Address mask request——地址掩码请求x
180Address mask reply——地址掩码应答

四.ICMP命令

ICMP 协议应用在许多网络管理命令中,下面以 ping 和 tracert 命令为例详细介绍 ICMP 协议的应用。 [1]

(1) ping 命令使用 ICMP 回送请求和应答报文

在网络可达性测试中使用的分组网间探测命令 ping 能产生 ICMP 回送请求和应答报文。目的主机收到 ICMP 回送请求报文后立刻回送应答报文,若源主机能收到 ICMP 回送应答报文,则说明到达该主机的网络正常。

(2)路由分析诊断程序 tracert 使用了 ICMP时间超过报文

tracert 命令主要用来显示数据包到达目的主机所经过的路径。通过执行一个 tracert 到对方主机的命令,返回数据包到达目的主机所经历的路径详细信息,并显示每个路径所消耗的时间

 

 

五.ICMP重定向

ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据包向它的目的地转发。

  • 发生ICMP重定向通常有两种情况:

    • 当路由器从某个接口收到数据还需要从相同接口转发该数据时;

    • 当路由器从某个接口到发往远程网络的数据时发现源ip地址与下一跳属于同一网段时。

1.ICMP应用分析-ICMP重定向

ICMP虽然不是路由协议,但是有时它也可以指导数据包的流向(使数据流向正确的网关)。ICMP协议通过ICMP重定向数据包(类型5、代码0:网络重定向)达到这个目的。

图1 ICMP重定向

如图1所示,主机PC要ping路由器R2的loopback 0地址:192.168.3.1,主机将判断出目标属于不同的网段,因此它要将 ICMP请求包发往自己的默认网关192.168.1.253(路由器R1的E0接口)。但是,这之前主机PC首先必须发送ARP请求,请求路由器R1的 E0(192.168.1.253)的MAC地址。

当路由器R1收到此ARP请求包后,它首先用ARP应答包回答主机PC的ARP请求(通知主机PC:路由器R1自己的E0接口的MAC地址)。然后, 它(路由器R1)将此ICMP请求转发到路由器R2的E0接口:192.168.1.254(要求路由器R1正确配置了到网络 192.168.3.0/24的路由)。此外,路由器R1还要发送一个ICMP重定向消息给主机PC,通知主机PC对于主机PC请求的地址的网关是: 192.168.1.254。

路由器R2此时会发送一个ARP请求消息请求主机PC的MAC地址,而主机PC会发送ARP应答消息给路由器R2。最后路由器R2通过获得的主机PC的MAC地址信息,将ICMP应答消息发送给主机PC。

2.重定向报文的处理

主机和路由器对于重定向报文有不同的处理原则。 路由器一般忽略ICMP重定向报文。而主机对于重定向报文的感知取决于操作系统。以Windows为例,对于网关返回的ICMP重定向报文,Windows会在主机的路由表中添加一项主机路由。那么以后对于这个目的地址数据报,主机会将其直接送往重定向所指示的路由器。支持重定向报文处理的还有许多的Unix系统,如FreeBSD的诸多版本等。这类主机收到ICMP重定向报文后所采取的行动基本都是增加主机路由。显然,修改默认网关是不合理的。 同时,有的操作系统对于重定向报文是不做任何处理而直接丢弃(虽然也同样经由网络层向上递交),比如Sun的某些系统。 某些主机可以启动路由器功能,如FreeBSD的某些版本和Win32系统。这时主机的行为要特殊一些,会施加一些特殊条件来判断是否处理该重定向报文,这是依系统而异的。比如BSD,它检查重定向报文的条件之一是“重定向报文不能让主机本身作为网关”。

3.ICMP重定向的利与弊

ICMP重定向使得客户端的管理工作大大减少,使得对于主机的路由功能要求大大降低。该功能把所有的负担推向路由器学习。但是与此同时ICMP重定向也有很多弊端。 就重定向本身的机制来说,ICMP重定向增加了网络报文流量,因为主机的报文总是要在网关的直连网段上重复传输。那么更进一步如果主机的操作系统支持重定向(比如Windows)会如何?如图1,而主机收到重定向报文,会在自己的路由表中产生指向B的主机路由,经由1.1.1.2。事实上,主机这样可能会引起两点显著问题。 其一是引起性能问题,例如:有一台大型的服务器,要处理数十个子网下的数千台主机的业务。如果要支持重定向,那么服务器将会维护一个庞大的充满主机路由的路由表。这是一笔很大的开销。可能很大程度上降低服务性能,甚至导致网络服务瘫痪。 其二是可能埋下安全隐患。利用这点可以进行攻击和网络窃听。如果目某主机A支持ICMP重定向,那么主机B发一个IMCP重定向给它,以后它发出的所有到指定地址的报文都会转发主机B,这样B就可以达到窃听目的了。当然,拿windows操作系统来说,它会对ICMP报文进行检查,如果这个重定向不是网关发送的,会被直接丢弃。不过伪造一个网关的数据包很容易。另外,如果刻意伪造许多虚假的ICMP重定向报文,主机路由表就可能被改的乱七八糟。

4.ICMP重定向的避免与消除

针对上述ICMP重定向引发的问题,我们可以采用一些手段来避免或补救。我们讨论的前提条件是不改变网络拓扑。

  • 关掉ip redirects

    在路由器上取消ip redirect。这样路由器不向主机发送ICMP重定向报文。或者当起动HSRP或VRRP的时候,ICMP重定向会被关掉。这是相当于一台路由器作备份。有效的避免出现ICMP重定向。该方案是看似根本上解决了问题,但是只是ICMP重定向报文不会发回主机,解决了安全和主机负荷的问题,网络上的流量却没有减少。

  • 不同掩码长度子网划分

    使用子接口来改变ICMP重定向条件。还是如图1,我们如下配置IP。 HostA: IP Addr = 1.1.1.12/24 Default Gateway = 1.1.1.2/24 RT1 E0/1 IP Addr = 1.1.1.254/25 RT2 E0/1 IP Addr = 1.1.1.2/24 E0/1.1(Sub interface) = 1.1.1.250/25 这种方法的基本思想是:破坏ICMP重定向的条件,哄骗路由器认为用户数据报的入接口和出接口不同。从HostA来看,RT1和RT2都在和自己直连的网段。如此配置从RT2来看,用户数据的入接口和出接口不在同一网段上,数据从1.1.1.2进入,从1.1.1.250路由出去,用户数据纯粹的被路由出去,这样就破坏了ICMP重定向的条件。而且RT2会认为自己的子接口E0/1.1和RT1的E0/1接口是在同一子网的。这种方式要求配置的技巧性比较强,但也并没有减少网络数据流量,只是在安全性和主机负荷上有所改进。

  • 使用访问控制列表(ACL)

    在高级的ACL中可以根据报文类型进行过滤,在我司设备上如下配置: [Quidway]acl number 100 match-order auto [Quidway-acl-adv-100]rule deny icmp fragment icmp-type net-redirect [Quidway-Ethernet6/0]firewall packet-filter 100 outbound 在出接口上绑定ACL,过滤掉报文。这样做实事上减少了网络流量,保证了主机的安全性,减轻主机负荷。但是会消耗路由器的处理资源。

  • 代理ARP

    代理ARP的方法比较直接,干脆在RT1上启动代理ARP,让自己的。主机广播ARP请求后,网关RT1返回RT2的接口MAC地址。这种方法相当于修改了主机的默认网关。其后所有的流量都被导向RT2。这样可能会影响原来的业务需求。所以这种方法是不可取的。

六.ICMP重定向攻击

在KAli上使用工具实施ICMP重定向网关

  • 使用工具(两个都可以)

    • netwox(工具集)

    • ettercap

  • 环境

    • Kali

    • 被攻击主机(这里用redhat)

网络适配器改为nat模式,单独可以上网,有自己ip

  • Kali:ip,网关

 

 

  • 被攻击主机:IP 网关

  • 测试被攻击主机可以成功ping通,有网

Kali下载netwox 

apt-get install netwox

 Kali攻击

netwox 86 -f "host {被攻击主机ip地址}" -g "{新指定的网关ip地址}" -i "{当前网关ip地址}"
  • 被攻击主机wireshark抓包,发现ICMP重定向报文,至此逻辑成功

本文标签: 详解协议ICMP