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

时间:2010-02-11 19:31:32

标签: python filter pcap scapy

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

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

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

由于

修改1:

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

编辑2:

我试过Scapy,但我不知道如何正确过滤。过滤器只接受Berkeley Packet Filter表达式,即我无法应用msn,HTTP或上层的其他特定过滤器。任何人都可以帮助我吗?

9 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:13)

我知道这是一个非常古老的问题,但我刚刚遇到它,因为我提供了 我的 答案。这是我多年来遇到的一个问题,我一直发现自己会回到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)

希望这有助于下一个人碰到这篇文章!

答案 2 :(得分:10)

也许这可以帮助Scapy

答案 3 :(得分:4)

的内容
from pcapy import open_offline
from impacket.ImpactDecoder import EthDecoder
from impacket.ImpactPacket import IP, TCP, UDP, ICMP

decoder = EthDecoder()

def callback(jdr, data):
    packet = decoder.decode(data)
    child = packet.child()
    if isinstance(child, IP):
        child = packet.child()
        if isinstance(child, TCP):
            if child.get_th_dport() == 80:
                print 'HTTP'

pcap = open_offline('net.cap')
pcap.loop(0, callback)
使用

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

答案 4 :(得分:3)

尝试pylibpcap

答案 5 :(得分:3)

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

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

希望有所帮助!

答案 6 :(得分:1)

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

答案 7 :(得分: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语句的任何其他方法吗?

答案 8 :(得分:0)

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