【发布时间】:2020-09-18 10:00:56
【问题描述】:
想法
我正在尝试与 Scapy 建立 3 次 TCP 握手
问题
我在 Wireshark 中看到了 SYN-ACK 包,但 sr1 永远不会终止,而且似乎没有收到任何包。
代码
我有一个简单的设置来测试与 Scapy 的 TCP 握手。
DESTINATION_HOST = "194.232.104.142"
DESTINATION_PORT = 80
SOURCE_PORT = 50210
SOURCE_HOST = "192.168.0.31"
#create a TCL Handshake
#SYN
ip = IP(src=SOURCE_HOST,dst=DESTINATION_HOST)
SYN = TCP(sport=SOURCE_PORT, dport=DESTINATION_PORT, flags='S', seq=1000)
SYNACK =sr1(ip/SYN) #send the package and wait for the answer
#ACK
ACK = TCP(sport=SOURCE_PORT, dport=DESTINATION_PORT, flags='A', seq=SYNACK.ack, ack=SYNACK.seq + 1)
send(ip/ACK)
设置
Wireshark
因为似乎包裹永远不会到达我的计算机,所以我打开了wireshark并在那里找到了所需的包裹,但是sr1并没有终止,甚至:
ans = sniff(filter=f"tcp port {DESTINATION_HOST}",lfilter=match_packet,count=12,timeout=10)
print(ans)
与
def match_packet(self, pkt):
if pkt.haslayer(IP) and pkt[IP].dst == SOURCE_HOST \
and pkt.haslayer(TCP) and pkt[TCP].dport == SOURCE_PORT:
#and pkt[TCP].ack == self.seq_next:
return True
return False
返回
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:0>
【问题讨论】:
-
嗯,您是否向 Web 服务器发送了一些内容以便它可以向您发送响应?否则 Web 服务器将无限期地等待请求。因为您使用的this code 建立了一个连接,而不仅仅是发送ACK 和其他东西。
-
抱歉,您的意思是
sr1(ip/SYNC)挂了?假设我创建了示例中缺少的SOURCE_HOST,此代码似乎可以在我的机器上完美运行。 -
@Torxed 是的,我的 sr1(ip/SYN) 挂起,尽管服务器发送了 SYN-ACK 包,但它没有收到。我在stackoverflow上格式化了错误的代码,所以隐藏了DESTINATION_HOST,但现在代码(没有导入)与我机器上的完全一样。我猜你的意思是 DESTINATION_HOST 不见了?
-
我有些怀疑它是否真的发送了它,至少没有将它发送到正确的机器。如果你在欺骗 IP 肯定会出现问题,如果你在本地机器上做所有事情可能会出现问题,如果是虚拟机可能会出现问题,如果你有路由器也可能会出现问题 :) 我们知道您的设置没有任何内容,您的问题对于您尝试过的内容以及当前情况的情况含糊不清。
-
我并没有试图欺骗我的 IP,SOURCE_HOST 是我从路由器获得的实际本地 IP 地址。而且我也不是在虚拟机上,路由器当然可能是个问题,但是我要实现的任务不应该依赖于路由器,我只是想手动创建一个普通的 TLC 握手发送 SYN 并在收到 SYN-ACK 数据包后发送 ACK 数据包。 @Torxed,我很高兴让我的问题更具体或更详细地解释我的设置,但恐怕我不知道如何更具体地解决这个问题,而且我的设置非常标准。
标签: python networking tcp scapy