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

Оригинал: Capturing Packets in Your C Program, with libpcap
Автор: Pankaj Tanwar
Дата публикации: 1 Февраля 2011 г.
Перевод: А.Панин
Дата перевода: 11 октября 2012 г.

В данной статье проводится обзор основных функций библиотеки libpcap и демонстрируется пример создания программы для захвата пакетов.

Перемещение всех данных в сетях осуществляется в форме пакетов, являющихся единицей данных для сетей. Для понимания того, какие данные находятся в пакете, необходимо понимать иерархию сетевых протоколов в рамках сетевой модели. Если вы не знакомы с сетевой моделью ISO OSI (Open Systems Interconnection - базовая эталонная модель взаимодействия открытых систем), настоятельно рекомендую изучить соответствующую документацию. Неплохим источником информации является статья в Wikipedia .

Термин "пакет" впервые вводится на сетевом уровне. Основные протоколы этого уровня: IP (Internet Protocol - межсетевой протокол), ICMP (Internet Control Message Protocol - протокол межсетевых управляющих сообщений), IGMP (Internet Group Management Protocol - протокол управления группами Интернета) и IPsec (набор протоколов для обеспечения защиты данных, передаваемых по протоколу IP). Протоколы транспортного уровня включают в себя TCP (Transmission Control Protocol - протокол управления передачей), ориентированный на создание постоянного соединения; UDP (User Datagram Protocol - протокол пользовательских дейтаграмм), не требующий постоянного соединения; SCTP (Stream Control Transmission Protocol - протокол передачи с управлением потоком), сочетающий в себе свойства двух приведенных выше протоколов. Прикладной уровень содержит множество часто используемых протоколов, таких как: HTTP, FTP, IMAP, SMTP и множество других.

Под захватом пакетов понимается сбор данных, передаваемых по сети. В любой момент, когда сетевая карта принимает Ethernet-кадр, она проверяет целевой MAC-адрес пакета на соответствие своему. В случае совпадения адресов генерируется запрос прерывания. Это прерывание впоследствии обрабатывается драйвером сетевой карты; он копирует данные из буфера сетевой карты в буфер в адресном пространстве ядра, затем проверяет поле в заголовке пакета, отвечающее за тип и передает пакет обработчику необходимого протокола в зависимости от содержания поля. Данные преодолевают стек обработчиков сетевых уровней и достигают прикладного уровня, на котором обрабатываются с помощью пользовательского приложения.

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

Основы работы с libpcap

Библиотека libpcap является платформонезависимой библиотекой с открытым исходным кодом (версия для Windows носит название winpcap). Известные снифферы tcpdump и Wireshark используют эту библиотеку для работы.

Для разработки нашей программы, нам необходим сетевой интерфейс, на котором будет производиться захват пакетов. Мы можем назначить это устройство самостоятельно или воспользоваться функцией, предоставляемой libpcap: char *pcap_lookupdev(char *errbuf) .

Эта функция возвращает указатель на строку, содержащую название первого сетевого интерфейса, пригодного для захвата пакетов; в случае ошибки возвращается NULL (это справедливо и для других функций libpcap). Аргумент errbuf предназначен для пользовательского буфера, в который будет помещено сообщение об ошибке в случае возникновения - это очень удобно при отладке программ. Размер этого буфера должен быть не меньше PCAP_ERRBUF_SIZE (на данный момент 256) байт.

Работа с устройством

Далее мы открываем выбранное сетевое устройство, используя функцию pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf) . Она возвращает идентификатор устройства, представленный в виде переменной типа pcap_t , которая может использоваться в других функциях libpcap. Первый аргумент - сетевой интерфейс, с которым мы хотим работать, второй - максимальный размер буфера для захвата данных в байтах.

Установка минимального значения второго параметра полезна в том случае, когда необходимо производить захват только заголовков пакетов. Размер Ethernet-кадра равен 1518 байтам. Значения 65535 будет достаточно для захвата любого пакета из любой сети. Аргумент promisc устанавливает, будет ли устройство работать в promiscous-режиме или нет. (В promiscous-режиме сетевая карта будет генерировать прерывания для всех данных, которые она получает, а не только для тех, которые подходят по значению MAC-адреса. Подробнее читайте в Wikipedia).

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

Захват данных

Теперь нам необходимо начать захват пакетов. Давайте используем функцию u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h) . Здесь *p - это указатель, возвращаемый функцией pcap_open_live() ; следующий аргумент - это указатель на переменную типа struct pcap_pkthdr , в которой возвращается первый принятый пакет.

Функция int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) используется для сборки пакетов и их обработки. Она возвращает количество пакетов, заданное аргументом cnt . Функция обратного вызова используется для обработки принятых пакетов (нам необходимо будет задать эту функцию). Для передачи дополнительной информации в эту функцию мы будем использовать параметр *user , являющийся указателем на переменную типа u_char (нам необходимо будет самостоятельно производить приведение типов в зависимости от необходимого типа данных, передаваемых функции).

Прототип функции обратного вызова вызова выглядит следующим образом: void callback_function(u_char *arg, const struct pcap_pkthdr* pkthdr, const u_char* packet) . Первый аргумент является аргументом *user , переданным функции pcap_loop() ; следующий аргумент является указателем на структуру, содержащую информацию о принятом пакете. Поля структуры struct pcap_pkthdr представлены ниже (взято из файла pcap.h ): struct pcap_pkthdr { struct timeval ts; /* отметка времени (time stamp) */ bpf_u_int32 caplen; /* размер принятых данных (length of portion present) */ bpf_u_int32 len; /* размер данного пакета (length of this packet (off wire)) */ }

Альтернативой функции pcap_loop() является функция pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) . Единственным отличием является то, что это функция возвращает результат по истечении времени, заданного при вызове pcap_open_live() .

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

До этого времени мы получали все пакеты, приходящие на сетевой интерфейс. Теперь давайте применим функцию pcap , позволяющую отфильтровывать трафик приходящий на заданный порт. Мы можем использовать эту функцию также для работы только с пакетами для заданного прокола, например, ARP или FTP. Для начала нам нужно составить фильтр, используя данную функцию: int pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 mask);

Первый аргумент аналогичен во всех функциям библиотеки и рассмотрен ранее; второй аргумент представляет собой указатель на составленную версию фильтра. Следующий - это выражение для фильтра. Это выражение может быть названием протокола, таким как ARP, IP, TCP, UDP и.т.д. Вы можете найти множество примеров выражений в руководствах pcap-filter и tcpdump, которые должны быть установлены в вашей системе.

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

После составления, давайте применим фильтр при помощи функции int pcap_setfilter(pcap_t *p, struct bpf_program *fp) . Второй аргумент функции - составленная версия выражения для фильтрации трафика.

Получение информации IPv4

Int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf)

При помощи этой функции можно получить сетевой адрес IPv4 и маску сети, присвоенные данному сетевому интерфейсу. Сетевой адрес будет записан по адресу *netp , а маска сети - по адресу *mask .

Небольшая программа для захвата пакетов

Теперь давайте напишем программу, которая поможет нам понять принцип работы pcap. Назовем файл с исходным кодом sniff.c . Это программа из раздела руководств сайта tcpdump.org , автором которой является Martin Casado. Сначала подключим необходимые заголовочные файлы. #include #include #include #include #include #include #include #include

Далее введем функцию обратного вызова для обработки принятых пакетов. Эта функция будет просто печатать текущее количество принятых пакетов. Позднее мы напишем другую функцию обратного вызова. Эта же функция настолько очевидна, что не требует объяснений. void my_callback(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet) { static int count = 1; fprintf(stdout, "%3d, ", count); fflush(stdout); count++; }

Теперь рассмотрим функцию main() . Здесь использованы функции, которые мы разбирали ранее: int main(int argc,char **argv) { int i; char *dev; char errbuf; pcap_t* descr; const u_char *packet; struct pcap_pkthdr hdr; struct ether_header *eptr; /* net/ethernet.h */ struct bpf_program fp; /*выражение фильтрации в составленном виде */ bpf_u_int32 maskp; /*маска подсети */ bpf_u_int32 netp; /* ip */ if(argc != 2){ fprintf(stdout, "Usage: %s \"expression\"\n" ,argv); return 0; } /* Получение имени устройства */ dev = pcap_lookupdev(errbuf); if(dev == NULL) { fprintf(stderr, "%s\n", errbuf); exit(1); } /* Получение сетевого адреса и маски сети для устройства */ pcap_lookupnet(dev, &netp, &maskp, errbuf); /* открытие устройства в promiscuous-режиме */ descr = pcap_open_live(dev, BUFSIZ, 1,-1, errbuf); if(descr == NULL) { printf("pcap_open_live(): %s\n", errbuf); exit(1); } /* теперь составляется выражение фильтрации*/ if(pcap_compile(descr, &fp, argv, 0, netp) == -1) { fprintf(stderr, "Error calling pcap_compile\n"); exit(1); } /* применение фильтра*/ if(pcap_setfilter(descr, &fp) == -1) { fprintf(stderr, "Error setting filter\n"); exit(1); } /* функция обратного вызова используется в цикле */ pcap_loop(descr, -1, my_callback, NULL); return 0; }

Скомпилируйте программу при помощи команд, приведенных ниже и запустите с привилегиями пользователя root (необходимо для задействования promiscous-режима): $ gcc -lpcap sniff.c -o sniffer # ./sniffer ip

На рисунке 1 представлен примерный вывод программы.

Рисунок 1: Вывод программы

Поскольку в качестве выражения фильтрации задана строка ip , ваш экран скоро будет заполнен отметками о приеме IP-пакетов. Можете заменить ip на другое выражение, например, tcp , arp , и.т.д. - посмотрите примеры на странице руководства tcpdump.

Другая реализация функции обратного вызова, которая выводит содержимое пакетов, принятых на основе заданного выражения фильтрации (она уже в sniff.c ): void another_callback(u_char *arg, const struct pcap_pkthdr* pkthdr, const u_char* packet) { int i=0; static int count=0; printf("Packet Count: %d\n", ++count); /* Количество пакетов */ printf("Recieved Packet Size: %d\n", pkthdr->len); /* Длина заголовка */ printf("Payload:\n"); /* А теперь данные */ for(i=0;ilen;i++) { if(isprint(packet[i])) /* Проверка, является ли символ печатаемым */ printf("%c ",packet[i]); /* Печать символа */ else printf(" . ",packet[i]); /* Если символ непечатаемый, вывод. */ if((i%16==0 && i!=0) || i==pkthdr->len-1) printf("\n"); } }

Вы можете изменить строку с вызовом функции pcap_loop() в функции main() , где производится вызов функции my_callback() для использования нового варианта функции. Скомпилируйте измененную программу и запустите с тем же выражением в качестве аргумента. Вывод, представленный на рисунке 2, содержит данные из IP-пакетов.


Рисунок 2: Вывод, показывающий содержимое пакетов.

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

Программа Wireshark использует для захвата сетевого трафика библиотеки libpcap или WinPcap для Windows. Библиотека WinPcap не поддерживает использование беспроводных сетевых карт, поэтому напрямую не позволяет захватывать Wi-Fi трафик с помощью Wireshark и других приложений, таких как Cain & Abel или Elcomsoft Wireless Security Auditor для Windows.

Ограничения WinPcap и Wi-Fi трафик в Wireshark

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

Содержит собственный драйвер для захвата трафика с использованием технологии NDIS, захватывающий трафик в сети WiFi в в ОС Windows и позволяющий осуществлять захват беспроводного трафика с помощью Wireshark в Windows Vista, Windows 7, Windows 8 и Windows 8.1. С помощью этого драйвера можно автоматически обеспечить другим программам для анализа Wi-Fi-трафика возможность захвата данных в беспроводных сетях под Windows.

NDIS-драйвер и интерфейсы WiFi в Wireshark

Для обеспечения этого взаимодействия Acrylic устанавливает на компьютер собственную библиотеку airpcap.dll , эмулирующую библиотеку оригинальной карты AirPcap. Когда Wireshark загружает соответствующую системную библиотеку AirPcap от Acrylic, библиотека возвращает фиктивный список установленных устройств AirPcap, по одной записи для каждой внутренней карты Wi-Fi или внешнего USB-адаптера Wi-Fi.

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

Нажав на кнопку «Настройки беспроводной сети» (“Wireless settings” ), можно выбрать дополнительные параметры, такие как канал Wi-Fi для мониторинга и включить проверку FCS. FCS - это проверочная последовательность кадров (Frame Check Sequence), позволяющая определить целостность пакетов Wi-Fi и отбросить некорректно переданные пакеты.

Захват Wi-Fi трафика с помощью Wireshark в ОС Windows

Итак, после установки запустите Wireshark от имени администратора (щелкните правой кнопкой мыши на ярлыке Wireshark и выберите «Запуск от имени Администратора»), после чего выберите из списка карту, имеющую обозначение сетевого интерфейса NDIS. В нашем случае - это встроенная Wi-Fi карта DELL (Dell Wireless 1702/b/g/n)

Видеоинструкция по использованию Acrylic WiFi с Wireshark в ОС Windows

Мы подготовили видео с демонстрацией процесса, которое поможет, если у вас остались вопросы или если вы хотите увидеть, как происходит захват беспроводного трафика с помощью любой Wi-Fi карты в Wireshark для Windows.

Что такое Intercepter-NG

Рассмотрим суть функционирования ARP на простом примере. Компьютер А (IP-адрес 10.0.0.1) и компьютер Б (IP-адрес 10.22.22.2) соединены сетью Ethernet. Компьютер А желает переслать пакет данных на компьютер Б, IP-адрес компьютера Б ему известен. Однако сеть Ethernet, которой они соединены, не работает с IP-адресами. Поэтому компьютеру А для осуществления передачи через Ethernet требуется узнать адрес компьютера Б в сети Ethernet (MAC-адрес в терминах Ethernet). Для этой задачи и используется протокол ARP. По этому протоколу компьютер А отправляет широковещательный запрос, адресованный всем компьютерам в одном с ним широковещательном домене. Суть запроса: «компьютер с IP-адресом 10.22.22.2, сообщите свой MAC-адрес компьютеру с МАС-адресом (напр. a0:ea:d1:11:f1:01)». Сеть Ethernet доставляет этот запрос всем устройствам в том же сегменте Ethernet, в том числе и компьютеру Б. Компьютер Б отвечает компьютеру А на запрос и сообщает свой MAC-адрес (напр. 00:ea:d1:11:f1:11) Теперь, получив MAC-адрес компьютера Б, компьютер А может передавать ему любые данные через сеть Ethernet.

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

Как мы только что увидели, ARP включает в себя запрос и ответ. MAC-адрес из ответа записывается в таблицу MAC/IP. При получении ответа он никак не проверяется на подлинность. Более того, даже не проверяется, был ли сделан запрос. Т.е. на целевые устройства можно прислать сразу ARP-ответ (даже без запроса), с подменёнными данными, и эти данные попадут в таблицу MAC/IP и они будут использоваться для передачи данных. Это и есть суть атаки ARP-spoofing , которую иногда называют ARP травлением, травлением ARP кэша.

Описание атаки ARP-spoofing

Два компьютера(узла) M и N в локальной сети Ethernet обмениваются сообщениями. Злоумышленник X, находящийся в этой же сети, хочет перехватывать сообщения между этими узлами. До применения атаки ARP-spoofing на сетевом интерфейсе узла M ARP-таблица содержит IP и MAC адрес узла N. Также на сетевом интерфейсе узла N ARP-таблица содержит IP и MAC узла M.

Во время атаки ARP-spoofing узел X (злоумышленник) отсылает два ARP ответа (без запроса) - узлу M и узлу N. ARP-ответ узлу M содержит IP-адрес N и MAC-адрес X. ARP-ответ узлу N содержит IP адрес M и MAC-адрес X.

Так как компьютеры M и N поддерживают самопроизвольный ARP, то, после получения ARP-ответа, они изменяют свои ARP таблицы, и теперь ARP-таблица M содержит MAC адрес X, привязанный к IP-адресу N, а ARP-таблица N содержит MAC адрес X, привязанный к IP-адресу M.

Тем самым атака ARP-spoofing выполнена, и теперь все пакеты(кадры) между M и N проходят через X. К примеру, если M хочет передать пакет компьютеру N, то M смотрит в свою ARP-таблицу, находит запись с IP-адресом узла N, выбирает оттуда MAC-адрес (а там уже MAC-адрес узла X) и передает пакет. Пакет поступает на интерфейс X, анализируется им, после чего перенаправляется узлу N.

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

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

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

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

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

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

CommView предоставляет возможность вести статистику по всем IP-соединениям, декодировать IP-пакеты до низкого уровня и анализировать их. Встроенная система фильтров по нескольким параметрам позволяет настроить слежение исключительно за необходимыми пакетами, что позволяет сделать их анализ более эффективным. Программа может распознавать пакеты более чем семи десятков самых распространенных протоколов (в том числе DDNS, DHCP, DIAG, DNS, FTP, HTTP, HTTPS, ICMP, ICQ, IMAP, IPsec, IPv4, IPv6, IPX, LDAP, MS SQL, NCP, NetBIOS, NFS, NLSP, POP3, PPP, PPPoE, SMB, SMTP, SOCKS, SPX, SSH, TCP, TELNET, UDP, WAP и др.), а также сохранять их в файлы для последующего анализа. Множество других инструментов, таких как определение изготовителя сетевого адаптера по MAC-адресу, реконструкция HTML и удаленный перехват пакетов с помощью дополнительной утилиты CommView Remote Agent также могут быть полезны в определенных случаях.

Работа с программой

Для начала нужно выбрать сетевой интерфейс, на котором будет отслеживаться трафик.

CommView поддерживает практически любой тип адаптеров Ethernet - 10, 100 и 1000 Мбит/с, а также аналоговые модемы, xDSL, Wi-Fi и др. Анализируя трафик адаптера Ethernet, CommView может перехватывать не только входящие и исходящие, но и транзитные пакеты, адресованные любому из компьютеров локального сегмента сети. Стоит отметить, что если стоит задача мониторинга всего трафика сегмента локальной сети, то требуется, чтобы компьютеры в ней были подключены через хаб, а не через свитч. Некоторые современные модели свитчей имеют функцию port mirroring, что позволяет их также сконфигурировать для мониторинга сети с помощью CommView. Подробнее об этом можно прочитать . Выбрав нужное соединение, можно приступать к захвату пакетов. Кнопки запуска и остановки захвата находятся около строки выбора интерфейса. Для работы с контроллером удаленного доступа, VPN и PPPoE при инсталляции программы необходимо установить соответствующий драйвер.

Главное окно программы разделено на несколько вкладок, отвечающих за тот или иной участок работы. Первая из них, «Текущие IP-соединения» , отображает подробную информацию о действующих IP-соединениях компьютера. Здесь можно увидеть локальный и удаленный IP-адрес, количество переданных и принятых пакетов, направление передачи, число установленных IP-сессий, порты, имя хоста (если в настройках программы не отключена функция распознавания DNS), и имя процесса, принимающего или передающего пакета данной сессии. Последняя информация недоступна для транзитных пакетов, а также на компьютерах, работающих под управлением Windows 9x/ME.

Вкладка «Текущие IP-соединения»

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

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

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

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

Вкладка «Пакеты»

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

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

В нижнем окне отображается декодированная детальная информация о выбранном пакете.

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

Контекстное меню позволяет скопировать в буфер обмена MAC-, IP-адреса и целые пакеты, присваивать псевдонимы, применять быстрый фильтр для выбора требуемых пакетов, а также воспользоваться инструментами «Реконструкция TCP-сессии» и «Генератор пакетов».

Инструмент «Реконструкция TCP-сессии» позволяет просмотреть процесс обмена между двумя хостами по TCP. Для того чтобы содержимое сессии выглядело более понятно, нужно выбрать соответствующую «логику отображения». Эта функция наиболее полезна для восстановления текстовой информации, например, HTML или ASCII.

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

Вкладка «Log-файлы» . Здесь можно настроить параметры сохранения перехваченных пакетов в файл. CommView сохраняет log-файлы в собственном формате NCF; для их просмотра используется встроенная утилита, запустить которую можно из меню «Файл».

Имеется возможность включения автосохранения перехваченных пакетов по мере их поступления, ведения протоколов сессий HTTP в форматах TXT и HTML, сохранения, удаления, объединения и разделения log-файлов. Следует помнить, что пакет не сохраняется сразу по его прибытии, поэтому при просмотре log-файла в реальном времени в нем, скорее всего, не будет самых последних пакетов. Для того чтобы программа немедленно переслала буфер в файл, нужно нажать кнопку «Закончить захват».

Во вкладке «Правила» можно задать условия перехвата или игнорирования пакетов.

Для облегчения выбора и анализа требуемых пакетов, можно использовать правила фильтрации. Это также поможет значительно сократить количество системных ресурсов, используемых CommView.

Для того чтобы включить какое-нибудь правило, нужно выбрать соответствующий раздел с левой стороны окна. Всего доступно семь типов правил: простые - «Протоколы и направление», «Mac-адреса», «IP-адреса», «Порты», «Текст», «TCP-флаги», «Процесс», а также универсальное правило «Формулы». Для каждого из простых правил предусмотрена возможность выбора индивидуальных параметров, таких как выбор направления или протокола. Универсальное правило «Формула» является мощным и гибким механизмом создания фильтров с помощью булевой логики. Подробный справочник по его синтаксису можно найти .

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

Вкладка «Предупреждения» позволяет создавать, изменять, удалять правила предупреждений, а также просматривать текущие события, соответствующие этим правилам

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

CommView позволяет задать следующие типы отслеживаемых событий:

  • «Обнаружение пакета», соответствующего указанной формуле. Синтаксис формул подробно описан в руководстве пользователя;
  • «Байты в секунду». Это предупреждение сработает при превышении указанного уровня загрузки сети;
  • «Пакеты в секунду». Срабатывает при превышении заданного уровня частоты передачи пакетов;
  • «Бродкасты в секунду». То же, только для широковещательных пакетов;
  • «Мультикасты в секунду» - то же для многоадресных пакетов.
  • «Неизвестный MAC-адрес». Это предупреждение можно использовать для обнаружения подключений нового или несанкционированного оборудования в сеть, задав предварительно список известных адресов с помощью опции «Настройка»;
  • предупреждение «Неизвестный IP-адрес» сработает при перехвате пакетов с неизвестными IP-адресами отправителя либо получателя. Если предварительно задать список известных адресов, то это предупреждение можно использовать для обнаружения несанкционированных подключений через корпоративный брандмауэр.

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

Окно статистики в режиме «Общее»

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

Доступность, стоимость, системные требования

Текущая версия программы - CommView 5.1. С web-сайта Tamosoft можно , которая будет функционировать в течение 30 дней.

Разработчик предлагает покупателям два варианта лицензий:

  • Home License (домашняя лицензия), стоимостью 2000 рублей, дает право пользоваться программой дома на некоммерческой основе, при этом количество хостов, доступных для наблюдения в вашей домашней сети, ограничивается пятью. В рамках данного типа лицензии не позволяется работать удаленно с помощью Remote Agent.
  • Enterprise License (корпоративная, стоимость - 10000 рублей) предоставляет право на коммерческое и некоммерческое использование программы одним лицом, которое лично пользуется программой на одной или на нескольких машинах. Программа также может быть установлена на одной рабочей станции и использоваться несколькими людьми, но не одновременно.

Приложение работает в операционных системах Windows 98/Me/NT/2000/XP/2003. Для работы необходим сетевой адаптер Ethernet, Wireless Ethernet, Token Ring с поддержкой стандарта NDIS 3.0 или стандартный контроллер удаленного доступа.

Плюсы:

  • локализованный интерфейс;
  • прекрасная справочная система;
  • поддержка разных типов сетевых адаптеров;
  • развитые средства анализа пакетов и определения протоколов;
  • визуализация статистики;
  • функциональная система предупреждений.

Минусы:

  • слишком высокая стоимость;
  • отсутствие пресетов для правил перехвата и предупреждений;
  • не очень удобный механизм выбора пакета во вкладке «Пакеты».

Заключение

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