编写TCP连接劫持代码

0 投票
1 回答
4587 浏览
提问于 2025-04-16 12:55

我写了一个脚本,用Python的scapy库来劫持TCP连接。

在测试这个攻击时,我在两台虚拟机之间进行(服务器是xp_sp3,客户端是xp_sp1),我找到了客户端的端口,然后找到了服务器的SND.NEXT,接着又找到了客户端的SND.NEXT(我用Wireshark对比过,都是合法的)。

现在,当我从客户端向服务器发送一个伪造的数据包,使用客户端的SND.NEXT时,我发现这个数据包确实到达了服务器,但没有到达NetCat(它的目的地)。而且当我把它和一个真实的客户端数据包进行比较时,它们看起来几乎一模一样(只是MAC地址、TTL、窗口大小等不同)。

除了我已经做的这些,还有什么其他的事情我需要做,让这个数据包看起来对服务器是合法的吗?

1 个回答

1

首先,使用Wireshark来检查你伪造的数据包的TCP校验和是否正确。如果你的伪造数据包的TCP校验和无效,接收方会直接丢掉这些数据包。要在Wireshark中开启这个功能,可以按照以下步骤操作:编辑 > 首选项 > 协议 > TCP > 如果可能,验证TCP校验和。

除了序列号之外,还要确认你是否正确处理了TCP时间戳的值。如果序列号是正确的,但TCP时间戳选项过旧,接收方仍然会丢掉这个数据包。

这里有一个函数可以用来增加TCP时间戳,可能会对你有帮助。

def inc_timestamp(packet, TSval_inc, TSecr_inc):
    if packet.haslayer(TCP):
        for i, option in enumerate(packet[TCP].options): # Timestamp option format: tuple(name, tuple(time1, time2))    
            if str(option[0]) == "Timestamp":            # Ex. ('Timestamp', (7797613, 414050))]            
                packet[TCP].options[i] = option[0], (option[1][0]+TSval_inc,option[1][1]+TSecr_inc)

如果你是在Scapy中从头开始创建这些数据包,你可能需要手动添加TCP时间戳选项,因为Scapy的TCP()层默认是没有这个选项的。无论如何,上面提供的代码应该能给你所需的格式信息,帮助你完成这个操作。

撰写回答