tcpdump в примерах (или шпаргалка по tcpdump)

Tcpdump — это команда, используемая в различных операционных системах Linux (ОС), которая собирает пакеты TCP / IP , которые проходят через сетевой адаптер . Так же, как инструмент перехвата пакетов , tcpdump может не только анализировать сетевой трафик, но и сохранять его в файл .

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

Tcpdump распечатывает заголовки пакетов на сетевом интерфейсе, которые соответствуют логическому выражению . Его также можно запустить с   флагом -w , который заставляет его сохранять данные пакета в файл для последующего анализа, и / или с   флагом -r , который заставляет его читать из сохраненного файла пакета, а не читать пакеты из сетевого интерфейса. Во всех случаях tcpdump  будет обрабатывать  только пакеты, которые соответствуют выражению .

Tcpdump  , если не запускается с   флагом -c , продолжит захват пакетов, пока не прервется сигналом SIGINT (генерируемым, например, путем ввода символа прерывания, обычно Ctrl + C ) или сигналом SIGTERM (обычно генерируемым с помощью  kill ( 1) команда); если он запускается с   флагом -c , он будет захватывать пакеты до тех пор, пока его не прервет сигнал SIGINT или SIGTERM или пока не будет обработано указанное количество пакетов.

Упомянутые выше переключатели подробно описаны ниже в этой статье.

Когда  tcpdump  заканчивает захват пакетов, он сообщит о количестве:

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

На платформах, которые поддерживают сигнал SIGINFO, таких как большинство BSD (дистрибутивы программного обеспечения Беркли), он будет сообщать эти подсчеты при получении сигнала SIGINFO (генерируемого, например, путем ввода символа «status»), обычно Ctrl + T ) и продолжит захват пакетов.

Опции утилиты tcpdump

-i интерфейс

Задает интерфейс, с которого необходимо анализировать трафик (без указания интерфейса — анализ «первого попавшегося»).

Отключает преобразование IP в доменные имена. Если указано -nn, то запрещается преобразование номеров портов в название протокола.

Включает вывод данных канального уровня (например, MAC-адреса).

Вывод дополнительной информации (TTL, опции IP).

-s размер

Указание размера захватываемых пакетов. (по-умолчанию — пакеты больше 68 байт)

-w имя_файла

Задать имя файла, в который сохранять собранную информацию.

-r имя_файла

Чтение дампа из заданного файла.

Захватывать только трафик, предназначенный данному узлу. (по-умолчанию — захват всех пакетов, например в том числе широковещательных).

Читайте также:  iOS 3 против iOS 4 в тесте батареи iPhone 3G и 3GS

Переводит tcpdump в «бесшумный режим», в котором пакет анализируется на транспортном уровне (протоколы TCP, UDP, ICMP), а не на сетевом (протокол IP).

Отключает вывод меток времени.

tcpdump

Утилита tcpdump относится к числу так называемых «снифферов» — программ предназначенных для перехвата сетевого трафика. Одним словом, tcpdump предназначен для подслушивания. Разрабо­тан Группой сетевых исследований (Network Reseach Group, NRG) Отдела инфор­мационных и вычислительных технологий (Information and Computing Sciences Division, ICSD) в Национальной лаборатории Лоренс Беркли (Lawrence Berkeley National Laboratory, LBNL).

tcpdump не единственный Сетевые анализаторы снифферы, которым может пользоваться администратор. Кроме tcpdump можно обратить внимание на такие программы, как:

tcpdump работает при помощи интерфейса bpf (Berkeley Packet Filter). Если поддержку этого устройства отключить, сниффинг в BSD-UNIX окажется невозможен. Права на запуск программы tcpdump определяются правами доступа к устройсву bpf (/dev/bpf0). Эти права можно регулировать через devfs. Если вы предоставляете, например, группе operator права на чтение из этого устройства, то это значит, что все члены этой группы смогут перехватывать любой трафик, в том числе трафик суперпользователя.

Если программа tcpdump вызвана для прослушивания некоторого интерфейса, она переводит его в «promiscuous mode» — «неразборчивый режим». В этом режиме интерфейс ловит вообще все пакеты, которые до него добрались, а не только пакеты адресованные непосредственно ему. Таким образом, если сеть собрана не на коммураторах (switch), а на репитерах (hub), то tcpdump позволит перехватить трафик между посторонними машинами, т.е. подслушать разговор двух сторонних машин. Сказанное не означает, что перехват трафика невозможен в сети собранной на коммутаторах. Впрочем, интерфейс можно и не переводить в promiscous mode, если передать программе аргумент -p.

Writing a Basic Packet Capture Engine

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

Рассмотрим следующий библиотечный метод pcap :

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

Он будет использован нами как один из базовых. Во время цикла pcap_loop(..) будет происходить захват пакетов, которые будут передаваться в callback function типа pcap_handler. Здесь представляют интерес аргументы 2 и 3, хидер для pcap packet и константа u_char.

В качестве примера напишем программу , которая захватывает в цикле n пакетов.

Allright then, lets give her a whirl!

Как вы видите , my_callback(. ) была вызвана 7 раз. Весь анализ пакетов мы положили внутрь my_callback. Но это не совсем правильное решение. Первая проблема в том , что pcap_loop(..) может подвиснуть в случае отсутствия пакетов. Было бы неплохо установить тайм-аут на чтение. Одним из параметров функции pcap_open_live(..) является тайм-аут в милли-секундах. Функция pcap_loop игнорирует этот аргумент, но pcap_dispatch(..) нет! Смотрите описание pcap_dispatch() в man page

Читайте также:  Mandriva Linux: Полное руководство пользователя. 2-е издание

************ pcap_dispatch() используется для сбора пакетов. cnt — определяет максимальное число пакетов. cnt = -1 говорит о том , что все пакеты возвращаются в одном буфере. cnt = 0 обрабатывает пакеты до тех пор , пока не произойдет ошибка. callback — подпрограмма , вызываемая 3-м аргументом:u_char — указатель на нее, туда входит структура pcap_pkthdr и данные. pcap_dispatch() возвращает число прочитанных пакетов. -1 означает ошибку, для ее вывода можно использовать pcap_perror() или pcap_geterr(). ************

Нам неинтересны все пакеты,гуляющие по сети. Что нужно для того , чтобы захватить пакеты , зная номер хоста и номер порта ? Использовать pcap_compile(..) и pcap_setfilter(. ).

Мы можем захватить все пакеты и отсортировать их. Но трафик может быть нешуточным. В библиотеке libpcap есть интерфейс,позволяющий определить точно , какие пакеты нас интересуют. Для этого нужно передать фильтр в форме строки функции pcap_compile(). Есть волшебная программа tcpdump и ее man page. Как правило,эта программа стоит по умолчанию везде. Tcpdump — это фактически враппер для libpcap. tcpdump man page явно описывает синтаксис и семантику языка фильтров. Вот часть этого мана:

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

Рассмотрим следующую программу :

Эта программа принимает строку от пользователя, компилирует ее и устанавливает ее в качестве фильтра- при этом нужно сделать запрос на :

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

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

Практическое использование

Утилиту tcpdump принято использовать для двух целей: для отладки сети, сетевых приложений и новых протоколов и для обучения основам TCP/IP. Мы пойдем другим путем и воспользуемся возможностями tcpdump для выявления фактов сканирования хоста и проведения сетевых атак.

Практическое использование

На рис. 1 показано, как выглядит классический TCP-скан портов, выполненный утилитой Nmap, в логах tcpdump. Хорошо видно, как Nmap с адреса пытается установить TCP-соединение с разными портами, посылая SYN-пакет (S в поле флагов). Сначала идет проба порта 8888, в ответ приходит RST-пакет, а это значит, что порт не прослушивается ни одним сервисом, далее проба порта 587 с тем же результатом. Наконец, Nmap посылает SYN-пакет на 22-й порт (SSH) и получает ответ в виде пакета SYN-ACK:

Практическое использование

> : Flags [S], seq 2610024277, … > : Flags , seq 3496707239, ack 2610024278, … > : Flags [.], ack 1, …

Практическое использование

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

Практическое использование

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

Практическое использование

Теперь рассмотрим другой метод обнаружения открытых портов — SYN-сканирование (nmap -sS). Такой вид скана принято называть скрытым, потому что во время его никогда не устанавливается полное TCP-соединение, а значит, информация о факте соединения не попадает в логи. Вывод tcpdump для такого вида скана представлен на рис. 2. Он очень похож на лог обычного TCP-сканирования, однако реакция сканера на открытые порты теперь другая:

Практическое использование

> : Flags [S], seq 1679394613, … > : Flags , seq 625029896, ack 1679394614, … > : Flags [R], seq 1679394614, …

Практическое использование

Видно, что после получения одобрительного пакета SYN-ACK сканер не завершает установку соединения, а сразу обрывает его, уходя от попадания в логи. На рис. 3 можно видеть результат UDP-сканирования. Здесь все очень просто, Nmap перебирает порты с возможными UDP-сервисами, посылая на каждый из них пакет нулевой длины. Если порт закрыт, ОС посылает в ответ сообщение ICMP unreachable:

Практическое использование

16:41: IP > : UDP, length 0 16:41: IP > : ICMP udp port 18869 unreachable, length 36

Практическое использование

В противном случае порт считается открытым. Еще один метод сканирования: null-сканирование с помощью отправки пакетов, не содержащих ни одного установленного флага (nmap -sN). Реакция на такие пакеты может быть разной в зависимости от используемой ОС, но, как видно по следующему листингу, Linux отвечает на них посылкой RST-пакетов:

Практическое использование

> : Flags , win 3072, length 0 > : Flags , …

Практическое использование

Также атакующий может применять Xmas-сканирование, при котором пакеты имеют установленные флаги FIN, URG и PUSH (пакет как бы светится флагами, как новогодняя елка):

Практическое использование

> : Flags , seq 3998959601, win 4096, urg 0, length 0 > : Flags , seq 0, ack 3998959602

Практическое использование

Как видно, реакция на такие пакеты идентичная. ACK-сканирование (-sA) будет выглядеть в логах tcpdump как отправка множества пакетов с установленным флагом ACK и ответ на них в виде посылки пакетов RST. Однако, если в системе установлен брандмауэр, ответных сообщений приходить не будет, и Nmap сможет понять, фильтруется ли порт.

Практическое использование

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

Практическое использование

16:43: IP > : ICMP type-#68, length 1032 16:43: IP > : ICMP type-#34, length 1032 16:43: IP > : ICMP type-#183, length 1032 16:43: IP > : ICMP type-#192, length 1032

Практическое использование

Особую важность здесь имеет поле, содержащее время приема пакета. Ни одно нормальное приложение не будет слать множество ICMP-сообщений за промежуток времени, равный одной тысячной секунды. Другие виды флуда (например, SYN) определяются точно таким же образом.

Практическое использование