Анализаторы сетевых пакетов. Сетевой анализатор трафика сниффер. Что такое сниффер: описание Анализ пакетов с помощью wireshark

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

Сниффер: что такое sniffer с точки зрения английского языка и компьютерной техники?

На самом деле определить сущность такого программного или программно-аппаратного комплекса вовсе несложно, если просто перевести термин.

Это название происходит от английского слова sniff (нюхать). Отсюда и значение русскоязычного термина «сниффер». Что такое sniffer в нашем понимании? «Нюхач», способный отслеживать использование сетевого трафика, а, проще говоря, шпион, который может вмешиваться в работу локальных или интернет-ориентированных сетей, извлекая нужную ему информацию на основе доступа через протоколы передачи данных TCP/IP.

Анализатор трафика: как это работает?

Оговоримся сразу: сниффер, будь он программным или условно-программным компонентом, способен анализировать и перехватывать трафик (передаваемые и принимаемые данные) исключительно через сетевые карты (Ethernet). Что получается?

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

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

Благие намерения и злоумышленные цели?

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

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

Виды снифферов

Но и по видам их можно разделить на несколько основных:

  • аппаратные;
  • программные;
  • аппаратно-программные;
  • онлайн-апплеты.

Поведенческое определение присутствия сниффера в сети

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

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

Онлайн-ресурсы

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

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

Как защититься от перехвата данных?

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

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

Отсюда законный вопрос: а стоит и устанавливать такое ПО? Быть может, его взлом со стороны хакеров нанесет еще больший вред, или оно само заблокирует то, что должно работать?

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

Вместо послесловия

Вот и все, что касается понятия «сниффер». Что такое sniffer, думается, уже многие сообразили. Напоследок вопрос остается в другом: насколько правильно такие вещи будет использовать рядовой пользователь? А то ведь среди юных юзеров иногда можно заметить склонность к компьютерному хулиганству. Они-то думают, что взломать чужой «комп» - это что-то вроде интересного соревнования или самоутверждения. К сожалению, никто из них даже не задумывается о последствиях, а ведь определить злоумышленника, использующего тот же онлайн-сниффер, очень просто по его внешнему IP, например, на сайте WhoIs. В качестве местоположения, правда, будет указана локация провайдера, тем не менее, страна и город определятся точно. Ну а потом дело за малым: либо звонок провайдеру с целью блокировки терминала, с которого производился несанкционированный доступ, либо подсудное дело. Выводы делайте сами.

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

SmartSniff позволяет перехватить сетевой трафик и отобразить его содержимое в ASCII. Программа захватывает пакеты проходящие через сетевой адаптер и выводит на экран содержание пакетов в текстовом виде (протоколы http, pop3, smtp, ftp) и в виде шестнадцатеричного дампа. Для захвата TCP/IP пакетов SmartSniff использует методики: необработанные сокеты - RAW Sockets, WinCap Capture Driver и Microsoft Network Monitor Driver. Программа поддерживает русский язык и проста в использовании.

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


SmartSniff отображает следующую информацию: название протокола, локальный и удаленный адрес, локальный и удаленный порт, локальный узел, название службы, объем данных, общий размер, время захвата и время последнего пакета, длительность, локальный и удаленный МАС адрес, страны и содержание пакета данных. Программа обладает гибкими настройками, в ней реализована функция фильтра захвата, распаковка ответов http, преобразования ip адреса, утилита сворачивается в системный трей. SmartSniff формирует отчет о потоках пакетовв виде HTML страницы. В программе возможно выполнить экспорт потоков TCP/IP.

Общая схема

Последовательность шагов, которая должна выполнить программа, использующая библиотеку pcap (от PacketCAPture) для выполнения своей задачи, такова:

  • Определить сетевой интерфейс, который будет прослушиваться. (В Linux это может быть eth0, в BSD xl1).
  • Инициализировать pcap . При этом библиотеке сообщается, на каком интерфейсе мы будем слушать данные. Возможно прослушивание нескольких интерфейсов одновременно (в разных сессиях).
  • В случае необходимости создать фильтр (например, нас интересуют только TCP пакеты, приходящие на порт 23), "скомпилировать" этот фильтр и применить к той или иной сессии.
  • Перейти в цикл приема пакетов. После этого всякий раз, когда приходит очередной пакет и он проходит через указанный фильтр, вызывается функция, которую нужно заранее определить. Эта функция может выполнять любые действия, которые мы захотим. Она может разбирать пакет и выдавать его пользователю, может сохранять его на диск или вообще ничего не делать.
  • По окончании работы нужно закрыть все открытые сессии.

Рассмотрим перечисленные шаги подробно.

Определение интерфейса

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

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

#include #include Int main(int argc, char *argv) { char *dev = argv; printf("Device: %s\n", dev); return(0); }

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

Второй способ - узнать имя интерфейса у самой библиотеки:

#include #include Int main() { char *dev, errbuf; dev = pcap_lookupdev(errbuf); printf("Device: %s\n", dev); return(0); }

В этом случае pcap передает нам имя интерфейса, которым он владеет. В строку errbuf будет передано описание ошибки, если таковая возникнет при исполнении вызова pcap_lookupdev() .

Открытие интерфейса для перехвата пакетов

Для создания сессии перехвата трафика необходимо вызвать функцию pcap_open_live() . Прототип этой функции (из страницы руководства по pcap) выглядит следующим образом:

Pcap_t *pcap_open_live (char *device, int snaplen, int promisc, int to_ms, char *ebuf)

Первый аргумент - имя устройства, которое мы определили на предыдущем шаге. snaplen - целое число, определяющее максимальное количество байт сетевого кадра, которое будет захватываться библиотекой. Если promisc установлен в true, интерфейс переходит в так называемый promiscuous mode (перехватываются пакеты, адресованные другим станциям сети). to_ms - тайм-аут в миллисекундах (в случае, если значение установлено в ноль, чтение будет происходить до первой ошибки, в минус единицу - бесконечно). Наконец, errbuf - строка, в которую мы получим сообщение об ошибке. Функция возвращает хэндл (дескриптор) сессии.

Для демонстрации рассмотрим фрагмент кода:

#include Pcap_t *handle; handle = pcap_open_live(somedev, BUFSIZ, 1, 0, errbuf);

Здесь открывается интерфейс, имя которого указано в строке somedev , указывается сколько байт пакета захватывать (значение BUFSIZ определено в pcap.h). Сетевой интерфейс переключается в promiscuous режим. Данные будут читаться до тех пор, пока не произойдет ошибка. В случае ошибки можно вывести ее текстовое описание на экран, используя указатель errbuf.

Замечание по поводу перехвата трафика в promiscuous и non-promiscuous режимах: эти два метода очень отличаются. В случае перехвата трафика в non-promiscuous режиме узел получает только тот трафик, который направлен или относится к нему. Только трафик до, от и маршрутизируемый через хост будет перехвачен нашей программой. В promiscuous режиме сетевой интерфейс принимает все пакеты, идущие через кабель. В некоммутируемом окружении это может быть весь сетевой трафик. Его явное преимущество в том, что он предоставляет большее количество пакетов для перехвата, что может быть (или может не быть) полезным, в зависимости от того, для чего вы перехватываете сетевой поток.

Однако, перехват трафика в promiscuous режиме можно обнаружить; другой узел может с высокой точностью определить, используем ли мы promiscuous режим. Кроме того, он работает только в некоммутируемом окружении (таком как концентраторы или коммутаторы, которые затоплены arp пакетами). В третьих, в случае, если сеть сильно загружена, наша программа будет использовать большое количество системных ресурсов.

Фильтрация трафика

Часто перехватчик пакетов нужен для перехвата не всех, а только определенных пакетов. Например, бывают случаи, когда мы хотим перехватывать трафик на 23-тий порт (telnet) в поисках паролей. Или, возможно, мы хотим перехватить файл, которые пересылается по 21-му порту (FTP). Возможно, мы хотим перехватывать только DNS трафик (53-ий порт UDP). В любом случае, очень редко необходимо перехватывать все данные. Для фильтрации трафика предназначены функции pcap_compile() и pcap_setfilter() .

После того, как мы вызвали pcap_open_live() и получили функционирующую сессию перехвата трафика, мы можем применить наш фильтр. Естественно, можно реализовать фильтр вручную, разбирая ETH/IP/TCP заголовки после получения пакета, но использование внутреннего фильтра pcap более эффективно, и кроме того, это проще.

Перед тем тем, как применить фильтр, нужно его "скомпилировать". Выражение для фильтра хранится в обыкновенной строке (массиве символов). Синтаксис таких выражений подробно описан в странице руководства по tcpdump (man tcpdump).

Для компиляции фильтра используется функция pcap_compile() . Ее прототип выглядит следующим образом:

Int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)

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

После того, как выражение скомпилировано, его нужно применить, что осуществляется с помощью функции pcap_setfilter() . Ее прототип таков:

Int pcap_setfilter(pcap_t *p, struct bpf_program *fp)

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

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

#include Pcap_t *handle; // дескриптор сессии char dev = "eth0"; // интерфейс, на котором мы будем слушать char errbuf; // Строка с ошибкой struct bpf_program filter; // Скомпилированное выражение для фильтра сhar filter_app = "port 23"; // Выражение для фильтра bpf_u_int32 mask; // Сетевая маска нашего интерфейса bpf_u_int32 net; // IP адрес нашего интерфейса pcap_lookupnet(dev, &net, &mask, errbuf); handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf); pcap_compile(handle, &filter, filter_app, 0, net); pcap_setfilter(handle, &filter);

Эта программа подготавливает перехватчик для пакетов, идущих на или с 23-го порта, в promiscuous режиме, на интерфейсе eth0. Пример содержит функцию pcap_lookupnet() , которая возвращает сетевой адрес и маску сети для устройства, имя которого передано ей как параметр. Ее использование необходимо, так как для того, чтобы наложить фильтр, мы должны знать адрес и маску сети.

Перехват пакетов

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

U_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

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

Демонстрация использования pcap_next() для перехвата одного пакета:

#include #include int main() { pcap_t *handle; char *dev; char errbuf; // строка с описанием ошибки struct bpf_program filter; // скомпилированный фильтр char filter_app = "port 23"; // фильтр bpf_u_int32 mask; // сетевая маска bpf_u_int32 net; // наш ip адрес struct pcap_pkthdr header; // заголовок пакета, который заполнит pcap const u_char *packet; // сам пакет // определим интерфейс dev = pcap_lookupdev(errbuf); // получим сетевой адрес и маску интерфейса pcap_lookupnet(dev, &net, &mask, errbuf); // откроем сессию перехвата в promiscuous режиме handle = pcap_open_live(dev, BUFSIZ, 1, 0, errbuf); // скомпилируем и применим пакетный фильтр pcap_compile(handle, &filter, filter_app, 0, net); pcap_setfilter(handle, &filter); // перехватим пакет packet = pcap_next(handle, &header); // выведем его длину в консоль printf("Jacked a packet with length of [%d]\n", header.len); // закроем сессию pcap_close(handle); return(0); }

Эта программа перехватывает пакеты на устройстве, которое возвращает pcap_lookupdev() , переводя его в pormiscuous режим. Она обнаруживает пакет, который идет через 23-ий порт (telnet) и выводит его размер в байтах. Вызов pcap_close() закрывает открытую сессию перехвата.

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

Callback-функции - часто использующийся прием программирования. Принцип довольно прост. Предположим, у вас есть программа, которая ожидает какого-либо события. С целью, например, обработки нажатия клавиши. Каждый раз, когда нажимается клавиша, я хочу вызывать функцию, которая обработает это событие. Функция, которую я использую - callback-функция. Каждый раз, когда пользователь нажимает клавишу, моя программа вызовет callback-функцию. Callback-функции используются в pcap , но вместо того, чтобы вызывать их, когда пользователь нажмет на клавишу, pcap вызывает их, когда получает очередной пакет. pcap_loop() и pcap_dispatch() - функции, которые практически одинаково используют механизм callback-функций. Обе вызывают callback-функцию, каждый раз, когда pcap перехватывает пакет, который проходит через фильтр (если, конечно, фильтр скомпилирован и применен к сессии, в противном случае callback-функции передаются все перехваченные пакеты)

Прототип функции pcap_loop():

Int pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user);

Первый аргумент - хэндл нашей сессии. Следующее целое число говорит pcap_loop() сколько всего пакетов нужно перехватить (отрицательное значение обозначает, что перехват пакетов должен происходить, пока не произойдет ошибка). Третий аргумент - имя callback-функции (только имя, без скобок). Последний аргумент используется в некоторых приложениях, но обычно он просто установлен в NULL. pcap_dispatch() практически идентична, единственная разница в том, как функции обрабатывают таймаут, величина которого задается при вызове pcap_open_live() . pcap_loop() просто игнорирует таймауты, в отличие от pcap_dispatch() . Детали - в man pcap .

Перед тем, как привести пример использования pcap_loop() , мы должны рассмотреть формат нашей callback-функции. Мы не можем произвольно определить прототип callback-функции, так как pcap_loop() не будет знать, что с ней делать. Прототип нашей callback-функции должен быть таким:

Void got_packet (u_char *args, const struct pcap_pkthdr *header, const u_char *packet);

Рассмотрим его подробнее. Первое - функция возвращает пустое значение (void). Это логично, так как pcap_loop() не может знать, что делать с возвращаемым значением. Первый аргумент совпадает с последним аргументом pcap_loop(). Какое бы значение не использовалось как последний аргумент pcap_loop() , оно пробрасывается в качестве первого аргумента callback-функции каждый раз когда она вызывается из pcap_loop() . Второй аргумент - заголовок pcap , который содержит информацию о том, когда был перехвачен пакет, его размер и т.д. Структура pcap_pkthdr определена в pcap.h следующим образом:

Struct pcap_pkthdr { struct timeval ts; // временная метка bpf_u_int32 caplen; // длина захваченной части пакета bpf_u_int32 len; // полная длина пакета };

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

Как использовать переменную packet ? Пакет содержит множество атрибутов, так что, как вы можете представить, он на самом деле не строка, а некоторый набор структур (например, пакет TCP/IP будет содержать ethernet-, ip-, tcp-заголовок и сами данные). Параметр packet , имеющий тип u_char , на самом деле сериализованная версия этих структур. Для того, чтобы получить полезные данные из этих структур, мы должны провести некоторые преобразования.

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

Struct sniff_ethernet { u_char ether_dhost; u_char ether_shost; u_short ether_type; /* IP? ARP? RARP? etc */ }; // IP заголовок struct sniff_ip { #if BYTE_ORDER == LITTLE_ENDIAN u_int ip_hl:4, ip_v:4; #endif #if BYTE_ORDER == BIG_ENDIAN u_int ip_v:4, /* version */ ip_hl:4; /* header length */ #endif /* not _IP_VHL */ u_char ip_tos; u_short ip_len; u_short ip_id; u_short ip_off; #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; struct sniff_tcp { u_short th_sport; u_short th_dport; tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ #if BYTE_ORDER == LITTLE_ENDIAN u_int th_x2:4, /* (unused) */ th_off:4; /* data offset */ #endif #if BYTE_ORDER == BIG_ENDIAN u_int th_off:4, /* data offset */ th_x2:4; /* (unused) */ #endif u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS \ (TH_FIN|TH_SYN|TH_RST|\ TH_ACK|TH_URG|TH_ECE|TH_CWR) u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ };

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

pcap , естественно, использует точно такие же структуры, когда перехватывает пакеты. Затем он просто создает u_char строку (буфер) и копируют данные из структур в нее. Как разобрать строку обратно на структуры? Это легко делается с помощью указателей и преобразований типов.

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

Const struct sniff_ethernet *ethernet; const struct sniff_ip *ip; const struct sniff_tcp *tcp; const char *payload; int size_ethernet = sizeof(struct sniff_ethernet); int size_ip = sizeof(struct sniff_ip); int size_tcp = sizeof(struct sniff_tcp);

Теперь делаем преобазование типов:

Ethernet = (struct sniff_ethernet*)(packet); ip = (struct sniff_ip*)(packet + size_ethernet); tcp = (struct sniff_tcp*)(packet + size_ethernet + size_ip); payload = (u_char *)(packet + size_ethernet + size_ip + size_tcp);

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

If (tcp->th_flags & TH_URG) { ... }; ... printf("TTL = %d\n", ip->ip_ttl);

Завершение работы

По завершении работы нужно закрыть сессию. Это делается с помощью функции pcap_close() .

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

Принципы работы пакетных снифферов

Дальнейшем в рамках данной статьи мы будем рассматривать только программные снифферы, предназначенные для сетей Ethernet. Сниффер — это программа, которая работает на уровне сетевого адаптера NIC (Network Interface Card) (канальный уровень) и скрытым образом перехватывает весь трафик. Поскольку снифферы работают на канальном уровне модели OSI, они не должны играть по правилам протоколов более высокого уровня. Снифферы обходят механизмы фильтрации (адреса, порты и т.д.), которые драйверы Ethernet и стек TCP/IP используют для интерпретации данных. Пакетные снифферы захватывают из провода все, что по нему приходит. Снифферы могут сохранять кадры в двоичном формате и позже расшифровывать их, чтобы раскрыть информацию более высокого уровня, спрятанную внутри (рис. 1).

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

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

Ограничения использования снифферов

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

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

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

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

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

Другая причина, по которой снифферы перестали быть настолько опасными, как раньше, заключается в том, что в настоящее время наиболее важные данные передаются в зашифрованном виде. Открытые, незашифрованные службы быстро исчезают из Интернета. К примеру, при посещении web-сайтов все чаще используется протокол SSL (Secure Sockets Layer); вместо открытого FTP используется SFTP (Secure FTP), а для других служб, которые не применяют шифрование по умолчанию, все чаще используются виртуальные частные сети (VPN).

Итак, те, кто беспокоится о возможности злонамеренного применения пакетных снифферов, должны иметь в виду следующее. Во-первых, чтобы представлять серьезную угрозу для вашей сети, снифферы должны находиться внутри самой сети. Во-вторых, сегодняшние стандарты шифрования чрезвычайно затрудняют процесс перехвата конфиденциальной информации. Поэтому в настоящее время пакетные снифферы постепенно утрачивают свою актуальность в качестве инструментов хакеров, но в то же время остаются действенным и мощным средством для диагностирования сетей. Более того, снифферы могут с успехом использоваться не только для диагностики и локализации сетевых проблем, но и для аудита сетевой безопасности. В частности, применение пакетных анализаторов позволяет обнаружить несанкционированный трафик, обнаружить и идентифицировать несанкционированное программное обеспечение, идентифицировать неиспользуемые протоколы для удаления их из сети, осуществлять генерацию трафика для испытания на вторжение (penetration test) с целью проверки системы защиты, работать с системами обнаружения вторжений (Intrusion Detection System, IDS).

Обзор программных пакетных снифферов

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

Обычно окно любого сниффера с графическим интерфейсом состоит их трех областей. В первой из них отображаются итоговые данные перехваченных пакетов. Обычно в этой области отображается минимум полей, а именно: время перехвата пакета; IP-адреса отправителя и получателя пакета; MAC-адреса отправителя и получателя пакета, исходные и целевые адреса портов; тип протокола (сетевой, транспортный или прикладного уровня); некоторая суммарная информация о перехваченных данных. Во второй области выводится статистическая информация об отдельном выбранном пакете, и, наконец, в третьей области пакет представлен в шестнадцатеричном виде или в символьной форме — ASCII.

Практически все пакетные снифферы позволяют производить анализ декодированных пакетов (именно поэтому пакетные снифферы также называют пакетными анализаторами, или протокольными анализаторами). Сниффер распределяет перехваченные пакеты по уровням и протоколам. Некоторые анализаторы пакетов способны распознавать протокол и отображать перехваченную информацию. Этот тип информации обычно отображается во второй области окна сниффера. К примеру, любой сниффер способен распознавать протокол TCP, а продвинутые снифферы умеют определять, каким приложением порожден данный трафик. Большинство анализаторов протоколов распознают свыше 500 различных протоколов и умеют описывать и декодировать их по именам. Чем больше информации в состоянии декодировать и представить на экране сниффер, тем меньше придется декодировать вручную.

Одна из проблем, с которой могут сталкиваться анализаторы пакетов, — невозможность корректной идентификации протокола, использующего порт, отличный от порта по умолчанию. К примеру, с целью повышения безопасности некоторые известные приложения могут настраиваться на применение портов, отличных от портов по умолчанию. Так, вместо традиционного порта 80, зарезервированного для web-сервера, данный сервер можно принудительно перенастроить на порт 8088 или на любой другой. Некоторые анализаторы пакетов в подобной ситуации не способны корректно определить протокол и отображают лишь информацию о протоколе нижнего уровня (TCP или UDP).

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

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

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

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

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

  • Захват пакетов в реальном времени из проводного или любого другого типа сетевых интерфейсов, а также чтение из файла;
  • Поддерживаются такие интерфейсы захвата: Ethernet, IEEE 802.11, PPP и локальные виртуальные интерфейсы;
  • Пакеты можно отсеивать по множеству параметров с помощью фильтров;
  • Все известные протоколы подсвечиваются в списке разными цветами, например TCP, HTTP, FTP, DNS, ICMP и так далее;
  • Поддержка захвата трафика VoIP-звонков;
  • Поддерживается расшифровка HTTPS-трафика при наличии сертификата;
  • Расшифровка WEP-, WPA-трафика беспроводных сетей при наличии ключа и handshake;
  • Отображение статистики нагрузки на сеть;
  • Просмотр содержимого пакетов для всех сетевых уровней;
  • Отображение времени отправки и получения пакетов.

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

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

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

sudo apt install wireshark

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

А для Gnome / Unity:

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

Анализ сетевого трафика

Для начала анализа выберите сетевой интерфейс, например eth0, и нажмите кнопку Start.

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

  • Верхняя часть - это меню и панели с различными кнопками;
  • Список пакетов - дальше отображается поток сетевых пакетов, которые вы будете анализировать;
  • Содержимое пакета - чуть ниже расположено содержимое выбранного пакета, оно разбито по категориям в зависимости от транспортного уровня;
  • Реальное представление - в самом низу отображается содержимое пакета в реальном виде, а также в виде HEX.

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

Здесь мы видим пакет запроса к DNS, чтобы получить IP-адрес сайта, в самом запросе отправляется домен, а в пакете ответа мы получаем наш вопрос, а также ответ.

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

Фильтры Wireshark

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

  • ip.dst - целевой IP-адрес;
  • ip.src - IP-адрес отправителя;
  • ip.addr - IP отправителя или получателя;
  • ip.proto - протокол;
  • tcp.dstport - порт назначения;
  • tcp.srcport - порт отправителя;
  • ip.ttl - фильтр по ttl, определяет сетевое расстояние;
  • http.request_uri - запрашиваемый адрес сайта.

Для указания отношения между полем и значением в фильтре можно использовать такие операторы:

  • == - равно;
  • != - не равно;
  • < - меньше;
  • > - больше;
  • <= - меньше или равно;
  • >= - больше или равно;
  • matches - регулярное выражение;
  • contains - содержит.

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

  • && - оба выражения должны быть верными для пакета;
  • || - может быть верным одно из выражений.

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

Сначала отфильтруем все пакеты, отправленные на 194.67.215.. Наберите строку в поле фильтра и нажмите Apply . Для удобства фильтры Wireshark можно сохранять с помощью кнопки Save :

ip.dst == 194.67.215.125

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

ip.dst == 194.67.215.125 || ip.src == 194.67.215.125

Также мы можем отобрать переданные большие файлы:

http.content_length > 5000

Отфильтровав Content-Type, мы можем выбрать все картинки, которые были загружены; выполним анализ трафика Wireshark, пакеты, которого содержат слово image:

http.content_type contains image

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

Например, я хочу вывести в виде колонки ttl (время жизни) пакета. Для этого откройте информацию о пакете, найдите это поле в разделе IP. Затем вызовите контекстное меню и выберите опцию Apply As Column :

Таким же образом можно создать фильтр на основе любого нужного поля. Выберите его и вызовите контекстное меню, затем нажмите Apply as filter или Prepare as filter , затем выбираем Selected, чтобы вывести только выбранные значения, или Not selected , чтобы их убрать:

Указанное поле и его значение будет применено или во втором случае подставлено в поле фильтра:

Таким способом вы можете добавить в фильтр поле любого пакета или колонку. Там тоже есть эта опция в контекстном меню. Для фильтрации протоколов вы можете использовать и более простые условия. Например, выполним анализ трафика Wireshark для протоколов HTTP и DNS:

Еще одна интересная возможность программы - использование Wireshark для отслеживания определённого сеанса между компьютером пользователя и сервером. Для этого откройте контекстное меню для пакета и выберите Follow TCP stream .

Затем откроется окно, в котором вы найдете все данные, переданные между сервером и клиентом:

Диагностика проблем Wireshark

Возможно, вам интересно, как пользоваться Wireshark 2.0 для обнаружения проблем в сети. Для этого в левом нижнем углу окна есть круглая кнопка, при нажатии на неё открывается окно Expet Tools . В нём Wireshark собирает все сообщения об ошибках и неполадках в сети:

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

Анализ трафика Wireshark

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

Для этого сначала нужно остановить захват трафика с помощью красного квадрата на панели. Затем откройте меню File -> Export Objects -> HTTP :