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以外のすべてのパケットが必要な場合、3 行目は次のようになります。

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にフォールバックしていることに気づき続けています。もともと非常に有能な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)

これが次の人がこの投稿に出くわすのに役立つことを願っています!

于 2011-07-08T21:17:23.173 に答える
4

の線に沿った何か

pcapy import open_offline から
impacket.ImpactDecoder から EthDecoder をインポート
impacket.ImpactPacket インポート IP、TCP、UDP、ICMP から

デコーダー = EthDecoder()

def コールバック (jdr、データ):
    パケット = デコーダ.デコード(データ)
    子 = パケット.子()
    インスタンス (子、IP) の場合:
        子 = パケット.子()
        インスタンス (子、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

@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%"))

フィルタリングに役立ちますが、スニッフィング中のみです。

for ステートメントの代わりに BPF 構文を使用できる他の方法を知っている人はいますか?

于 2012-08-30T11:48:49.243 に答える
1

特定のプロトコルをフィルターイン/アウトするには、パケットごとの分析を行う必要があります。そうしないと、ネットワーク内を流れている従来とは異なるポートで http トラフィックを見逃す可能性があります。もちろん、緩いシステムが必要な場合は、送信元と宛先のポート番号だけを確認できますが、正確な結果は得られません。HTTPのGET、POST、HEADなどのキーワードや他のプロトコルのその他のキーワードなど、プロトコルの特定の機能を探し、各TCPパケットを確認する必要があります。

于 2011-05-21T11:03:39.473 に答える