下载安装scapy库(https://blog.csdn.net/qq_23977687/article/details/88046257)
安装完后:
ls() 命令可以查看所有支持的协议
ls(IP) 命令列出ip协议头部字段格式,只要想查看哪个协议的参数,括号里就填哪个协议
IP().show() 列出ip包的信息
lsc() 命令列出scapy的所有命令
conf 命令列出scapy 的配置参数
scapy是python中一个可用于网络嗅探的非常强大的第三方库,可以用它来做 packet 嗅探和伪造 packet。 scapy已经在内部实现了大量的网络协议。如DNS、ARP、IP、TCP、UDP等等,可以用它来编写非常灵活实用的工具。
换言之,Scapy 是一个强大的操纵报文的交互程序。它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。Scapy 可以轻松地做到像扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)这样的传统任务。它可以代替 hping 、arpspoof 、arp-sk、arping,p0f 甚至是部分的Namp、tcpdump 和 tshark 的功能。
有两种方式,实时抓包,读取 pcap文件
1.1.1 实时抓包:scapy抓包使用 sniff() 函数,这个函数有很多参数
def sniff(count=0, store=1, offline=None, prn=None,filter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, iface=None,*args,**kargs)
count:抓包的数量,0表示无限制;
store:保存抓取的数据包或者丢弃,1保存,0丢弃
offline:从 pcap 文件读取数据包,而不进行嗅探,默认为None
prn:为每一个数据包定义一个函数,如果返回了什么,则显示。例如:prn = lambda x: x.summary(); ( packct.summar()函数返回的是对包的统计性信息 )
filter:过滤规则,使用wireshark里面的过滤语法
L2socket:使用给定的 L2socket
timeout:在给定的时间后停止嗅探,默认为 None
opened_socket:对指定的对象使用 .recv() 进行读取;
stop_filter:定义一个函数,决定在抓到指定数据包后停止抓包,如:stop_filter = lambda x: x.haslayer(TCP);
iface:指定抓包的接口
实例:(eth0是要检测的网卡名,count是抓包的数量)
from scapy.all import *
packets = sniff(iface=eth0, count=1)
1.1.2 读取pcap文件:利用这个库中的 rdpcap()方法来实现
import scapy.all as scapy
packets = scapy.rdpcap(xx.pcap)
2.1.1 使用scapy的内置函数 show() 打印结果
for p in packets:
p.show()
输出:
###[ Ethernet ]###
dst = 14:43:d0:65:ae:a2
src = 88:b8:5d:bd:0d:7f
type = IPv4
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 40
id = 28350
flags =
frag = 0
ttl = 128
proto = udp
chksum = 0x0
src = 192.168.1.56
dst = 192.144.236.192
\options \
###[ UDP ]###
sport = 59297
dport = ms_wbt_server
len = 20
chksum = 0x6f27
###[ Raw ]###
load = '\xae;\xf8\x01\x04\x00\x04\x04\x00\x01\x07\x00'
通过上述输出结果,我们可以看得出每个层的数据包有哪些属性可以取出。
这里P代表的是Ethernet层。P.dst (取出dst属性)、P.src (取出src属性)、P.type (取出type属性)
每一层都有一个 payload 属性,可以不断进入下一层。
p.payload:IP层(可用 p.payload.* 取出IP层的属性)
p.payload.payload:TCP/UDP层(可用 p.payload.payload.* 取出TCP/UDP层的属性)
p.payload.payload.payload:RAW层(可用 p.payload.payload.payload.* 取出RAW层的属性)
2.2 根据列表标签查找输出
我们可以查看第一个数据包:package[0]是查看第一个数据包的数据,package[0].show()是查看第一个数据包的详细信息,scapy是按照按照 TCP/IP 四层参考模型显示详细包信息的,即:链路层 [Ethernet]、网络层[IP]、传输层[TCP/UDP]、应用层[RAW] 。我们还可以通过协议来查看指定的包:
package[UDP][0].show() ,因为我们这里只有UDP的数据包,所以就没有这样使用。,而我们也可以直接只获取指定层的数据,如: pcap[UDP][1][Ether].dst 这个包里面是等于ff:ff:ff:ff:ff:ff
from scapy.all import *
package=sniff(iface='eth0',count=10) #扫描eth0网卡的数据包,总数为10个
print(package)
print(package[0]) #查看第一个数据包的数据
print(package[0].show()) #查看第一个数据包的详情
######################################################################
<Sniffed: TCP:0 UDP:9 ICMP:0 Other:1>
b"\xff\xff\xff\xff\xff\xff\xc8[v\xec5\xed\x08\x00E\x00\x01#8G\x00\x00@\x11\x17=\n`\n\x88\n`\n\xff\xd6\x83\xd6\x83\x01\x0fN\xa0\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00@\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"
###[ Ethernet ]###
dst = ff:ff:ff:ff:ff:ff
src = c8:5b:76:ec:35:ed
type = 0x800
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 291
id = 14407
flags =
frag = 0
ttl = 64
proto = udp
chksum = 0x173d
src = 10.96.10.136
dst = 10.96.10.255
\options \
###[ UDP ]###
sport = 54915
dport = 54915
len = 271
chksum = 0x4ea0
###[ Raw ]###
load = "\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00@\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"