Подтвердить что ты не робот

Фильтр функции sniff в scapy не работает должным образом

Кажется, что функция filter of sniff работает неправильно.

Я выполняю sniff со следующим фильтром

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

Но некоторое время sniff поймает пакет UDP следующим образом:

>>> 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>

И некоторое время sniff поймает TCP-пакет с неправильными портами:

>>> 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" |>>>>

И некоторое время sniff поймает пакет ARP следующим образом:

>>> 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' |>>>

Я что-то пропустил в своем фильтре? Как я могу избежать этой проблемы?

4b9b3361

Ответ 1

У меня была такая же или подобная проблема - фильтр sniff не работал.

Установка tcpdump решила проблему для меня.

Ответ 2

Вы можете проверить синтаксис фильтров на следующем сайте http://biot.com/capstats/bpf.html. Я столкнулся с подобными проблемами, и это сработало для меня.

Вы могли бы обратиться к этому вопросу: fooobar.com/questions/709263/...

Вы также можете попробовать протестировать свою программу, открыв необходимые порты перед запуском кода.

Ответ 3

У меня была такая же проблема с Centos на VM. Я использовал ip host для фильтра вместо хоста. Это, похоже, устранило проблему в моем случае.

Неверный фильтр #

>>> packets = sniff (filter = "host 176.96.135.80", count =2, iface = "eth0", timeout =10)
>>> packets.summary()
Ether / IP / UDP 172.7.198.136:netbios_ns > 172.7.199.255:netbios_ns / NBNSQueryRequest
Ether / IP / TCP 176.96.135.80:53527 > 172.7.19.58:ssh A / Padding

Fix #

>>> packets = sniff (filter = "ip host 176.96.135.80", count =2, iface = "eth0", timeout =10)

После этого не было проблем.

Ответ 4

функция sniff нуждается в tcpdump для применения "фильтра". Если tcpdump нет, scapy выдает предупреждение, но не выдает. Вы можете включить ведение журнала, чтобы проверить это.

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

from scapy.all import *

Ответ 5

Есть известные ошибки с функцией фильтра (особенно при использовании локальной петлевой сети!). Рекомендуется использовать lfilter (и в зависимости от ваших потребностей также stop_filter):

Пример использования: lfilter=lambda p: any(proto in [14010]) for proto in [TCP]), stop_filter =lambda x: x.haslayer(TCP)

Для более подробной информации смотрите lfilter: https://home.regit.org/2012/06/using-scapy-lfilter/