使用scapy的Http请求

2024-06-01 06:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要为学校作业与scapy实现http请求。一切正常,直到我需要确认http段并关闭连接。必须使用scapy并手动打开和关闭tcp连接。在wireshark中,我可以看到两个错误是TCP重传和TCP无序段。谁能解决这个问题?提前谢谢

from scapy.all import *

sport = random.randint(1024,65535)
dest = "128.119.245.12" 
getStr = 'GET / HTTP/1.1\r\nHost:' + dest + '\r\nAccept-Encoding: gzip, deflate\r\n\r\n'


#SYN
ip=IP(src='192.168.1.6',dst='128.119.245.12')
SYN=TCP(sport=sport, dport=80, flags='S', seq=0)
SYNACK=sr1(ip/SYN)
print(SYNACK.summary())


# SYN-ACK
ACK=TCP(sport=sport, dport=80, flags='A', seq=1, ack=SYNACK.seq + 1)
send(ip/ACK)

response = sr1(IP(dst=dest) / TCP(dport=80, sport=sport, seq=1, ack=SYNACK.seq + 1, flags='P''A') / getStr, timeout = 5)
print(response.dataofs)

ACK=TCP(sport=sport, dport=80, flags='A', seq=response.seq, ack=response.seq + 1)
send(ip/ACK)

FIN=ip/TCP(sport=sport, dport=80, flags="FA", seq=SYNACK.ack, ack=SYNACK.seq + 1)
FINACK=sr1(FIN)
LASTACK=ip/TCP(sport=sport, dport=80, flags="A", seq=FINACK.ack, ack=FINACK.seq + 1)
send(LASTACK)

Wireshark


Tags: ipsendresponseseqscapytcpdestflags
1条回答
网友
1楼 · 发布于 2024-06-01 06:19:19

我发现您从包25的clinet发送的ack号码是错误的。您只需增加第一个ack号码,实际上您应该发送TCP_len+1。确认接收到TCP_len字节

ACK=TCP(sport=sport, dport=80, flags='A', seq=response.seq, ack=response.seq + 1)

如果您修改这一行,应该可以。您提到的其他两个“错误”是预期的TCP行为。由于您仅通过ACK数据包确认收到1个字节,服务器将尝试重新传输剩余的有效负载。然后您将获得失败的重新传输尝试,因为客户端已经通过设置FIN ACK关闭了连接。而故障警告也来自发送错误的ACK号码

相关问题 更多 >