一、安装与环境配置
Pyshark是一款Python封装的Wireshark网络协议分析工具。使用Pyshark能够方便地在Python代码中读入pcap文件或者在线抓包进行高效地网络数据分析。
使用pyshark前需要安装Wireshark,并添加Wireshark环境变量。可以在命令行运行wireshark查看是否安装成功。在Windows中配置时,需要在环境变量中添加Wireshark的相关路径。
# 快速安装pyshark pip install pyshark
二、基础用法
在使用Pyshark时,先创建一个Pcap对象,用于打开pcap文件或者在线抓包,然后对该对象进行配置,在进行操作。
可以使用filter参数提供Berkeley包过滤器语法进行过滤解析,也可以直接设置追踪的协议。通过parse方法将抓到的网络数据转化成Packets对象进行操作。
如果只处理少量的数据包的话,可以直接遍历Packets对象访问各个数据包。
import pyshark
# 打开pcap文件
cap = pyshark.FileCapture('test.pcap')
# 配置过滤器
cap.set_display_filter('http')
# 遍历抓到的数据包
for packet in cap:
print(packet.http)
三、协议解析
Pyshark支持的协议解析非常的丰富,包括TCP、UDP、ICMP、HTTP、SMB、SMTP、POP3等。对于每个协议,都有对应的属性和方法可以进行访问和操作。
以HTTP协议为例,可以访问HTTP对象的方法和属性,获取HTTP数据的相关信息,比如请求类型、请求地址、请求头、请求内容、响应类型、响应头、响应内容等。
import pyshark
# 打开pcap文件
cap = pyshark.FileCapture('test.pcap')
# 配置过滤器
cap.set_display_filter('http')
# 遍历抓到的HTTP数据包
for packet in cap.http:
print(packet.http.request.method)
print(packet.http.request.uri)
print(packet.http.request_full_uri)
print(packet.http.cookie)
四、SSL解密
在HTTPS中,数据是进行加密传输的,普通的抓包工具是无法解析和捕获到数据的。但是,使用Wireshark可以捕获到加密过的数据,并将其导出成pcap文件。
Pyshark提供了SSL解密的方式,先需要在Wireshark中对SSL进行配置,生成TLS密钥文件。接下来在Pyshark中将TLS密钥文件导入,即可进行SSL解密操作。
import pyshark
# 加载TLS密钥文件
pyshark.tshark.tshark.get_tshark_interfaces()[-1].ssl_keylog_file = '/path/to/your/keylog/file'
# 打开加密的pcap文件
cap = pyshark.FileCapture('test-ssl.pcap', ssl_keylog='/path/to/your/keylog/file')
# 配置过滤器
cap.set_display_filter('http')
# 遍历抓到的HTTP数据包
for packet in cap.http:
print(packet.http.request.method)
print(packet.http.request.uri)
print(packet.http.request_full_uri)
print(packet.http.cookie)
五、协议定制
Pyshark支持对其它具有特定协议的数据包进行解析。以HTTP为例,可以生成一个HTTP协议的数据包类,通过inherited_fields参数进行相关方法和属性的继承和增加。
import pyshark
# 定义自定义协议类
class MyHTTPPacket(pyshark.packet.Packet):
"""定义HTTP数据包"""
decode_as = {
# 指定解码类型为HTTP协议
pyshark.LayerType.PDNS: 'http'
}
def __init__(self, *args, **kwargs):
super(MyHTTPPacket, self).__init__(*args, **kwargs)
@property
def method(self):
return self.http.request.method
# 打开pcap文件
cap = pyshark.FileCapture('test.pcap')
# 配置过滤器
cap.set_display_filter('http')
# 遍历抓到的HTTP数据包
for packet in cap:
if packet.http:
my_packet = MyHTTPPacket(packet)
print(my_packet.method)
六、高效抓包
可以使用Pyshark的LiveCapture类进行高效在线抓包,指定网卡名称或者网卡地址等信息进行抓包。
在抓包时可以使用BPF过滤器进行抓包范围的配置,避免大量无用数据的传输,提升抓包效率。
import pyshark
# 指定所需抓包的网卡和过滤器
capture = pyshark.LiveCapture(interface='en0', display_filter='http')
# 持续抓包
for packet in capture.sniff_continuously():
print(packet.http)
七、参考资料
1、Pyshark官方文档:https://kiminewt.github.io/pyshark/
2、Wireshark官方网站:https://www.wireshark.org/
