Как пользоваться Wireshark? Анализ трафика. Уроки Wireshark: поиск пакетов и их подсветка Знакомимся с фильтрами

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

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

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

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

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

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

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

Tcp contains hackware

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

Как можно видеть, имеется по два варианта написания, например, если мы хотим указать, что значение фильтра равно чему-либо, то мы можем использовать == или 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 протокола, отправленные с устройства, имеющего 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 трафик:

Показать фреймы (вообще все фреймы, а не только 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

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

Фильтрация IPv4 протокола

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

Если быть более точным, имеется ввиду трафик протокола 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 протокол отвечает только за маршрутизацию трафика между хостами.

Фильтрация подсетей и диапазонов IP в Wireshark

Вы можете вместо одного IP адреса указать подсеть:

Ip.addr == 192.168.1.0/24

Фильтрация трафика, отправленного с определённого диапазона IP. Если нужно отфильтровать трафик, источником которого является подсеть, то используйте фильтр вида:

Ip.src == 192.168.1.0/24

Фильтрация трафика, предназначенного для отправки на определённый диапазон IP. Если нужно отфильтровать трафик, пунктом назначения которого является подсеть, то используйте фильтр вида:

Ip.dst == 192.168.1.0/24

Фильтрация IPv6 протокола

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

Фильтрация по IPv6 адресу. Для фильтрации по IPv6 адресу используйте фильтр:

Ipv6.addr == 2604:a880:800:c1::2ae:d001

Фильтрация подсетей и диапазонов IPv6 в Wireshark

Вы можете вместо одного IPv6 адреса указать подсеть для фильтрации:

Ipv6.addr == 2604:a880:800:c1::2ae:d000/64

Если нужно отфильтровать трафик, источником которого является определённый IPv6 адрес:

Ipv6.src == 2604:a880:800:c1::2ae:d001

Если нужно отфильтровать трафик, отправленный на определённый IPv6 адрес:

Ipv6.dst == 2604:a880:800:c1::2ae:d001

Фильтрация трафика, отправленного с определённого диапазона IPv6. Если нужно отфильтровать трафик, источником которого является подсеть, то используйте фильтр вида:

Ipv6.src == 2604:a880:800:c1::2ae:d000/64

Фильтрация трафика, предназначенного для отправки на определённый диапазон IPv6. Если нужно отфильтровать трафик, пунктом назначения которого является подсеть, то используйте фильтр вида:

Ipv6.dst == 2604:a880:800:c1::2ae:d000/64

Фильтрация ICMPv6 (Internet Control Message Protocol — протокол межсетевых управляющих сообщений шестой версии) в Wireshark делается фильтром:

Для того, чтобы увидеть пакеты, которые выполняют роль ARP для IPv6, используйте фильтр:

Icmpv6.type == 133 or icmpv6.type == 134 or icmpv6.type == 135 or icmpv6.type == 136 or icmpv6.type == 137

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

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

Чтобы увидеть только трафик 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

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

tcp.flags.syn==1 tcp.flags.ack==1 tcp.flags.reset==1 tcp.flags.fin==1 tcp.flags.cwr tcp.flags.ecn tcp.flags.urg==1 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 Keep-Alive, но они не являются показателем проблем.

Tcp.analysis.flags

Фильтры для оценки качества сетевого подключения.

Следующие характеристики относятся к TCP фреймам. Причём они не основываются на заголовках фрейма — рассматриваемые характеристики (пропуск данных, дубли) присвоены программой Wireshark исходя из анализа.

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

Tcp.analysis.duplicate_ack_num == 1

Фильтр показа фреймов для которых не захвачен предыдущий сегмент:

Tcp.analysis.ack_lost_segment

Это нормально в начале захвата данных — поскольку информация перехватывается не с самого начала сессии.

Для показа фреймов, которые являются ретрансмиссией (отправляются повторно):

Tcp.analysis.retransmission

Вывод фреймов, которые получены не в правильном порядке:

Tcp.analysis.out_of_order

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

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

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

Udp.srcport == 53

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

Udp.dstport == 53

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

Udp contains hackware

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

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

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

Icmp.type==0

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

Icmp.type==8

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

Icmp.type==3

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

Icmp.type==8

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

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

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

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

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

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

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

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

Http.request.method == "POST"

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

Http.request.method == "GET"

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

Http.host == ""

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

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

Фильтр для вывода HTTP запросов, в которых передавались кукиз:

Http.cookie

Запросы, в которых сервер установил кукиз в браузер пользователя.

Http.set_cookie

Для поиска любых переданных изображений:

Http.content_type contains "image"

Для поиска определённых видов изображений:

Http.content_type contains "gif" http.content_type contains "jpeg" http.content_type contains "png"

Для поиска файлов определённого типа:

Http.content_type contains "text" http.content_type contains "xml" http.content_type contains "html" http.content_type contains "json" http.content_type contains "javascript" http.content_type contains "x-www-form-urlencode" http.content_type contains "compressed" http.content_type contains "application"

Поиск в Wireshark запросов на получения файлов определённого типа. Например, для поиска переданных ZIP архивов:

Http.request.uri contains "zip"

Вместо http.request.uri для большей точности можно использовать фильтры http.request.uri.path или http.request.uri.query , например, для поиска запросов на скачивание файлов JPG (ссылки на картинки):

Http.request.uri.path contains "jpg"

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

Http.referer contains "ru-board.com"

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.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):

Показать фреймы 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 , то поделитесь ими в комментариях.

Введение

При исследовании сетевых взаимодействий на уровне отдельных пакетов, датаграмм, сегментов и сообщений прикладного уровня часто требуется решать задачи фильтрации трафика. Суть применения фильтров заключается в поиске и выделении групп, а также отдельных единиц передачи, представляющих интерес для дальнейшего анализа. Данная функциональность является исключительно полезной в инструментах, предназначенных для перехвата и изучения сетевого трафика (снифферах), и помогает системному администратору или специалисту по информационной безопасности найти толику полезной информации в интенсивных информационных потоках современных сетей.

Рассматриваемый в данной статье открытый многоплатформенный анализатор протоколов Wireshark имеет в своем составе две подсистемы фильтров: времени перехвата трафика (capture filters) и отображения (display filters). Как известно, первая подсистема базируется на языке правил библиотеки Pcap (Packet Capture). «Очистка» трафика во время его сбора, в частности, уменьшает количество перехватываемых пакетов, сохраняя тем самым место в памяти или на жёстком диске. Что же касается фильтров отображения, то они, являясь встроенной функцией Wireshark, предназначены для «кастомизации» в графическом интерфейсе программы уже перехваченного трафика.


Об языках фильтров

Возможность перехвата трафика для целей мониторинга и отладки присутствует в сетевом стеке любой операционной системы. Осуществляется она с помощью так называемого пакетного фильтра (Packet Filter), входящего в состав ядра системы и получающего принятые/отправленные пакеты от драйвера сетевой карты. Самыми известными пакетными фильтрами для Unix-подобных ОС являются BPF (Berkeley Packet Filter) и LSF (Linux Socket Filter).

Так, выборка трафика по заданным критериям в BPF реализована в виде специального регистро-ориентированного примитивного машинного языка, интерпретатором для которого собственно и выступает пакетный фильтр. Программы на этом языке могут извлекать фрагменты из пакетов, сравнивать полученные данные с заданными значениями, проверять отдельные биты, выполнять арифметические операции, а затем принимать или отбрасывать пакеты в зависимости от результатов всех этих тестов. «Низкоуровневый» подход полезен для программистов, разрабатывающих библиотеки сетевых функций и различные утилиты.

Простые пользователи обычно пользуются «высокоуровневыми» языками фильтров. Типичный прикладной язык, используемый в сниффере для описаний правил трафика, позволяет конструировать примитивы выражений на основе отдельных полей сообщений различных протоколов. При этом, в качестве критерия могут выступать соотношение значения поля к определённой величине (равно, больше, меньше), совпадение значения с шаблоном, или просто наличие поля в сообщении. Примитивы могут быть объединены в сложное выражение с помощью логических функций («и», «или», «не» и т. п.).

В мире открытого программного обеспечения фактически стандартом языка фильтров является синтаксис, используемый в библиотеке Pcap. Он является основой не только для Wireshark, но и для других утилит с открытым исходным кодом, таких как, например, общеизвестный в мире Unix консольный сниффер tcpdump. Собственно, Pcap и tcpdump - это совместный проект. В популярной системе обнаружения вторжений Snort в режиме перехвата пакетов также используется формат Pcap для определения правил фильтрации трафика.


Основы фильтров Pcap

Итак, фильтр включает один или несколько примитивов . Примитив обычно состоит из объекта (номера или имени) и одного или нескольких спецификаторов, определяющих протокол (ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp, udp), направление (src, dst, any и т.д.) и тип объекта (host, net, port и т. д.). Например, для перехвата пакетов, в которых исходящий IP-адрес равен 192.168.56.102 следует использовать фильтр вида:

Ip src host 192.168.56.102

Или для записи трафика протокола ARP, в котором участвуют узлы сети 192.168.56.0:

Arp net 192.168.56

Часто используемые спецификаторы сведены в таблицу (необязательные компоненты обозначены - , альтернативные - |, объекты - < >). Полный список можно найти в документации к Pcap (в Linux доступно в руководстве пользователя с помощью команды man pcap-filter).

Для того чтобы объединить несколько примитивов в одно выражения используются логические функции: «и» (обозначается ключевым словом and или &&), «или» (or или ||), «не» (not или!). Например для перехвата трафика протокола SSH для узла 192.168.56.102 подойдет такая конструкция:

Tcp port 22 and host 192.168.56.102

Для совсем сложных выражений следует использовать скобки. Например:

Net 192.168.56.0/24 and (tcp port 21 or tcp port 22)

Фильтры Pcap без ограничений

Для тех, кто привык жить по собственным правилам, библиотека Pcap предоставляет произвольный доступ к содержимому сетевых пакетов, используя всю мощь пакетного фильтра ОС. Делается это с помощью достаточно простого синтаксиса:

Proto [ exp: size]

где, параметр proto — один из протоколов, поддерживаемых Wireshark; exp - смещение в байтах, относительно начала слоя, заданного в proto, a size — количество байт для извлечения.

Учитывая то, что в примитивах можно применять операции сравнения в нотации языка программирования C (>, =,

Пример, впрочем, имеет только методический смысл, так как данный протокол легко фильтруется стандартным правилом icmp.

А вот выбрать на лету из трафика сделанные методом GET HTTP-запросы - не такая простая задача для Pcap. И предложенное в документации решение претендует на оригинальность:

Port 80 and tcp[((tcp & 0xf0) >> 2):4] = 0x47455420

Этот фильтр проверяет наличие байт "G", "E", "T" и "" (шестнадцатиричные значения 47, 45, 54 и 20) сразу после TCP-заголовка, длина которого вычисляется выражением "tcp & 0xf0) >> 2".

Как видно из последнего примера, кроме операций сравнения, пользователю непосредственно в примитивах также доступны бинарные операторы C (+, -, *, /, &, |, >).


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

Если говорить об отличиях фильтров отображения от Pcap-фильтров, то кроме формата записи спецификаторов (поля протоколов выглядят как. , например ip.len), можно также назвать дополнительную поддержку английской нотации в операциях сравнения (eq - равно, gt - больше, lt — меньше, ge — больше или равно, le — меньше или равно) и бинарных операторах (and, or, xor, not), а также поддержку подстрок.

Выборка подстрок в полях похожа на извлечение произвольных байт из пакета в Pcap-фильтрах, однако имеет более гибкий синтаксис. Например, такое выражение будет проверять первых 4 байта поле исходного MAC-адреса кадра Ethernet (эквивалентно ):

Eth.src[:4] == 00:1d:72:01

Разумеется, отличием фильтров будет то, что правила Pcap используются при перехвате трафика; в графическом интерфейсе настраиваются в диалоговом окне «Capture options» (кстати, есть возможность запоминать часто используемые выражения). А фильтры отображения работают с пакетами, размещёнными в списке главного окна программы:

Функционально встроенная подсистема фильтрации Wireshark гораздо дружелюбнее к пользователю. В частности, нет необходимости помнить подробности формата сообщения (смещения, размеры полей и т. д.). Необходимое поле сообщения данного протокола можно легко найти в окне настройки правил отображения (Filter Expression), а также выбрать условие и предопределённое значение из списка для данного поля или указать своё собственное. Для любого из множества протоколов, поддерживаемых Wireshark, таким простым способом можно настроить фильтр отображения.

Весьма показательным будет почти академический пример определения момента переполнения буфера TCP-сегментов при помощи нижеприведенного правила отображения:

Tcp.window_size == 0 && tcp.flags.reset != 1

Заключение

Анализатор протоколов Wireshark обладает мощной системой фильтрации пакетов, дает возможность создавать сложные правила с использованием логических функций и бинарных операторов. Фильтры времени перехвата стандартны и будут знакомы пользователям, использовавшим сетевые утилиты на основе библиотеки Pcap, например tcpdump. Правила отображения пакетов просты в освоении и использовании, благодаря возможностям графического интерфейса рассматриваемой программы. В целом, функциональность системы фильтрации Wireshark позволяет использовать преимущества низкоуровнего пакетного фильтра достаточно эффективно.

Иногда при использовании интернета возникают ситуации, при которых происходит утечка трафика или непредвиденный расход системных ресурсов. Чтобы быстро провести анализ и обнаружить источник проблемы, используют специальные сетевые инструменты. Об одном из них, WireShark, пойдёт речь в статье.

Общая информация

Перед тем, как пользоваться WireShark, нужно ознакомиться с областью её применения, функционалом и возможностями. Вкратце: программа позволяет перехватывать пакеты в режиме реального времени в проводных и беспроводных сетевых подключениях. Применяется в протоколах Ethernet, IEEE 802.11, PPP и аналогичных. Можно использовать и перехват трафика звонков VoIP.

Программа распространяется под лицензией GNU GPL, что означает - бесплатно и с открытым исходным кодом. Можно запустить её на многих дистрибутивах Linux, MacOS, и есть также версия для операционной системы Windows.

Как пользоваться WireShark?

Во-первых, сначала стоит установить её в систему. Так как одним из наиболее часто используемых Linux дистрибутивов является Ubuntu, то и все примеры будут показаны именно в нем.

Для установки достаточно набрать в консоли команду:

sudo apt-get install wireshark

После этого программа появится в главном меню. Можно запустить её оттуда. Но лучше делать это из терминала, так как ей нужны права суперпользователя. Это можно сделать так:

Внешний вид

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

Блок Capture содержит список доступных для захвата сетевых интерфейсов. При выборе, например, eth0 и нажатии кнопки Start запустится процесс перехвата.

Окно с перехватываемыми данными также разделено логически на несколько частей. Сверху находится панель управления с различными элементами. Следом за ним идёт список пакетов. Он представлен в виде таблицы. Здесь можно увидеть порядковый номер пакета, время его перехвата, адрес отправления и получения. Также можно изъять данные об используемых протоколах, длине и других полезных сведений.

Ниже списка расположено окно с содержимым технических данных выбранного пакета. А ещё ниже имеется отображение в шестнадцатеричном виде.

Каждое представление можно развернуть в большом окне для более удобного чтения данных.

Применение фильтров

В процессе работы программы перед пользователем всегда будут пробегать десятки, а то и сотни пакетов. Отсеивать их вручную довольно трудно и долго. Поэтому официальная инструкция WireShark рекомендует использовать фильтры.

Для них есть специальное поле в окне программы — Filter. Чтобы сконфигурировать фильтр более точно, имеется кнопка Expression.

Но для большинства случаев хватит и стандартного набора фильтров:

  • ip.dst — ip адрес назначения пакета;
  • ip.src — адрес отправителя;
  • ip.addr — просто любой ip;
  • ip.proto — протокол.

Использование фильтров в WireShark — инструкция

Чтобы попробовать, как работает программа с фильтрами, нужно в ввести определённую команду. Например, такой набор — ip.dst == 172.217.23.131 - покажет все летящие пакеты на сайт "Гугл". Чтобы просмотреть весь трафик — и входящий и исходящий, - можно объединить две формулы — ip.dst == 172.217.23.131 || ip.src == 172.217.23.131. Таким образом, получилось использовать в одной строке сразу два условия.

Можно использовать и другие условия, например ip.ttl < 10. Данная команда выведет все пакеты с длительностью жизни меньше 10. Чтобы выбрать данные по их размеру, можно применить такой подход — http.content_length > 5000.

Дополнительные возможности

Для удобства в WireShark есть способ быстро выбрать в качестве анализируемого поля параметры пакета. Например, в поле с техническими данными можно щёлкнуть правой кнопкой на нужном объекте и выбрать Apply as Column. Что означает его перевод в область поля в качестве колонки.

Аналогично можно выбрать любой параметр и как фильтр. Для этого в контекстном меню есть пункт Apply as Filter.

Отдельный сеанс

Можно пользоваться WireShark как монитором между двумя узлами сети, например, пользователем и сервером. Для этого нужно выбрать интересующий пакет, вызвать контекстное меню и нажать Follow TCP Stream. В новом окне отобразится весь лог обмена между двумя узлами.

Диагностика

WireShark обладает отдельным инструментом для анализа проблем сети. Он называется Expert Tools. Найти его можно в левом нижнем углу, в виде круглой иконки. По нажатию на ней откроется новое окно с несколькими вкладками — Errors, Warnings и другие. С их помощью можно проанализировать, в каких узлах происходят сбои, не доходят пакеты, и обнаружить прочие проблемы с сетью.

Голосовой трафик

Как уже было сказано, WireShark умеет перехватывать и голосовой трафик. Для этого отведено целое меню Telephony. Это можно использовать для нахождения проблем в VoIP и их оперативного устранения.

Пункт VoIP Calls в меню Telephony позволит просмотреть совершенные звонки и прослушать их.

Экспорт объектов

Это, наверное, самый интересный функционал программы. Он позволяет пользоваться WireShark как перехватчиком файлов, которые передавались по сети. Для этого нужно остановить процесс перехвата и выполнить экспорт HTTP объектов в меню File. В открывшемся окне будет представлен список всех переданных за сессию файлов, которые можно сохранить в удобное место.

В заключение

К сожалению, актуальную версию WireShark на русском языке в сети найти будет трудно. Наиболее доступная и часто используемая есть на английском.

Также обстоят дела и с подробной инструкцией по WireShark на русском. Официальная от разработчика представлена на английском. В сети есть много небольших и кратких руководств по WireShark для начинающих.

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

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

Больше всего вопросов при работе с программой WireShark у пользователей вызывают фильтры для захвата трафика. Сегодня мы рассмотри их основные примеры, и покажем, как их правильно настраивать!

В процессе анализа проблем с производительностью сети или приложений, если в вашей компании не установлено централизованной системы мониторинга производительности приложений, то для анализа проблем с 4 по 7 уровень сетевой модели OSI необходимо будет воспользоваться анализатором протоколов (он же сниффер).

Если у вас нет коммерческого решения с встроенными средствами автоматического анализа или экспертной системы, то, пожалуй, самый правильный путь будет такой:

    скачать и установить на ноутбук один из лучших бесплатных анализаторов протоколов WireShark (http://www.wireshark.org/download.html);

    освоиться с его интерфейсом;

    изучить стек протоколов и их структуру;

    научиться работать с фильтрами для захвата трафика;

    научится работать с фильтрами для анализа трафика.

В рамках этой статьи мы остановимся на предпоследнем пункте - как настроить фильтры для захвата трафика в WireShark.

Примеры настройки фильтров WireShark для захвата трафика

После выбора интерфейса мы можем приступить или к захвату трафика в режиме — всё подряд, но делать это не рекомендуется, так как, например, при 50% загрузке гигабитного интерфейса для передачи 100 000 пакетов требуется всего несколько миллисекунд. Поэтому важно понимать, какую проблему мы решаем. Тогда у нас как минимум будет уже или адрес (IP или MAC) пользователя или приложение, на которое он жалуется или сервер, к которому он обращается.

Таким образом, самый простой фильтр в Wireshark - это IP адрес устройства (хоста, host) и выглядит этот фильтр следующим образом:

В случае если проблема глобальнее и нам необходимо захватить трафик с отдельной подсети независимо от направления его передачи, то применяем фильтр:

    net 192.168.0.0/24 или net 192.168.0.0 mask 255.255.255.0

При захвате трафика от подсети фильтр будет выглядеть вот так:

    src net 192.168.0.0/24 или src net 192.168.0.0 mask 255.255.255.0

А если надо увидеть для анализа только приходящий трафик в нашу подсеть, то любой из фильтров:

    dst net 192.168.0.0/24

    dst net 192.168.0.0 mask 255.255.255.0

Если пользователь жалуется, что у него не открываются странице в браузере, проблема может быть с DNS сервером (порт 53) или с протоколом HTTP (порт 80), тогда захватываем трафик с использованием фильтра «порт»:

Если мы решили захватить весь трафик для конкретного сервера без учета HTTP и FTP, то фильтр настраивается по любому из этих двух примеров:

    host 192.168.0.1 and not (port 21 or port 80)

    host 192.168.0.1 and not port 21 and not port 80

Если мы хотим видеть весь трафик на порту, кроме трафика DNS, FTP, ARP, то логика будет аналогичной:

    port not dns and not 21 and not arp

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

    (tcp > 1500 and tcp < 1550) or (tcp > 1500 and tcp < 1550)

если версии более поздние, то фильтр будет менее угрожающим и понятным:

    tcp portrange 1501-1549

Для захвата кадров Ethernet типа EAPOL (Протокол передачи EAP-сообщений в стандарте 802.1x называется EAPOL (EAP encapsulation over LAN)):

    ether proto 0x888e

Для справки приведу список типов Ethernet кадров специфичных протоколов:

Ethertype (Hexadecimal)

Протокол

0x0000 — 0x05DC

IEEE 802.3 length

0x0101 — 0x01FF

IP, Internet Protocol

ARP, Address Resolution Protocol.

Frame Relay ARP

Raw Frame Relay

DRARP, Dynamic RARP. RARP, Reverse Address Resolution Protocol.

Novell Netware IPX

EtherTalk (AppleTalk over Ethernet)

IBM SNA Services over Ethernet

AARP, AppleTalk Address Resolution Protocol.

EAPS, Ethernet Automatic Protection Switching.

IPX, Internet Packet Exchange.

SNMP, Simple Network Management Protocol.

IPv6, Internet Protocol version 6.

PPP, Point-to-Point Protocol.

GSMP, General Switch Management Protocol.

MPLS, Multi-Protocol Label Switching (unicast).

MPLS, Multi-Protocol Label Switching (multicast).

PPPoE, PPP Over Ethernet (Discovery Stage).

PPPoE, PPP Over Ethernet (PPP Session Stage).

LWAPP, Light Weight Access Point Protocol.

LLDP, Link Layer Discovery Protocol.

EAPOL, EAP over LAN.

Loopback (Configuration Test Protocol)

VLAN Tag Protocol Identifier

VLAN Tag Protocol Identifier

Если необходимо захватить трафик определенного IP протокола, то можно использовать фильтр:

    ip proto tcp - захват TCP трафика

    ip proto udp - захват UDP трафика

Для захвата IP трафика применяется самый короткий фильтр:

Для захвата только unicast трафика при анализе трафика исходящего и приходящего к сетевому устройству используется фильтр в таком формате:

    not broadcast and not multicast

Простые фильтры, о которых мы поговорили, можно объединять с помощью не сложных символов:

    Отрицание: ! Или not

    Объединение: && или and

    Чередование: II или or

Пример: для захвата трафика от или к устройству с адресом 10.10.10.10, но не из сети 192.168.0.0 фильтр получится объединением с отрицанием:

    host 10.10.10.10 && !net 192.168

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

Смещаемся на восемь байт в IP пакете и захватываем трафик со значением TTL =1

Захватываем все пакеты TCP с адресом порта отправителя 80. Это эквивалент фильтру src port 80.

Для справки приведем байт смещения до наиболее интересных полей в пакете:

Поле в пакете

Длина в байтах

Фильтр

IP Header Length

IP Packet Length

IP Address Source

IP Address Destination

IP Fragmentation

flag = 3 and Offset = 13

ip & 0x2000 = 0x2000 or ip & 0x1fff !=0x0000

TCP Destination Port

TCP Header Length

Для закрепления полученной информации построим фильтр для захвата трафика с запросом HTTP GET. Протокол HTTP использует порт 80, транспортный протокол TCP. Значения в шестнадцатеричной системе исчисления слова GET будет выглядеть 0x47455420. Пример фильтра, который получится у нас:

    port 80 and tcp[((tcp & 0xf0 >>2):4]=0x47455420

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

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

Введение

Из всех методов изучения компьютерных сетей анализ трафика, пожалуй, самый кропотливый и трудоемкий. Интенсивные потоки современных сетей порождают очень много «сырого» материала, отыскать в котором крупицы полезной информации далеко не просто. За время своего существования стек TCP/IP оброс многочисленными приложениями и дополнениями, счет которым идет на сотни и тысячи. Это прикладные и служебные протоколы, протоколы аутентификации, туннелирования, доступа к сети и так далее. Кроме знания азов сетевых взаимодействий, исследователю трафика (то есть тебе) нужно свободно ориентироваться во всем этом протокольном многообразии и уметь работать со специфичными программными инструментами - снифферами, или, по-научному, анализаторами трафика (протоколов).

Функциональность сниффера - это не только возможность использования «неразборчивого» (promiscuos) режима работы сетевой карты для перехвата. Подобный софт должен уметь эффективно фильтровать трафик как на этапе сбора, так и во время изучения отдельных единиц передачи (фреймов, пакетов, сегментов, датаграмм, сообщений). Причем чем больше протоколов сниффер «знает», тем лучше.

Современные анализаторы протоколов много чего умеют: считать статистику трафика, рисовать графики хода сетевых взаимодействий, извлекать данные прикладных протоколов, экспортировать результаты работы в различные форматы... Поэтому подбор инструментария для анализа сетевого трафика - это тема для отдельного разговора. Если ты не знаешь, что выбрать, или же не хочешь тратить деньги на платное ПО, то воспользуйся простым советом: установи Wireshark.

Знакомимся с фильтрами

Wireshark поддерживает два вида фильтров:

  • перехвата трафика (capture filters);
  • отображения (display filters).

Первая подсистема досталась Wireshark в наследство от библиотеки Pcap, обеспечивающей низкоуровневый API для работы с сетевыми интерфейсами. Выборка трафика на лету во время перехвата позволяет экономить оперативную память и место на жестком диске. Фильтр представляет собой выражение, состоящее из группы примитивов, при необходимости объединенных логическими функциями (and, or, not). Записывается это выражение в поле «Capture Filter» диалогового окна «Capture options». Наиболее употребляемые фильтры можно сохранять в профиле для повторного использования (рис. 1).

Рис. 1. Профиль фильтров перехвата

Язык фильтров перехвата стандартный для мира Open Source и используется многими Pcap-основанными продуктами (например, утилитой tcpdump или системой обнаружения/предотвращения вторжений Snort). Поэтому описывать синтаксис здесь нет особого смысла, так как он тебе, скорее всего, знаком. А детали можно посмотреть в документации, например в Linux на странице справочного руководства pcap-filter(7).

Фильтры отображения работают с уже перехваченным трафиком и являются «родными» для Wireshark. Отличия от Pcap - в формате записи (в частности, в качестве разделителя полей используется точка); также добавлены английская нотация в операциях сравнения и поддержка подстрок.

Вписать фильтр отображения можно прямо в соответствующее поле (внимание, работает выпадающий список-подсказка) главного окна программы после кнопки «Filter» (кстати, под этой кнопкой скрывается профиль для часто используемых выражений). А если кликнуть расположенную неподалеку кнопку «Expression…», то откроется многофункциональный конструктор выражений (рис. 2).


Слева (Field Name) представлено упорядоченное по алфавиту дерево полей сообщений протоколов, которые известны Wireshark. Для данного поля можно указать логический оператор (Relation), вписать значение (Value), указать диапазон (Range) или выбрать значение из списка (Predefined Value). В общем, полная сетевая энциклопедия в одном окошке.

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

  • and (&&) - «И»;
  • or (||) - «ИЛИ»;
  • xor (^^) - исключающее «ИЛИ»;
  • not (!) - отрицание;
  • [...] - выборка подстроки. # Фильтруя по MAC-адресу своего сетевого адаптера, исключаем весь локальный трафик not (eth.addr eq aa:bb:cc:22:33:44) # Отметаем весь «служебный шум», чтобы сконцентрироваться на интересующем нас трафике!(arp or icmp or dns)

Что касается выборки подстроки, то это не совсем логическая операция, но весьма полезная опция. Она позволяет получить определенную часть последовательности. Например, так можно использовать в выражении первые (первое число в квадратных скобках - смещение) три байта (число после двоеточия - длина подпоследовательности) поля MAC-адреса источника:

Eth.src == 00:19:5b

В выборках с двоеточием один из параметров можно опускать. Если пропустить смещение, то отсчет выборки начнется с нулевого байта. Если длину - то получим все байты от смещения до конца поля.

К слову, выборку подстроки удобно использовать для выявления малвари в случае, если известна последовательность байт, идущая после заголовка (например, «0x90, 0x90, 0x90, 0x04» в UDP-пакете):

Udp == 90:90:90:04

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

  • eq (==) - равно;
  • ne (!=) - не равно;
  • gt (>) - больше;
  • lt (<) - меньше;
  • ge (>=) - больше или равно;
  • le (<=) - меньше или равно.tcp.dstport ne 8080 && tcp.len gt 0 && data eq A0

Собственно, теории для начала достаточно. Дальше используй здравый смысл и скобки по необходимости и без нее. Также не забывай, что фильтр по сути - логическое выражение: если оно истинно, то пакет отобразится на экране, если ложно - нет.

Pcap-фильтр для выявления сканирования Netbios-портов

dst port 135 or dst port 445 or dst port 1433 and tcp & (tcp-syn) != 0 and tcp & (tcp-ack) = 0 and src net 192.168.56.0/24

Ищем угонщика IP-адреса

В сегменте локальной сети случаются (по тем или иным причинам) совпадения IP-адресов у двух и более узлов. Методика «отлова» (определения MAC-адресов) конфликтующих систем общеизвестна: запускаем на третьем компьютере сниффер, чистим ARP-кеш и стимулируем запрос на разрешение MAC’а искомого IP, например пропинговав его:

# arp -d 192.168.56.5 # ping -n -c 1 192.168.56.5

А потом ищем в перехваченном трафике, с каких MAC’ов пришли ответы. Если Wireshark наловил слишком много пакетов, создаем фильтр отображения с помощью конструктора. В первой части выражения выбираем ARP-ответы, во второй - те сообщения, в которых исходный IP-адрес равен искомому. Примитивы объединяем оператором &&, так как нужно, чтобы оба условия выполнялись одновременно:

(arp.opcode == reply) && (arp.src.proto_ipv4 == 192.168.56.5)

Кстати, при выполнении этого сценария ни одна компьютерная сеть не пострадала, потому что были использованы две виртуальные машины Oracle VirtualBox и сетевое подключение типа «Виртуальный адаптер хоста».

Инспектируем сетевой и транспортный уровни

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

Как ты уже догадался, отфильтровать ICMP в Wireshark очень просто. Достаточно в строке фильтрации в главном окне программы написать: icmp. Кроме icmp, работают и многие другие ключевые слова, являющиеся именами протоколов, например arp, ip, tcp, udp, snmp, smb, http, ftp, ssh и другие.

Если ICMP-трафика много, то отображение можно детализировать, исключив, например, эхо-запросы (тип 0) и эхо-ответы (тип 8):

Icmp and ((icmp.type ne 0) and (icmp.type ne 8))

На рис. 4 показан пример небольшой выборки ICMP-сообщений, созданных тестовым Linux-маршрутизатором. Сообщение «Port Unreachable» обычно используется по умолчанию. Оно же генерируется сетевым стеком при получении UDP-датаграммы на неиспользуемый порт. Чтобы виртуальный роутер на основе Debian начал отдавать сообщения «Host unreachable» и «Communication administratively filtered», пришлось с ним повозиться. Cisco же информирует об административной фильтрации обычно по умолчанию. Сообщение «Time-to-live exceeded» говорит о наличии петли на каком-то участке сети (ну и при трассировке маршрута такие пакеты также могут появляться).

Кстати, о межсетевых экранах. Создавать правила для популярных файеров можно прямо в Wireshark, используя пункт «Firewall ACL Rules» меню «Tools». Предварительно нужно выбрать в списке пакет, информация которого будет использована. Доступны стандартные и расширенные ACL Cisco, правила UNIX-like продуктов IP Filter, IPFirewall (ipfw), Netfilter (iptables), Packet Filter (pf), а также Windows Firewall (netsh).

И теперь кратко об азах фильтрации на сетевом уровне, основу которой составляют поля заголовка IP-пакета - адрес отправителя (ip.src) и адрес получателя (ip.dst):

(ip.src == 192.168.56.6) || (ip.dst == 192.168.56.6)

Так мы увидим все пакеты, которые получил или отправил данный IP-адрес. Фильтровать целые подсети можно, используя CIDR-нотацию записи маски. Для примера выявим инфицированный хост, осуществляющий спам-рассылку (здесь 192.168.56.251 - это IP-адрес нашего SMTP-сервера):

Ip.src == 192.168.56.0/24 and tcp.dstport == 25 and !(ip.dst == 192.168.56.251)

К слову, для выборки по MAC-адресам следует использовать примитивы eth.src, eth.dst и eth.addr. Порой проблемы сетевого уровня куда теснее связаны с Ethernet-уровнем, чем об этом повествует теория. В частности, при настройке маршрутизации очень полезно бывает посмотреть, на MAC-адрес какого роутера упрямый узел отправляет пакеты. Впрочем, для такой простой задачи за глаза хватит утилиты tcpdump, практически штатной для UNIX-подобных систем.

С фильтрацией портов у Wireshark тоже никаких вопросов нет. Для TCP к твоим услугам ключевые слова tcp.srcport, tcp.dstport и tcp.port, для UDP - udp.srcport, udp.dstport и udp.port. Правда, у встроенного языка фильтров Wireshark не нашлось аналога примитива port в Pcap, обозначающего как порт UDP, так и TCP. Но это легко исправить с помощью логического выражения, например:

Tcp.port == 53 || udp.port == 53

Импровизируем с HTTP-трафиком

Прикладные протоколы, в частности HTTP, - это «вечная» тема в разрезе сниффинга. Справедливости ради нужно сказать, что для исследования веб-трафика создано немало специализированных программных средств. Но и такой универсальный инструмент, как Wireshark, с его гибкой системой фильтрации на этом поприще оказывается совсем не лишним.

Для начала соберем немного веб-трафика, сходив на первый пришедший на ум сайт. Теперь поищем в сообщениях протокола TCP, служащего транспортом для HTTP, упоминания любимого интернет-ресурса:

Tcp contains "сайт"

Оператор contains проверяет наличие подстроки в данном поле. Есть еще оператор matches, в нем можно использовать Perl-совместимые регулярные выражения.


Окошко «Filter Expressions», конечно, хороший помощник, но порой перелистывать длинный список в поисках нужного поля весьма утомительно. Есть более простой способ создания/модификации фильтров отображения: с помощью контекстного меню при просмотре пакетов. Для этого нужно просто кликнуть правой клавишей мыши по интересующему полю и выбрать один из подпунктов пункта «Apply As Filter» или пункта «Prepare a Filter». В первом случае изменения тут же вступят в силу, а во втором - можно будет подкорректировать выражение. «Selected» означает, что значение поля станет новым фильтром, «Not Selected» - то же самое, только с отрицанием. Пункты, начинающиеся с «...», добавляют значение поля к существующему выражению с учетом логических операторов.

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

Например, чтобы посмотреть, какие изображения браузер запрашивал у веб-сервера при формировании страницы, сгодится фильтр, анализирующий содержимое передаваемого серверу URI:

(http.host eq "www..request.uri contains ".jpg#26759185") or (http.request.uri contains ".png#26759185"))

То же самое, но с использованием matches:

(http.host eq "www..request.uri matches ".jpg|.png#26759185")

Разумеется, поля сообщений протоколов разных уровней можно смело смешивать в одном выражении. Например, чтобы узнать, какие картинки данный сервер передал клиенту, используем исходный адрес из IP-пакета и поле «Content-Type» HTTP-ответа:

(ip.src eq 178.248.232.27) and (http.content_type contains "image")

А с помощью поля HTTP-запроса «Referer» ты сможешь узнать, с каких еще серверов браузер берет контент при формировании страницы любимого сайта:

(http.referer eq "http://www..dst eq 178.248.232.27))

Рассмотрим еще несколько фильтров-полезняшек. Для выборки из трафика HTTP-запросов, сделанных методом GET, можно использовать следующее выражение:

Http.request.method == GET

Именно на прикладном уровне фильтры отображения проявляют себя во всей красе и простоте. Для сравнения: чтобы, например, решить эту задачу с помощью Pcap, пришлось бы применить вот такую трехэтажную конструкцию:

Port 80 and tcp[((tcp & 0xf0) >> 2):4] = 0x47455420

Чтобы выяснить, какие www-подключения совершал пользователь хоста 192.168.56.8 в определенный интервал времени (скажем, в обеденный перерыв), задействуем примитив frame.time:

Tcp.dstport == 80 && frame.time >= "Yan 9, 2013 13:00:00" && frame.time < "Yan 9, 2013 14:00:00" && ip.src == 192.168.56.8

Ну и отображение URI запросов, содержащих слова «login» и «user», плюс «напоминалка» паролей:

Http.request.uri matches "login.*=user" (http contains "password") || (pop contains "PASS")

Перехват SSL-контента

Настоящий бич исследователя сетевого трафика - шифрование. Но если у тебя есть заветный файл с сертификатом (кстати, беречь его нужно как зеницу ока), то ты легко сможешь узнать, что прячут пользователи данного ресурса в SSL-сессиях. Для этого нужно указать параметры сервера и файл сертификата в настройках протокола SSL (пункт «Preferences» меню «Edit», слева в списке протоколов выбрать SSL). Поддерживаются форматы PKCS12 и PEM. В последнем случае нужно убрать пароль с файла командами:

Openssl pkcs12 -export -in server.pem -out aa.pfx openssl pkcs12 -in aa.pfx -out serverNoPass.pem –nodes

INFO

Извлечение трафика для мониторинга и отладки из сетевого трафика осуществляется пакетным фильтром. Пакетный фильтр входит в состав ядра операционной системы и получает сетевые пакеты от драйвера сетевой карты.

Примерами пакетных фильтров для UNIX-like ОС являются BPF (Berkeley Packet Filter) и LSF (Linux Socket Filter). В BPF фильтрация реализована на основе регистро-ориентированного примитивного машинного языка, интерпретатором которого и является BPF.


Анализируем трафик с удаленных хостов

Пользователи Windows могут работать не только с интерфейсами того компьютера, на котором запущен Wireshark, но и снимать трафик с удаленных машин. Для этого существует специальная служба (Remote Packet Capture Protocol) в поставке библиотеки WinPcap. Ее нужно предварительно включить в оснастке управления службами (services.msc). Теперь, запустив Wireshark на удаленном компьютере, можно подключиться к тому узлу, на котором работает сервис удаленного перехвата трафика (по умолчанию использует порт 2002), и данные по протоколу RPCAP потекут к тебе рекой.

Также приведу варианты подключения к домашнему *nix-роутеру «извне» для удаленного анализа трафика:

$ ssh [email protected] "tshark -f "port !22" -i any -w -" | wireshark -k -i - $ ssh [email protected] tcpdump -U -s0 -w - "not port 22" | wireshark -k -i -

Инструмент из разряда must have

Wireshark - широко известный инструмент перехвата и интерактивного анализа сетевого трафика, фактически стандарт для промышленности и образования. Распространяется под лицензией GNU GPLv2. Wireshark работает с большинством известных протоколов, имеет графический интерфейс пользователя на основе GTK+, мощную систему фильтров трафика и встроенный интерпретатор языка программирования Lua для создания декодеров и обработчиков событий.

Извлечь полезный груз

В определенных кругах широко известны специализированные инструменты, позволяющие «вытаскивать» из трафика конечные информационные объекты: файлы, изображения, видео- и аудиоконтент и прочее. Благодаря мощной аналитической подсистеме, Wireshark эту функциональность с лихвой покрывает, поэтому ищи в соответствующих окнах анализа кнопку «Save Payload…».

Заключение

На фоне всеобщего увлечения компьютерного андеграунда вопросами безопасности сетевых приложений монументальные проблемы нижележащих уровней постепенно уходят на второй план. Понятно, что сетевой и транспортный уровни изучены и исследованы вдоль и поперек. Но беда в том, что специалисты, выросшие на SQL-инъекциях, межсайтовом скриптинге и инклудах, не подозревают об огромном пласте, скрытом под вершиной айсберга, и часто пасуют перед, казалось бы, элементарными проблемами.

Сниффер же, подобно отладчику и дизассемблеру, показывает детали функционирования системы в мельчайших подробностях. Установив Wireshark и проявив некоторую сноровку, ты сможешь увидеть сетевые взаимодействия, как они есть - в невинном, девственно обнаженном виде. И фильтры тебе в помощь!