用 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 相关的脚本和工具可以帮助完成此类工作,例如 capinfostshark,但我过去并没有太多使用它们。 - 但我认为它们可以用来做统计分析。你可以在这里找到它们:wiki.wireshark.org/Tools 例如你可以这样做:import pysharkcap = 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 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用scapy分析pcap报文

使用 Scapy python 识别 telnet 协议

scapy怎么构造http请求

python解析pcap文件中的http数据包

使用scapy给pcap包添加vlan

Python Scapy wrpcap - 如何将数据包附加到 pcap 文件?