the filter of sniff function in scapy does not work properly

12,875

Solution 1

I had the same or similar problem - the sniff filter did not work.

Installing tcpdump solved the problem for me.

Solution 2

the sniff function need tcpdump to apply "filter". If there is no tcpdump, scapy reports a warning but doesn't throw. You can enable logging to check it.

import logging
import sys
logging.getLogger("scapy").setLevel(1)
logging.basicConfig(stream=sys.stdout, level=logging.INFO)

from scapy.all import *

Solution 3

You can check into the syntax of filters in the following site http://biot.com/capstats/bpf.html. I was facing similar kinds of problems and it worked for me.

You might like to refer to this question: https://stackoverflow.com/questions/37453283/filter-options-for-sniff-function-in-scapy#=

You can also try to test your program by opening the required ports before running code.

Share:
12,875

Related videos on Youtube

MOHAMED
Author by

MOHAMED

Contact me on LinkedIn.

Updated on June 30, 2022

Comments

  • MOHAMED
    MOHAMED almost 2 years

    It seems that the filter of sniff function does not work properly.

    I m executing the sniff with the following filter

    a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
    

    But some time the sniff catch an UDP packet like this:

    >>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
    >>> a
    <Sniffed: TCP:0 UDP:1 ICMP:0 Other:0>
    

    And some time the sniff catch a TCP packet with wrong ports:

    >>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
    >>> a
    <Sniffed: TCP:1 UDP:0 ICMP:0 Other:0>
    >>> a[0]
    <Ether  dst=00:26:55:cb:3b:10 src=00:22:64:55:c8:89 type=0x800 |<IP  version=4L ihl=5L tos=0x10 len=92 id=8683 flags=DF frag=0L ttl=64 proto=tcp chksum=0x9484 src=192.168.1.71 dst=192.168.1.133 options=[] |<TCP  sport=ssh dport=1874 seq=350107599 ack=2484345720 dataofs=5L reserved=0L flags=PA window=254 chksum=0x846b urgptr=0 options=[] |<Raw  load="yn\x01\x9d\xfca\xc9V-8\x18|\xc4\t\xf1\xc4\xd8\xd3\xc6\x95E\x19'h\xc0\x89\xf1\x08g\xa3\x9a\xa9\xf51RF\xc2\x1f\xe5a\xac\x83M\xc9\x0b\x80\x85\x1b\xcf\xb6f\xcc" |>>>>
    

    And some time the sniff catch an ARP packet like this:

    >>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
    >>> a
    <Sniffed: TCP:0 UDP:0 ICMP:0 Other:1>
    >>> a[0]
    <Ether  dst=ff:ff:ff:ff:ff:ff src=00:22:07:2c:53:97 type=0x806 |<ARP  hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=who-has hwsrc=00:22:07:2c:53:97 psrc=192.168.1.178 hwdst=ff:ff:ff:ff:ff:ff pdst=192.168.1.179 |<Padding  load='\x00\x07\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x01\x14\x00\x00' |>>>
    

    Am I missing something in my filter? How I can avoid this problem?

    • Wintermute
      Wintermute about 9 years
      Do you have tcpdump installed? Also, does scapy -d give any warnings?
  • Cukic0d
    Cukic0d over 5 years
    Even if downvoted, this answer is also correct. There are actually several causes for this bug: tcpdump is not installed, the filter isn’t a correct BPF format or your socket implementation doesn’t support it (e.g. an outdated libpcap version if you have conf.use_pcap=True)
  • Cukic0d
    Cukic0d over 4 years
    Those issues were mostly fixed in recent Scapy versions. lfilter works great when you don't want to waste time figuring the BPF filter, but is eventually less memory efficient.