Анализ трафика с помощью tcpdump

Для чего нужно анализировать трафик? Знание того, как происходит взаимодействие между компьютерами дозволяет более быстро обнаружить и решить возможные проблемы, возникшие в работе сети. Приведу простенький пример: один из компьютеров локальной сети перестает отвечать на запросы. Что могло случится? Были ли он взломан или это ошибки системного администратора? Если в сети присутствует хорошая система управления логами, то возможно много информации узнать из этих файлов. Но что если в них нет ничего подозрительного или, что еще хуже, они истины скомпрометированы злоумышленником? Тогда на помощь приходит tcpdump. Эта программа, как скрытая камера, какая показывает, что происходит в данный момент в сети. Благодаря ей вы можете создать специальные фильтры, какие будут отображать только нужный вам трафик.

Конечно tcpdump не единственная прога, умеющая анализировать трафик, существует множество подобных программ, например ethereal. Это весьма хорошее средство, быстро развивающееся и, несмотря на казалось бы раннюю версию, (последняя на момент начертанье статьи версия была 0.10.10) является очень надежной и глубоко продуманной програмкой. Один только список поддерживаемых протоколов перевалил за 500 (последняя версия, в какой мере я знаю поддерживает 673 протокола www.ethereal.com/introduction.html )! Почему я утилизировал именно tcpdump, а не эту программу (термин, в переводе означающий «предписание», то есть предварительное описание предстоящих событий или действий)? Во-первых я привык работать с tcpdump, для использования же ethereal нужно наличие X-сервера, а я больше люблю работать в консоли. Во-вторых, отчеты ethereal нелегко отобразить в печатном виде. И все же я планирую подробно рассказать об этой замечательной программе в одной из собственных следующих статей.

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

Как работает tcpdump

Для того, чтобы научиться читать записи tcpdump нужно хотя бы небольшие знания основных протоколов, в частности рассматриваемом ниже протоколе TCP. Хотя если вы хотите максимально использовать tcpdump, без глубокого изучения теории их работы ни коим образом не обойтись. Напомню, что tcpdump – лишь программа для отображения, но не генерирования трафика. Она может только показать то, что происходит в сети и повлиять на трафик она не может.

Для работы в tcpdump нужны полномочия пользователя root. Это связано с тем, что tcpdump необходимо перевести сетевую карту в так именуемый неразборчивый (promiscuous) режим, при котором сетевая карта не проверяет предназначены ли именно ей приобретенные данные, она принимает абсолютно всё.
Схема передачи данных, при котором трафик (Телефонный трафик — в телекоммуникациях — большое количество телефонных разговоров и попыток установления соединения, проходящих через коммутационной оборудования и/или телефонную сеть Транспортный) проходит чрез каждый компьютер свойственна для Ethernet-сетей, основанных прежде всего на концентраторах. Их называют «сетями всеобщего пользования», то есть получив данные от какого-нибудь хоста, концентратор отправляет эти данные на все присоединенные к нему порты не заботясь о том, кому именно они предназначались.

Читайте также:  Задать максимальную глубину поиска в Linux

Противоположность такому типу сети – Ethernet-сеть базирующаяся на коммутаторах. Здесь данные передаются только указанному получателю. Коммутатор создает условное соединение между компьютерами, что не позволяет остальным хостам в сети «прослушивать» передаваемые ими этые. Однако, это вовсе не означает, что их невозможно перехватить, правда для этого не обойтись без некоторых хитростей.

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

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

Еще один момент, какой следует указать, так это то, что tcpdump поддерживает chroot. chroot – это переопределение корневой папки для програмки, пользователя. С ее помощью можно сделать так, чтобы даже в случае взлома программы и приобретенье прав с помощью которой запускается программа, взломщик не сможет выйти за пределы папки узкой chroot-средой. Эта полезная опция, указывается при компиляции Tcpdump.

Тестовые машины

tcpdump нужен для работы в сети. Однако если у вас ее нет, то есть несколько вариантов:

1) Использовать интерфейс оборотной связи.
Благодаря тому, что в *nix системах запрограммирован этот интерфейс, вы можете посылать наиболее себе данные, предназначенные как бы для локальной сети. Преимущества данного способа: высокая быстрота работы (может означать: Работа — функционирование какой-либо системы — механизма, биоценоза, организма или общности, — а также её части), не нужно дополнительное ПО. Недостатки – поведение вашей операционной системы на тот или иной трафик сможет сильно отличаться от реальной работы в сети, в результате можно сделать неправильные выводы. Хотя просто для познания того, как работает сеть это идеальный вариант.

2) Воспользоваться програмками типа VmWare или Bochs.
Виртуальная машина – прекрасное средство, если вы хотите эмулировать на собственном компьютере работу локальной сети. Именно так я и поступил, т.к. у меня пока что нет возможности трудиться в реальной локальной сети. Преимущества: хорошая производительность, впечатление, что работаешь в локальной сети. Несовершенства: необходим большой объем оперативной памяти. Если учесть, что для работы каждой операторной системы необходимо как минимум 32, а то и 64 или 128 мб, то для эмуляции сети из 3-4 компьютеров необходимо примерно 256 мб.

Я пользовался программой VmWare. На своей машине и эмулировал службу в сети 4 операционных систем: ASP Linux 7.2 (192.168.0.1) – эта машина выполняет роль web и ftp-сервера сервера. Поставлены apache последней версии и vsftpd. На нем же стоит Tcpdump.
Windows 2000 (192.168.0.2) – на этой машине также стоит web и ftp-сервер.
FreeBSD 4.1 (192.168.0.3) – клиентская машина.
ASP Linux 7.2 (192.168.0.4) – клиентская машина.

Аппарат программного обеспечения

Как было выше упомянуто, для анализа пакетов мы будем использовать програмку tcpdump. Для ее установки потребуется библиотека libpcap, последнюю версию которой вы можете закачать с сайта www.tcpdump.org. впрочем, как и саму tcpdump. Настоятельно рекомендую перед установкой прочитать README и INSTALL, в них содержаться полезные сведения о том, с какими параметрами ее следует устанавливать, и какой-никакие дополнительные библиотеки нужны для правильной работы программы. В частности, для libpcap необходимы flex и bison. Когда у вас система основанная на RPM, то скорее всего пакеты есть на диске с дистрибутивом, либо уже находятся в системе. Лично я ставил libpcap из исходников с такими параметрами:

Читайте также:  Как исправить ошибку "Your password does not satisfy the current policy requirements MySQL" в Linux?

shell$ ./configure –prefix=/usr/local/ –disable-ipv6
shell$ su
shell@root# make && make install

Как видите, я отключил поддержку IP 6 версии, мы будем рассматривать пакеты только 4 версии. Когда ставил tcpdump, я также выключил поддержку smb-принтера и криптоанализа.

shell$ ./configure –prefix=/usr/local/ –disable-ipv6 –disable-smb –without-crypto
shell$ su
shell@root# make && make install

У меня tcpdump водворился в директории /usr/local/sbin. Возможно, вам придется добавить эту директорию в переменную PATH, когда она там не числится. Для тех, кто не знает, это можно сделать вот так:

shell@root# PATH=$PATH:/usr/local/sbin/
shell@root# export $PATH

Вот и все, tcpdump поставлен и можно приступить к работе с самой программой.

Пример отчета tcpdump

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

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

shell@root# tcpdump -n -i eth0 -l | tee tmp.log

1 этап

  • 07:18:54.437096 192.168.0.4.1026 > 192.168.0.1.80: S 3292064290:3292064290(0) win 5840 <mss 1460>
  • 07:18:54.445895 192.168.0.1.80 > 192.168.0.4.1026: S 3900383410:3900383410(0) ack 3292064291 win 5792 <mss 1460>
  • 07:18:54.449874 192.168.0.4.1026 > 192.168.0.1.80: . ack 1 win 5840

2 шаг

  • 07:18:54.449921 192.168.0.4.1026 > 192.168.0.1.80: P 1:566(565) ack 1 win 5840
  • 07:18:54.450152 192.168.0.1.80 > 192.168.0.4.1026: . ack 566 win 6780
  • 07:18:54.505579 192.168.0.1.80 > 192.168.0.4.1026: P 1:321(320) ack 566 win 6780
  • 07:18:54.506535 192.168.0.4.1026 > 192.168.0.1.80: . ack 321 win 6432

3 шаг

  • 07:18:54.565873 192.168.0.4.1026 > 192.168.0.1.80: F 566:566(0) ack 322 win 6432
  • 07:18:54.565954 192.168.0.1.80 > 192.168.0.4.1026: . ack 567 win 6780
  • 07:18:54.56708 192.168.0.1.80 > 192.168.0.4.1026: F 321:321(0) ack 566 win 6780
  • 07:18:54.567954 192.168.0.4.1026 > 192.168.0.1.80: . ack 322 win 6432

Процедура аппараты соединения

В начале каждой строки отчета указано время, когда был передан пакет, потом указывается IP адрес отправителя, за ним следует ip-адрес получателя. После каждого ip-адреса, чрез точку, указывается порт обмена данными (зарегистрированная информация:439; представление фактов, понятий или инструкций в форме, приемлемой для общения, интерпретации, или обработки человеком или с помощью автоматических средств), в данном случае он будет осуществляться: у покупателя через временный порт – 1026, а у сервера через 80 порт. Далее заслуживает буква S, это означает, что в пакете установлен флаг SYN, как вы помните, этот флаг используется при введенье каждого tcp-соединения. Далее следует начальный порядковый номер пакета (упаковка для чего-либо, обычно из бумаги или пластика: Бумажный пакет Полиэтиленовый пакет Пакет-саше — герметичный пакет) (ISN – initial sequence number ), за ним – последний порядковый номер пакета, в скобках указана полезная нагрузка – 0 байт, и это верно, так как во время установления соединения никаких данных передаваться не должно, однако если каким-никаким данным имеет место быть, то они будут добавлены к остальным уже после установки слияния.

Читайте также:  Как в Linux изменить права доступа к файлу?

Следует всегда обращать на это внимание, так как зачастую этот метод используется для отвода фаерволлов. win 5840 – это размер окна (буфера), в котором хранятся данные для отправки. Отправитель вдобавок сообщает, что несмотря на большой размер буфера, максимальное число байт данных*, какое можно передать в его сети – 1460 (mss 1460), это стандартное значение для сетей Ethernet.

Потом, во второй строке, хост-сервер отсылает пакет с установленным SYN-флагом и подтверждение на получение пакета от хоста 192.168.0.1, заслуживает флаг ack и увеличен ISN клиента на 1(3292064291). Он также говорит размер своего окна и mss.

Знак . в третьей строке означает отсутствие флага SYN, FIN, RESET или PUSH (обычно его называют заполнителем). Хост подкрепляет получение пакета флагом ack, а следующая за ним цифра 1 показывает, что он увеличил ISN на 1. Такая несложная форма (использование единицы) позволяет не заполнять отчет постоянно изменяющимся ISN. Если же вы желаете, чтобы tcpdump не использовал эту форму, запустите tcpdump с ключом -S.

Вся проделанная процедура слияния называется ‘полным tcp-соединением с подтверждением данных’. Если вы запутались во всех этих записях в низу в таблице 1 показана расшифровка каждого поля.

* – Я не зря в скобках указал, что 1460 б – максимальное значение именно для данных, а не всего пакета. Если быть более буквальным, то это значение должно быть 1500. Просто 20 байт идет на tcp-заголовок и еще 20 на ip-заголовок.

Настилу Расшифровка

07:18:54.437096 метка времени
192.168.0.4 хост-отправитель

192.168.0.1 хост-получатель

80 порт размена данными

S флаг

3292064290 начальный порядковый номер

3292064290 конечный последовательный номер

(0) полезная нагрузка пакета

win 5840 размер окна

mss 1460 наибольшее число байтов, которые

можно передавать в данной сети.

Обмен здоровыми данными

Обмен даными происходит при помощи пакетов с установленным флагом PUSH, для сжатости в tcpdump он обозначается как P, в скобочках указывается полезная нагрузка. И по-прежнему каждый посланный пакет подтверждается с иной стороны. На самом деле это довольно сложный этап, при котором может происходить много разных событий, например один из партнеров перестал передавать данные и не подтвердил приобретенные пакеты от сервера. В самом протоколе TCP заложены механизмы в случае появления непредвиденной ситуации во время передавания данных, однако рассматривать их сейчас – значит углубиться еще дальше в работу протокола, что сейчас мне не хотелось бы делать.

Закрытие соединения

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

Заключение

Мы с вами рассмотрели схему обмена данными по tcp-протоколу, а вдобавок узнали, как выглядит небольшой отчет о нем в tcpdump. В следующей части статьи мы более досконально рассмотрим, как создавать отчеты tcpdump и узнаем как читать заголовки ip-пакета в шестнадцатиричном формате.