web-dev-qa-db-ja.com

Pythonを使用して特定のプロトコルでpcapファイルをフィルタリングするにはどうすればよいですか?

いくつかのpcapファイルがあり、プロトコルでフィルタリングしたいのですが、HTTPプロトコルでフィルタリングしたい場合、HTTPパケット以外はpcapファイルに残ります。

openDPI というツールがあり、必要なものには最適ですが、python言語のラッパーはありません。

誰かが私が必要なことを行うことができるpythonモジュールを知っていますか?

ありがとう

編集1:

HTTPフィルタリングはほんの一例であり、フィルタリングしたいプロトコルはたくさんあります。

編集2:

Scapyを試しましたが、正しくフィルタリングする方法がわかりません。このフィルターは、バークレーパケットフィルター式のみを受け入れます。つまり、msn、HTTP、または上位層からの別の特定のフィルターを適用することはできません。誰か助けてもらえますか?

11
coelhudo

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でもないパケットが除外されます。すべてのパケットが必要な場合but 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)
17
nmichaels

私はこれが非常に古い質問であることを知っています、しかし私はちょうど私が提供すると思ってそれに出くわしましたmy答え。これは私が何年にもわたって何度か遭遇した問題であり、私は自分自身が dpkt にフォールバックしていることに気づき続けています。もともと非常に有能な dugsong から、dpktは主にパケット作成/解析ライブラリです。 pcapの解析は後から考えたものだと思いますが、pcap、IP、TCP and and 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)

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

13
J.J.

の線に沿った何か

 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 = decode.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
fraca7

pylibpcap を試してください。

3
Dave Bacher

sniffは、pcapファイルを入力として提供できるオフラインオプションをサポートしています。このようにして、pcapファイルでsniffコマンドのフィルタリングの利点を使用できます。

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

お役に立てば幸いです。

3
Yasser Arafat

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

1
vinit

@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構文を使用できる他の方法を誰かが知っている場合は?

1
Abhinav

これが私の scapyを使用したpcap解析です。また、パフォーマンステストやその他のものに関連するコードもいくつかあります。

0
InvincibleWolf