用 scapy 读取 PCAP 文件
Posted
技术标签:
【中文标题】用 scapy 读取 PCAP 文件【英文标题】:Reading PCAP file with scapy 【发布时间】:2017-08-15 06:10:57 【问题描述】:我有大约 10GB 的 pcap 数据和 IPv6 流量来分析存储在 IPv6 标头和其他扩展标头中的信息。为此,我决定使用 Scapy 框架。我试过 rdpcap 功能,但对于这么大的文件,不推荐。它试图将所有文件加载到内存中并卡在我的情况下。 我在网上发现,在这种情况下 sniff 是推荐的,我的代码如下:
def main():
sniff(offline='traffic.pcap', prn=my_method,store=0)
def my_method(packet):
packet.show()
在名为 my_method 的函数中,我分别接收每个数据包并且可以解析它们,但是.... 当我使用内置框架方法调用 show 函数时,我得到了这样的结果:
当在 Wireshark 中打开时,我得到了正确的数据包:
你能告诉我如何在 scapy 中解析这些数据包以获得正确的结果吗?
编辑: 根据 cmets 中的讨论,我找到了一种用 Python 解析 PCAP 文件的方法。在我看来,最简单的方法是使用 pyshark 框架:
import pyshark
pcap = pyshark.FileCapture(pcap_path) ### for reading PCAP file
使用 for 循环可以轻松迭代读取文件
for pkt in pcap:
#do what you want
对于解析 IPv6 标头,以下方法可能有用:
pkt['ipv6'].tclass #Traffic class field
pkt['ipv6'].tclass_dscp #Traffic class DSCP field
pkt['ipv6'].tclass_ecn #Traffic class ECN field
pkt['ipv6'].flow #Flow label field
pkt['ipv6'].plen #Payload length field
pkt['ipv6'].nxt #Next header field
pkt['ipv6'].hlim #Hop limit field
【问题讨论】:
@coder 我知道wireshark 以不同的方式显示数据包,我对此很满意。但是看看 src ip 地址以及它是如何被 scapy 解析的——据我所知,这并不好,但也许我不对。 哦,是的,你是对的 - 我错过了 ipv6 部分。 我在 scapy github 页面 (github.com/secdev/scapy/issues/579) 上打开了 bug 问题。 @coder 你提到使用wireshark 会更有效率。我的目标是获取标头的每个值并进行一些统计工作——wireshark 是否能够执行此类活动? 据我所知,有一些与 Wireshark 相关的脚本和工具可以帮助完成此类工作,例如capinfos
和 tshark
,但我过去并没有太多使用它们。 - 但我认为它们可以用来做统计分析。你可以在这里找到它们:wiki.wireshark.org/Tools
例如你可以这样做:import pyshark
,cap = pyshark.FileCapture('v6.pcap')
,然后是for packet in cap: print packet.ipv6.src
【参考方案1】:
更新
最新的scapy 版本现在支持 ipv6
解析。
因此,用scapy
解析 ipv6 ".pcap" 文件 现在可以这样做:
from scapy.all import *
scapy_cap = rdpcap('file.pcap')
for packet in scapy_cap:
print packet[IPv6].src
现在,正如我在最初提出这个问题时所评论的那样,对于较早的
scapy
版本(不支持 ipv6 解析):
pyshark
代替(pyshark
是 tshark 包装器),如下所示:
import pyshark
shark_cap = pyshark.FileCapture('file.pcap')
for packet in shark_cap:
print packet.ipv6.src
当然还有tshark
(wireshark 的终端版本):
$ tshark -r file.pcap -q -Tfields -e ipv6.src
【讨论】:
【参考方案2】:如果你想继续使用 scapy 并反复阅读文件,我建议你试试PcapReader()
它会与您尝试对 pyshark
做的相同,但在 Scapy 中
from scapy.all import *
for packet in PcapReader('file.pcap')
try:
print(packet[IPv6].src)
except:
pass
如果您有任何没有 IPv6 地址的数据包,我建议您将其包装起来,以防万一。
【讨论】:
我有一个 pcap 文件,我使用 IPv6 和 IPv4 运行上述代码,这两种类型都没有打印任何内容。 @umairmehmood 你检查过你有任何 IPv6 数据包吗?我从packetlife.net/captures/protocol/ipv6 下载了一个文件,它正在运行:在 [1]: from scapy.all import * In [2]: pcap_file = '/tmp/lispmn_IPv6-RLOC.pcapng.cap' 在 [3]:对于 PcapReader(pcap_file) 中的数据包: ...: try: ...: print(packet[IPv6].src) ...: except: ...: pass ...: 2607:f2c0:f00f:b001: :face:b00c 2607:f2c0:f00f:b001::face:b00c 2607:f2c0:f00f:b001::face:b00c 2607:f2c0:f00f:b001::face:b00c 2607:f2c0:f00f:b001::face :b00c 2607:f2c0:f00f:b001::face:b00c以上是关于用 scapy 读取 PCAP 文件的主要内容,如果未能解决你的问题,请参考以下文章