一、安装与环境配置
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/