ICMP 欺骗实用吗?

网络工程 安全
2021-07-18 22:18:11

ICMP 欺骗有多实用?

场景 1:在 NAT 环境中,NAT 如何跟踪 ICMP 会话(技术上不是会话,因为它不是面向连接的?)对于 ECHO/ECHO 响应 Windows 使用相同的标识符 (0x1) 和序列号,每个数据包的增量为 256 . 如果两台主机在 ping 同一个外部服务器,NAT 如何区分传入的 ICMP 数据包?如果内网不过滤源地址,伪造ECHO响应有多难?用例:用于监控的 icmp ping,负载均衡器在收到伪造的 ICMP 响应(目标不可达、高延迟等)时可能会采取不正确/不必要的操作

场景 2:一些 IPS 设备,比如 GFW,检查传输路径上的数据包。伪造 ICMP 错误消息以隐秘方式杀死连接有多么实用。它不是发送 TCP RST,而是使用伪造的源 ip(另一端的合法 IP 或路径更远的一些跃点)发送无法访问的目标端口/数据包太大(这可能会很有趣:))。跟踪原始 IP 标头和前 64 个字节可能很昂贵,但以当今可用的计算能力,是否可行?

基本上无论是从 NAT 内部还是外部,伪造的 ICMP 造成损坏/混乱的可能性有多大?我不是在谈论 ICMP 泛洪。

顺便说一句,NAT 可以处理 TCP/UDP 以外的任何 IP 协议吗?我实际上并不确定它如何处理不同的 ICMP 类型。

2个回答

RFC 5508 “ICMP 的 NAT 行为要求”说(第 3.1 节):

NAT 设备的 ICMP 查询映射是当前基于 ICMP 查询的应用程序工作所必需的。这需要一个 NAT 设备透明地转发从 NAT 后面的节点发起的 ICMP 查询数据包,并在相反方向上对这些查询数据包的响应。正如 [NAT-TRAD] 中所规定的,这需要翻译 IP 报头。NAPT 设备在转发之前进一步转换 ICMP 查询 ID 和 ICMP 报头中的相关校验和。

因此,NAT 设备确实可以在向外部转发请求时在 Identifier 字段中放置唯一值。内部的两台机器使用相同的标识符是没有问题的,NAT设备会使用两个不同的值并记住原始ID和内部IP地址的组合。

可以在此处找到一些(旧的)Cisco 特定信息:http : //www.ciscopress.com/articles/article.asp ? p=25273& seqNum=3此页面还包括 NAT 支持的协议/应用程序列表。


如果发送 ICMP 消息以通知 TCP 连接引起的错误,则 ICMP 消息必须包含触发错误的 TCP 段的标头和部分有效负载。这是允许接收主机识别 TCP 连接所必需的。

NAT 设备可以做完全相同的事情来确定将它收到的 ICMP 错误发送到哪里。如果它有一个对应于 ICMP 有效载荷中 TCP 头的映射,它就知道将 ICMP 消息发送到哪里。

想要欺骗 ICMP 错误的攻​​击者需要知道源和目标 IP 地址和端口才能创建他的消息。因为ICMP 消息有效载荷还将包含一个TCP 序列号,TCP 端点还可以验证该序列号是否有效(即已发送但尚未确认)。这将使欺骗更加困难,但这种验证可能不会在所有系统中实现。

您可能应该好好看看RFC 5927 “ICMP Attacks against TCP”。

在任何现代有状态 NAT 实现中,连接跟踪通常是促进它的基本部分。NAT 可以处理哪些 IP 协议并没有任何限制——Linux Netfilter 可以愉快地对任何 ip 协议进行 NAT,但显然,如果没有对该协议进行特殊处理(即附加鉴别器),则只有一个内部主机是限制将能够一次与特定的外部主机进行通信。

在 ICMP 的情况下echo request,标识符和时间戳字段极不可能与另一台主机 ping 同一个远程端点的匹配 - 因此,如果 NAT/连接跟踪实现能够利用这些数据,它可以区分两者。因为destination unreachableNAT 设备必须跟踪有效载荷数据(即前 8 个字节)以确保 ICMP 错误消息的有效性 - 但即便如此,主机端点肯定应该自己验证这样的消息。

一般来说,假设一个符合 RFC 的网络堆栈,伪造的 ICMP 消息不应该是一个问题,因为几个字段是唯一的......除非攻击者是中间人,否则他们可以非常自由地进行干预 -当然,这就是 IPsec、TCP-MD5 和 TCP-AO 之类存在的原因。

注意:虽然一些RFC中确实存在关于NAT,它应该被认为以这样的方式之类的路由协议是一个统一的标准。