tcp协议:
---Source Port是源端口,16位
---Destination Port是目的端口,16位
---Sequence Number是发送数据包中的第一个字节的序列号,32位
---Acknowledgment Number是确认序列号,32位
---Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4
---标志位: 6位,URG表示Urgent Pointer字段有意义:
ACK表示Acknowledgment Number字段有意义
PSH表示Push功能,RST表示复位TCP连接
SYN表示SYN报文(在建立TCP连接的时候使用)
FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)
Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度
---Checksum是校验和,16位
---Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移
IHL(Internet Header Length 报头长度)是计算机名词,位于IP报文的第二个字段,4位,表示IP报文头部按32位字长(32位,4字节)计数的长度,也即报文头的长度等于IHL的值乘以4
涉及到python中的scapy库
# -- coding: utf-8 --
from scapy.all import *
#数据包应用层数据部分
data='mydata'
#发送端IP地址10.0.3.83 接收端ip 10.0.3.88
传输层的TCP并未指明数据包类型:syn fin ack 窗口大小 数据包如果分片,要指明序号
pkt=IP(src='10.0.3.83',dst='10.0.3.88')/TCP(sport=12345,dport=5555)/data
#间隔一秒发送一次 总共发送5次 发送网卡口:enp1s0
send(pkt,inter=1,count=5,iface="enp1s0")
eth = Ether(src=src_mac, dst=dst_mac)#赋值src_mac时需要注意,参数为字符串类型
arp = ARP(hwsrc=src_mac, psrc=src_ip, hwdst=dst_mac, pdst=dst_ip, op=2)
#src为源,dst为目标,op=2为响应报文、1为请求
pkt = eth / arp
endp(pkt)
构建一层包:
#不同层之间用/分隔(常用)
Ether = Ether(src="源mac",dst="目的mac") #以太网层=二层
IP = IP(src="源ip",dst="目的ip或者URL") #IP层(三层)
XY = ICMP()、TCP()、UDP() [都可以用dport=目的端口,sport=源端口] #协议封装在IP层
ARP = ARP(hwsrc=‘二层源mac‘,psrc=‘三层源IP‘,hwdst=‘二层目的mac‘,pdst=‘三层目的IP‘)
SJ = padding(load=‘x‘*8) #数据位,填充 x乘8个
RandMAC() 任意MAC地址
RandIP() 任意IP地址
构建二层包:
(以Ether层开头) 如:pkt=Ether/IP/ARP
构建三层包:
(以IP层开头) 如:pkt=IP/XY/SJ2.
只发送二层:
sendp() #给定网卡接口
只发送三层:send() #自动根据路由表进行路由发送
如发二层包:
sendp(pkt,iface="eth0",loop=1,inter=1 )
参数:
pkt #构建包的变量
iface="eth0" #选择网卡为eth0
loop=1 #循环发送
inter=1 #每隔1秒发送
timeout=1 #超时1秒就丢弃,实际时间看程序处理能力而定
发送并返回 二层:
srp() #发送包, 返回答复和没有答复的包的数量
srp1() #发送包, 返回只答复或者发送的包的详细信息| .参数,显示这个参数的返回数据
三层:
sr( ) #发送包, 返回答复和没有答复的包的数量
sr1( ) #发送包, 返回只答复或者发送的包的详细信息|.参数,显示这个参数的返回数据
如二层发收包:
srp1(pkt,timeout=1,verbose=0 )
参数:
pkt #构建包的变量
timeout=1 #超时1秒就丢弃,实际时间看程序处理能力而定
verbose=0 #不显示详细信息
sniff嗅探函数:
sniff(filter="",iface="any",prn=function,count=N)
#filter参数允许对Scapy嗅探的数据包指定一个BPF(Wireshark类型)的过滤器,也可以留空以嗅探所有的数据包。
#iface参数设置嗅探器所要嗅探的网卡,留空则对所有网卡进行嗅探。
#prn参数指定嗅探到符合过滤器条件的数据包时所调用的回调函数,这个回调函数以接受到的数据包对象作为唯一的参数。
# count参数指定需要嗅探的数据包的个数,留空则默认为嗅探无限个
haslayer(xxx) 是scapy的一个成员函数,他会检测XXX层是不是存在,存在的话,会将xxx层返回
xxx可以是 TCP,IP,ICMP
写函数:
scapy.wrpcap(‘filename’,list)
第一个参数是filename,第二个参数是一个list,保存报文的list
参考:
https://www.jianshu.com/p/c42578889ba1
https://blog.csdn.net/hjxzb/article/details/79299121
https://blog.csdn.net/shichimiyasatone/article/details/79712976
https://blog.csdn.net/singleyellow/article/details/79737473
https://blog.csdn.net/qq_41185868/article/details/80396915