web-dev-qa-db-fra.com

Renifleur de paquet scapy déclenchant une action sur chaque paquet reniflé

J'utilise scapy avec python pour renifler le trafic en direct.

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

Mais cela renifle chaque paquet et l'ajoute à la liste capture qui peut être traitée plus tard.

Je veux traiter un paquet et afficher quelques champs du paquet, dès qu'il est reniflé. c'est-à-dire qu'en reniflant un paquet, il déclenchera une fonction où je pourrai analyser ce paquet. Et cela continuerait pour quelques paquets.

J'ai la fonction prête que j'utilise avec la liste des paquets capturés. Mais je ne peux pas l'utiliser pour chaque paquet en direct.

Comment y parvenir? Est-ce possible avec scapy ou dois-je installer un autre package?

12
RatDon

Les paramètres de la fonction sniff doivent être comme le code ci-dessous:

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 dit de ne stocker aucun paquet reçu et prn dit d'envoyer le pkt à pkt_callback.

Source.

Comme mentionné par Yoel , si une seule action est requise, lambda peut être utilisé avec prn au lieu d'une nouvelle fonction comme dans ce cas:

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

Cela peut être fait avec l'argument prn de la fonction sniff. Le tutoriel de Scapy a un exemple simple ici . Scapy's documentation officielle de l'API spécifie:

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

...
prn: fonction à appliquer à chaque paquet. Si quelque chose est retourné, il s'affiche. Par exemple, vous pouvez utiliser prn = lambda x: x.summary().
...


MODIFIER:
La réponse acceptée affirme que l'argument store doit être défini sur 0 pour que le rappel prn soit appelé. Cependant, la définition de store=0 n'a pas un tel effet. Scapy propres exemples ne pas définir store=0 et le documentation officielle de l'API ne mentionne pas une telle exigence. En fait, inspecter le code source de Scapy ne révèle aucune connexion entre les arguments store et prn. Voici un extrait du bloc de code correspondant:

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

L'exécution de quelques cas de test simples prend également en charge cette constatation.

7
Yoel