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

问题描述 投票:11回答:8

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

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

有人知道任何可以满足我需要的python模块吗?

谢谢

编辑1:

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

编辑2:

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

python filter pcap scapy
8个回答
16
投票

一个使用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)

13
投票

我知道这是一个非常古老的问题,但是我以为我会提供my答案而碰到它。这些年来,我已经遇到过几次这个问题,但我一直发现自己退回到dpkt。 dpkt最初来自功能强大的dugsong,主要是一个数据包创建/解析库。我觉得pcap解析是事后的想法,但事实证明这是非常有用的,因为解析pcaps,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)

希望这可以帮助下一个人浏览这篇文章!


4
投票

类似的东西

从pcapy import open_offline从impacket.ImpactDecoder导入EthDecoder从impacket.ImpactPacket导入IP,TCP,UDP,ICMP解码器= EthDecoder()def回调(jdr,data):数据包=解码器。解码(数据)子= packet.child()如果isinstance(child,IP):子= packet.child()如果isinstance(child,TCP):如果child.get_th_dport()== 80:打印'HTTP'pcap = open_offline('net.cap')pcap.loop(0,回调)

使用中

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


3
投票

尝试pylibpcap


3
投票

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

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

希望有帮助!


1
投票

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


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语句的任何其他方法?


0
投票

这是我使用Scapy解析pcap的example。它还具有一些用于性能测试的相关代码以及其他一些东西。

© www.soinside.com 2019 - 2024. All rights reserved.