Анализ сетевого трафика на сервере с помощью tshark. Фильтр захвата


Установка фильтров на захват пакетов (Capturefilter)

При решении конкретных задач анализа сетевого трафика обычно бывает необходимо захватывать не все пакеты, передаваемые по сети (их количество может быть очень большим!), а только определенные, то есть пакеты, удовлетворяющее определенным условиям. Для этого устанавливаются фильтры захвата (Capturefilter– не путать с фильтрами просмотра –Displayfilter!). Для того чтобы просмотреть или изменить фильтр захвата нужно выбрать менюCapture\Filter. Появится окно отображающее текущий фильтр:

Фильтрация захватываемых пакетов возможна на основе следующих критериев:

Тип протокола. Для определения этого критерия необходимо дважды кликнуть на строкеSAP/ETYPE= … Появится диалоговое окно, которое позволяет разрешить или запретить захват пакетов определенного протокола. По умолчанию все протоколы разрешены для захвата (Enabledprotocols):

Адрес компьютера. Для определения этого критерия необходимо дважды кликнуть на строкеAddressPairs. Появится диалоговое окно, которое позволяет определить пары адресов, при передаче между которыми пакеты будут захватываться. Кроме того, можно определить направление передачи захватываемых пакетов (Direction) – двустороннее или только в направлении от одного адреса другому. Имя *ANYсоответствует любому адресу любого типа. По умолчанию этот критерий настроен на захват всех пакетов во всех направлениях (ANY<->ANY).

Соответствие поля пакета шаблону (Pattern matches).Позволяет захватывать пакеты, содержимое которых соответствует шаблону. Шаблон представляет собой двоичные данные (Hex) или строку символов (ASCII) и смещение в байтах относительно начала пакета (Fromstartofframe). Пакет будет захвачен, если его содержимое по указанному смещению соответствует указанной последовательности двоичных или символьных данных. По умолчанию шаблон не задан, то есть все пакеты соответствуют шаблону.

Все три вышеописанных критерия объединены по логической схеме «И» (AND). Это означает, что пакет будет захвачен в том случае, если соответствует всем трем критериям. Для критерияPatternmatchesмогут быть заданы несколько условий, комбинированных в логическое выражение. Например, следующий фильтр предназначен для захвата пакетов, содержащих указанные данные по смещению 0x30 либо указанные данные по смещению 0x50 и не содержащих указанных данных по смещению0x4.

    1. Порядок выполнения работы

  1. В командной строке выполнить команду ipconfig/all. Просмотреть и записать имя, MAC-адрес (физический адрес) и IP- адрес вашего компьютера.

  2. Выбрать в меню Capture/Networks интерфейс для захвата пакетов.

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

  1. Используя созданный фильтр, захватить небольшое количество пакетов (100-200). При этом после запуска захвата пакетов необходимо инициировать сетевую активность своего компьютера – например, запустить Интернет-браузер, браузер для просмотра сетевого окружения, обратиться к сетевому диску.

  2. Перейти в режим просмотра захваченных пакетов.

  3. Из общего количества пакетов (за исключением первого и последнего пакета) выбрать несколько пакетов, имеющих различную структуру (не менее 3-х). В среднем окне просмотра открыть секции FrameиEthernet, просмотреть содержимое полей.

  1. Выписать и оформить в виде таблицы следующую информацию о пакетах:

  • MAC-адрес источника (Source address)

  • MAC-адрес назначения (Destination address)

  • Тип протокола верхнего уровня (EthernetType)

  • Общий размер пакета (Total Frame Lengths)

  • Размер поля данных Ethernet-пакета (Number of data bytes remaining)

  • Порядок вложенности протоколов. Например, для рассматриваемого выше пакета Ethernet,IP,TCP,NBT

  1. Сохранить захваченные пакеты в файле, имя которого совпадает с вашим именем пользователя с индексом 1 например 281san1.cap

  2. Создать фильтр для захвата пакетов, не содержащих IP-пакеты. Для этого в окнеCapturefilterвыбрать строкуSAP/ETYPEи нажать кнопкуEdit.

Запретить захват IP-пакетов и нажать ОК.

  1. Произвести захват пакетов (захватить не менее 3-х пакетов), повторить п.7.

  2. Сохранить захваченные пакеты в файле, имя которого совпадает с вашим именем пользователя с индексом 2, например 281san2.cap

studfiles.net

Wireshark — приручение акулы / Хабр

Wireshark — это достаточно известный инструмент для захвата и анализа сетевого трафика, фактически стандарт как для образования, так и для траблшутинга. Wireshark работает с подавляющим большинством известных протоколов, имеет понятный и логичный графический интерфейс на основе GTK+ и мощнейшую систему фильтров. Кроссплатформенный, работает в таких ОС как Linux, Solaris, FreeBSD, NetBSD, OpenBSD, Mac OS X, и, естественно, Windows. Распространяется под лицензией GNU GPL v2. Доступен бесплатно на сайте wireshark.org. Установка в системе Windows тривиальна — next, next, next. Самая свежая на момент написания статьи версия – 1.10.3, она и будет участвовать в обзоре.

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

Для начала захвата достаточно выбрать свой сетевой интерфейс и нажать Start.

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

А следующая за ними кнопка позволяет сделать быстрый переход к пакету, указав его номер. В случае если колонки перекрываются и наползают друг на друга, можно кликнуть по такой колонке правой кнопкой мыши и выбрать “Resize Column”. Произойдет автоматическая подгонка размеров под текущую ситуацию. И кроме того, есть кнопка “Resize all Columns”, которая приведет в порядок все колонки. Используя меню View – Time Display Format, можно, например, настроить, чтобы отсчет времени шел не с начала захвата, а с момента получения предыдущего пакета (Since Previous Captured Packet). Самое важное в каждой программе (Help – About Wireshark) покажет не только версию и список авторов, но и содержит закладку Folders, которая покажет пути размещения каталогов с конфигурациями. Изучая интерфейс, можно выбрать, например, пакет http, и увидеть, что HTTP инкапсулируется в TCP (транспортный уровень), TCP инкапсулируется в IP (сетевой уровень), а IP в свою очередь инкапсулируется в Ethernet (перед этим даже мелькает 802.1Q).

И на самом верху идет нечто вроде небольшого обзора собранной информации о кадре.

Про фильтры мы поговорим дальше, а на данном этапе, если нужно быстро отфильтровать лишние пакеты, достаточно сделать правый клик на пакете, выбрать меню Apply as Filter – Not selected и изменения сразу же вступят в силу. Если нужно еще что-то убрать, то в следующий раз выбирать “and not Selected”, и новое правило просто добавится к фильтру.

Довольно часто при работе с Wireshark возникает ошибка IP checksum offload – ошибка контрольной суммы заголовка IP пакета.

Современные сетевые карты насколько умные, что сами считают контрольную сумму, зачем это делать на уровне стека TCP/IP программно, если можно делать хардварно. А Wireshark натурально перехватывает пакеты, до того как они попадают в сеть. И до того как эта сумма была просчитана и была добавлена в заголовок пакета. Соответственно есть два пути решения этой проблемы — выключать функцию offload в настройках сетевой карты или в настройках сниффера указать, чтобы он не обращал внимание на это значение. Хардваные функции зачастую лучше софтварных, в основном из-за скорости обработки (в железе обычно выше) поэтому лучше изменить настройки самого сниффера. Для этого нужно зайти в настройки (Edit — Preferences), затем Protocols – IPv4 – и снять флаг с “Validate IPv4 checksum if possible”.

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

  • Локально на своем хосте;
  • Организовать зеркалирование трафика на коммутаторе;
  • Подключаться непосредственно в интересующие места;
  • или же отравление протокола ARP (еще более незаконно, чем пассивное прослушивание трафика)
Wireshark содержит два вида фильтров – захвата (Capture Filters) и отображения (Display Filters). Вначале рассмотрим Capture Filters. Как можно догадаться по названию, они служат для фильтрации еще на этапе захвата трафика. Но в таком случае, безусловно, можно безвозвратно потерять часть нужного трафика. Фильтр представляет собой выражение, состоящее из встроенных значений, которые при необходимости могут объединяться логическими функциями (and, or, not). Для того, чтобы его задействовать, нужно зайти в меню Сapture, затем Options, и в поле Capture Filter набрать, например, host 8.8.8.8 (или, например, net 192.168.0.0./24)

Так же, конечно, можно выбрать и заранее созданный фильтр (за это отвечает кнопка Capture Filter). В любом из вариантов фильтр появится возле интерфейса, можно жать Start.

Теперь перейдем к Display Filters. Они фильтруют исключительно уже захваченный трафик. Что можно фильтровать? — Практически все — протоколы, адреса, специфические поля в протоколах. Операции, которые можно использовать при построении фильтров:

Команда Значение Пример использования
== равенство ip.dst == 193.168.3.10
!= Не равно udp.dst != 53
< меньше чем ip.ttl < 24
> больше чем frame.len > 10
<= меньше или равно frame.len <= 0x20
>= больше или равно tcp.analysis.bytes_in_flight >= 1000
matches регулярные выражения frame matches "[Pp][Aa][Ss][Ss]"
contains содержит dns.resp.name contains google

Как вы, наверное, заметили, в таблице в качестве примеров были разнообразные выражения, достаточно понятные и зачастую говорящие сами за себя. Например, ip.dst – это поле протокола IP. Чтобы увидеть это поле, можно просто посмотреть на пакет, и в нижней части окна можно увидеть его значение, которое потом можно применять в любом фильтре. Например, нас интересует, как создать фильтр, где будет проверяться значение TTL. Для этого раскрываем L3 часть и становимся на соответствующее поле:

И видим, что для построения фильтра, нужно использовать выражение ip.ttl. Если начать набирать фильтр, то после точки автоматически появится список возможных значений:

Чтобы применить фильтр, достаточно нажать enter или кнопку Apply. Само поле для ввода фильтра может менять цвет в зависимости от того, что было набрано. Зеленый цвет означает, что все в порядке. Красный — допущена ошибка, желтый — получен неожиданный результат, потому что существуют другие варианты написания фильтра (например можно написать ip.dst != 8.8.8.8 или же !ip.dst == 8.8.8.8, именно второй вариант более предпочтительный). Фильтры можно сохранять для дальнейшего использования, нажав кнопку Save, затем ввести произвольное название

и после нажатия на кнопку ОК фильтр появится как кнопка на панели.

А если кликнуть на расположенную неподалеку кнопку «Expression…», то откроется достаточно мощный конструктор выражений, по которому можно чуть ли не изучать сетевые протоколы. Количество поддерживаемых протоколов постоянно увеличивается.

Как уже упоминалось ранее, можно выделить любой пакет и в контекстном меню выбрать Apply as Filter и в подменю выбрать режим — selected или not selected и соответственно сразу же появится фильтр, который будет показывать только выбранное или наоборот уберет выбранное с экрана. Таким образом можно гибко выбирать, что видеть на экране, а что — нет. Это может быть определенный ip-адрес, ttl, порт, dns ответ и многое другое. Кроме того, есть два варианта для таких быстрых фильтров — Prepare as Filter и Apply as Filter. Как можно догадаться по названию — разница заключается в том, что в первом случае только появится в поле для ввода Display Filter, но не применится (удобно, если например, добавлять таким способом несколько фильтров, а затем сразу применить готовый результат), а во втором — сразу же и применится.

Фильтры можно объединять, используя знакомые по булевой алгебре логические операции:(dns) && (http) логическое и

(dns) || (http) это логическое или

Таким образом можно строить большие и сложные фильтры вроде:(tcp.flags.syn==1) && (ip.src == 172.16.10.2) && (ip.dst == 172.16.10.1) Здесь видим, что выбираются только TCP SYN сегменты, только с определенным адресом отправителя и получателя. При составлении больших фильтров нужно помнить, что фильтр по сути — логическое выражение, и если оно истинно, то пакет отобразится на экране, если ложно — нет.

Достаточно частая ситуация, когда возникают жалобы на медленную работу сети, причин этого может быть множество. Попробуем разобраться, в чем может быть причина, и рассмотрим два способа. Первый состоит в добавлении колонки TCP delta. Открываем пакет, находим поле Time since previous frame in this TCP frame, правый клик и выбираем Apply as Column. Появится новая колонка. На ней можно кликнуть правой кнопкой мыши и выбрать режим сортировки, например, Sort Descending.

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

Если клиент делает запрос и получает ответ через 10 миллисекунд, и клиент говорит, что у него все медленно работает, то, возможно, проблема у самого клиента. Если же клиент делает запрос и получает ответ через 2-3 секунды, тут уже, возможно, проблема кроется в сети.

Если посмотреть в TCP пакет (или сегмент если быть точным), то можно увидеть там Stream index, который начинается обычно с нуля. Само поле будет называться tcp.stream.

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

Таким образом можно фильтровать нужные соединения.

Еще один способ – сделать правый клик на самом пакете, выбрать Conversation Filter и создать фильтр для l2 l3 l4 уровня соответственно.

В итоге мы опять увидим взаимодействие двух хостов.

И третий вариант — это одна из самых интересных фич — Follow TCP Stream. Для того чтобы его задействовать, нужно опять таки кликнуть правой кнопкой мыши на пакете и выбрать “Follow TCP Stream”. Появится окно, где будет наглядно продемонстрирован весь обмен между двумя узлами.

Если же зайти в меню Statistics – Conversations, то, выбирая закладки, можно увидеть статистику по таким “разговорам” и различные сессии, при этом можно отсортировать их по различным колонкам, например, по количеству переданных данных.

И прямо в этом окне можно правой кнопкой взывать контекстное меню и опять же применить как фильтр.

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

Нажатие на эту кнопку приведет к открытию окна Expert Infos. Того же результата можно добиться, пройдя в меню Analyze – Expert Info.

В этом окне будет содержаться информация по найденным пакетам, разбитая на группы Errors, Warnings, Notes и Chats. Цветовая раскраска для этих групп выглядит следующим образом: Ошибки — красный цвет Предупреждения — желтый Примечания — сине-зелёный (cyan) Чат — серый

Wireshark содержит в себе мощный анализатор и умеет автоматически обнаруживать большое количество проблем, возникающих в сети. Как вы уже могли заметить, буквально везде можно использовать фильтры и Expert Info не является исключением. Для того чтобы создать такой фильтр, нужно использовать конструкцию expert.severity. Например, expert.severity==error.

Можно ли с помощью Wireshark узнать, что было скачано? Да, можно. И сейчас это увидим. Вначале возьмем HTTP трафик. Сделаем правый клик по HTTP пакету — Protocol Preferences – и видим тут массу опций, которые непосредственно влияют на извлечение файлов из веб трафика. Для того чтобы увидеть, что можно извлечь из текущего дампа нужно перейти в меню File – Export Objects – HTTP. Появится окно, которое покажет все захваченные http объекты — текстовые файлы, картинки и т.д. Для того чтобы вытащить любой файл из этого списка, достаточно просто выделить его и нажать Save As.

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

Таким же способом, можно извлекать и потоковое видео/аудио.

Но на этом возможности Wireshark не заканчиваются! Он умеет вытаскивать файлы и с протокола FTP. Для этого можно использовать знакомый уже Follow TCP Stream. В итоге отобразится только обмен по протоколу FTP, в котором нужно будет найти строку RETR, что собственно и будет означать передачу файла.

Затем опускаемся дальше, находим пакеты уже непосредственно с файлом (FTP-DATA) и опять выбираем Follow TCP Stream, видим содержимое файла, жмем Save As и сохраняем.

Wireshark имеет несколько встроенных функций для работы с этой технологией. Он поддерживает массу голосовых протоколов — SIP, SDP, RTSP, H.323, RTCP, SRTP и другие. И, конечно же, умеет перехватывать и сохранять голосовой трафик для дальнейшего прослушивания. Этот функционал как нельзя лучше подойдет для траблшутинга в сетях Voice over IP. Меню Statistics — Flow Graph покажет наглядную картину, как происходил весь обмен пакетами.

А вообще целое меню Telephony отведено для работы с голосовым трафиком. Например, Telephony – RTP – Show All Streams покажет подробно, что происходило с RTP, в частности jitter (параметр, который, вероятно, самый важный в голосе), что иногда сразу скажет о наличии проблем.

Нажав на кнопку “Analyze”, можно открыть окно RTP stream Analysis – и, выбрав там поток, можно его даже проиграть, используя кнопку player. Сначала отроется окно проигрывателя, в котором вначале нужно установить подходящее значение jitter и использовать кнопку decode.

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

Так же существует еще один способ прослушивания голосовых звонков — можно зайти в меню Telephony – VoIP Calls.

Откроется окно со списком совершенных звонков, где опять же можно нажать кнопку player, отменить нужные разговоры флажками и нажать play. Для того чтобы добиться приемлемого качества звучания, потребуется проиграться со значением поля jitter buffer, меняя его значение.

Некоторое время назад появился сайт CloudShark.org.

Это тот самый сниффер Wireshark, но реализованный в виде онлайн-сервиса. Очевидно, что с его помощью не удастся захватывать сетевой трафик, но выполнять анализ дампа трафика – вполне. Загрузив туда через форму PCAP-файл на анализ, можно будет получить четкую последовательность пакетов, в которой всё данные будут разбиты на понятные поля в зависимости от протокола. В общем, тот же Wireshark, но немного облегченный и доступный из любого браузера.

Напоследок рассмотрим как выглядит сканирование портов. Смотрим на дамп и видим, что вначале происходит ARP запрос и затем непосредственно начинается сканирование. Адрес нашего маршрутизатора 192.168.10.11, сканирование идет с адреса 192.168.10.101

Это, так называемое, SYN сканирование, когда идут SYN-пакеты на указанный диапазон портов. Так как большинство портов закрыто, маршрутизатор отвечает пакетами RST, ACK. Пролистав чуть ниже видим, что открыт telnet (tcp 23).

На это указывает то, что маршрутизатор ответил пакетом SYN, ACK. К слову, для фильтрации портов в сниффере можно использовать конструкции вида: tcp.srcport, tcp.dstport и tcp.port. Для протокола UDP всё аналогично — udp.srcport, udp.dstport, udp.port.

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

В процессе написания использовались материалы сайта wiki.wireshark.org Дампы с трафиком брались из разных источников, больше всего с сайта packetlife.net

habr.com

Копия статьи "Фильтры захвата ...tcpdump, Wireshark, Paketyze

Анализаторы трафика являются полезным и эффективным инструментом в жизни администратора сети, они позволяют «увидеть» то что на самом деле передается в сети, чем упрощают диагностику разнообразных проблем или же изучение принципов работы тех или иных протоколов и технологий. Однако в сети зачастую передается достаточно много разнообразных блоков данных, и если заставить вывести на экран все, что проходит через сетевой интерфейс, выделить то, что действительно необходимо, бывает проблематично. Для решения этой проблемы в анализаторах трафика реализованы фильтры, которые разделены на два типа: фильтры захвата и фильтры отображения. Сегодня пойдет речь о первом типе фильтров – о фильтрах захвата. Фильтры захвата, это разновидность фильтров, позволяющая ограничить захват кадров только теми, которые необходимы для анализа, уменьшив, таким образом, нагрузку на вычислительные ресурсы компьютера, а также упростив процесс анализа трафика.
2. Синтаксис фильтров захвата
Выражение фильтра захвата состоит из набора специальных примитивов, которые строятся из так называемых классификаторов и идентификаторов объекта (адреса, имена объектов сети, номера портов). Внимание: все классификаторы регистрозависимы и должны писаться только маленькими буквами. Давайте разберемся с ними подробней. Классификаторы могут быть следующих разновидностей:
  • type – тип объекта
    • host – узел (тип по умолчанию, если тип не задан, предполагается что это host)
    • net – сеть
    • port – порт
Например:host 192.168.0.1 – захват трафика в котором в качестве адреса (отправителя или получателя) стоит IP 192.168.0.1net 172.16.0.0/16 – захват трафика в котором в качестве адреса (отправителя или получателя) стоит IP из сети 172.16.0.0/16 (точнее находится в диапазоне от 172.16.0.0 до 172.16.255.255), при этом, так как это всего лишь фильтр поиска совпадающих адресов, совершенно не важно какая настроена маска на интерфейсе, и вас не должно смущать что 172.16.0.0 по маске /16 это номер сети, мы совершенно не знаем какая маска настроена на интерфейсе, и формально, такой адрес узла допустим.port 80 – захват трафика в котором есть данные принадлежащие порту 80 (udp или tcp)10.0.0.1 – захват трафика в котором в качестве адреса (отправителя или получателя) стоит IP 10.0.0.1, классификатор host не указан, но он предполагается по умолчанию.
  • dir – направление по отношению к объекту (direction)
    • src – объект является отправителем
    • dst – объект является получателем
Например:src host 192.168.0.1 – захват трафика в котором в качестве адреса отправителя (не получателя) стоит IP 192.168.0.1dst net 172.16.0.0/16 – захват трафика в котором в качестве адреса получателя (не отправителя) стоит IP из сети 172.16.0.0/16 (точнее находится в диапазоне от 172.16.0.0 до 172.16.255.255).
  • proto – протокол взаимодействия
    • ether – базовая сетевая технология Ethernet, как правило указывает на то что в фильтре используется аппаратный MAC адрес
    • ip – протокол IPv4
    • ip6 – протокол IPv6
    • arp – протокол ARP
    • tcp – протокол TCP
    • udp – протокол UDP
    • если протокол не указан, то считается что должен захватываться весь трафик, совместимый с типом объекта
Например:src ether host 00:11:22:33:44:55 – захват трафика в котором в качестве MAC адреса отправителя используется 00:11:22:33:44:55.ip icmp – захват ICMP пакетов.tcp port 80 – захват трафика в котором есть данные принадлежащие TCP порту 80 Кроме идентификаторов и классификаторов объекта фильтры могут содержать ключевые слова gateway, broadcast, multicast, less, greater а так же арифметические выражения. Например:ip multicast – захват ip пакетов, содержащих адреса из класса D.less 1000 – захват кадров, у которых размер менее 1000 байт. Связка нескольких условий может происходить с помощью логических операций:
  • «И» – and (&&)
  • «ИЛИ» – or (||)
  • «НЕ» – not (!) – инверсия значения
При этом приоритет этих операций следующий:
  • наивысшим приоритетом обладает операция инверсии
  • потом логическое «И»
  • наименьшим приоритетом обладает операция «ИЛИ».
Как и в обычных математических выражениях, приоритет можно менять с использованием круглых скобочек (), действия в которых выполняются в первую очередь. Например:net 192.168.0.0/24 and tcp port 21 – захват трафика принадлежащего сети (диапазону) 192.168.0.0/24 (или отправитель или получатель) и передающего данные по протоколу TCP и использующего порт 21.host 192.168.0.1 or host 192.168.0.221 – захват трафика принадлежащего или хосту 192.168.0.1 или хосту 192.168.0.221 (при чем не важно кто отправитель, кто получатель и так же достаточно выполнения одно из двух условий, что бы хотя бы один из этих адресов присутствовал в кадре)host 192.168.0.1 or host 192.168.0.2 and tcp port 22 – захват или любого трафика принадлежащего хосту 192.168.0.1 или трафика протокола TCP и использующего порт 22 принадлежащего хосту 192.168.0.2.(host 192.168.0.1 or host 192.168.0.2) and tcp port 22 – захват трафика протокола TCP и использующего порт 22 принадлежащего хосту 192.168.0.1 или хосту 192.168.0.2 (любому из них, или обоим сразу).(host 192.168.0.1 || host 192.168.0.1) && not tcp port 22 – захват любого трафика кроме трафика протокола TCP и использующего порт 22 принадлежащего хосту 192.168.0.1 или хосту 192.168.0.2 (любому из них, или обоим сразу). Если в фильтре есть несколько одинаковых повторяющихся классификаторов, то для сокращения записи их можно не писать. Например:net 192.168.0.0/24 and (tcp port 21 or tcp port 20 or tcp port 25 or tcp port 80 or tcp port 110)можно сократить доnet 192.168.0.0/24 and (tcp port 21 or 20 or 25 or 80 or 110) Внимание:Выражение исключающее пакеты, в которых есть адреса 1.1.1.1 и 1.1.1.2:not (host 1.1.1.1 and host 1.1.1.2)Можно сократить как:not (host 1.1.1.1 and 1.1.1.2)Но не как:not host 1.1.1.1 and 1.1.1.2 – в этом случае будут показаны пакеты в которых нет первого адреса и есть второй. И не такnot ( host 1.1.1.1 or 1.1.1.2) – в этом случае будут исключены пакеты в которых есть хотя бы один из указанных двух адресов. Список основных примитивов, которые могут быть использованы для написания фильтров захвата, показан в таблице 2-1.

Таблица 2-1. Список основных примитивов, которые могут быть использованы для написания фильтров захвата.

Примитив Описание
dst host ip_address Захватывать кадры, в которых в поле адреса получателя заголовка IPv4/IPv6 содержит заданный адрес узла
src host ip_address Захватывать кадры, в которых в поле адреса отправителя заголовка IPv4/IPv6 содержит заданный адрес узла
host ip_address Захватывать кадры, в которых в поле адреса отправителя или получателя заголовка IPv4/IPv6 содержит заданный адрес узла. Эквивалентен фильтру:ether proto ip and host ip_address
ether dst mac_address Захватывать кадры, в которых в поле адреса получателя заголовка канального уровня содержит заданный MAC адрес узла
ether src mac_address Захватывать кадры, в которых в поле адреса отправителя заголовка канального уровня содержит заданный MAC адрес узла
ether host mac_address Захватывать кадры, в которых в поле адреса отправителя или получателя заголовка канального уровня содержит заданный MAC адрес узла
dst net network Захватывать кадры, в которых в поле адреса получателя заголовка IPv4/IPv6 содержит заданный адрес, принадлежащий диапазону указанной классовой сети
src net network Захватывать кадры, в которых в поле адреса отправителя заголовка IPv4/IPv6 содержит заданный адрес, принадлежащий диапазону указанной классовой сети
net network Выбирает все пакеты IPv4/IPv6, содержащие адреса из указанной сети в поле отправителя или получателя
net network mask mask Захватывать кадры, в которых в поле адреса отправителя или получателя заголовка IPv4/IPv6 содержит заданный адрес, принадлежащий диапазону указанной сети
net network/mask_length Захватывать кадры, в которых в поле адреса отправителя или получателя заголовка IPv4/IPv6 содержит заданный адрес, принадлежащий диапазону указанной сети
dst port port Захватывать кадры, в которых в поле порт получателя заголовка UDP или TCP содержит заданный номер порта
src port port Захватывать кадры, в которых в поле порт отправителя заголовка UDP или TCP содержит заданный номер порта
port port Захватывать кадры, в которых в поле порт отправителя заголовка UDP или TCP содержит заданный номер порта
less length Захватывать кадры, размер которых не больше указанного значения
greater length Захватывать кадры, размер которых не меньше указанного значения
ip proto protocol Захватывать кадры, в которых в поле «Protocol» заголовка IPv4, содержится идентификатор указанного протокола. При этом можно указывать не только численные значения протоколов, но и их стандартные имена (icmp, igmp, igrp, pim, ah, esp, vrrp, udp, tcp и другие). Однако следует учитывать, что tcp, udp и icmp используются также в качестве ключевых слов, поэтому перед этими символьными идентификаторами следует помешать символ обратного слэша («»)
ip6 proto protocol Захватывать кадры, в которых в поле «Protocol» заголовка IPv4, содержится идентификатор указанного протокола. При этом можно указывать не только численные значения протоколов, но и их стандартные имена (icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, tcp и другие). Однако следует учитывать, что tcp, udp и icmp6 используются также в качестве ключевых слов, поэтому перед этими символьными идентификаторами следует помешать символ обратного слэша («»)
ether broadcast Захватывать все широковещательные кадры Ethernet. Ключевое слово ether может быть опущено
ip broadcast Захватывать кадры, содержащие широковещательные адреса в заголовке пакета IPv4. При этом для определения, является ли адрес широковещательным, используется маски подсети для интерфейса, который используется для захвата пакетов. Так же захватывает пакеты, отправленные на ограниченный широковещательный адрес
ether multicast Захватывать все групповые кадры Ethernet. Ключевое слово ether может быть опущено
ip multicast Захватывать кадры, содержащие групповые адреса в заголовке пакета IPv4
ip6 multicast Захватывать кадры, содержащие групповые адреса в заголовке пакета IPv6
ether proto protocol_type Захватывать кадры Ethernet с заданным типом протокола. Протокол может быть указан по номеру или имени (ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, netbeui)
ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui, tcp, udp, icmp Захватывать кадры передающие данные указанного протокола. Используются в качестве сокращения для:ether proto protocol
vlan [vlan_id] Захватывать кадры соответствующе стандарту IEEE 802.1Q. Если при этом указан номер vlan_id, то захватываются только кадры принадлежащие указанному VLAN
3. Расширенные примеры фильтров захвата
Кроме простых указаний адресов и протоколов в фильтрах захвата можно использовать и более сложные конструкции, позволяющие производить более тонкий анализ заголовков. Для этого используются выражения возвращающее логическое значение следующего формата: expression операция expression В котором в качестве expression могут быть константы, результаты арифметических (+, -, *, /) или двоичных побитовых операций (& — «И», | — «ИЛИ», > — сдвиг вправо), оператор длинны offset, данные или поля заголовков кадра. В качестве операции могут быть применены символы «>» (больше), «=» (больше равно), « Простейшим примером использования расширенного фильтра будет «5 = 3+1», где «5» и «3+1» — expression, а «=» — операция. В результате вычисления этой строки будет возвращено логическое значение, в данном случае false.

Для получения данных или заголовков кадра используется примитив proto[offset:size].

Внимание: квадратные скобочки в данном случае элемент синтаксиса, а не признак необязательного поля. Параметр proto содержит название протокола, из заголовка которого необходимо выбрать определенные данные (ether, fddi, tr, wlan, ppp, slip, link, ip, arp, rarp, tcp, udp, icmp, ip6 и другие). Параметр offset указывает на смещение в байтах относительно начала заголовка указанного протокола, нумерация байт начинается с нуля: ip[0] – первый байт от начала IP пакета, tcp[1] – второй байт от начала TCP сегмента, ether[3] – четвертый байт от начала Ethernet кадра. Параметр size указывает на количество байт, которое необходимо взять, начиная с байта, указанного в смещении (offset), поле size является не обязательным, и если оно отсутствует, то считается что необходимо взять 1 байт: ip[2:2] – третий и четвертый байты от начала IP пакета, tcp[4] – пятый байт от начала TCP сегмента, ether[6-6] – байты с седьмого по двенадцатый, от начала Ethernet кадра. Если в поле offset установить отрицательное значение, то будут выбраны байты предыдущего заголовка, идущие до заголовка протокола, указанного в параметре proto. Но при этом будет обязательно требоваться наличие в кадре заголовка протокола, указанного в примитиве proto. Таким образом, фильтры ether[11]=0x37 (взять 12-й байт кадра Ethernet и сравнить его со значением 0x37) и ip[-3] = 0x37 (взять 3-й байт с конца заголовка, идущего перед заголовком IP, и сравнить его со значением 0x37) не являются идентичными. В первом будут пропускаться все кадры, в которых MAC адрес отправителя заканчивается на 37, а во втором так же будет требоваться наличие протокола IP, а кадры не содержащие IP протокол, например, ARP кадры, захватываться не будут. Например:Выражения ip[1:1] и ip[1] приведут к одному и тому же результату – будет выбрано значение второго байта заголовка IPv4 Выражение tcp[8:2] выберет девятый и десятый байты (поле Source Port) заголовка TCP.Выражение ip[-3] = 0x37 выберет все IPv4 пакеты, MAC адрес отправителя которых заканчивается на «0x37». Следует учитывать, что при выборе данных с помощью конструкции proto [offset:size] для протоколов TCP и UDP, учитывается фрагментация IP пакетов. В результате tcp[0] всегда будет означать первый байт заголовка TCP, и никогда не приведет к выбору первого байта данных пакетов, передающих не первый фрагмент из цепочки фрагментов. Для некоторых протоколов определенные поля и значения смещений могут задаваться не только числами, но и именами. Например, для протокола ICMP поддерживается параметр icmptype, который может принимать значения icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstam-preply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply. Для анализа флагов TCP можно использовать параметр tcpflags идентификаторы tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack и tcp-urg. Например:Выражение tcp[tcpflags]&(tcp-syn|tcp-fin) != 0 выберет все кадры, содержащие TCP сегменты в которых открывается или завершается сессия.Выражение icmp[icmptype]!=icmp-echo and icmp[icmptype]!=icmp-echoreply выберет все кадры, содержащие ICMP протокол, кроме эхо запросов и эхо ответов. Могут быть ситуации, в которых необходимо анализировать только часть бит, определенного байта. Для решения этих задач используется битовая операция «И» (&). С ее помощью можно сохранить только определенные биты байта, а остальные обнулить. Например, нам необходимо выделить только те кадры, которые передаются на канальном уровне широковещательными или групповыми кадрами. Мы знаем, что определить тип MAC адреса можно по его старшему байту:
Тип адреса Значение старшего байта в 16-й системе Значение старшего байта в 2-й системе
Направленные 00 00000000
Групповые 01 00000001
Административно назначенныеID 01 00000010
Широковещательные FF 11111111
Исходя из этой информации, можно сделать вывод о том, то в широковещательных или групповых адресах младший бит старшего байта адреса равен единице, а в остальных – нулю. Если мы возьмем старший байта адреса, обнулим все его биты кроме самого младшего, и при этом значение байта станет равным единице, то этот адрес был или широковещательным, или групповым, если значение байта станет равным нулю, то этот адрес были или направленным, или административно заданным. В результате для выполнения данной проверки необходимо использоваться следующее выражение: ether[0]&1 = 1, где ether[0] – получает значение первого байта Ethernet заголовка, а &1 — битовая операция логическое «И», обнуляющая все биты этого байта, кроме младшего, «= 1» — проверка результата на совпадение с единицей. Разберем еще один пример более подробно. Нам нужно получить содержимое поля Type Of Service (ToS) заголовка IPv4. Для этого обратившись к RFC-791 мы увидим, что это поле является однобайтовым полем, и вторым байтом заголовка: 3.1. Internet Header Format A summary of the contents of the internet header follows: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Для того что бы получить его значение нам необходимо воспользоваться следующим примитивом:ip[1:1] – получить один байт заголовка IP начиная с байта номер 1 (нумерация байт начинается с нуля). Теперь мы можем строить фильтры, основываясь на содержимом этого поля. Если мы хотим, чтобы отображались все кадры, содержащие заголовок IPv4, в котором поле ToS равно нулю необходимо написать следующее: ip[1:1] = 0. Если мы хотим что бы отображались все кадры, содержащие заголовок IPv4, в котором поле ToS не равно нулю необходимо написать следующее: ip[1:1] != 0. Но можно пойти дальше, согласно RFC-791 поле ToS является составным полем и имеет следующую структуру: 0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | PRECEDENCE | D | T | R | 0 | 0 | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+ Bits 0-2: Precedence. Bit 3: 0 = Normal Delay, 1 = Low Delay. Bits 4: 0 = Normal Throughput, 1 = High Throughput. Bits 5: 0 = Normal Relibility, 1 = High Relibility. Bit 6-7: Reserved for Future Use. Первые три бита – предпочтительность, четвертый описывает требования к задержкам, пятый описывает требования к пропускной способности, шестой описывает требования к надежности линии связи, седьмой и восьмой – зарезервированы для будущего использования. Если обратиться к более новым стандартам (RFC1349), значение седьмого бита уже определено – требования по цене – «Cost» (денежный эквивалент). И вот, допустим, мы хотим определить есть ли в сети кадры, в которых в IPv4 заголовке установлен седьмой бит поля ToS. Как это сделать? Для решения этой задачи нам понадобиться вспомнить (или выучить:D) двоичную систему исчисления. В байте каждый бит имеет свой вес, который начинается с единицы, и увеличивается, справа налево каждый раз умножаясь на два. 0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | PRECEDENCE | D | T | R | С | 0 | | 0 0 0 | 0 | 0 | 0 | 1 | 0 | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+ 128 64 32 16 8 4 2 1 Получается, что вес интересующего нас бита равен 2. Что если мы сравним значение поля ToS c двойкой?ip[1:1] = 2 Получим ли мы ответ на вопрос, присутствует ли в этом заголовке интересующий нас бит? С одной стороны, да, но с другой стороны и нет. Например, если у нас в поле ToS есть кроме бита «Cost» еще и другие биты, установленные в единицу? Допустим это будет бит отвечающий за требования к пропускной способности – «Throughput». 0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ | | | | | | | | PRECEDENCE | D | T | R | С | 0 | | 0 0 0 | 0 | 1 | 0 | 1 | 0 | | | | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+ 128 64 32 16 8 4 2 1 В результате значение этого байта будет уже не 2, а 10, и простым сравнением нельзя получить ответ на вопрос, установлен ли определенный бит в интересующем нас поле. Что же нам мешает получить интересующий нас ответ? Нам мешает значение других, возможно также установленных в единицу битов. Соответственно надо от них избавиться. Для решения этой задачи воспользуемся операцией побитового логического «И» (иногда называется логическое умножение), обозначается символом «&». Как известно, в логической операции «И» на выходе будет только тогда единица, когда и первый операнд и второй равны единице. Соответственно если мы произведем побитовое умножение значения поля ToS на специальную маску, в которой будет установлен в единицу только тот бит, который находится на позиции интересующего нас бита в поле ToS, то мы исключим из результата все остальные биты: Поле ToS :00001010=10 Маска :00000010=2 Результат:00000010=2

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

Поле ToS :11111111=255 Маска :00000010=2 Результат:00000010=2 И только лишь, если интересующий нас бит, равен нулю, в результате наложения маски будет так же ноль. Поле ToS :11111101=253 Маска :00000010=1 Результат:00000000=0 Таким образом, если интересующий нас бит равен единице, в результате наложения маски мы получим вес этого бита, если он равен нулю, то мы получим ноль. Исходя из этого, для решения этой задачи нам необходимо применить следующий фильтр:ip[1:1] & 2 = 2

Он будет брать значение второго байта, накладывать на него маску «вырезающую» значение определенного бита и сравнивать результат с весом этого бита.

Можно привести еще один пример на основании анализа поля Type Of Service заголовка IP: нам нужно увидеть все кадры, в которых в заголовке IPv4 в поле ToS значение битов Precedence (предпочтительность) не равна нулю. Для этого применим маску, в который единичками выделим те биты, которые отвечают за Precedence:

Поле ToS :10111101=189 Маска :11100000=224 Результат:10100000=160 Результат не равен нулю, и это говорит о том, что поле Precedence так же не равно нулю. Поле ToS :00011111=31 Маска :11100000=224 Результат:00000000=0 Результат равен нулю, и это говорит о том, что поле Precedence так же равно нулю.

В результате, проверка на ненулевое значение поля ToS в заголовке IPv4 будет выглядеть следующим образом:ip[1:1] & 224 != 0или же тоже самое, но используя шестнадцатеричный вариант:ip[1:1] & 0xe0 != 0

Рассмотрим пример с другим протоколом. Возьмем протокол TCP.Например, нам нужно захватить все кадры, которые передают TCP сегменты с опциями. Для того что бы понять, что нужно искать и где обратимся к RFC-793.

TCP Header Format 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Для определения есть ли в сегменте опции, используется поле «Data Offset», оно показывается длину заголовка в четырехбайтовых словах. Минимальная длина заголовка TCP сегмента – 20 байт, а это 5 четырехбайтовых слов. Соответственно, если в заголовке TCP сегмента есть опции, то значение этого поля будет больше 5. Для того, чтобы получить значение этого поля необходимо воспользоваться примитивом tcp[12:1]. Правда, учитывая то что минимальный кусок, который мы можем взять это один байт, а нам нужно всего 4 бита, придется немного подумать. Применив примитив tcp[12:1] мы получили следующий кусок заголовка: +-+-+-+-+-+-+-+- | Data | | Offset| Reserved | | +-+-+-+-+-+-+-+- Если бы поле «Data Offset» было в младшей части байта, то число «5» в двоичном представлении выглядело бы следующим образом: 128 64 32 16 8 4 2 1 0 0 0 0 0 1 0 1 = 5 Но интересующие нас биты находятся не в левой, младшей, а в правой, старшей его части, поэтому, для получения десятичного эквивалента переносим их в правую часть байта: 128 64 32 16 8 4 2 1 0 1 0 1 0 0 0 0 = 80 (0x50 в шестнадцатеричном виде) Для выделения старших бит необходимо наложить маску: Поле Data Offset :01010000=80 Маска :11110000=240 Результат :01010000=80 Если в заголовке все же есть опции, то значение «Data Offset» будет больше 5. Например, если в заголовке будет одна восьмибайтовая опция, то значение этого поля будет 7 (5 четырехбайтовых слов фиксированной части заголовка, и 2 четырехбайтовых слова опции): 128 64 32 16 8 4 2 1 0 0 0 0 0 1 1 1 = 7 Перенеся соответствующие биты в старшую часть получаем: 128 64 32 16 8 4 2 1 0 1 1 1 0 0 0 0 = 112 (0x70 в шестнадцатеричном виде) Выделяем старшие биты накладывая маску: Поле Data Offset :01110000=112 Маска :11110000=240 Результат :01110000=112 Таким образом, получается, что если в результате получается значение больше 80, то в TCP заголовке есть опции. В принципе тут маску можно было и не накладывать, так как лишние биты все равно резервные, и всегда должны быть равны нулю, но мало ли, что может измениться, и чтобы не переписывать фильтр, если вдруг стандарт измениться, мы лучше их обрежем маской. Результирующий фильтр, который покажет те TCP сегменты, в которых длина TCP заголовка больше 5 четырехбайтовых слов, получился следующий:tcp[12:1] & 240 != 80 илиtcp[12:1] & 240 > 80 илиtcp[12:1] & 0xf0 > 80 Также давайте рассмотрим возможность работы с TCP флагами. Их можно выделять таким же методом с помощью маски, но также можно использовать символьные классификаторы, которые приводились выше. Например, для того что бы захватить кадры содержащие сегменты с флагами SYN или FIN, необходимо написать следующий фильтр: tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 Я думаю он вполне читаем и не требует особых пояснений. Реализация подобной задачи через биты и маски привела бы к такому формату фильтра:tcp[13:1] & 2 != 0 or tcp[13:1] & 1 != 0 В качестве закрепления понимания темы попробуйте самостоятельно разобраться с тем, как этот вариант фильтра будет работать. Например:Выражение ether[0]&1 != 0 выберет все широковещательные кадры. Выражение ether[0] & 1 = 0 and ip [16]>= 244 выберет все широковещательные или групповые IP пакеты, в которых на канальном уровне не используется широковещательный или групповой MAC адрес.Выражение ip[0]&0xf = 5 выберет все IP пакеты, в которых нет опций.Выражение ip[6:2]&0x1fff = 0 выберет все не фрагментированные IP пакеты, и первые фрагменты фрагментированных пакетов.Выражение ip[-3]&0xff = 0x37 выберет все IP пакеты, MAC адрес отправителя которых заканчивается на «0x37». Еще одним интересным набором битовых операций является операции битового сдвига. Эти операции обозначаются символами «пара стрелочек»: «>»- сдвиг вправо. Как они работают? Возьмем произвольный байт, для простоты возьмем единицу, и запишем ее значение в двоичной системе исчисления: 128 64 32 16 8 4 2 1 0 0 0 0 0 0 0 1 = 1 Теперь произведем операцию битового сдвига влево, смещая значения всех бит на одну позицию, и поставляя ноль в младший освободившийся разряд: 128 64 32 16 8 4 2 1 0 0 0 0 0 0 1 << 128 64 32 16 8 4 2 1 0 0 0 0 0 0 1 0 = 2 В результате значение байта стала равно двойке, то есть увеличилось в два раза. И еще раз применим эту операцию: 128 64 32 16 8 4 2 1 0 0 0 0 0 1 0 << 128 64 32 16 8 4 2 1 0 0 0 0 0 1 0 0 = 4 В результате значение байта стала равно четверке, то есть опять увеличилось в два раза. Таким образом, можно сделать вывод, что операция битового сдвига влево, эквивалентна умножению значения байта на два (так как мы работаем с двоичной системой исчисления). Давайте проверим действительность этого правила на более сложном числе, например, 100. Запишем его в двоичном виде: 128 64 32 16 8 4 2 1 0 1 1 0 0 1 0 0 = 100 А теперь произведем операцию сдвига влево: 128 64 32 16 8 4 2 1 1 1 0 0 1 0 0 << 128 64 32 16 8 4 2 1 1 1 0 0 1 0 0 0 = 200 В результате значение байта стала равно 200 – увеличилось в два раза. Соответственно можно сразу сделать вывод о том, что битовый сдвиг вправо эквивалентен делению числа на два. Например, число 240: 128 64 32 16 8 4 2 1 1 1 1 1 0 0 0 0 = 240 Произведем операцию сдвига вправо: 128 64 32 16 8 4 2 1 >> 1 1 1 1 0 0 0 128 64 32 16 8 4 2 1 0 1 1 1 1 0 0 0 = 120 Значение байта стала равно 120 – уменьшилось в два раза. Как эту операцию мы можем использовать? Давайте вспомним, что поле IHL (Internet Header Length) заголовка IP указывает длину заголовка не в байтах, а в четырехбайтовых словах, и для того что бы проверить, содержит ли пакет опции мы применяли следующую операцию:ip[0]&0xf = 5 То есть сравнивали не с реальным значением, а со значением, разделенным на четыре (20 байт это 5 четырехбайтовых слов). Если по каким-то причинам удобней работать с длиной заголовка в байтах (например, если это значение надо впоследствии вычесть из общей длины пакета), то его необходимо умножить на 4. Для того что бы умножить число на 4, его нужно дважды умножить на два, то есть провести операцию битового сдвига влево дважды, после чего сравнить с необходимой длинной IP заголовка в байтах:ip[0]<<2 = 20

Ну и конечно же все это можно объединять в составные наборы правил:(icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply) or (udp and udp port not 67 and ip[16] < 224) or (tcp[0:2]<1024 and tcp[2:2]<1024)С этим фильтром программа будет захватывать только те кадры, которые подходят под одно из трех описаний:

  • Содержат ICMP сообщения, кроме echo и echoreply (использующиеся утилитой ping)
  • Передают UDP дейтаграммы, кроме тех, что используют в качестве порта отправителя или порта получателя порт 67 и кроме тех, которые передаются на групповые адреса и на ограниченный широковещательный адрес
  • Передают TCP сегменты, в которых и порт отправителя, и порт получателя находятся в диапазоне «Хорошо известных портов»
4. Задание для самопроверки :D
Для закрепления работы со сложными фильтрами захвата попробуйте понять, что описывает и как работает этот фильтр:tcp port 80 and (ip[2:2] — ip[0]&0xf<<2 — tcp[12]&0xf0>>2 != 0) Примечание:Это один из стандартных примеров, и при необходимости вы легко сможете проверить себя, попользовавшись поиском в интернет, но все же попробуйте приложить усилия и самостоятельно с ним разобраться. Удачного снифинга)

Посты чуть ниже также могут вас заинтересовать

pythonr.blogspot.com

Захват сетевых пакетов с помощью программы Wireshark – Keenetic

Как выполнить захват сетевых пакетов с помощью программы-анализатора трафика Wireshark?

В интернет-центрах серии Keenetic реализована возможность захвата сетевых пакетов с помощью специального программного модуля (компонента). Это самый удобный способ собрать дамп сетевых пакетов. Рекомендуем использовать именно этот метод, он описан в статье: «Использование встроенного модуля захвата сетевых пакетов» 

Но также собрать дамп сетевых пакетов можно с помощью популярной программы Wireshark.Wireshark — программа для анализа сетевых протоколов, которая широко используется для захвата сетевых пакетов. Программа распространяется бесплатно.Скачать последнюю версию можно с официального сайта программы: http://www.wireshark.org/

Выполните установку на вашем компьютере программы Wireshark. Для завершения установки следуйте инструкциям Wireshark Setup Wizard.

Далее запустите программу.

После запуска вы увидите основное окно программы.

Зайдите в меню Capture > Options или нажмите Ctrl+K для дальнейшей настройки параметров программы.

Вы увидите окно Capture Options. 

В разделе Capture в поле Interface выберите из выпадающего списка адаптер, через который будет происходить захват пакетов.

Затем нажмите кнопку  для начала захвата пакетов. 

Подключите ваш компьютер к LAN-порту вашего устройства. Подождите пока ваш компьютер получит IP-адрес от устройства (если включен DHCP-сервер), или установите на компьютере вручную IP-адрес из той же подсети, что и LAN IP-адрес устройства.

В программе Wireshark вы увидите все захваченные пакеты, которые присутствуют на LAN-порту устройства.

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

Для завершения захвата пакетов нажмите кнопку  на панели инструментов программы Wireshark.

Зайдите в меню File > Save As… для сохранения захваченных данных в файл.

Выберите местоположение, введите имя файла и нажмите кнопку  для сохранения пакетов.

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

 

Для удобства поиска/просмотра информации о нужных пакетах в программе Wireshark

help.keenetic.com

Анализ сетевого трафика на сервере с помощью tshark / Блог компании Selectel / Хабр

В практике системного администрирования довольно часто приходится cталкиваться со сложными ситуациями, в которых не помогают ни инструменты сбора статистики (например, netstat), ни стандартные утилиты на основе протокола ICMP (ping, traceroute и другие). В таких случаях часто используются специализированные диагностические утилиты, дающие возможность «слушать» сетевой трафик и анализировать его на уровне единиц передачи отдельных протоколов. Они называются анализаторами трафика, а на профессиональном жаргоне — снифферами. С их помощью можно, во-первых, локализовывать сетевые проблемы и более точно их диагностировать, а во-вторых — обнаруживать паразитный трафик и выявлять в сети зловредное ПО.

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

Одним из самых распространенных и популярных анализаторов трафика сегодня является Wireshark, распространяемый под лицензией GNU GPL. Существуют версии Wireshark для различных операционных систем: Linux, Windows, MacOS, FreeBSD, Solaris.

Tshark использует для захвата библиотеку libpcap, реализующую API pcap (packet capture). Эту библиотеку использует и стандартная утилита tcpdump. Файлы, созданные в tcpdump, можно передавать tshark для последующего анализа.

Несомненным преимуществом tshark по сравнению с tcpdump является более ясный и человекопонятный формат вывода. Кроме того, tshark поддерживает огромное количество сетевых протоколов (более 300, что охватывает практически все когда-либо изобретенные виды сетей).

Об особенностях работы с tshark мы подробно расскажем в этой статье.

Начало работы

Tshark включена в дистрибутивы большинства современных Linux-систем и устанавливается при помощи стандартного менеджера пакетов: $ sudo apt-get install tshark Завершив установку, запустим программу: $ sudo tshark На консоль будет выводиться список пакетов, захватываемых в режиме реального времени: Capturing on eth0 0.000000 88:e0:f3:b6:47:c0 -> Broadcast ARP Who has 31.186.98.120? Tell 31.186.98.1 0.322046 5a:58:74:bf:a9:9c -> Broadcast ARP Who has 31.186.98.77? Tell 31.186.98.226 0.351801 31.186.98.235 -> 188.93.16.50 SSH Encrypted response packet len=224 0.352414 188.93.16.50 -> 31.186.98.235 TCP cap > ssh [ACK] Seq=1 Ack=225 Win=331 Len=0 TSV=194287231 TSER=416767897 0.600054 88:e0:f3:b6:47:c0 -> Broadcast ARP Who has 31.186.98.120? Tell 31.186.98.1 0.622913 Cisco_0d:0d:96 -> PVST+ STP Conf. Root = 32768/398/00:21:1c:0d:0d:80 Cost = 0 Port = 0×8016 0.800377 88:e0:f3:b6:47:c0 -> Broadcast ARP Who has 31.186.98.107? Tell 31.186.98.1 1.320775 31.186.98.235 -> 188.93.16.50 SSH Encrypted response packet len=528 1.321507 188.93.16.50 -> 31.186.98.235 TCP cap > ssh [ACK] Seq=1 Ack=753 Win=331 Len=0 TSV=194287474 TSER=416768866 1.322109 5a:58:74:bf:a9:9c -> Broadcast ARP Who has 31.186.98.77? Tell 31.186.98.226 1.400654 88:e0:f3:b6:47:c0 -> Broadcast ARP Who has 31.186.98.107? Tell 31.186.98.1 1.589797 Cisco_0d:0d:96 -> PVST+ STP Conf. Root = 32768/401/00:21:1c:0d:0d:80 Cost = 0 Port = 0×8016 2.100769 88:e0:f3:b6:47:c0 -> Broadcast ARP Who has 31.186.98.107? Tell 31.186.98.1 2.322163 5a:58:74:bf:a9:9c -> Broadcast ARP Who has 31.186.98.77? Tell 31.186.98.226 2.322764 31.186.98.235 -> 188.93.16.50 SSH Encrypted response packet len=720 2.323594 188.93.16.50 -> 31.186.98.235 TCP cap > ssh [ACK] Seq=1 Ack=1473 Win=331 Len=0 TSV=194287724 TSER=416769868 2.520048 88:e0:f3:b6:47:c0 -> Broadcast ARP Who has 31.186.98.64? Tell 31.186.98.1 2.635370 Cisco_0d:0d:96 -> PVST+ STP Conf. Root = 32768/398/00:21:1c:0d:0d:80 Cost = 0 Port = 0×8016 3.200299 88:e0:f3:b6:47:c0 -> Broadcast ARP Who has 31.186.98.64? Tell 31.186.98.1 3.451774 31.186.98.235 -> 188.93.16.50 SSH Encrypted response packet len=528 Как видно из приведенного вывода, tshark показывает информацию обо всех пакетах подряд, в том числе и о тех, которые в данный момент нам совершенно не нужны. С помощью специальных опций можно сделать так, чтобы на консоль выводилась только та информация, которая нам действительно требуется.

Фильтры

Выбор интерфейса для захвата

Опция -i позволяет захватывать трафик только для конкретного интерфейса. Просмотреть список доступных сетевых интерфейсов можно с помощью команды: $ sudo tshark -D 1. eth0 2. any 3. lo (Loopback) 4. nflog 5. nfqueue 6. usbmon1 После опции -i указывается любой из доступных интерфейсов: $ sudo tshark -i eth0 С помощью дополнительных аргументов можно получать более специализированную информацию. Например, с помощью аргумента host можно осуществить захват пакетов для конкретного IP-адреса: $ sudo tshark -i eth0 host 192.168.1.100 В вывод будут включены как входящие, так и исходящие пакеты. Чтобы просмотреть информацию только о входящих пакетах или только об исходящих пакетах, используются аргументы dst и src соответственно: $ sudo tshark -i eth0 src host 192.168.1.100 Команда выведет на консоль список пакетов, исходящих с адреса 192.168.1.100 $ sudo tshark -i eth0 dst host 192.168.1.100 На консоль будет выведен список пакетов, поступающих на адрес 192.168.1.100.

Аналогичным образом можно захватывать трафик для целой подсети — для этого используется аргумент net:

$ sudo tshark -i eth0 src net 192.168.1.0/24 Можно также указать порт, на котором будут захватываться пакеты: $ sudo tshark -i eth0 host 192.168.1.1 and port 80 Tshark позволяет захватывать пакеты в течение определенного промежутка времени: $ sudo tshark -i eth0 -a duration:10 -w traffic.pcap В приведенном примере была также использована опция -w. После неё указывается путь к файлу, в который будут записаны полученные данные.

Фильтры захвата

Эти фильтры используются при захвате трафика «на лету». Они перекомпилируются в набор правил для pcap, в соответствии с которыми осуществляется фильтрация пакетов. На консоль выводится лишь та информация, которая соответствует установленным с помощью фильтров критериям.

В общем виде синтаксис команды tshark с фильтрами можно представить так:

$ sudo tshark -i <интерфейс> -f <фильтр> В tshark для фильтров захвата используется такой же синтаксис, как и в tcpdump. В рамках этой статьи мы подробно рассматривать все существующие фильтры не будем и ограничимся отсылкой к официальному мануалу).

Фильтры чтения

Tshark может сохранять информацию о захваченных пакетах в файлах. Чтобы извлечь из этих файлов нужную информацию, используются фильтры чтения, называемые так же правилами (опция -R). Они могут быть использованы и при захвате пакетов «на лету». Обработка информации осуществляется не pcap, а средствами самого tshark.

Эти фильтры дают гораздо более широкие возможности для отбора и конкретизации информации.

Следует, однако, учитывать, что при анализе большого количества информации «на лету» они могут не справиться с возлагаемыми на них задачами: не успевают осуществлять фильтрацию и сбрасывают пакеты.

В общем виде синтаксис правил можно представить так:

$ sudo tshark -R "правило" -r "путь к файлу" Рассмотрим особенности формирования правил на конкретных примерах. Так, команда $ sudo tshark -R "ip.addr == 192.168.0.1" -r /tmp/capture.cap указывает, что из файла /tmp/capture.cap нужно извлечь информацию об исходящих и входящих пакетах для IP-адреса 192.168.0.1.

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

$ sudo tshark -R "!(ip.addr == 192.168.0.1)" -r /tmp/capture.cap Аналогичным образом можно задавать правила и для других протоколов и портов (фильтры eth.addr, udp.port, tcp.port): $ sudo tshark -R "eth.addr == 00:08:15:00:08:15" -r /tmp/capture.cap $ sudo tshark -R "udp.port == 80" -r /tmp/capture.cap $ sudo tshark -R "tcp.port == 80" -r /tmp/capture.cap Правила можно также объединять при помощи логических операторов and, or и not: $ sudo tshark -R "not arp and not (udp.port == 53)" -r /tmp/capture.cap Приведенная команда указывает, что нужно извлечь список всех захваченных пакетов, кроме ARP и DNS (53 порт).

Дополнительные настройки

Cбор статистики

C помощью опции -z можно собирать и выводить на консоль различную статическую информацию о пакетах.

Например, команда

$ sudo tshark -z "proto,colinfo,tcp.srcport,tcp.srcport" -r /tmp/capture.cap указывает, что из файла /tmp/capture.cap нужно извлечь информацию о порте-источнике всех пакетов.

Рассмотрим еще один пример:

$ sudo tshark -R "http.response and http.content_type contains image" \ -z "proto,colinfo,http.content_length,http.content_length" \ -z "proto,colinfo,http.content_type,http.content_type" \ -r /tmp/capture.cap Эта команда извлечет из файла /tmp/capture.cap информацию обо всех пакетах, в которых были изображения, и выведет на консоль содержимое полей content_type и content_length: 439 12.717117 66.249.89.127 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (GIF89a) http.content_type == "image/gif" http.content_length == 35 452 12.828186 66.114.48.56 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (GIF89a) http.content_type == "image/gif" http.content_length == 477 479 13.046184 66.114.48.56 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (GIF89a) http.content_type == "image/gif" http.content_length == 105 499 13.075361 203.190.124.6 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (GIF89a) http.content_type == "image/gif" http.content_length == 35 506 13.177414 66.114.48.56 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (GIF89a) http.content_type == "image/gif" http.content_length == 4039 514 13.190000 66.114.48.56 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (JPEG JFIF image) http.content_type == "image/jpeg" http.content_length == 11997 519 13.231228 66.114.48.56 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (JPEG JFIF image) http.content_type == "image/jpeg" http.content_length == 1033 523 13.273888 72.233.69.4 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (PNG) http.content_type == "image/png" http.content_length == 1974 561 728 19.096984 60.254.185.58 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (GIF89a) http.content_type == "image/gif" http.content_length == 592 805 19.471444 60.254.185.58 -> 192.168.1.108 HTTP HTTP/1.1 200 OK (GIF89a) http.content_type == "image/gif" http.content_length == 259

Автоматическое сохранение в несколько файлов

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

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

$ sudo tshark -b filesize:100 -a files:20 -w temp.pcap будет сохранять вывод в 20 файлах размером по 100 кБ каждый.

В приведенном выше примере опция -b означает, что будет задействован кольцевой буфер, а filesize устанавливает размер; опция -a указывает автоматическую остановку по достижении заданного предела, files — указывает количество файлов.

Автосохранение по истечении заданного времени

В приведенном ниже примере tshark будет сохранять захваченную информацию в несколько файлов. Новый файл будет создан автоматически при превышении размера в 10240 кБ или по истечении интервала 1 с: $ sudo tshark -b filesize:10240 -b duration:1 -w temp.pcap Capturing on eth0 34 # ls -lrt -rw------- 1 root root 1863 Apr 10 16:13 temp_00001_20140410161312.pcap -rw------- 1 root root 1357 Apr 10 16:13 temp_00002_20140410161313.pcap -rw------- 1 root root 1476 Apr 10 16:13 temp_00003_20140410161314.pcap -rw------- 1 root root 1216 Apr 10 16:13 temp_00004_20140410161315.pcap

Установка размера буфера

Эта опция может быть полезной в случаях, когда приходится иметь дело с отбрасыванием пакетов. По умолчанию размер буфера составляет 1МБ; при помощи опции -B можно установить любой другой размер (в мегабайтах), по достижении которого все данные будут сбрасываться на диск: $ sudo tshark -B 2

Отображение статистики для выбранного протокола

В tshark имеется также возможность захватывать только пакеты, передаваемые по указанному пользователем протоколу.

Вот так, например, выглядит статистика для протокола HTTP:

$ sudo tshark -q -r a.pcap -R http -z http,tree =================================================================== HTTP/Packet Counter value rate percent ------------------------------------------------------------------- Total HTTP Packets 7 0.000375 HTTP Request Packets 4 0.000214 57.14% GET 4 0.000214 100.00% HTTP Response Packets 3 0.000161 42.86% 2xx: Success 2 0.000107 66.67% 200 OK 2 0.000107 100.00% 3xx: Redirection 1 0.000054 33.33% 302 Found 1 0.000054 100.00% 5xx: Server Error 0 0.000000 0.00% Other HTTP Packets 0 0.000000 0.00%

Практические примеры

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

Мониторинг http-запросов

Чтобы вывести список http-запросов к серверу, используется следующая команда: $ sudo tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<>2)) != 0)' -R 'http.request.method == "GET" || http.request.method == "HEAD"' Вывод этой команды будет выглядеть так: 190.302141 192.168.0.199 -> 74.125.77.104 HTTP GET / HTTP/1.1 190.331454 192.168.0.199 -> 74.125.77.104 HTTP GET /intl/en_com/images/srpr/logo1w.png HTTP/1.1 190.353211 192.168.0.199 -> 74.125.77.104 HTTP GET /images/srpr/nav_logo13.png HTTP/1.1 190.400350 192.168.0.199 -> 74.125.77.100 HTTP GET /generate_204 HTTP/1.1 Следующая команда выведет на консоль список из 10 URL-адресов, с которых поступают http-запросы: $ tshark -r sample1.cap -R http.request -T fields -e http.host -e http.request.uri | sed -e ‘s/?.*$//’ | sed -e ‘s#^(.*)t(.*)$#http://12#’ | sort | uniq -c | sort -rn | head

Просмотр списка HTTP-заголовков

Чтобы просмотреть список http-заголовков запросов к серверу, используется команда: $ tshark -r sample1.cap -R http.request -T fields -e http.host -e http.request.uri | sed -e ‘s/?.*$//’ | sed -e ‘s#^(.*)t(.*)$#http://12#’ | sort | uniq -c | sort -rn | head Соответственно, список заголовков для http-ответов можно получить так: $ sudo tshark tcp port 80 or tcp port 443 -V -R «http.request» Чтобы в список были включены заголовки как запросов, так и ответов, используется следующая команда: $ sudo tshark "tcp port 80 or tcp port 443" -V -R "http.request || http.response"

Просмотр списка файлов определенного типа

С помощью tshark можно просматривать списки файлов определенного типа, передаваемых через http-протокол. Вот так, например, можно просмотреть список изображений в формате GIF: $ sudo tshark -R "http.response and http.content_type contains image" \ -z "proto,colinfo,http.content_length,http.content_length" \ -z "proto,colinfo,http.content_type,http.content_type" \ -r /tmp/capture.tmp| grep "image/gif"| wc -l

Мониторинг запросов к MySQL

Отследить в реальном времени запросы в базе данных MySQL можно с помощью следующей команды: $ sudo tshark -i eth0 -a duration:60 -d tcp.port==3306,mysql -T fields -e mysql.query ’port 3306′ C помощью tshark можно записывать в лог информацию обо всех запросах к MySQL. Запустим захват всего MySQL-трафика с помощью tcpdump: $ sudo tcpdump -i eth0 port 3306 -s 1500 -w tcpdump.out Из полученного файла c помощью tshark извлечем список запросов: $ sudo tshark -r tcpdump.out -d tcp.port==3306,mysql -T fields -e mysql.query > query_log.out Из этого списка удалим пустые строки и сохраним отредактированный вариант в новом файле: $ sudo cat query_log.out | grep -v "^$" | grep -v "^commit" | grep -v "^SET autocommit" | grep -v "^rollback" > query_log_no_blank.out

Заключение

Tshark — инструмент с очень широкими возможностями, о которых вряд ли возможно подробно рассказать в рамках одной статьи. На все вопросы мы с удовольствием ответим в комментариях. Будем рады, если вы поделитесь собственным опытом диагностики сетевых проблем с помощью tshark.

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

habr.com

Wireshark - приручение акулы / LinkMeUp

Автор статьи Александр Sinister. Специально для проекта linkmeup.

=============

Wireshark — это достаточно известный инструмент для захвата и анализа сетевого трафика, фактически стандарт как для образования, так и для траблшутинга. Wireshark работает с подавляющим большинством известных протоколов, имеет понятный и логичный графический интерфейс на основе GTK+ и мощнейшую систему фильтров. Кроссплатформенный, работает в таких ОС как Linux, Solaris, FreeBSD, NetBSD, OpenBSD, Mac OS X, и, естественно, Windows. Распространяется под лицензией GNU. Доступен бесплатно на сайте wireshark.org. Установка в системе Windows тривиальна — next, next, next. Самая свежая на момент написания статьи версия – 1.10.3, она и будет участвовать в обзоре.

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

Для начала захвата достаточно выбрать свой сетевой интерфейс и нажать Start.

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

А следующая за ними кнопка позволяет сделать быстрый переход к пакету, указав его номер. В случае если колонки перекрываются и наползают друг на друга, можно кликнуть по такой колонке правой кнопкой мыши и выбрать “Resize Column”. Произойдет автоматическая подгонка размеров под текущую ситуацию. И кроме того, есть кнопка “Resize all Columns”, которая приведет в порядок все колонки. Используя меню View – Time Display Format, можно, например, настроить, чтобы отсчет времени шел не с начала захвата, а с момента получения предыдущего пакета (Since Previous Captured Packet). Самое важное в каждой программе (Help – About Wireshark) покажет не только версию и список авторов, но и содержит закладку Folders, которая покажет пути размещения каталогов с конфигурациями. Изучая интерфейс, можно выбрать, например, пакет http, и увидеть, что HTTP инкапсулируется в TCP (транспортный уровень), TCP инкапсулируется в IP (сетевой уровень), а IP в свою очередь инкапсулируется в Ethernet (перед этим даже мелькает 802.1Q).

И на самом верху идет нечто вроде небольшого обзора собранной информации о кадре.

Про фильтры мы поговорим дальше, а на данном этапе, если нужно быстро отфильтровать лишние пакеты, достаточно сделать правый клик на пакете, выбрать меню Apply as Filter – Not selected и изменения сразу же вступят в силу. Если нужно еще что-то убрать, то в следующий раз выбирать “and not Selected”, и новое правило просто добавится к фильтру.

Довольно часто при работе с Wireshark возникает ошибка IP checksum offload – ошибка контрольной суммы заголовка IP пакета.

Современные сетевые карты насколько умные, что сами считают контрольную сумму, зачем это делать на уровне стека TCP/IP программно, если можно делать хардварно. А Wireshark натурально перехватывает пакеты, до того как они попадают в сеть. И до того как эта сумма была просчитана и была добавлена в заголовок пакета. Соответственно есть два пути решения этой проблемы — выключать функцию offload в настройках сетевой карты или в настройках сниффера указать, чтобы он не обращал внимание на это значение. Хардваные функции зачастую лучше софтварных, в основном из-за скорости обработки (в железе обычно выше) поэтому лучше изменить настройки самого сниффера. Для этого нужно зайти в настройки (Edit — Preferences), затем Protocols – IPv4 – и снять флаг с “Validate IPv4 checksum if possible”.

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

  • Локально на своем хосте;
  • Организовать зеркалирование трафика на коммутаторе;
  • Подключаться непосредственно в интересующие места;
  • или же отравление протокола ARP (еще более незаконно, чем пассивное прослушивание трафика)
Wireshark содержит два вида фильтров – захвата (Capture Filters) и отображения (Display Filters). Вначале рассмотрим Capture Filters. Как можно догадаться по названию, они служат для фильтрации еще на этапе захвата трафика. Но в таком случае, безусловно, можно безвозвратно потерять часть нужного трафика. Фильтр представляет собой выражение, состоящее из встроенных значений, которые при необходимости могут объединяться логическими функциями (and, or, not). Для того, чтобы его задействовать, нужно зайти в меню Сapture, затем Options, и в поле Capture Filter набрать, например, host 8.8.8.8 (или, например, net 192.168.0.0./24)

Так же, конечно, можно выбрать и заранее созданный фильтр (за это отвечает кнопка Capture Filter). В любом из вариантов фильтр появится возле интерфейса, можно жать Start.

Теперь перейдем к Display Filters. Они фильтруют исключительно уже захваченный трафик. Что можно фильтровать? — Практически все — протоколы, адреса, специфические поля в протоколах. Операции, которые можно использовать при построении фильтров:

КомандаЗначениеПример использования
==равенствоip.dst == 193.168.3.10
!=Не равноudp.dst != 53
<меньше чемip.ttl < 24
>больше чемframe.len > 10
<=меньше или равноframe.len <= 0x20
>=больше или равноtcp.analysis.bytes_in_flight >= 1000
matchesрегулярные выраженияframe matches "[Pp][Aa][Ss][Ss]"
containsсодержитdns.resp.name contains google

Как вы, наверное, заметили, в таблице в качестве примеров были разнообразные выражения, достаточно понятные и зачастую говорящие сами за себя. Например, ip.dst – это поле протокола IP. Чтобы увидеть это поле, можно просто посмотреть на пакет, и в нижней части окна можно увидеть его значение, которое потом можно применять в любом фильтре. Например, нас интересует, как создать фильтр, где будет проверяться значение TTL. Для этого раскрываем L3 часть и становимся на соответствующее поле:

И видим, что для построения фильтра, нужно использовать выражение ip.ttl. Если начать набирать фильтр, то после точки автоматически появится список возможных значений:

Чтобы применить фильтр, достаточно нажать enter или кнопку Apply. Само поле для ввода фильтра может менять цвет в зависимости от того, что было набрано. Зеленый цвет означает, что все в порядке. Красный — допущена ошибка, желтый — получен неожиданный результат, потому что существуют другие варианты написания фильтра (например можно написать ip.dst != 8.8.8.8 или же !ip.dst == 8.8.8.8, именно второй вариант более предпочтительный). Фильтры можно сохранять для дальнейшего использования, нажав кнопку Save, затем ввести произвольное название

и после нажатия на кнопку ОК фильтр появится как кнопка на панели.

А если кликнуть на расположенную неподалеку кнопку «Expression…», то откроется достаточно мощный конструктор выражений, по которому можно чуть ли не изучать сетевые протоколы. Количество поддерживаемых протоколов постоянно увеличивается.

Как уже упоминалось ранее, можно выделить любой пакет и в контекстном меню выбрать Apply as Filter и в подменю выбрать режим — selected или not selected и соответственно сразу же появится фильтр, который будет показывать только выбранное или наоборот уберет выбранное с экрана. Таким образом можно гибко выбирать, что видеть на экране, а что — нет. Это может быть определенный ip-адрес, ttl, порт, dns ответ и многое другое. Кроме того, есть два варианта для таких быстрых фильтров — Prepare as Filter и Apply as Filter. Как можно догадаться по названию — разница заключается в том, что в первом случае только появится в поле для ввода Display Filter, но не применится (удобно, если например, добавлять таким способом несколько фильтров, а затем сразу применить готовый результат), а во втором — сразу же и применится.

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

(dns) && (http) логическое и (dns) || (http) это логическое или

Таким образом можно строить большие и сложные фильтры вроде:

(tcp.flags.syn==1) && (ip.src == 172.16.10.2) && (ip.dst == 172.16.10.1) Здесь видим, что выбираются только TCP SYN сегменты, только с определенным адресом отправителя и получателя. При составлении больших фильтров нужно помнить, что фильтр по сути — логическое выражение, и если оно истинно, то пакет отобразится на экране, если ложно — нет. Достаточно частая ситуация, когда возникают жалобы на медленную работу сети, причин этого может быть множество. Попробуем разобраться, в чем может быть причина, и рассмотрим два способа. Первый состоит в добавлении колонки TCP delta. Открываем пакет, находим поле Time since previous frame in this TCP frame, правый клик и выбираем Apply as Column. Появится новая колонка. На ней можно кликнуть правой кнопкой мыши и выбрать режим сортировки, например, Sort Descending.

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

Если клиент делает запрос и получает ответ через 10 миллисекунд, и клиент говорит, что у него все медленно работает, то, возможно, проблема у самого клиента. Если же клиент делает запрос и получает ответ через 2-3 секунды, тут уже, возможно, проблема кроется в сети.

Если посмотреть в TCP пакет (или сегмент если быть точным), то можно увидеть там Stream index, который начинается обычно с нуля. Само поле будет называться tcp.stream.

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

Таким образом можно фильтровать нужные соединения.

Еще один способ – сделать правый клик на самом пакете, выбрать Conversation Filter и создать фильтр для l2 l3 l4 уровня соответственно.

В итоге мы опять увидим взаимодействие двух хостов.

И третий вариант — это одна из самых интересных фич — Follow TCP Stream. Для того чтобы его задействовать, нужно опять таки кликнуть правой кнопкой мыши на пакете и выбрать “Follow TCP Stream”. Появится окно, где будет наглядно продемонстрирован весь обмен между двумя узлами.

Если же зайти в меню Statistics – Conversations, то, выбирая закладки, можно увидеть статистику по таким “разговорам” и различные сессии, при этом можно отсортировать их по различным колонкам, например, по количеству переданных данных.

И прямо в этом окне можно правой кнопкой взывать контекстное меню и опять же применить как фильтр.

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

Нажатие на эту кнопку приведет к открытию окна Expert Infos. Того же результата можно добиться, пройдя в меню Analyze – Expert Info.

В этом окне будет содержаться информация по найденным пакетам, разбитая на группы Errors, Warnings, Notes и Chats. Цветовая раскраска для этих групп выглядит следующим образом: Ошибки — красный цвет Предупреждения — желтый Примечания — сине-зелёный (cyan) Чат — серый

Wireshark содержит в себе мощный анализатор и умеет автоматически обнаруживать большое количество проблем, возникающих в сети. Как вы уже могли заметить, буквально везде можно использовать фильтры и Expert Info не является исключением. Для того чтобы создать такой фильтр, нужно использовать конструкцию expert.severity. Например, expert.severity==error.

Можно ли с помощью Wireshark узнать, что было скачано? Да, можно. И сейчас это увидим. Вначале возьмем HTTP трафик. Сделаем правый клик по HTTP пакету — Protocol Preferences – и видим тут массу опций, которые непосредственно влияют на извлечение файлов из веб трафика. Для того чтобы увидеть, что можно извлечь из текущего дампа нужно перейти в меню File – Export Objects – HTTP. Появится окно, которое покажет все захваченные http объекты — текстовые файлы, картинки и т.д. Для того чтобы вытащить любой файл из этого списка, достаточно просто выделить его и нажать Save As.

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

Таким же способом, можно извлекать и потоковое видео/аудио.

Но на этом возможности Wireshark не заканчиваются! Он умеет вытаскивать файлы и с протокола FTP. Для этого можно использовать знакомый уже Follow TCP Stream. В итоге отобразится только обмен по протоколу FTP, в котором нужно будет найти строку RETR, что собственно и будет означать передачу файла.

Затем опускаемся дальше, находим пакеты уже непосредственно с файлом (FTP-DATA) и опять выбираем Follow TCP Stream, видим содержимое файла, жмем Save As и сохраняем.

Wireshark имеет несколько встроенных функций для работы с этой технологией. Он поддерживает массу голосовых протоколов — SIP, SDP, RTSP, H.323, RTCP, SRTP и другие. И, конечно же, умеет перехватывать и сохранять голосовой трафик для дальнейшего прослушивания. Этот функционал как нельзя лучше подойдет для траблшутинга в сетях Voice over IP. Меню Statistics — Flow Graph покажет наглядную картину, как происходил весь обмен пакетами.

А вообще целое меню Telephony отведено для работы с голосовым трафиком. Например, Telephony – RTP – Show All Streams покажет подробно, что происходило с RTP, в частности jitter (параметр, который, вероятно, самый важный в голосе), что иногда сразу скажет о наличии проблем.

Нажав на кнопку “Analyze”, можно открыть окно RTP stream Analysis – и, выбрав там поток, можно его даже проиграть, используя кнопку player. Сначала отроется окно проигрывателя, в котором вначале нужно установить подходящее значение jitter и использовать кнопку decode.

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

Так же существует еще один способ прослушивания голосовых звонков — можно зайти в меню Telephony – VoIP Calls.

Откроется окно со списком совершенных звонков, где опять же можно нажать кнопку player, отменить нужные разговоры флажками и нажать play. Для того чтобы добиться приемлемого качества звучания, потребуется проиграться со значением поля jitter buffer, меняя его значение.

Некоторое время назад появился сайт CloudShark.org.

Это тот самый сниффер Wireshark, но реализованный в виде онлайн-сервиса. Очевидно, что с его помощью не удастся захватывать сетевой трафик, но выполнять анализ дампа трафика – вполне. Загрузив туда через форму PCAP-файл на анализ, можно будет получить четкую последовательность пакетов, в которой всё данные будут разбиты на понятные поля в зависимости от протокола. В общем, тот же Wireshark, но немного облегченный и доступный из любого браузера.

Напоследок рассмотрим как выглядит сканирование портов (sinister не был бы самим собой, если бы не коснулся темы ИБ). Смотрим на дамп и видим, что вначале происходит ARP запрос и затем непосредственно начинается сканирование. Адрес нашего маршрутизатора 192.168.10.11, сканирование идет с адреса 192.168.10.101

Это, так называемое, SYN сканирование, когда идут SYN-пакеты на указанный диапазон портов. Так как большинство портов закрыто, маршрутизатор отвечает пакетами RST, ACK. Пролистав чуть ниже видим, что открыт telnet (tcp 23).

На это указывает то, что маршрутизатор ответил пакетом SYN, ACK. К слову, для фильтрации портов в сниффере можно использовать конструкции вида: tcp.srcport, tcp.dstport и tcp.port. Для протокола UDP всё аналогично — udp.srcport, udp.dstport, udp.port.

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

В процессе написания использовались материалы сайта wiki.wireshark.org/ Дампы с трафиком брались из разных источников, больше всего с сайта packetlife.net

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

P. S. Для тех, кто интересуется темой сетевой безопасности, хорошие новости. Скоро начнется серия обучающих вебинаров, проводить их будет sinister. Вначале будут базовые вещи, затем сложнее и сложнее по нарастающей. Рассматриваться и демонстрироваться будут все актуальные на сегодняшний день угрозы, начиная с тривиального отравления ARP-кеша и заканчивая хардкорными атаками на протоколы маршрутизации. В первом, базовом, курсе рассмотрим построение своего тестового полигона и множество типов сканирования и фингерпринта. Расписания занятий будут доступны по адресу http://pentestit.seemedia.pro/event/bdyn

linkmeup.ru

filter - Как написать собственный фильтр захвата?

Здесь с открытым исходным кодом [если вы хотите перейти по маршруту dshow] https://github.com/rdp/screen-capture-recorder-to-video-windows-free Еще одним вариантом будет некоторый тип настраиваемого фильтра ввода для libav [FFmpeg].

Вы зарегистрируете его в [в консоли администратора] regsvr32 dll_name.dll

ответ дан rogerdpack 29 янв. '15 в 20:29 источник поделиться

ffmpeg использует устройства захвата видео DirectShow, доступные в системе opreating, см. более подробную информацию об этой теме: Поддержка DirectShow Capture.

Таким образом, вам нужно сделать виртуальное исходное устройство для сопоставления с помощью ffmpeg. Ваши ресурсы:

ответ дан Roman R. 10 апр. '12 в 13:45 источник поделиться

qaru.site