1

我正在编写一个伪造 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。谁能让我知道我哪里出错了。非常感谢你的帮助。

4

0 回答 0