我正在编写一个伪造 TCP 请求并收集数据以存储在本地缓冲区中的程序。为此,在连接到客户端的系统中,我已将 iptables 配置为在路由之前将所有传入数据包保留在队列中。然后我使用 netfilter 库从队列中读取数据包。在此之后使用 RAW 套接字,我将伪造的 TCP 数据包发送到客户端。有了这个,我可以伪造 SYN/ACK 数据包以响应来自客户端的 SYN 请求。
但是,当我尝试向客户端伪造 ACK 以响应传入数据时,就会出现问题。在这种情况下,源的真实 ip 来自数据包,而不是伪造的。请参阅下面标有“>>>”的第 7 条轨迹。在此源 ip 显示为 192.168.10.10,因为它必须是 212.58.246.81。在第 4 个跟踪(即 SYN/ACK 数据包)中,它显示得很好。
3 0.073852000 192.168.10.100 212.58.246.81 TCP 38307 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=502233100 TSER=0 WS=6
4 0.103102000 212.58.246.81 192.168.10.100 TCP http > 38307 [SYN, ACK] Seq=0 Ack=1 Win=31744 Len=0
5 0.103147000 192.168.10.100 212.58.246.81 TCP 38307 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0
6 0.103349000 192.168.10.100 212.58.246.81 HTTP GET /go/rss/int/news/-/sport2/hi/tennis/9519762.stm HTTP/1.1
>>> 7 1.118729000 192.168.10.10 192.168.10.100 TCP http > 38307 [ACK] Seq=1 Ack=1 Win=31744 Len=0
8 1.118788000 192.168.10.100 192.168.10.10 TCP 38307 > http [RST] Seq=1 Win=0 Len=0
9 3.102627000 192.168.10.100 212.58.246.81 HTTP [TCP Retransmission] GET /go/rss/int/news/-/sport2/hi/tennis/9519762.stm HTTP/1.1
10 3.148590000 192.168.10.10 192.168.10.100 TCP [TCP Dup ACK 7#1] http > 38307 [ACK] Seq=1 Ack=1 Win=31744 Len=0
11 3.148606000 192.168.10.100 192.168.10.10 TCP 38307 > http [RST] Seq=1 Win=0 Len=0
我也试过像下面这样的“sendip”命令来发送一个假的 TCP ACK
sendip -p ipv4 -p tcp -is 212.58.246.81 -id 192.168.10.100 -ts 80 -td 4567 -tfa 1 -tfs 0 -d "Data" 192.168.10.100
这里 tfa 和 tfs 分别代表 ack 和 syn 标志。这也没有按预期工作,它显示为源自 192.168.10.10 而不是 212.58.246.81。但是,如果我将两个标志(syn 和 ack)都设置为 1,那么它工作正常。
操作系统是 Ubuntu。谁能让我知道我哪里出错了。非常感谢你的帮助。