我已经设置了一个监听port A
的服务器套接字(普通原始套接字)。客户端现在连接到此服务器。操作系统为此目的为客户端打开了一个端口。假设port B
已分配给此客户端。现在我的问题是,3 rd 脚本可以连接到此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
答案 0 :(得分:1)
由于服务器和客户端使用SOCK_STREAM
套接字,他们都知道TCP会话(包括端口,IP和( SEQ_NUMBER , ACK_NUMBER )),所以当会话已在进行中,您必须执行TCP hikacking和IP spoofing才能以流方式发送消息。
换句话说,您必须猜测(或窃取)服务器的ACK号码,以便使用badclient
向客户端发送虚假消息。
但是,如果您以某种方式goodclient
回答您而不是服务器,则应运行以下命令:
iptables -A FORWARD -j NFQUEUE --queue-num 1
,因为您的操作系统并不知道您刚刚打开过的会话"与goodclient,它将发送RST数据包。此命令将阻止它。