劫持客户端套接字

Hijacking a client socket

我已经设置了一个监听 port A 的服务器套接字(普通原始套接字)。客户端现在连接到此服务器。 OS为此目的为客户端打开一个端口。说 port B 分配给这个客户。现在我的问题是,3rd 脚本能否连接到此 port B 并发送数据。或者换句话说,我可以欺骗对客户端的响应,就好像它来自服务器一样吗?我尝试使用 scapy 欺骗它,但它没有用。

server.py

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", A))
s.listen(10)
ns, cli_addr = s.accept()
time.sleep(30) # so that i can trigger my 3rd script

goodclient.py

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", A))
print s.getsockname() # to get the local port of client - B
s.recv(1024)

badboy.py

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", B)) # connection refused error
s.send("hihihi")

scapybadboy.py

pack = IP(src="localhost", dst="localhost") / TCP(sport=A, dport=B) / "Hello"
send(pack) # Packet sent but not received by the client

因为服务器和客户端使用SOCK_STREAM套接字,他们都知道TCP会话(包括端口、IP和(SEQ_NUMBERACK_NUMBER)),所以当会话已经在进行中时,您必须执行 TCP hikacking and IP spoofing 才能在流中发送消息。

换句话说,您必须猜测(或窃取)服务器的 ACK 编号才能使用 badclient 向客户端发送虚假消息。

但是,如果您要以某种方式 goodclient 回答您而不是服务器,您应该 运行 以下内容:

iptables -A FORWARD -j NFQUEUE --queue-num 1 ,因为您的操作系统不知道您只是 "opened" 与 goodclient 的会话,它会发送 RST 数据包。此命令将阻止它。