我正在编写一个程序来伪造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。任何人都可以让我知道我哪里出错了。非常感谢你的帮助。