我目前正在开发一个程序,该程序可以嗅探发送到特定地址和从特定地址接收的 TCP 数据包。我想要完成的是用定制的数据包回复某些收到的数据包。我已经完成了解析。我已经可以生成有效的以太网、IP 和(大部分)TCP 数据包。
我唯一不明白的是 seq / ack 号是如何确定的。
虽然这可能与问题无关,但该程序是使用 WinPCap 用 C++ 编写的。 我正在寻求任何可能对我有帮助的提示、文章或其他资源。
TCP连接建立时,双方都会生成一个随机数作为其初始序列号。它是一个强随机数:如果互联网上的任何人都可以猜测序列号,就会出现安全问题,因为他们可以轻松伪造数据包注入 TCP 流。
此后,每发送一个字节,序列号就会加 1。ACK 字段是来自另一端的序列号,发回以确认接收。
RFC 793,原始的 TCP 协议规范,可以提供很大的帮助。
我也有同样的工作要做。 首先,初始的 seq# 将随机生成(0-4294967297)。 然后接收方会计算收到的数据长度,并将
seq# + length = x
的ACK发送给发送方。序列将为 x,发送者将发送数据。类似地,接收器将计算长度x + length = y
并将ACK作为y
发送,依此类推...这就是seq/ack的生成方式...
如果你想实际展示它,请尝试在 Wireshark 中嗅探数据包并跟踪 TCP 流并查看场景...
如果我理解正确的话 - 您正在尝试发起TCP SEQ 预测攻击。如果是这种情况,您需要研究目标操作系统的初始序列号生成器的细节。
几乎所有主要操作系统都存在广泛公开的漏洞,其 ISN 生成器是可预测的。我没有密切关注后果,但我的理解是大多数供应商发布了补丁来随机化他们的 ISN 增量。