安装方法:
pip3 install scapy
1. 10.20.0.5运行server.pyq启动一个监听端口为7000的tcp server端
# ./server.py
# cat server.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
HOST = '0.0.0.0'
PORT = 7000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(5)
print('server start at: %s:%s' % (HOST, PORT))
print('wait for connection...')
while True:
conn, addr = s.accept()
print('connected by ' + str(addr))
while True:
indata = conn.recv(1024)
if len(indata) == 0: # connection closed
conn.close()
print('client closed connection.')
break
print('recv: ' + indata.decode())
# outdata = 'echo ' + indata.decode()
# conn.send(outdata.encode())
2. 在server端启动抓包,加-S显示绝对序列号:
tcpdump -i any host 10.20.0.13 and tcp port 7000 -nn -vv -S
3. 10.20.0.13作为客户端运行client.py启动tcp连接server的
4. 步骤3启动client端后通过抓包可以看到已建立连接的四元组信息:
client ip:10.20.0.13
client port:47066
server ip: 10.20.0.5
server port: 7000
客户端当前最后一个报文的seq和ack号如下:
seq 1076722322, ack 3291023708
5. 根据四元组信息和seq以及ack信息在client端构造scapy报文信息发送给server端7000端口:
ip = IP(src='10.20.0.13', dst='10.20.0.5')
tcp = TCP(sport=47066, dport=7000,flags='PA', seq=1076722322,ack=3291023708)
payload="hello,scapy!"
send(ip/tcp/payload)
6. 此时server端可以收到client端scapy构造的信息:
对应抓包信息:
说明下这里flags对应要发送数据包的类型,这里为PA代表要发送的tcp报文带有数据和ack信息:
tcp = TCP(sport=47066, dport=7000,flags='PA', seq=1076722322,ack=3291023708)
如果只是发送SYN报文则:
flags='S'
如果只是发送ACK报文则:
flags='A'
如果只是发送RST报文则:
flags='R'
如果发送FIN+ACK报文则:
flasg=‘FA’
参考:
https://www.firewall.cx/networking-topics/protocols/tcp/136-tcp-flag-options.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。