来自第三台主机的欺骗消息直接发送到 TCP 连接中的客户端地址和端口

网络工程 tcp
2022-02-24 21:15:21

如果两台主机(主机 1 和主机 2)成功完成 TCP 握手过程并建立连接,第三台主机(主机 3)是否能够在知道主机 1 的地址和(临时)端口后直接发送消息,用主机 2 欺骗这些消息地址和端口?

换句话说:

主机1 (192.0.2.115:32154)<------------->(198.51.100.10:7184主机2

Host3直接向192.0.2.115:32154发送消息,将其源端口和地址欺骗为198.51.100.10:7184

这会起作用,还是 TCP 有一些机制可以避免它?由于 TCP 会话是由源地址和目标地址以及端口标识的,并且它们会被欺骗,我看不出这个消息怎么会被称为 bogon。

2个回答

当然,这“有效”。要可靠地做到这一点,您需要知道序列号。许多负载均衡器以这种方式工作 - 有时称为“单臂”操作,其中一台主机进行握手并将其余流量交给平衡服务器,然后让路。

即使您不知道序列号,您也可以快速搜索并在窗口中找到一个(也就是足够近),这足以在不精确的位置注入一些数据。RST 尤其烦人。

像 QUIC 或 TCP 之上的 TLS 等经过身份验证的传输将防止伪造的第三方成为对话的一部分。

为了使设备欺骗进入 TCP 会话,它需要做的不仅仅是欺骗 TCP 会话中主机之一的源地址。它还必须能够知道序列/确认号、窗口大小、ACK 等。要使其正常工作将非常困难。例如,您需要被欺骗的主机上的 TCP 不响应来自其他主机的流量,否则发送欺骗流量的主机将收到两个 ACK​​,因为它发送给它认为连接的主机的所有内容。

应用程序 TCP 会话(套接字)由端口和 IP 地址的串联标识,但我认为您缺少的部分是每个主机上的 TCP 直接与对等连接上的 TCP 通信,并且 TCP 在发送数据之前缓冲数据到应用程序。应用程序不涉及 TCP 窗口、序列号、ACK 等。TCP 所做的某些事情不涉及 TCP 连接到的应用程序。

要使其正常工作,您需要直接控制被欺骗主机和进行欺骗的主机上的 TCP。

要了解 TCP 的工作原理,原始来源是RFC 793, TRANSMISSION CONTROL PROTOCOL