web-dev-qa-db-ja.com

各スニッフィングパケットでアクションをトリガーするScapyパケットスニファー

scapypythonとともに使用して、ライブトラフィックを盗聴しています。

capture=sniff(iface="<My Interface>", filter="tcp")

しかし、これは各パケットをスニッフィングし、後で処理できるリストcaptureに追加します。

パケットを処理し、スニッフィングされたらすぐにパケットのいくつかのフィールドを表示したい。つまり、パケットをスニッフィングすると、そのパケットを分析できる機能がトリガーされます。そして、これは少数のパケットで継続します。

キャプチャされたパケットリストで使用している関数の準備ができました。しかし、私はそれを各ライブパケットに使用することはできません。

それを達成する方法は? scapyで可能ですか、それとも他のパッケージをインストールする必要がありますか?

10
RatDon

Sniff関数のパラメーターは、次のコードのようになります。

from scapy.all import *

def pkt_callback(pkt):
    pkt.show() # debug statement

sniff(iface="<My Interface>", prn=pkt_callback, filter="tcp", store=0)

store=0は受信したパケットを保存しないことを示し、prnpktpkt_callbackに送信することを示します。

ソース

Yoel で述べたように、1つのアクションのみが必要な場合、この場合のような新しい関数の代わりにlambdaprnを使用できます。

sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0)
12
RatDon

これは、prn関数のsniff引数を使用して実行できます。 Scapyのチュートリアルには、単純な例 here があります。 Scapyの-​​ 公式APIドキュメント は以下を指定します。

sniff(prn=None, lfilter=None, count=0, store=1, offline=None, L2socket=None, timeout=None)

...
prn:各パケットに適用する関数。何かが返された場合、それが表示されます。たとえば、prn = lambda x: x.summary()を使用できます。
...


編集:
受け入れられた答えstoreコールバックを呼び出すには、prn引数を0に設定する必要があると主張しています。ただし、store=0を設定しても、そのような効果はありません。 Scapyの独自の例store=0を設定しないでください 公式のAPIドキュメント はそのような要件について言及していません。実際、Scapyのソースコードを調べると、store引数とprn引数の間には何の関係もないことがわかります。関連するコードブロックの抜粋を次に示します。

...
if store:
    lst.append(p)
c += 1
if prn:
    r = prn(p)
    if r is not None:
        print r
...

いくつかの簡単なテストケースを実行すると、この発見もサポートされます。

7
Yoel