事先说明:要有一定的scapy基础,我做的是tcp三次握手,然后构造数据,没有tcp四次挥手,若你有兴趣也可以搞一下,原理都是那么回事儿,主要是讲一下scapy使用时的各种坑
from scapy.all import *
dst_ip = "192.168.1.1"
dst_port = 80
src_port = 20001
data = "GET GET / HTTP/1.0/nihao \r\n\r\n"
try:
spk1 = IP(dst=dst_ip)/TCP(dport=dst_port,sport=src_port,flags="S")
res1 = sr1(spk1)
ack1 = res1[TCP].ack
ack2 = res1[TCP].seq + 1
spk2 = IP(dst=dst_ip)/TCP(dport=dst_port,sport=src_port,seq=ack1,ack=ack2,falgs="A")
send(spk2)
except Exception as e:
print(e)
da1 = IP(dst=dst_ip)/TCP(dport=dst_port,sport=src_port,seq=ack1,ack=ack2,flags=24)/data
res2 = sr1(da1)
这个就是py代码的抓包分析,用wireshark抓包过滤一下,过滤条件也贴出来了,自己写上码即可;然后分析数据包就可以看到自己对数据包的修改 虚拟机,IP:192.168.1.16 http服务器:192.168.1.1:80
三次握手的本质
其实三次握手本质上就是,(你把那个确认号,和验证号看成一个一个数据包去理解) 你给他发第一个包,里面有个验证包seq=X,用于第二个包的确认 他给你回第二个包,里面包含一个确认包,它是第一个包的验证包+1,即就是ack=seq+1=X+1;里面还有一个验证包seq=Y,用于第三个包的确认; 你给他回第三个包,这里面包含一个确认包,它是第二个包的验证包+1,即就是ack=seq+1=Y+1;第三个包还包含一个验证包,这个验证包是第二个确认包,即就是seq=X+1; 握完手后,由你先给他发第一个数据包,需要照搬第三个包的确认号和验证号,同时flags设值为24,后面跟数据即可
|