Wireshark (перехватчик сетевых пакетов). Сниффер под Windows Intercepter-NG (инструкция по использованию)


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

Wireshark

Netcat

Если говорить о перехвате данных, то Network Miner снимет с «эфира»
(или из заранее подготовленного дампа в PCAP-формате) файлы, сертификаты,
изображения и другие медиа, а также пароли и прочую инфу для авторизации.
Полезная возможность — поиск тех участков данных, что содержат ключевые слова
(например, логин пользователя).

Scapy

Сайт:
www.secdev.org/projects/scapy

Must-have для любого хакера, представляющий собой мощнейшую тулзу для
интерактивной манипуляции пакетами. Принять и декодировать пакеты самых
различных протоколов, ответить на запрос, инжектировать модифицированный и
собственноручно созданный пакет — все легко! С ее помощью можно выполнять целый
ряд классических задач, вроде сканирования, tracorute, атак и определения
инфраструктуры сети. В одном флаконе мы получаем замену таких популярных утилит,
как: hping, nmap, arpspoof, arp-sk, arping, tcpdump, tetheral, p0f и т.д. В то
же самое время Scapy позволяет выполнить любое, даже самое специфическое
задание, которое никогда не сможет сделать уже созданное другим разработчиком
средство. Вместо того чтобы писать целую гору строк на Си, чтобы, например,
сгенерировать неправильный пакет и сделать фаззинг какого-то демона, достаточно
накидать пару строчек кода с использованием Scapy ! У программы нет
графического интерфейса, а интерактивность достигается за счет интерпретатора
Python. Чуть освоишься, и тебе уже ничего не будет стоить создать некорректные
пакеты, инжектировать нужные фреймы 802.11, совмещать различные подходы в атаках
(скажем, ARP cache poisoning и VLAN hopping) и т.д. Разработчики сами настаивают
на том, чтобы возможности Scapy использовались в других проектах. Подключив ее
как модуль, легко создать утилиту для различного рода исследования локалки,
поиска уязвимостей, Wi-Fi инжекции, автоматического выполнения специфических
задач и т.д.

packeth

Сайт:
Платформа: *nix, есть порт под Windows

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

В этой статье мы рассмотрим создание простого сниффера под ОС Windows.
Кому интересно, добро пожаловать под кат.

Введение

Цель: написать программу, которая будет захватывать сетевой трафик (Ethernet, WiFi), передающийся по протоколу IP.
Средства: Visual Studio 2005 или выше.
Подход, который здесь описан, не принадлежит лично автору и успешно применяется во многих коммерческих, а также категорически бесплатных программах (привет, GPL).
Сей труд предназначен прежде всего для новичков в сетевом программровании, которые, однако, имеют хотя бы базовые знания в области сокетов вообще, и windows-сокетов в частности. Здесь я часто буду писать общеизвестные вещи, потому что предметная область специфическая, если что-то пропустить - в голове будет каша.

Надеюсь, Вам будет интересно.

Теория (читать не обязательно, но желательно)

В данный момент подавляющее большинство современных информационных сетей базируются на фундаменте стека протоколов TCP/IP. Стек протоколов TCP/IP (англ. Transmission Control Protocol/Internet Protocol) - собирательное название для сетевых протоколов разных уровней, используемых в сетях. В настоящей статье нас будет интересовать в основном протокол IP - маршрутизируемый сетевой протокол, используемый для негарантированной доставки данных, разделяемых на так называемые пакеты (более верный термин – дейтаграмма) от одного узла сети к другому.
Особый интерес для нас представляют IP-пакеты, предназначенные для передачи информации. Это достаточно высокий уровень сетевой OSI-модели данных, когда можно обстрагироваться от устройства и среды передачи данных, оперируя лишь логическим представлением.
Совершенно логичным является то обстоятельство, что рано или поздно должны были появится инструменты для перехвата, контроля, учета и анализа сетевого трафика. Такие средства обычно называется анализаторами трафика, пакетными анализаторыми или снифферами (от англ. to sniff - нюхать). Это - сетевой анализатор трафика, программа или программно-аппаратное устройство, предназначенное для перехвата и последующего анализа, либо только анализа сетевого трафика, предназначенного для других узлов.

Практика (разговор по существу)

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

Для чего это может понадобиться:

  1. Смотреть текущий поток трафика через сетевое соеднинение (входящий/исходящий/всего).
  2. Перенаправлять трафик для последующего анализа на другой хост.
  3. Теоретически, можно попытаться применить его для взлома WiFi-сети (мы ведь не собираемся этим заниматься?).
В отличие от Wireshark, который базируется на библиотеке libpcap/WinPcap, наш анализатор не будет использовать этот драйвер. Чего уж там, у нас вообще не будет драйвера, и свой NDIS(о ужас!) мы писать не собираемся. Про это можно прочитать в . Он будет просто пассивным наблюдателем, использующим только библиотеку WinSock. Использование драйвера в данном случае избыточно.

Как так? Очень просто.
Ключевым шагом в превращении простого сетевого приложения в сетевой анализатор является переключение сетевого интерфейса в режим прослушивания (promiscuous mode), что и позволит ему получать пакеты, адресованные другим интерфейсам в сети. Этот режим заставляют сетевую плату принимать все кадры, вне зависимости от того, кому они адресованы в сети.

Начиная с Windows 2000 (NT 5.0) создать программу для прослушивания сегмента сети стало очень просто, т.к. ее сетевой драйвер позволяет перевести сокет в режим приёма всех пакетов.

Включение неразборчивого режима
long flag = 1; SOCKET socket; #define SIO_RCVALL 0x98000001 ioctlsocket(socket, SIO_RCVALL, &RS_Flag);
Наша программа оперирует IP-пакетами, и использует библиотеку Windows Sockets версии 2.2 и «сырые» сокеты (raw sockets). Для того чтобы получить прямой доступ к IP-пакету, сокет нужно создавать следующим образом:
Создание сырого сокета
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
Здесь вместо константы SOCK_STREAM (протокол TCP) или SOCK_DGRAM (протокол UDP), мы используем значение SOCK_RAW . Вообще говоря, работа с raw sockets интересна не только с точки зрения захвата трафика. Фактически, мы получаем полный контроль за формированием пакета. Вернее, формируем его вручную, что позволяет, например, послать специфический ICMP-пакет…

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

Описание структуры IP-пакета
typedef struct _IPHeader { unsigned char ver_len; // версия и длина заголовка unsigned char tos; // тип сервиса unsigned short length; // длина всего пакета unsigned short id; // Id unsigned short flgs_offset; // флаги и смещение unsigned char ttl; // время жизни unsigned char protocol; // протокол unsigned short xsum; // контрольная сумма unsigned long src; // IP-адрес отправителя unsigned long dest; // IP-адрес назначения unsigned short *params; // параметры (до 320 бит) unsigned char *data; // данные (до 65535 октетов) }IPHeader;
Главная функция алгоритма прослушивания будет выглядеть следующим образом:
Функция захвата одного пакета
IPHeader* RS_Sniff() { IPHeader *hdr; int count = 0; count = recv(RS_SSocket, (char*)&RS_Buffer, sizeof(RS_Buffer), 0); if (count >= sizeof(IPHeader)) { hdr = (LPIPHeader)malloc(MAX_PACKET_SIZE); memcpy(hdr, RS_Buffer, MAX_PACKET_SIZE); RS_UpdateNetStat(count, hdr); return hdr; } else return 0; }
Здесь все просто: получаем порцию данных с помощью стандартной функции socket-функции recv , а затем копируем их в структуру типа IPHeader .
И, наконец, запускаем бесконечный цикл захвата пакетов:
Захватым все пакеты, которые попадут на наш сетевой интерфейс
while (true) { IPHeader* hdr = RS_Sniff(); // обработка IP-пакета if (hdr) { // печатаем заголовок в консоли } }
Немного оффтопика
Здесь и далее у некоторых важных функций и переменных автор сделал префкис RS_ (от Raw Sockets). Проект делал 3-4 года назад, и была шальная мысль написать полноценную библиотеку для работы с сырыми сокетами. Как это часто бывает, после получения сколь-нибудь значимых(для автора) результатов, энтузиазм угас, и дальше учебного примера дело не полшло.

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

/* * Выделение пакета цветом */ void ColorPacket(const IPHeader *h, const u_long haddr, const u_long whost = 0) { if (h->xsum) SetConsoleTextColor(0x17); // если пакет не пустой else SetConsoleTextColor(0x07); // пустой пакет if (haddr == h->src) { SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_RED | FOREGROUND_INTENSITY); // "родной" пакет на отдачу } else if (haddr == h->dest) { SetConsoleTextColor(BACKGROUND_BLUE | /*BACKGROUND_INTENSITY |*/ FOREGROUND_GREEN | FOREGROUND_INTENSITY); // "родной" пакет на прием } if (h->protocol == PROT_ICMP || h->protocol == PROT_IGMP) { SetConsoleTextColor(0x70); // ICMP-пакет } else if(h->protocol == PROT_IP || h->protocol == 115) { SetConsoleTextColor(0x4F); // IP-in-IP-пакет, L2TP } else if(h->protocol == 53 || h->protocol == 56) { SetConsoleTextColor(0x4C); // TLS, IP with Encryption } if(whost == h->dest || whost == h->src) { SetConsoleTextColor(0x0A); } }

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

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

Преобразование IP-заголовка в строку
inline char* iph2str(IPHeader *iph) { const int BUF_SIZE = 1024; char *r = (char*)malloc(BUF_SIZE); memset((void*)r, 0, BUF_SIZE); sprintf(r, "ver=%d hlen=%d tos=%d len=%d id=%d flags=0x%X offset=%d ttl=%dms prot=%d crc=0x%X src=%s dest=%s", BYTE_H(iph->ver_len), BYTE_L(iph->ver_len)*4, iph->tos, ntohs(iph->length), ntohs(iph->id), IP_FLAGS(ntohs(iph->flgs_offset)), IP_OFFSET(ntohs(iph->flgs_offset)), iph->ttl, iph->protocol, ntohs(iph->xsum), nethost2str(iph->src), nethost2str(iph->dest)); return r; }
На основании приведенных выше базовых сведений, получается вот такая небольшая программа (жуткое название ss, сокр. от англ. simple sniffer), реализующая локальное прослушивание IP-трафика. Интерфейс ее приведен ниже на рисунке.

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

Что у нас получилось в итоге:

  • Сниффер работает в режиме пользователя, однако требует привилегии администратора.
  • Пакеты не фильтруются, отображаясь как есть (можно добавить настраиваемые фильтры - предлагаю подробно рассмотреть эту тему в следующей статье, если интересно).
  • WiFi-трафик тоже захватывается(все зависит от конкретной модели чипа, у Вас может и не работать, как у меня несколько лет назад), хотя есть AirPcap, которая чудесно это умеет делать, но стоит денег.
  • Весь поток дейтаграмм логируется в файл (см. архив, приложенный в конце статьи).
  • Программа работает в качестве сервера на порту 2000. Можно подключиться с помощью утилиты telnet к хосту и произвести мониторинг потоков трафика. Количество подключений ограничено двадцатью (код не мой, нашел на просторах сети и применял для экспериментов; удалять не стал - жалко)
Спасибо за внимание, проздравляю хабровчан и хабровчанок и всех-всех-всех с наступающим Рождеством!

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

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

Шаг 1. Устанавливаем и запускаем Wireshark для захвата трафика

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

Захват трафика начался.

Шаг 2. Фильтрация захваченного POST трафика

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

Вводим в окне специальный фильтр для отображения захваченных пакетов: http. request. method == “ POST”

И видим вместо тысячи пакетов, всего один с искомыми нами данными.

Шаг 3. Находим логин и пароль пользователя

Быстрый клик правой кнопки мыши и выбираем из меню пункт Follow TCP Steam


После этого в новом окне появится текст, который в коде восстанавливает содержимое страницы. Найдем поля «password» и «user», которые соответствуют паролю и имени пользователя. В некоторых случаях оба поля будут легко читаемы и даже не зашифрованы, но если мы пытаемся захватить трафик при обращении к очень известным ресурсам типа: Mail.ru, Facebook, Вконтакте и т.д., то пароль будет закодирован:

HTTP/1.1 302 Found

Server: Apache/2.2.15 (CentOS)

X-Powered-By: PHP/5.3.3

P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"

Set-Cookie: password=; expires=Thu, 07-Nov-2024 23:52:21 GMT; path=/

Location: loggedin.php

Content-Length: 0

Connection: close

Content-Type: text/html; charset=UTF-8

Таким образом, в нашем случае:

Имя пользователя: networkguru

Пароль:

Шаг 4. Определение типа кодирования для расшифровки пароля

Заходим, например, на сайт http://www.onlinehashcrack.com/hash-identification.php#res и вводим наш пароль в окно для идентификации. Мне выдан был список протоколов кодирования в порядке приоритета:

Шаг 5. Расшифровка пароля пользователя

На данном этапе можем воспользоваться утилитой hashcat:

~# hashcat -m 0 -a 0 /root/wireshark-hash.lf /root/rockyou.txt

На выходе мы получили расшифрованным пароль: simplepassword

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

  • Протокол POP и фильтр выглядит следующим образом: pop.request.command == "USER" || pop.request.command == "PASS"
  • Протокол IMAP и фильтр будет: imap.request contains "login"
  • Протокол SMTP и потребуется ввод следующего фильтра: smtp.req.command == "AUTH"

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

Шаг 6. Что делать, если трафик зашифрован и используется HTTPS?

Для ответа на этот вопрос есть несколько вариантов.

Вариант 1. Подключиться в разрыв соединения между пользователем и сервером и захватить трафик в момент установления соединения (SSL Handshake). В момент установки соединения можно перехватить сеансовый ключ.

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

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

После получения ключей по варианту 1 или 2 необходимо прописать их в WireShark:

  1. Идем в меню Edit - Preferences - Protocols - SSL.
  2. Ставим флаг «Reassemble SSL records spanning multiple TCP segments».
  3. «RSA keys list» и нажимаем Edit.
  4. Вводим данные во все поля и прописываем путь в файлу с ключом

WireShark может расшифровывать пакеты, которые зашифрованы с использованием алгоритма RSA. В случае если используются алгоритмы DHE/ECDHE, FS, ECC, сниффер нам не помощник.

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

БОНУС

ВИДЕО: Wireshark Packet Sniffing Usernames, Passwords, and Web Pages

Оригинал: 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.

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

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

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

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

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







2024 © gtavrl.ru.