什么是Scapy
Scapy 是一个强大的网络数据包操作工具。
导入scapy模块
>>> from scapy.all import *
构造一个包
>>> from scapy.all import *
>>> ip_package = IP(dst='www.163.com', ttl=80) #构造一个IP包
>>> package = IP(dst='www.163.com')/TCP(dport=80)/"GET / HTTP/1.1\r\n\r\n" #构造TCP包
>>> package #显示包的内容
<IP frag=0 proto=tcp dst=Net('www.163.com') |<TCP dport=http |<Raw load='GET / HTTP/1.1\r\n\r\n' |>>>
发送方数据包send() 以及 sendp()
Scapy 提供了两个函数来发送数据包:send() 以及 sendp()。
send() :作用于第三层也就是网络层,也就是说它会帮你处理掉路由以及下面两层(即物理层和链路层)。
sendp(): 作用于第二层。
当指定管关键字参数 return_packets 为 True 是会返回发送的包列表。
>>> send(IP(dst="www.baidu.com")/TCP(dport=80), return_packets=True)
.
Sent 1 packets.
<PacketList: TCP:1 UDP:0 ICMP:0 Other:0>
发送并接收数据包 sr()
sr 函数负责发送数据包并接收应答,返回值是一对数据包以及其应答,还包括没有被应答的数据包,所以一共有两个列表。
sr1 函数是上面的一个变种,只返回一个应答数据包列表。这些发送的数据包必须位于第三层之上(IP、ARP 等等)。
srp 函数和 sr 类似,但是作用于第二层之上,如果没有任何响应,则当到达超时时间的时候将得到一个 None 的值。
导出导入 PCAP 文件
Scapy 可以读取 pcap 文件以及往 pcap 文件写入包数据
>>> a = rdpcap("/spare/captures/isakmp.cap")
>>> a
<isakmp.cap: UDP:721 TCP:0 ICMP:0 Other:0>
# 或者
>>> a = sniff(offline="isakmp.cap")
使用 Scapy 进行嗅探
使用 Scapy 进行嗅探操作,最核心的函数即是 sniff。它有一些常用的入参,如下表所示:
count 需要捕获的包的个数,0 代表无限
store 是否需要存储捕获到的包
filter 指定嗅探规则过滤,遵循 BPF (伯克利封包过滤器)
timeout 指定超时时间
iface 指定嗅探的网络接口或网络接口列表,默认为 None,即在所有网络接口上嗅探
prn 传入一个可调用对象,将会应用到每个捕获到的数据包上,如果有返回值,那么它不会显示
offline 从 pcap 文件读取包数据而不是通过嗅探的方式获得
# 嗅探实例
>>> sniff(filter="tcp and port 80 and target www.acfun.cn", count=3)
<Sniffed: TCP:3 UDP:0 ICMP:0 Other:0>
>>> a = _
>>> a.nsummary()
0000 Ether / IP / TCP 10.0.3.173:62061 > 202.105.176.96:https A / Raw
0001 Ether / IP / TCP 202.105.176.96:https > 10.0.3.173:62061 A
0002 Ether / IP / TCP 10.0.3.173:57087 > 59.110.88.58:https PA / Raw