11

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

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

有谁知道任何可以做我需要的python模块?

谢谢

编辑1:

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

编辑2:

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

4

8 回答 8

19

一个使用 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)
于 2010-12-30T17:09:52.723 回答
13

我知道这是一个非常古老的问题,但我只是遇到它以为我会提供我的答案。这是我多年来多次遇到的问题,并且我不断发现自己回到了dpkt。dpkt最初来自非常强大的dugsong,主要是一个数据包创建/解析库。我感觉 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)

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

于 2011-07-08T21:17:23.173 回答
4

类似的东西

从 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

于 2010-02-12T09:15:06.090 回答
4

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

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

希望有帮助!

于 2016-02-24T01:59:40.493 回答
3

尝试pylibpcap

于 2010-02-11T19:48:18.107 回答
1

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

于 2011-05-21T11:03:39.473 回答
1

我已经尝试过使用@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 语句的任何其他方法吗?

于 2012-08-30T11:48:49.243 回答
0

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

于 2020-02-12T18:25:43.767 回答