Фильтры Wireshark

Оглавление

1. Фильтры Wireshark для начинающих

2. Операторы фильтров Wireshark

3. Логические операторы фильтров Wireshark

4. Фильтр интерфейсов

5. Трафик протоколов канального уровня

6. Трафик протоколов межсетевого уровня

7. Трафик протоколов транспортного уровня

8. Трафик протоколов прикладного уровня

9. Фильтры для Wi-Fi фреймов


Фильтры Wireshark для начинающих

У Wireshark просто огромное количество разнообразных фильтров. И по этим фильтрам есть огромная документация, в которой не так просто разобраться. Я собрал самые интересные для меня и самые часто используемые фильтры Wireshark. Для начинающих пользователей это может стать чем-то вроде справочника по фильтрам Wireshark, отправной точкой для изучения. Также здесь в комментариях предлагаю вам делиться ходовыми фильтрами, которые вы часто используете, а также интересными находками — я добавлю их в этот список.

Помните, что в Wireshark есть фильтры отображения и фильтры захвата. Здесь я рассматриваю фильтры отображения, которые вводятся в главном окне программы в верхнем поле сразу под меню и иконками основных функций.

Чтобы в полной мере понимать значение фильтров и что именно он показывает, необходимо понимание работы сети. Для знакомства с принципами работы сети и протоколов, рекомендуется изучить цикл о работе компьютерных сетей, первая статья цикла «Компьютерные сети: Часть 1. Как работают компьютерные сети» (остальные части в процессе подготовки).

Некоторые фильтры здесь написаны в общей форме, а некоторые выполнены в качестве конкретных примеров. Помните, что вы в любом случае можете подставить свои данные, например, изменить номер порта на любой вас интересующий, а также сделать то же самое с IP адресом, MAC-адресом, значением времени и пр.

Операторы фильтров Wireshark

Фильтры могут иметь различные значения, например, это может быть строка, шестнадцатеричный формат или число.

Если ищется неточное вхождение (лучше подходит для нечисловых значений) то используется contains. Например, чтобы показать TCP пакеты, содержащие строку hackware нужен следующий фильтр:

tcp contains hackware

Для поиска точных значений используются операторы. Рассмотрим их:

Оператор Описание
==/eq Равно
!=/ne Не равно
</lt Меньше чем
<=/le Меньше или равно
>/gt Больше чем
>=/ge Больше или равно

Как можно видеть, имеется по два варианта написания, например, если мы хотим указать, что значение фильтра равно чему-либо, то мы можем использовать == или eq.

Из фильтров с применением логических операндов можно строить довольно сложные конструкции, но, видимо, если один и тот же фильтр использовать дважды с операторами сравнения, например, как здесь в попытке сделать фильтрацию не по одному порту, а по диапазону портов:

tcp.port>=8000 && tcp.port<=8180

то значение фильтра (в данном случае tcp.port) перезаписывается последним значением, поэтому в результате вместо ожидаемого поведения, мы получаем результат работы только последней части, в данном случае это

tcp.port<=8180

Помните об этом баге!

При использовании с == (равно) этот баг отсутствует.

Логические операторы фильтров Wireshark

Логические операторы позволяют создавать детальные фильтры с использованием сразу нескольких условий. Рекомендуется дополнительно использовать скобки, поскольку в противном случае вы можете получить не то значение, которое ожидаете.

Оператор Описание
AND/&& Логическое И, данные выводятся если они соответствуют обоим частям фильтра. Например, фильтр ip.src==192.168.1.1 and tcp покажет только пакеты, которые исходят от 192.168.1.1 и которые ассоциированы с протоколом TCP. Будут показаны только данные, совпадающие с обоими условиями.
OR/|| Логическое ИЛИ, достаточно чтобы только одно условие было истинным; если оба являются истинной, то это тоже подходит. Например фильтр tcp.port==80 or tcp.port==8080 покажет TCP пакеты, которые связаны (являются источником или пунктом назначения) с портом 80 или 8080.
NOT/! Логическое НЕ используется, когда мы хотим исключить некоторые пакеты. То есть будут показаны все пакеты, кроме удовлетворяющие условию, следующему после НЕ. Например фильтр !dns покажет все пакеты, кроме DNS.

Примеры комбинирования:

Показать HTTP или DNS трафик:

http or dns

Показать любой трафик, кроме ARP, ICMP и DNS:

!(arp or icmp or dns)

Фильтр интерфейсов

Показать пакеты только отправленные или полученные на интерфейсе wlan0:

frame.interface_name == "wlan0"

Трафик протоколов канального уровня

Для показа ARP трафика:

arp 

Показать фреймы ARP протокола, отправленные с устройства, имеющего MAC-адрес 00:c0:ca:96:cf:cb:

arp.src.hw_mac == 00:c0:ca:96:cf:cb

Показать фреймы ARP протокола, отправленные с устройства, имеющего IP адрес 192.168.50.90:

arp.src.proto_ipv4 == 192.168.50.90

Показать фреймы ARP протокола, отправленные на устройство, имеющего MAC-адрес 00:00:00:00:00:00 (этот адрес используется когда протокол пытается узнать целевой MAC-адрес. Ещё один популярный адрес, который может вас смутить, это ff:ff:ff:ff:ff:ff, этот адрес является широковещательным, то есть сообщения с этим адресом предназначены для всех устройств локальной сети):

arp.dst.hw_mac == 00:00:00:00:00:00

Показать фреймы ARP протокола, отправленные на устройство, имеющего IP адрес 192.168.50.1:

arp.dst.proto_ipv4 == 192.168.50.1

Показать Ethernet трафик:

eth

Показать фреймы (вообще все фреймы, а не только ARP, как это было в предыдущих примерах), отправленные с устройства, имеющего MAC-адрес 00:c0:ca:96:cf:cb:

eth.src == 00:c0:ca:96:cf:cb

Показать фреймы, отправленные на устройство, имеющего MAC-адрес 78:cd:8e:a6:73:be:

eth.dst == 78:cd:8e:a6:73:be

Трафик протоколов межсетевого уровня

Показать IP трафик (сюда относятся TCP, UDP, а также протоколы уровня приложений DNS, HTTP — то есть практически всё, кроме протоколов канального уровня, которые не используют IP адреса для передачи данных (в локальных сетях Ethernet в качестве адресов доставки они используют MAC-адреса)):

ip

Если быть более точным, имеется ввиду трафик протокола IPv4, который обычно называют просто IP (Internet Protocol).

Показать трафик, связанный с определённым IP адресом (впишите его вместо x.x.x.x). Будут показаны пакеты, в которых этот IP адрес является источником данных ИЛИ получателем:

ip.addr == x.x.x.x

Показать трафик, связанный с данными двумя IP адресами. По единственно возможной логике, один из этих адресов будет источником, а второй — адресом доставки.

ip.addr == x.x.x.x && ip.addr == y.y.y.y

Показать трафик, источником которого является хост с IP адресом 138.201.81.199:

ip.src == 138.201.81.199

Показать трафик, адресатом которого является хост с IP адресом 138.201.81.199:

ip.dst == 138.201.81.199

Обратите внимание, IP протокол оперирует IP адресами, но не оперирует портами. Порты являются частью протоколов TCP и UDP. IP протокол отвечает только за маршрутизацию трафика между хостами.

Показать трафик IPv6 (Internet Protocol шестой версии):

ipv6

Другие фильтры с IP адресом аналогичны для IPv6 и IPv4.

Трафик протоколов транспортного уровня

Чтобы увидеть только трафик TCP:

tcp

Показать трафик, источником или портом назначения которого является определённый порт, например 8080:

tcp.port==8080

Показать трафик, источником которого является порт 80:

tcp.srcport == 80

Показать трафик, который отправляется службе, прослушивающей порт 80:

tcp.dstport == 80

Показать TCP пакеты с включённым флагом SYN:

tcp.flags.syn==1

Показать TCP пакеты с включённым флагом SYN и отключённым флагом ACK:

tcp.flags.syn==1 && tcp.flags.ack==0

Аналогично и для других флагов:

  • SYN
tcp.flags.syn==1
  • ACK
tcp.flags.ack==1
  • RST
tcp.flags.reset==1
  • FIN
tcp.flags.fin==1
  • CWR
tcp.flags.cwr
  • ECE
tcp.flags.ecn
  • URG
tcp.flags.urg==1
  • PSH
tcp.flags.push==1

Также можно использовать синтаксис вида tcp.flags == 0x0XX, например:

  • FIN это tcp.flags == 0x001
  • SYN это tcp.flags == 0x002
  • RST это tcp.flags == 0x004
  • ACK это tcp.flags == 0x010
  • Установленные одновременно ACK и FIN это tcp.flags == 0x011
  • Установленные одновременно ACK и SYN это tcp.flags == 0x012
  • Установленные одновременно ACK и RST это tcp.flags == 0x014

Чтобы показать пакеты, содержащие какую либо строку, например, строку hackware:

tcp contains hackware

Следовать потоку TCP с номером X:

tcp.stream eq X

Фильтровать по номеру потока:

tcp.seq == x

Показать повторные отправки пакетов. Помогает прослеживать замедление производительности приложений и потери пакетов:

tcp.analysis.retransmission

Этот фильтр выведен проблемные пакеты (потерянные сегменты, повторную отправку и другие. Этот фильтр проходят пакеты TCP Keep-Alive, но они не являются показателем проблем.

tcp.analysis.flags

Чтобы увидеть только трафик UDP:

udp

Для UDP не используются флаги. Для этого протокола можно только указать порт.

Показать трафик, источником которого является порт 53:

udp.srcport == 53

Показать трафик, который отправляется службе, прослушивающей порт 53:

udp.dstport == 53

UDP пакет, в котором встречается определённая строка, например, строка hackware:

udp contains hackware

Чтобы увидеть только трафик ICMP:

icmp

Чтобы увидеть только трафик ICMP v6 (шестой версии)

icmpv6

Показать все ответы на пинг:

icmp.type==0

Показать все пинг запросы:

icmp.type==8

Показать все ошибки недоступности/запрета хостов и портов

icmp.type==3

Показать все попытки перенаправить маршрутизацию с использованием ICMP:

icmp.type==8

Другие типы ICMP, а также варианты CODE здесь: https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TCPOPTIONS

Пример использования значения CODE, следующий фильтр покажет сообщения о недоступности порта:

icmp.type==3 && icmp.code==3

Трафик протоколов прикладного уровня

Для протоколов приклодного уровня HTTP, DNS, SSH, FTP, SMTP, RDP, SNMP, RTSP, GQUIC, CDP, LLMNR, SSDP имеются фильтры, которые называются как и сами протоколы, но пишутся маленькими буквами.

Например, чтобы увидеть HTTP трафик:

http

Чтобы увидеть трафик нового протокола HTTP/2:

http2

Помните, что при принятии решения, к какому протоколу относятся передаваемые данные, программа исходит из номера используемого порта. Если используется нестандартный порт, то программа не сможет найти нужные данные. Например, если было выполнено подключение к SSH по порту 1234, то фильтр ssh не найдёт SSH трафик.

Фильтр, который показывает только данные, переданные методом POST:

http.request.method == "POST"

Фильтр, который показывает только данные, переданные методом GET:

http.request.method == "GET"

Поиск запросов к определённому сайту (хосту):

http.host == "<URL>"

Поиск запросов к определённому сайту по части имени:

http.host contains "здесь.частичное.имя"

Чтобы увидеть передаваемые кукиз:

http.cookie

Также вы можете отфильтровать запросы, содержащие определённое значение HTTP заголовка REFERER (реферер). Например, для поиска запросов, в которых реферером является ru-board.com:

http.referer contains "ru-board.com"

Поиск запросов с любой авторизацией. Аналогично с помощью contains можно искать определённые виды авторизации:

http.authorization

Поиск файлов в HTTP потоке:

http.file_data

Чтобы увидеть, какие HTTP данные получены с задержкой, используется следующая конструкция:

http.time>1

Она покажет трафик, полученный позднее чем через 1 секунду.

Для исследования проблем, можно анализировать статус HTTP кодов ответа. Например, следующий фильтр покажет трафик, при котором получена ошибка 404 Not Found (страница не найдена):

http.response.code==404

Следующий фильтр очень интересный. Во-первых, он показывает какие сложные конструкции можно строить из отдельных фильтров. Во-вторых, он позволяет исследовать HTTP запросы и в целом веб активность, исключая лишние данные. С помощью этого фильтра вы можете просматривать веб-активность высокого уровня. Правила внутри скобок исключают изображения, файлы Javascript и таблицы стилей — всё, что страница запрашивает внутри себя. Если исследуемые страницы содержат другие встроенные объекты, то исключите их похожим образом:

http.request && !(http.request.uri contains ".ico" or http.request.uri contains ".css" or http.request.uri contains ".js" or http.request.uri contains ".gif" or http.request.uri contains ".jpg")

Чтобы увидеть все DNS запросы и ответы:

dns

Чтобы увидеть, какие DNS запросы заняли много времени:

dns.time>1

Будут показаны ответы, пришедшие более чем через секунду после отправки запроса.

Этот фильтр показывает, какие dns запросы не могут быть правильно разрешены:

dns.flags.rcode != 0

Показать только DNS запросы:

dns.flags.response == 0

Показать только DNS ответы:

dns.flags.response == 1

Показать запросы и ответы на них, в котором ищется IP для google.com:

dns.qry.name == "google.com"

Показать DNS запросы и ответы касаемые записи A:

dns.qry.type == 1

Показать DNS запросы и ответы касаемые записи AAAA:

dns.qry.type == 28

Показать ответы, в которых для записи A в качестве IP отправлен 216.58.196.3:

dns.a == 216.58.196.3

Показать ответы, в которых для записи AAAA в качестве IP отправлен 2a01:4f8:172:1d86::1:

dns.aaaa == 2a01:4f8:172:1d86::1

Показать записи с CNAME apollo.archlinux.org:

dns.cname == "apollo.archlinux.org"

Показать ответы длиной более 30:

dns.resp.len > 30

Показать запросы с длиной более 25:

dns.qry.name.len >25

Показать ответы DNS серверов на которых доступна рекурсия:

dns.flags.recavail == 1

Показать ответы DNS серверов на которых не доступна рекурсия:

dns.flags.recavail == 0

Желательна ли рекурсия (если запрошенный DNS сервер не имеет информацию об имени хоста, должен ли он опрашивать другие DNS сервера в поисках этой информации):

dns.flags.recdesired == 1

Если в запросе стоит 1, значит рекурсия нужна, если 0 — значит она не желательна.

Принимать ли неаутентифицированные данные (0 означает не принимать, 1 означает принимать):

dns.flags.checkdisable == 0

Чтобы увидеть, как назначаются IP адреса по протоколу DHCP:

udp.dstport==67

Или так:

bootp.option.dhcp

Чтобы показать DHCP запросы:

bootp.option.dhcp == 3

Чтобы показать DHCP Discover:

bootp.option.dhcp == 1

SMB фильтр. Этот фильтр в колонке Info показывает всё дерево (шару) соединений, открытых директорий и открытых файлов в трассировке.

smb2.cmd==3 or smb2.cmd==5

Фильтры для Wi-Fi фреймов

Показать элементы четырёхэтапных рукопожатий (то есть фреймы протокола EAPOL):

eapol

Показать фреймы Beacon (маяки):

wlan.fc.type_subtype == 0x08

Показать фреймы Probe Response:

wlan.fc.type_subtype == 0x05

Показать всё сразу: EAPOL, маяки, Probe Response:

wlan.fc.type_subtype == 0x08 || wlan.fc.type_subtype == 0x05 || eapol

Показать беспроводные фреймы для определённого устройства с MAC-адресом BSSID:

wlan.addr==BSSID

Показать EAPOL, маяки, Probe Response для определённого устройства с MAC-адресом 28:28:5D:6C:16:24:

(wlan.fc.type_subtype == 0x08 || wlan.fc.type_subtype == 0x05 || eapol) && wlan.addr==28:28:5D:6C:16:24

Показ всех PMKID:

eapol && wlan.rsn.ie.pmkid

Показать PMKID, маяки, Probe Response:

(wlan.fc.type_subtype == 0x08 || wlan.fc.type_subtype == 0x05 || (eapol && wlan.rsn.ie.pmkid))

Показать PMKID, маяки, Probe Response для точки доступа с MAC-адресом 40:3D:EC:C2:72:B8:

(wlan.fc.type_subtype == 0x08 || wlan.fc.type_subtype == 0x05 || (eapol && wlan.rsn.ie.pmkid)) && wlan.addr==40:3D:EC:C2:72:B8

Показать только первое сообщение рукопожатия:

wlan_rsna_eapol.keydes.msgnr == 1

Показать только второе сообщение рукопожатия (можно использовать для сообщения рукопожатия с любым номером):

wlan_rsna_eapol.keydes.msgnr == 2

Показать фреймы для точек доступа со скоростью (Data Rate) 1 Мb/s:

wlan_radio.data_rate == 1

Показать фреймы для точек доступа со скоростью более 10 Мb/s:

wlan_radio.data_rate > 10

Показывать точки доступа на определённой частоте:

radiotap.channel.freq == 2412

Показывать точки доступа с определённым уровнем сигнала:

wlan_radio.signal_dbm > -50

Фильтры, связанные с наличием у устройства антены:

radiotap.present.antenna == 1

и

radiotap.antenna == 1

Если вы знаете другие интересные фильтры Wireshark, то поделитесь ими в комментариях.

Рекомендуется Вам:

One Comment to Фильтры Wireshark

  1. Nikolay:

    спасибо, дополню только что фильтры wireshark совместимы в строке с tshark, а вот dumpcap работает с фильтрами как tcpdump или windump, в соответствии со спецификацией libpcap

Добавить комментарий

Ваш e-mail не будет опубликован.