一文学会PyShark基本使用

First Post:

Last Update:

Word Count:
425

Read Time:
1 min

安装

  • 安装 Wireshark 时勾选安装 Tshark

    安装Tshark

  • pip 安装 Pyshark

1
pip install pyshark
  • 将 Wireshark 安装目录添加到环境变量

    环境变量

  • 找到 PyShark 库安装位置下的 config.ini,将 tshark_path 修改为安装路径

    安装路径

从读取 pcap/pcapng 文件开始

示例题目: BUUCTF - easycap

1
2
3
4
5
6
import pyshark # 导入 pyshark 库
# 通过路径定位 pcap 文件位置并创建 FileCapture 类
cap = pyshark.FileCapture('F:\\easycap.pcap')
# 遍历数据包
for pkt in cap:
print(pkt.highest_layer, pkt.length)

运行结果

从运行结果可知,包含数据的 TCP 包的 highest_layer 会被标记为 DATA

1
2
3
for pkt in cap: # 遍历数据包
if 'DATA' in pkt: # 当 highest_layer 为 DATA 时
print(pkt.tcp.payload) # 打印 TCP Payload
1
2
3
4
5
6
7
F:\>python shark.py
46
4c
41
47
3a
...

最后将十六进制 Payload 转为 char

1
2
3
4
for pkt in cap: # 遍历数据包
if 'DATA' in pkt: # 当 highest_layer 为 DATA 时
# TCP Payload 转为字符并打印
print(chr(int(pkt.tcp.payload, 16)))
1
2
3
4
5
6
7
F:\>python shark.py
F
L
A
G
:
...

对于一些不常见的数据包类型

示例题目:
第八届浙江省大学生网络与信息安全竞赛网络安全技能挑战赛-预赛
MISC - 小小作曲家

依然通过遍历数据包获取 highest_layer 类型

1
2
for pkt in cap:
print(pkt.highest_layer, pkt.length)
1
2
3
4
5
6
7
8
9
10
11
12
13
F:\>python shark.py
DATA 36
DATA 46
DATA 36
DATA 129
DATA 36
USB 28
USBAUDIO 31
USB 27
USBAUDIO 31
USB 27
USBAUDIO 31
...

了解到 highest_layer 类型为 USBAUDIO,通过 layers 属性获取数据包内所有 layer

1
2
pkt = cap[6]
print(pkt.layers)
1
2
F:\>python shark.py
[<USB Layer>, <USBAUDIO Layer>]

通过 field_names 属性获取具体属性名称

1
2
pkt = cap[6]
print(pkt.usbaudio.field_names)
1
2
F:\>python shark.py
['midi_cable_number', 'midi_code_index', 'midi_event']

结合 Wireshark 中显示的结构,具体数据位于 midi_event

1
2
pkt = cap[6]
print(pkt.usbaudio.midi_event)
1
2
F:\>python shark.py
90:40:64

确认与 Wireshark 显示内容相同

Wireshark