zoukankan      html  css  js  c++  java
  • 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字节的内存缓冲区来重新组装数据包。 (这实际上违反了规范,因为它增加了对大于允许的数据包的支持。)

  • 相关阅读:
    可以自己设计和定的报表工具!
    金山词霸取词冲突
    SSRS 2008 Domain User Issue
    第一次用AX2009正式版!
    顶级会议及期刊
    Python基础常识
    Ubuntu系统下查看安装的CUDA和CUDNN的版本
    js内字符串转数组的基本方法
    JavaScript之逻辑分支
    JS入门
  • 原文地址:https://www.cnblogs.com/rookieDanny/p/13228674.html
Copyright © 2011-2022 走看看