如何使用 python 通过特定协议过滤 pcap 文件?

Posted

技术标签:

【中文标题】如何使用 python 通过特定协议过滤 pcap 文件?【英文标题】:How can I filter a pcap file by specific protocol using python? 【发布时间】:2011-01-15 20:53:42 【问题描述】:

我有一些 pcap 文件,我想按协议过滤,即,如果我想按 HTTP 协议过滤,除了 HTTP 数据包之外的任何内容都将保留在 pcap 文件中。

有一个名为openDPI 的工具,它非常适合我的需要,但是没有python 语言的包装器。

有谁知道任何可以满足我需求的 python 模块?

谢谢

编辑 1:

HTTP 过滤只是一个例子,我要过滤的协议有很多。

编辑 2:

我尝试了 Scapy,但我不知道如何正确过滤。该过滤器只接受 Berkeley Packet Filter 表达式,即我不能应用 msn、HTTP 或来自上层的其他特定过滤器。谁能帮帮我?

【问题讨论】:

【参考方案1】:

一个使用 Scapy 的简单示例,因为我刚刚写了一个:

pkts = rdpcap('packets.pcap')
ports = [80, 25]
filtered = (pkt for pkt in pkts if
    TCP in pkt and
    (pkt[TCP].sport in ports or pkt[TCP].dport in ports))
wrpcap('filtered.pcap', filtered)

这将过滤掉既不是 HTTP 也不是 SMTP 的数据包。如果你想要所有的数据包但是 HTTP 和 SMTP,第三行应该是:

filtered = (pkt for pkt in pkts if
    not (TCP in pkt and
    (pkt[TCP].sport in ports or pkt[TCP].dport in ports)))
wrpcap('filtered.pcap', filtered)

【讨论】:

【参考方案2】:

我知道这是一个非常古老的问题,但我只是偶然发现它以为我会提供 我的 答案。这是我多年来多次遇到的问题,我一直发现自己回到了dpkt。最初来自功能强大的dugsong,dpkt 主要是一个数据包创建/解析库。我感觉 pcap 解析是事后才想到的,但事实证明它非常有用,因为解析 pcap、IP、TCP 和 TCP 标头很简单。它正在解析所有成为时间接收器的更高级别的协议! (找dpkt之前自己写了python pcap解析库)

关于使用 pcap 解析功能的文档有点薄。这是我文件中的一个示例:

import socket
import dpkt
import sys
pcapReader = dpkt.pcap.Reader(file(sys.argv[1], "rb"))
for ts, data in pcapReader:
    ether = dpkt.ethernet.Ethernet(data)
    if ether.type != dpkt.ethernet.ETH_TYPE_IP: raise
    ip = ether.data
    src = socket.inet_ntoa(ip.src)
    dst = socket.inet_ntoa(ip.dst)
    print "%s -> %s" % (src, dst)

希望这有助于下一个人浏览这篇文章!

【讨论】:

看起来 dpkt 不再维护了。 code.google.com/p/dpkt/issues/list 解析 pcap 文件还有其他建议吗? mac 和 linux 上哪一个不是要安装的 pita? 像 dpkt 这样的包永远不会“完整”——环境太动态了。您必须准备好在需要时进行挖掘。即使在过去几个月内,我在 Mac 或 Linux 上的安装也从未遇到过问题:只需 python setup.py install。仔细检查你的假设,其他地方可能有问题。【参考方案3】:

类似的东西

从 pcapy 导入 o​​pen_offline 从 impacket.ImpactDecoder 导入 EthDecoder 从 impacket.ImpactPacket 导入 IP、TCP、UDP、ICMP 解码器 = EthDecoder() def 回调(jdr,数据): 数据包 = 解码器.解码(数据) 孩子 = 数据包.child() 如果是实例(孩子,IP): 孩子 = 数据包.child() 如果是实例(孩子,TCP): 如果 child.get_th_dport() == 80: 打印'HTTP' pcap = open_offline('net.cap') pcap.loop(0, 回调)

使用

http://oss.coresecurity.com/projects/impacket.html

【讨论】:

示例中的错误。第二个孩子应该是 = child.child() 而不是 = packet.child()【参考方案4】:

sniff 支持离线选项,您可以在其中提供 pcap 文件作为输入。这样就可以利用 sniff 命令对 pcap 文件的过滤优势。

>>> packets = sniff(offline='mypackets.pcap')
>>>
>>> packets
<Sniffed: TCP:17 UDP:0 ICMP:0 Other:0>

希望有帮助!

【讨论】:

【参考方案5】:

试试pylibpcap。

【讨论】:

但我不想解析每个数据包来检查我想要的协议,我想要一个简单的解决方案(如 openDPI)。另外,我不想担心存在的所有协议的“幻数”。如果没有解决方案,那么我将不得不这样做。谢谢 几个想法: 1. 大多数 python pcap 库允许您在捕获的数据包上设置 BPF 过滤器。 HTTP 是一个简单的过滤器tcp port 80。 2. 您可以使用 Wireshark 或类似的 GUI 来隔离您想要的数据包,将它们保存到转储文件并使用 pylibpcap 或其他此类库对其进行操作。 除了“解析每个数据包”之外别无他法。你可以有一个程序在幕后为你做这件事,这就是你所希望的。【参考方案6】:

要过滤入/出特定协议,您必须对每个数据包进行分析,否则您可能会错过网络中流动的非常规端口上的一些 http 流量。当然,如果你想要一个松散的系统,你可以只检查源端口号和目标端口号,但这不会给你准确的结果。您必须为 HTTP 和其他协议寻找协议的特定功能,如 GET、POST、HEAD 等关键字,并检查每个 TCP 数据包。

【讨论】:

是的,这并不像我最初想的那样神奇而简单。据我记得,Scapy 解决了我的具体问题。谢谢【参考方案7】:

我已经尝试过使用@nmichaels 方法,但是当我想在多个协议上迭代它时它变得很麻烦。我尝试寻找读取 .pcap 文件的方法,然后对其进行过滤,但没有找到任何帮助。 基本上,当读取 .pcap 文件时,Scapy 中没有允许过滤这些数据包的功能,另一方面,使用类似的命令,

a=sniff(filter="tcp and ( port 25 or port 110 )",prn=lambda x: x.sprintf("%IP.src%:%TCP.sport% -> %IP.dst%:%TCP.dport%  %2s,TCP.flags% : %TCP.payload%"))

有助于过滤,但仅在嗅探时。

如果有人知道我们可以使用 BPF 语法代替 for 语句的任何其他方法吗?

【讨论】:

您可以将我的方法概括为使用实际的生成器而不是生成器表达式。这应该是相对清晰的代码。【参考方案8】:

这是我使用 scapy 进行 pcap 解析的example。它还有一些用于性能测试的相关代码和其他一些东西。

【讨论】:

以上是关于如何使用 python 通过特定协议过滤 pcap 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Python-对Pcap文件进行处理,获取指定TCP流

使用 Scapy python 识别 telnet 协议

Python解析pcap文件

使用scapy分析pcap报文

python+pcap+dpkt抓包小实例

Wireshark流量分析软件解析pcap格式数据包的每条数据流是否双向传输的?