Еще немножко о 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-сетей, основанных прежде всего на концентраторах. Их называют «сетями общего пользования», то есть получив данные от какого-нибудь хоста, концентратор отправляет эти данные на все подключенные к нему порты не заботясь о том, кому именно они предназначались.
Противоположность такому типу сети – 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 из исходников с такими параметрами:

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 этап
1) 07:18:54.437096 192.168.0.4.1026 > 192.168.0.1.80: S 3292064290:3292064290(0) win 5840 <mss 1460>
2) 07:18:54.445895 192.168.0.1.80 > 192.168.0.4.1026: S 3900383410:3900383410(0) ack 3292064291 win 5792 <mss 1460>
3) 07:18:54.449874 192.168.0.4.1026 > 192.168.0.1.80: . ack 1 win 5840

2 этап
4) 07:18:54.449921 192.168.0.4.1026 > 192.168.0.1.80: P 1:566(565) ack 1 win 5840
5) 07:18:54.450152 192.168.0.1.80 > 192.168.0.4.1026: . ack 566 win 6780
6) 07:18:54.505579 192.168.0.1.80 > 192.168.0.4.1026: P 1:321(320) ack 566 win 6780
7) 07:18:54.506535 192.168.0.4.1026 > 192.168.0.1.80: . ack 321 win 6432

3 этап
8 ) 07:18:54.565873 192.168.0.4.1026 > 192.168.0.1.80: F 566:566(0) ack 322 win 6432
9) 07:18:54.565954 192.168.0.1.80 > 192.168.0.4.1026: . ack 567 win 6780
10) 07:18:54.56708 192.168.0.1.80 > 192.168.0.4.1026: F 321:321(0) ack 566 win 6780
11) 07:18:54.567954 192.168.0.4.1026 > 192.168.0.1.80: . ack 322 win 6432

1 этап. Процедура установки соединения

В начале каждой строки отчета указано время, когда был передан пакет, затем указывается IP адрес отправителя, за ним следует ip-адрес получателя. После каждого ip-адреса, через точку, указывается порт обмена данными, в данном случае он будет осуществляться: у клиента через временный порт – 1026, а у сервера через 80 порт. Далее стоит буква S, это означает, что в пакете установлен флаг SYN, как вы помните, этот флаг используется при установлении каждого tcp-соединения. Далее следует начальный порядковый номер пакета (ISN – initial sequence number ), за ним – конечный порядковый номер пакета, в скобках указана полезная нагрузка – 0 байт, и это правильно, так как во время установления соединения никаких данных передаваться не должно, однако если каким-то данным имеет место быть, то они будут добавлены к остальным уже после установки соединения. Следует всегда обращать на это внимание, так как зачастую этот метод используется для обхода фаерволлов. 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 максимальное число байтов, которые

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

2 этап. Обмен полезными данными

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

3 этап. Закрытие соединения

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

Заключение

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

Опубликовано в Команды/утилиты

Рубрики