Фильтры отображения в WireShark. Примеры выражений

Формирование выражений фильтра отображения в wireshark

Wireshark предлагает простой, но мощный экранный фильтр, позволяющий создавать довольно сложные выражения фильтра. Вы можете сравнивать значения в пакетах, а также комбинировать простые выражения в более сложные выражения. Ниже разобраны конкретные примеры и описания.

Поля отображения фильтра

Каждое поле в панели сведений о пакете может использоваться как строка фильтра, это приведет к отображению только тех пакетов, где это поле существует. Например: строка фильтра: tcp отобразит все пакеты, содержащие протокол tcp.

Полный список всех полей фильтра доступен через пункт меню Справка

Сравнение значений

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

Вы можете использовать английские и C-подобные выражения таким же образом, их можно даже смешивать в строке фильтра.

EnglishCПример  —  описание
eq==ip.src==10.0.0.5  — IP адрес отправителя равный 10.0.0.5.
ne!=ip.src!=10.0.0.5  — IP адрес отправителя не равный 10.0.0.5 (все кроме)
gt>frame.len > 10  — Длинна больше чем 10
lt<frame.len < 128  — Длинна меньше чем 10
ge>=frame.len ge 0x100  — Больше или равно
le<=frame.len <= 0x20  — Меньше или равно
contains dns.resp.name contains google  — отображаем пакеты с DNS ответами, которые содержат «google»
matches~http.host matches yandex.ru   — соответствует HTTP-пакетам, где заголовок HOST содержит yandex.ru
bitwise_and&tcp.flags & 0x02  — побитовое сравнение поля

Кроме того, все поля протокола имеют тип.

Типы полей фильтра отображения

Беззнаковое целое
Может быть 8, 16, 24, 32 или 64 бит. Вы можете выразить целые числа в десятичном, восьмеричном или шестнадцатеричном. Следующие фильтры отображения эквивалентны:

ip.len 1500
ip.len 02734
ip.len 0x5dc
Знаковое целое число

Может быть 8, 16, 24, 32 или 64 бит. Как и в случае беззнаковых целых чисел, вы можете использовать десятичные, восьмеричные или шестнадцатеричные.

Логический

Логическое поле присутствует в декодировании протокола, только если его значение истинно. Например, tcp.flags.synприсутствует и, следовательно, истинно, только если флаг SYN присутствует в заголовке сегмента TCP.

Выражение фильтра `tcp.flags.syn` будет выбирать только те пакеты, для которых этот флаг существует, то есть сегменты TCP, в которых заголовок сегмента содержит Флаг SYN. Аналогичным образом, чтобы найти пакеты с маркером с маршрутизируемым маршрутом, используйте фильтр выражение `tr.sr`.

Ethernet-адрес

6 байтов, разделенных двоеточием (:), точкой (.) Или тире (-) с одним или двумя байтами между разделителями:

eth.dst == ff: ff: ff: ff: ff: ff
eth.dst == ff-ff-ff-ff-ff-ff
eth.dst == ffff.ffff.ffff

Адрес IPv4

ip.addr == 192.168.0.1

Бесклассовая междоменная маршрутизация (CIDR) может использоваться для проверки, если адрес IPv4 находится в определенной подсети. Например, этот дисплей фильтр найдет все пакеты в сети 129.111:

ip.addr == 129.111.0.0/16

Адрес IPv6

ipv6.addr == ::1

Как и с адресами IPv4, адреса IPv6 могут соответствовать подсети.

Текстовая строка

http.request.uri == "https://nordd.ru/"

Объединение выражений

Вы можете комбинировать выражения фильтра в Wireshark, используя логические операторы

английский C-подобный Описание и пример
and && Логические И. ip.src==10.0.0.5 and tcp.flags.fin
or || Логический ИЛИ. ip.scr==10.0.0.5 or ip.src==192.1.1.1
xor ^^ Логический XOR. tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29
not ! Логическое НЕ. not llc
[…​]   См. «Оператор Slice» ниже.
in   См. «Оператор Membership» ниже.

Оператор Slice

Wireshark позволяет вам выбирать подпоследовательности последовательности довольно продуманными способами.После метки вы можете поместить пару скобок [], содержащих список спецификаторов диапазона, разделенных запятыми.

eth.src [0: 3] == 00:00:83

В приведенном выше примере используется формат n: m для указания одного диапазона. В этом случае n — начальное смещение, а m — длина указанного диапазона.

eth.src [1-2] == 00:83

В приведенном выше примере используется формат nm для указания одного диапазона. В этом случае n является начальным смещением, а m является окончательным смещением.

eth.src [: 4] == 00: 00: 83: 00

В приведенном выше примере используется формат: m, который берет все от начала последовательности до смещения m. Это эквивалентно 0: m

eth.src [4:] == 20:20

В приведенном выше примере используется формат n:, который принимает все значения от смещения n до конца последовательности.

eth.src [2] == 83

В приведенном выше примере используется формат n для указания одного диапазона. В этом случае выбирается элемент в последовательности со смещением n. Это эквивалентно n: 1.

eth.src [0: 3.1-2 ,: 4.4 :, 2] == 00:00:83:00:83:00:00:83:00:20:20:83

Wireshark позволяет вам объединять отдельные диапазоны в списке, разделенном запятыми, для формирования составных диапазонов, как показано выше.

Оператор Membership

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

tcp.port in {80 443 8080}

Это можно считать оператором быстрого доступа, поскольку предыдущее выражение могло бы быть выражено как:

tcp.port == 80 || tcp.port == 443 || tcp.port == 8080

Набор значений также может содержать диапазоны:

tcp.port in {443 4430..4434}

простоt сокращение для tcp.port == 443 || (tcp.port >= 4430 && tcp.port <= 4434)Операторы сравнения обычно выполняются, когда какое-либо поле соответствует фильтру, и, таким образом, пакет с портами 80 и 56789 будет соответствовать этому альтернативному фильтру отображения, поскольку 56789 >= 4430 && 80 <= 4434это правда. Оператор членства вместо этого проверяет одно и то же поле относительно условия диапазона.

Наборы не просто ограничены числами, но и другими типами:

http.request.method in {"HEAD" "GET"}
ip.addr in {10.0.0.5 .. 10.0.0.9 192.168.1.1..192.168.1.9}
frame.time_delta in {10 .. 10.5}

Функции

Язык фильтра отображения имеет ряд функций для преобразования полей.

Функция Описание
upper Преобразует поле строки в верхний регистр.
lower Преобразует строковое поле в нижний регистр.
len Возвращает длину байта строки или байта.
count Возвращает количество полей в кадре.

Преобразует http.server в нижний регистр и ищет apache : lower(http.server) contains «apache».

Для того, чтобы найти HTTP запросы с длинным запросом URIs: len(http.request.uri) > 100. Обратите внимание, что lenфункция возвращает длину строки в байтах, а не символы.

Обычно IP-кадр имеет только два адреса (источник и адресат), но в случае ошибок ICMP или туннелирования один пакет может содержать еще больше адресов. Эти пакеты можно найти с помощью count(ip.addr) > 2.

Распространенная ошибка

Использование оператора ! = Для комбинированных выражений типа eth.addr, ip.addr, tcp.port и udp.port, вероятно, не будет работать должным образом.

Часто люди используют строку фильтра, чтобы отобразить что-то вроде ip.addr == 1.2.3.4 отображения всех пакетов, содержащих IP-адрес 1.2.3.4.

Затем они используют ip.addr != 1.2.3.4 для просмотра всех пакетов, не содержащих в нем IP-адрес 1.2.3.4. К сожалению, это результат не оправдывает ожидания.

Вместо этого это выражение будет даже верно для пакетов, где либо исходный, либо целевой IP-адрес равен 1.2.3.4. Причиной этого является то, что выражение ip.addr != 1.2.3.4 должно быть прочитано как «пакет содержит поле с именем ip.addr со значением, отличным от 1.2.3.4». Поскольку датаграмма IP содержит как источник, так и адрес назначения, выражение будет оцениваться как true, если хотя бы один из двух адресов отличается от 1.2.3.4.

Если вы хотите отфильтровать все пакеты, содержащие IP-датаграммы, или с IP-адреса 1.2.3.4, то правильный фильтр будет таким, !(ip.addr == 1.2.3.4)как он читает: «Покажите мне все пакеты, для которых это неверно», или, другими словами, » отфильтровать все пакеты, для которых нет вхождений поля с именем ip.addr со значением 1.2.3.4 «.