Что такое tcpdump. Установка и использование tcpdump. Изолирование специфических TCP-флагов

ПОЧЕМУ TCPDUMP?

Tcpdump — главный инструмент сетевого анализа для специалистов по информационной безопасности. Для тех, кто хочет получить полное представление о TCP / IP обязательно нужно обладать достаточным пониманием этого важного приложения. Многие предпочитают использовать инструменты более высокого уровня, такие как Wireshark, но я считаю это ошибкой.

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

15:31:34.079416 IP (tos 0x0, ttl 64, id 20244, offset 0, flags , proto: TCP (6), length: 60) source.35970 > dest.80: S, cksum 0x0ac1 (correct), 2647022145:2647022145(0) win 5840 0x0000: 4500 003c 4f14 4006 7417 0afb 0257 E.. 0x0010: 4815 222a 8c82 0050 9dc6 5a41 0000 0000 H."*...P..ZA.... 0x0020: a002 16d0 0ac1 0000 0204 05b4 0402 080a ................ 0x0030: 14b4 1555 0000 0000 0103 0302

ОСНОВЫ

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

ОПЦИИ

  • -i any: прослушивать все интерфейсы, чтобы увидеть, видите ли вы какой-либо трафик.
  • -i eth0: прослушивать интерфейс eth0.
  • -D: Показывать список доступных интерфейсов
  • -n: отображать IP адреса вместо имени хостов.
  • -nn: отображать IP адреса и номера портов вместо имени хостов и названия протоколов.
  • -q: показывает минимальное количество информации о пакете.
  • -t: не отображать метку времени в каждой строке.
  • -tttt: задает вывод временных меток в принятом по умолчанию формате для каждой строки.
  • -X: Показывать содержимое пакета как в шестнадцатеричной кодировке, так и в ASCII.
  • -XX: То же, что и -X, но также показывает ethernet header.
  • -v, -vv, -vvv: увеличить количество возвращаемой информации о пакетах.
  • -c: только получить x количество пакетов, а затем остановить.
  • -s: определить длину snaplength (размер) захвата в байтах. Используйте -s0, чтобы получить все, если только вы намеренно не захватили меньше.
  • -S: Печатать абсолютные порядковые номера.
  • -e: Получить ethernet header.
  • -q: Показать минимальную информацию о пакете.
  • -E: Расшифровать трафик IPSEC, предоставив ключ шифрования.
[Значение snaplength, по умолчанию для tcpdump 4.0, изменилось с 68 до 96 байтов. Хотя это даст вам увидеть больше информации о пакете, но это будет не вся информация. Используйте -s1514 или -s0, чтобы получить полный охват]

ВЫРАЖЕНИЯ

В tcpdump выражения позволяют вам урезать различные типы трафика и найти именно то, что вы ищете. Освоение выражений и умение объединить их творчески — вот что делает по-настоящему мощным tcpdump.

Существует три основных типа выражений: type, dir и proto.

Типы опций: хост, сеть и порт.

Директории позволяют вам выполнять src, dst и их комбинации.

Протокол позволяет вам определять: tcp, udp, icmp, ah и многие другие.

ПРИМЕРЫ

Итак, теперь, когда мы увидели, какие у нас есть варианты, давайте посмотрим на некоторые реальные примеры, которые мы, вероятно, увидим в нашей повседневной работе.

ОСНОВНОЕ СООБЩЕНИЕ

Просто посмотрите, что происходит, посмотрев на все интерфейсы.

# tcpdump -i any

КОНКРЕТНЫЙ ИНТЕРФЕЙС

Основное представление о том, что происходит на конкретном интерфейсе.

# tcpdump -i eth0

ПРЕДСТАВЛЕНИЕ НЕОБРАБОТАНОГО ВЫВОДА

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

# tcpdump -ttttnnvvS

НАЙДИТЕ ТРАФИК ПО IP

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

# tcpdump host 1.2.3.4

ПОСМОТРЕТЬ БОЛЬШЕ ИНФОРМАЦИИ О ПАКЕТЕ С ВЫВОДОМ НА ШЕСТНАДЦАТЕРИЧНУЮ СИСТЕМУ

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

# tcpdump -nnvXSs 0 -c1 icmp tcpdump: listening on eth0, link-type EN10MB (Ethernet), 23:11:10.370321 IP (tos 0x20, ttl 48, id 34859, offset 0, flags , length: 84) 69.254.213.43 > 72.21.34.42: icmp 64: echo request seq 0 0x0000: 4520 0054 882b 0000 3001 7cf5 45fe d52b E..T.+..0.|.E..+ 0x0010: 4815 222a 0800 3530 272a 0000 25ff d744 H."..50"..%..D 0x0020: ae5e 0500 0809 0a0b 0c0d 0e0f 1011 1213 .^.............. 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&"()*+,-./0123 0x0050: 3435 3637 4567 1 packets captured 1 packets received by filter 0 packets dropped by kernel

ФИЛЬТРАЦИЯ ПО ИСТОЧНИКАМ И НАЗНАЧЕНИЮ

Выделить трафик на основе источника или назначения очень просто, используя src и dst.

# tcpdump src 2.3.4.5 tcpdump dst 3.4.5.6

ПОИСКОВЫЕ ПАКЕТЫ ПО СЕТИ

Чтобы найти пакеты, идущие в или из определенной сети, используйте опцию net. Вы можете комбинировать это с опциями src или dst.

# tcpdump net 1.2.3.0/24

ПОКАЗАТЬ ТРАФИК СВЯЗАНЫЙ СО СПЕЦИАЛЬНЫМ ПОРТОМ

Вы можете найти определенный порт трафика, используя опцию port, за которой следует номер порта.

# tcpdump port 3389 tcpdump src port 1025

ПОКАЗАТЬ ТРАФИК ОДНОГО ПРОТОКОЛА

Если вы ищете определенный тип трафика, вы можете использовать tcp, udp, icmp и многие другие.

# tcpdump icmp

ПОКАЗАТЬ ТОЛЬКО ТРАФИК IP6

Вы также можете найти весь трафик IP6, используя опцию протокола.

НАЙДИТЕ ТРАФИК С ИСПОЛЬЗОВАНИЕМ ПОРТОВЫХ ДИАПАЗОНОВ

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

# tcpdump portrange 21-23

НАЙДИТЕ ТРАФИК НА ОСНОВЕ РАЗМЕРА ПАКЕТА

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

# tcpdump less 32 tcpdump greater 64 tcpdump <= 128

ПИСЬМЕННЫЕ ЗАПИСИ В ФАЙЛ

Часто полезно сохранять результат пакетов в файл для анализа в будущем. Эти файлы известны как файлы PCAP (PEE-cap), и их можно обрабатывать сотнями различных приложений, включая сетевые анализаторы, системы обнаружения вторжений и, конечно же, самим tcpdump. Здесь мы пишем файл с именем capture_file, используя ключ -w.

# tcpdump port 80 -w capture_file

ЧТЕНИЕ ФАЙЛОВ PCAP

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

# tcpdump -r capture_file

РАСШИРЕННЫЙ

Теперь, когда мы увидели, что мы можем сделать с основами с помощью некоторых примеров, давайте рассмотрим некоторые более сложные вещи.

ЭТО ВСЕ О КОМБИНАЦИЯХ

Делать эти различные вещи индивидуальными – мощная способность, но настоящая магия tcpdump исходит из способности сочетать варианты креативными способами, чтобы изолировать именно то, что вы ищете. Есть три способа сделать комбинации, и если вы вообще изучали программирование, они вам будут очень знакомы.

AND
and or &&

OR
or or ||

EXCEPT
not or !

Вот несколько примеров комбинированных команд.

ИЗ СПЕЦИФИЧЕСКОГО IP И НАЗНАЧАЕТСЯ ДЛЯ ОПРЕДЕЛЕННОГО ПОРТА

Давайте найдем весь трафик с 10.5.2.3 к любому хосту на порте 3389.

Tcpdump -nnvvS src 10.5.2.3 and dst port 3389

ОТ ОДНОЙ СЕТИ К ДРУГОЙ

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

Tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or172.16.0.0/16

НЕ ICMP ТРАФИК, ПЕРЕХОДЯЩИЙ В СПЕЦИФИЧЕСКИЙ IP

Это покажет нам весь трафик, идущий к 192.168.0.2, который не является ICMP.

Tcpdump dst 192.168.0.2 and src net and not icmp

ТРАФИК ОТ ХОСТА, КОТОРЫЙ НЕ В КОНКРЕТНОМ ПОРТУ

Это покажет нам весь трафик от хоста, который не является трафиком SSH (если предположить использование порта по умолчанию).

Tcpdump -vv src mars and not dst port 22

Как вы можете видеть, вы можете создавать запросы, чтобы найти практически все, что вам нужно. Ключ должен сначала определить именно то, что вы ищете, а затем построить синтаксис, чтобы изолировать определенный тип трафика.

Сложная группировка и специальные символы

Также имейте в виду, что при создании сложных запросов вам, возможно, придется группировать свои параметры, используя одинарные кавычки. Одиночные кавычки используются для того, чтобы указать tcpdump, что нужно игнорировать некоторые специальные символы — в этом случае то, что в скобках «()». Этот же метод можна использоваться для группировки с использованием других выражений, таких как хост, порт, сеть и т.д. Посмотрите на приведенную ниже команду.

# Traffic that’s from 10.0.2.4 AND destined for ports 3389 or 22 (неверно) tcpdump src 10.0.2.4 and (dst port 3389 or 22)

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

# Traffic that’s from 10.0.2.4 AND destined for ports 3389 or 22 (correct) # tcpdump "src 10.0.2.4 and (dst port 3389 or 22)"

Изолирование специфических TCP-флагов

Вы также можете захватывать трафик на основе определенных флагов (-ов) TCP.

[ПРИМЕЧАНИЕ: Фильтры ниже находят эти различные пакеты, потому что tcp замечает смещение 13 в заголовке TCP, число представляет местоположение в байте, а! = 0 означает, что данный флаг установлен в 1, т.е. он включен. ]

Показать все URGENT (URG) пакеты …

# tcpdump "tcp & 32!=0"

Показать все ACKNOWLEDGE пакеты (ACK) …

# tcpdump "tcp & 16!=0"

Показать все PUSH пакеты (PSH) …

# tcpdump "tcp & 8!=0"

Показать все RESET пакеты (RST) …

# tcpdump "tcp & 4!=0"

Показать все SYNCHRONIZE пакеты (SYN) …

# tcpdump "tcp & 2!=0"

Показать все FINISH (FIN) пакеты …

# tcpdump "tcp & 1!=0"

Показать все SYNCHRONIZE / ACKNOWLEDGE пакеты (SYNACK) …

# tcpdump "tcp=18" [Примечание: только флаг PSH, RST, SYN и FIN отображаются в выводе поля tcpdump. Отображаются URG и ACK, но они показаны в другом месте на выходе, а не в поле flags. ]

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

# tcpdump "tcp == tcp-syn"

Снять флаги RST с помощью параметра tcpflags …

# tcpdump "tcp == tcp-rst"

Снять флаги FIN с помощью параметра tcpflags…

# tcpdump "tcp == tcp-fin" [Примечание: тот же метод может быть использован и для других флагов; они были опущены в интересах экономии места. ]

Определение заслуживающего внимания трафика

Наконец, есть несколько быстрых рецептов, которые вы захотите запомнить, чтобы поймать специфический и специализированный трафик, например, неправильные / вероятно-вредоносные пакеты.

ПАКЕТЫ С ОБЫЧНЫМИ КОМПЛЕКТАМИ RST И SYN (ЭТОГО НЕ ДОЛЖНО БЫТЬ)

# tcpdump "tcp = 6"

НАЙТИ ОТКРЫТЫЙ ТЕКСТ HTTP И ПОЛУЧИТЬ ЗАПРОС

# tcpdump "tcp = 0x47455420"

НАЙДИТЕ SSH-СОЕДИНЕНИЯ НА ЛЮБОЙ ПОРТ (ЧЕРЕЗ БАННЕР)

# tcpdump "tcp[(tcp>>2):4] = 0x5353482D"

ПАКЕТЫ С TTL МЕНЬШЕ 10 (КАК ПРАВИЛО ПОКАЗЫВАЕТ ПРОБЛЕМУ ИЛИ ИСПОЛЬЗУЕТ TRACEROUTE)

# tcpdump "ip < 10"

ПАКЕТЫ С УСТАНОВКОЙ EVIL BIT

# tcpdump "ip & 128 != 0"

Заключение

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

  • Предлагаем проверенную программу и учебник экспертов из Cisco Networking Academy и Linux Professional Institute, сертифицированных инструкторов и личного куратора.
  • Поможем с трудоустройством и сделать карьеру. 100% наших выпускников трудоустраиваются.
  • Как проходит обучение?

    • Проводим вечерние онлайн-лекции на нашей платформе или обучайтесь очно на базе Киевского офиса.
    • Спросим у вас об удобном времени для практик и подстроимся: понимаем, что времени учиться мало.
    • Если хотите индивидуальный график - обсудим и осуществим.
    • Выставим четкие дедлайны для самоорганизации. Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.

    А еще поможем Вам:

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

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

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

    sudo apt install tcpdum p

    В Fedora/Red Hat/CentOS:

    sudo yum install tcpdump

    Когда установка завершится, вы можете переходить к работе.

    Команда tcpdump

    Перед тем как перейти к примерам работы с утилитой, давайте рассмотрим ее синтаксис и основные опции. Команда имеет такой синтаксис:

    $ tcpdump опции -i интерфейс фильтры

    При вызове обязательно нужно передать интерфейс, который будете отслеживать. Если интерфейс не указать, то будет использован первый в списке. Опции настраивают отображение и основные возможности утилиты, а фильтры позволяют отсеять ненужные пакеты. А теперь рассмотрим основные опции:

    • -A - выводить все пакеты в формате ASCII;
    • -c - закрыть программу после перехвата n-ого количества пакетов;
    • -C - при записи пакетов в файл, проверять размер файла, и если он больше заданного - создать новый файл;
    • -D - вывести список доступных сетевых интерфейсов;
    • -e - выводить информацию уровня соединения для каждого пакета, это может быть полезно, например, для отображения MAC адреса;
    • -f - выводить доменное имя для ip адресов;
    • -F - читать пакеты из файла, а не интерфейса;
    • -G - создавать новый файл лога через указанный промежуток времени;
    • -H - обнаруживать заголовки 802.11s;
    • -i - имя интерфейса для перехвата пакетов. Вы можете захватывать пакеты со всех интерфейсов, для этого укажите any;
    • -I - переключить интерфейс в режим монитора для захвата всех проходящих пакетов;
    • -j - установить формат Timestamp для записи пакетов;
    • -J - посмотреть доступные Timestamp;
    • -K - не проверять контрольные суммы пакетов;
    • -l - добавить поддержку прокрутки к выводу;
    • -L - вывести поддерживаемые протоколы подключения для интерфейса;
    • -n - не отображать доменные имена;
    • -r - прочитать пакеты из файла, созданного с помощью -w;
    • -v, -vv, -vvv - более подробный вывод;
    • -q - выводить минимум информации;
    • -w - записать вывод в файл;
    • -Z - пользователь, от имени которого будут создаваться файлы.

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

    Как пользоваться tcpdump

    Перед тем как перейти к использованию tcpdump нужно посмотреть какие сетевые интерфейсы вы можете использовать. Для этого запустите команду с опцией -D:

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

    sudo tcpdump -i eth0

    Чтобы остановить работу команды нажмите Ctrl+C. В выводе вы сразу же увидите все перехваченные пакеты. Формат записи для каждого пакета будет выглядеть следующим образом:

    13:03:41.795599 IP udp032919uds.hawaiiantel.net.6881 > 192.168.1.2.52055 : Flags [.], seq 640160396:640161844, ack 436677393, win 2050, options , length 1448

    Такой формат характерен для пакетов данных, в зависимости от протокола выделенный черным текст будет отличаться. Сначала идет временная метка, затем протокол, далее зеленым отмечен ip адрес отправителя, а синим адрес адресата, в данном случае, нашего компьютера. Дальше идут дополнительные параметры tcp и в конце размер пакета в байтах. Подробность вывода информации можно контролировать с помощью опций -v, Например:

    sudo tcpdump -v -i eth0

    Здесь уже появляется информация о протоколе IP:

    IP (tos 0x0, ttl 64 , id 50309, offset 0, flags , proto TCP (6) , length 64)

    Мы можем узнать информацию о времени жизни пакета ttl, версию протокола TCP и длину поля заголовка. Опция -vv будет выводить проверку контрольных сумм пакета и содержимое в некоторых случаях.

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

    • host - имя хоста;
    • ip - ip адрес;
    • proto - протокол;
    • net - адрес сети или подсети;
    • port - адрес порта;
    • src - параметр, касающийся отправителя;
    • dst - параметр, касающейся получателя;
    • Доступны такие протоколы: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp и udp .

    Вы можете все это комбинировать между собой, чтобы получить желаемый результат. Рассмотрим более детально на примерах. Отсеем только пакеты, адресованные нашему компьютеру:

    sudo tcpdump -i eth0 ip dst 192.168.1.2

    Также мы можем отобрать пакеты, отправляемые на определенный узел:

    sudo tcpdump -i eth0 dst host google-public-dns-a.google.com

    Как видите, это DNS пакеты и здесь вместо флагов TCP содержится полезная информация, запрос ip адреса хоста. Также вы можете выбрать ответные пакеты от определенного хоста:

    sudo tcpdump -i eth0 src host google-public-dns-a.google.com

    Здесь нет полного содержимого пакета, если вы хотите его получить нужно использовать опцию -v или -vv:

    sudo tcpdump -vv -i eth0 host dst google-public-dns-a.google.com

    С помощью оператора and вы можете объединить несколько фильтров в один:

    sudo tcpdump -i eth0 dst host google-public-dns-a.google.com and src host google-public-dns-a.google.com

    Из операций объедения доступны and и or, также можно применять скобки для обозначения приоритета. Вам необязательно указывать host, во многих случаях достаточно src или dst, утилита сама поймет что имелось в виду. Точно такую же конструкцию можно использовать для портов. Например, мы можем отсеять все запросы или ответы к DNS (на порт 53):

    sudo tcpdump -vv -i eth0 port 53

    Точно такое же можно провернуть для http (порт 80):

    sudo tcpdump -vv -i eth0 port 80

    Естественно, тут тоже можно применять dst и src для более конкретных результатов. Вы можете фильтровать не один порт, а целый диапазон портов:

    sudo tcpdump portrange 21-23

    Если указать один из протоколов, вы отфильтруете только пакеты этого протокола, например tcp, udp или arp:

    sudo tcpdump -vv arp

    Точно также можно выбрать все udp пакеты:

    sudo tcpdump -vv udp

    Также доступен фильтр по обозначению сети:

    sudo tcpdump net 129.168.1.1/24

    Кроме того, вы можете фильтровать пакеты по их размеру, например, меньше 32 байт:

    sudo tcpdump less 32

    Или больше 128:

    tcpdump greater 128

    sudo tcpdump -i eth0 -w file.pcap

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

    sudo tcpdump -r file.pcap

    Остался еще один момент, на который стоит обратить внимание. Это формат отображения содержимого пакетов. Вы можете вывести содержимое пакета в формате ASCII используйте опцию -A:

    sudo tcpdump -A -i eth0

    Также вы можете отобразить содержимое в формате HEX и ASCII для этого используйте -XX:

    sudo tcpdump -XX -i eth0

    Выводы

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

    На завершение видео с лекцией о tcpdump:

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

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

    С помощью tcpdump можно:

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

    Чтобы установить tcpdump на debian/ubuntu/linux mint нужно выполнить:

    # sudo apt-get install tcpdump

    Для того чтобы установить tcpdump на RedHat/CentOS/Fedora используйте:

    # sudo yum install tcpdump

    Для того чтобы установить tcpdump на MacOS используйте.

    # brew install tcpdump

    Использование tcpdump.

    Чтобы проверить работает ли у нас tcpdump можно выполнить команду:

    # tcpdump -i eth0 port 80

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

    Если нужно узнать какими пакетами обменивается 21 сервера (например your_server_1 и your_server_2), то для этого служит команда:

    # tcpdump host your_server_1 and your_server_2

    Если нужно отслеживать только исходящие пакеты из хоста, то выполните:

    # tcpdump src host your_server

    Если нужно отслеживать только входящие пакеты из хоста, то выполните:

    # tcpdump dst host your_server

    Так же можно прослушивать исходящие или входящие пакеты с сервера и по определенному порту для этого просто добавьте порт который нужно прослушивать (в основном используется 80, 8080).

    См. список интерфейсов, по которым tcpdumt можете слушать:

    # tcpdump -D

    Слушать интерфейс eth0:

    # tcpdump -i eth0

    Слушать на любом доступном интерфейсе (Требуется ядро Linux версии 2.2 или выше):

    # tcpdump -i any

    Вывод всего на экран (все что выполняется программой):

    # tcpdump -v

    Вывод много чего на экран (все что выполняется программой):

    # tcpdump -vv

    Вывод очень много всего на экран (все что выполняется программой):

    # tcpdump -vvv

    Выводить не сильно много информации когда идет захват пакетов (не как стандартный):

    # tcpdump -q

    Ограничить захват пакетов до 100:

    # tcpdump -c 100

    Записать все данные (перехваченные пакеты) в файл с именем capture.cap:

    # tcpdump -w capture.cap

    Записать все данные (перехваченные пакеты) в файл с именем capture.cap и вывести на экран в режиме реального времени:

    # tcpdump -v -w capture.cap

    Вывод пакетов с файла capture.cap:

    # tcpdump -r capture.cap

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

    # tcpdump -vvv -r capture.cap

    Вывод IP и порты вместо доменов идет захват пакетов:

    # tcpdump -n

    Захват любых пакетов, где хост назначения — 192.138.1.1. Вывод ИП и порты на экран:

    # tcpdump -n dst host 192.138.1.1

    # tcpdump -n src host 192.138.1.1

    Захват любых пакетов c хоста 192.138.1.1. Вывод ИП и порты на экран:

    # tcpdump -n host 192.138.1.1

    Захват пакетов где сеть 192.138.1.0/24. Вывод ИП и порты на экран:

    # tcpdump -n dst net 192.138.1.0/24

    # tcpdump -n src net 192.138.1.0/24

    Захват пакетов с сети 192.138.1.0/24. Вывод ИП и порты на экран:

    # tcpdump -n net 192.138.1.0/24

    Захват пакетов с порта 23. Вывод ИП и порты на экран:

    # tcpdump -n dst port 23

    Захват пакетов с портов 1 по 1023. Вывод ИП и порты на экран:

    # tcpdump -n dst portrange 1-1023

    Захватывать только TCP пакеты где destination на портах 1 по 1023. Вывод ИП и порты на экран:

    # tcpdump -n tcp dst portrange 1-1023

    Захватывать только UDP пакеты где destination на портах 1 по 1023. Вывод ИП и порты на экран:

    # tcpdump -n udp dst portrange 1-1023

    Захват пакетов с destination где ИП 192.138.1.1 и destination порт которого 23. Вывод на экран:

    # tcpdump -n "dst host 192.138.1.1 and dst port 23"

    Захват пакетов с destination где ИП 192.138.1.1 и destination по портам 80 или 443. Выводим на экран:

    # tcpdump -n "dst host 192.138.1.1 and (dst port 80 or dst port 443)"

    Захват любых ICMP пакетов:

    # tcpdump -v icmp

    Захват любых ARP пакетов:

    # tcpdump -v arp

    Захват любых ICMP или ARP пакетов:

    # tcpdump -v "icmp or arp"

    Захват любых пакетов которые broadcast или multicast:

    # tcpdump -n "broadcast or multicast"

    Захват больших пакетов (500 байт) а не стандартных 68б:

    # tcpdump -s 500

    Захват всех байт данных в пакете:

    # tcpdump -s 0

    Просмотр «тяжелых пакетов»:

    # tcpdump -nnvvXSs 1514

    Захват пакетов ICMP с ping и pong:

    # tcpdump -nnvXSs 0 -c2 icmp

    Вывод без многих вариантов:

    # tcpdump -nS

    Основные коммуникации (очень подробный режим), можно увидеть хороший объем трафика, с многословием:

    # tcpdump -nnvvS

    Глубокий взгляд на трафик, добавляет -X для полезной нагрузки:

    # tcpdump -nnvvXS

    Просмотр тяжелого пакета и увеличивает snaplength, захватывая весь пакет:

    # tcpdump -nnvvXSs 1514

    Вы можете также фильтровать на основе определенных частей пакета, а также объединить несколько условий в группы. Это полезно при поиске только SYNs или РСТ, например, и последний для еще более расширенный изоляцией трафика.

    Показать мне все URGENT (URG) пакеты:

    # tcpdump "tcp & 32!=0"

    Показать мне всеACKNOWLEDGE (ACK) пакеты:

    # tcpdump "tcp & 16!=0"

    Показать мне все PUSH (PSH) пакеты:

    # tcpdump "tcp & 8!=0"

    Показать мне все RESET (RST) пакеты:

    # tcpdump "tcp & 4!=0"

    Показать мне все SYNCHRONIZE (SYN) пакеты:

    # tcpdump "tcp & 2!=0"

    Показать мне все FINISH (FIN) пакеты:

    # tcpdump "tcp & 1!=0"

    Показать мне все SYNCHRONIZE/ACKNOWLEDGE (SYNACK) пакеты:

    # tcpdump "tcp=18"

    Захват TCP Flags используя tcpflags:

    # tcpdump "tcp & & tcp-syn != 0"

    Пакеты с RST и SYN флагами (проверка):

    # tcpdump "tcp = 6"

    Траффик с ‘Evil Bit"(проверка):

    # tcpdump "ip & 128 != 0"

    На этом я завершу свою статью «установка и использование tcpdump», надеюсь все ясно и понятно.

    Довольно часто в системном администрировании возникают ситуации, для которых необходимо видеть подробную «картину» того, что происходит с передачей данных по сети. Проследить за трафиком и выявить проблемы в таких случаях позволяют утилиты-анализаторы пакетов. Одной из таких (и самой распространённой) является tcpdump – стандартный анализатор пакетов для Linux-систем.

    Кроме tcpdump существуют и другие инструменты для анализа сетевого трафика, например такие как Wireshark и Tshark, которые являются усовершенствованными версиями tcpdump, но стандартным и до сих пор эффективным остаётся утилита tcpdump. С её помощью можно перехватывать, фильтровать по определённому критерию, а также выводить пакеты. Нужно заметить, что для полноценного доступа к пакетам необходимо запускать tcpdump от имени суперпользователя, поскольку сами пакеты - это низкоуровневые объекты системы. Кроме этого существуют определённые условия, в зависимости от сетевого оборудования, которые позволяют (или не позволяют) перехватывать все или только определённые пакеты или предоставлять только определённую информацию о них. Сетевое оборудование (сетевая карта, маршрутизатор и т. д.) должны поддерживать/разрешать доступ к пакетам, т. е. иметь (или предоставлять) механизм для передачи сведений о пакетах на более высокий программный уровень и в этом случае tcpdump, как впрочем и другие анализаторы пакетов, оказываются максимально эффективными. Кстати, аппаратные интерфейсы, если они работают в режиме «promiscuous mode», т. е. в так называемом «беспорядочном» режиме, позволяют системному ядру «видеть» все пакеты, т. е. даже и те, что адресуются для других компьютеров и устройств.

    Принцип работы tcpdump

    Как уже отмечалось, tcpdump является стандартной утилитой для анализа сетевого трафика в дистрибутивах Linux. Автором утилиты является Ван Якобсон. За всё время своего применения tcpdump проявил себя как весьма эффективный и надёжный инструмент. Поэтому в настоящее время многие аналоги в качестве основного формата файлов для чтения/записи результатов трассировки трафика используют формат tcpdump – libcap.

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

    tcpdump опции

    Для задания нужного сетевого интерфейса следует использовать опцию -i. Если необходимо знать адреса устройств (компьютеров, оборудования), то нужно задавать опцию -n. Это также очень полезно при проблемах с DNS. Опция -r позволяет читать информацию о пакетах из файла. Когда необходимы более подробные сведения о пакетах - поможет опция -v. Также существует опция -w для фиксирования информации в файле. Следует отметить, что в случае использования опции -w в файл записывается информация только о заголовках пакетов. Опция -s со значением 1056 (хотя это значение зависит от размера MTU-пакета) позволяет (совместно с -w) писать в файл дополнительную информацию. Объёмы данных могут быть очень большими и сложными по своей структуре (несмотря на то, что это текст) и поэтому в дальнейшем для их обработки рекомендуется использовать соответствующие высокопроизводительные утилиты, например .

    Формат команды tcpdump следующий:

    tcpdump [-опции] [фильтры]

    В официальной документации (команда man tcpdump) можно найти несколько примеров использования этой утилиты для разных случаев с применением довольно разнообразных и сложных фильтров.

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

    Наиболее часто используемые ключи при запуске tcpdump приведены таблице

    ключ

    описание

    Преобразовывает сетевые и широковещательные адреса в доменные имена.

    Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров.

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

    Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию - eth0, для выбора всех интерфейсов - any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo.

    Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:

    shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log

    Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит ‘net’ вместо ‘net.library.org’

    Отображает IP-адрес вместо имени хоста.

    Отображает номер порта вместо используемого им протокола.

    Не переводит интерфейс в режим приема всех пакетов (promiscuous mode).

    Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных.

    Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w.

    Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number - ISN) в относительные.

    Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet).

    Не отображает метку времени в каждой строке.

    Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb.

    Отображает неформатированную метку времени в каждой строке.

    Показывает время вместе с датой.

    Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)

    Вывод ещё более полной информации, в основном касается NFS и SMB.

    Вывод максимально подробной информации.

    Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w —

    Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s

    -x , но включает в себя заголовок канального уровня

    Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения.

    То же, что и предыдущий параметр -X , но включает заголовок канального уровня.

    tcpdump завершит работу после получения указанного числа пакетов.

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

    Фильтры tcpdump

    Фильтры разделяются на следующие классификации

    host — адрес узла сети

    port – порт на котором нужно ловить пакеты

    portrange – диапазон портов

    net – сеть

    Tcpdump net 192.168.0.0/24

    захват всего трафика в котором в качестве источника или получателя стоят ip адреса из сети 192.168.0.0/24

    Tcpdump port 80

    Будет захватываться весь трафик на 80-м порту.

    Направление трафика по отношению к объекту мониторинга

    src – отправитель

    dst — получатель

    например команда

    Src host 172.31.25.200

    Захват трафика у которого отправитель ip адрес 172.31.25.200

    Протокол

    ether – базовая сетевая технология Ethernet, как правило указывает на то что в фильтре используется аппаратный MAC адрес

    ip – протокол IPv4

    ip6 – протокол IPv6

    arp – протокол ARP

    tcp – протокол TCP

    udp – протокол UDP

    Если протокол не указан, то будет захвачен трафик по все протоколам

    Например команда

    Udp port 5060

    захват трафика по протоколу udp порт 5060

    Составные фильтры

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

    «И» – and (&&)

    «ИЛИ» – or (||)

    «НЕ» – not (!) – инверсия значения

    При этом приоритет этих операций следующий:

    наивысшим приоритетом обладает операция инверсии

    потом логическое «И»

    наименьшим приоритетом обладает операция «ИЛИ».

    Приоритет операций можно менять с помощью круглых скобок.

    (net 172.16.0.0/24 or host 172.31.0.5) and tcp port 80

    захват трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5, как любому хосту по отдельности так и вместе

    (net 172.16.0.0/24 || host 172.31.0.5) && not tcp port 80

    захват любого трафика кроме трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5 как любому хосту по отдельности так и вместе

    tcpdump linux примеры

    Запись вывода в файл

    $ sudo tcpdump -w sshtrace.tcpdump tcp port 22

    Файл sshtrace.tcpdump при этом будет по-умолчанию создан в домашнем каталоге текущего пользователя. Для вывода информации из файла myrouter.tcpdump следует использовать опцию -r:

    $ tcpdump -r sshtrace.tcpdump

    Снять весь трафик с интерфейса eth1

    $ tcpdump –i eth1

    Снять трафик с диапазона портов на интерфейсе eth1

    $ tcpdump -i eth1 portrange 100-200

    весь трафик, идущий к 172.16.0.1, который не является ICMP.

    Для UNIX-систем есть множество самых разнообразных снифферов и анализаторов трафика с удобным графическим интерфейсом и богатым набором функций. Но ни один из них не может сравниться в гибкости, универсальности и распространенности со старым как мир tcpdump. Эта утилита входит в состав многих дистрибутивов Linux и всех BSD-систем из коробки и сможет выручить тебя, когда другие средства будут недоступны.

    Введение

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

    Tcpdump появился на свет почти 25 лет назад в университете Беркли, до сих пор активно развивается и продолжает оставаться эталоном среди подобных инструментов для операционной системы UNIX. Разработанная специально для него библиотека захвата пакетов libpcap сегодня используется чуть ли не каждым сниффером для UNIX-систем и многими аналогичными программами для Windows.

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

    Наедине с консолью

    Попробуем разобраться, как работает tcpdump и с какой стороны следует к нему подходить. Открой терминал и запусти программу с правами пользователя root (как и любой сниффер, tcpdump должен иметь полный доступ к сетевым интерфейсам), указав имя сетевого интерфейса и ограничив количество выводимых пакетов десятью:

    # tcpdump -i wlan0 -c 10 -n

    Ключ -n отключает преобразование IP-адресов в DNS-имена. Теперь попытаемся отследить обмен только с конкретным хостом, например с домашним роутером:

    # tcpdump -i wlan0 -c 10 -n host 192.168.0.1 and port 53

    Давай посмотрим, что же нам вывел tcpdump, на примере двух строк, представленных на скриншоте «DNS-запрос глазами tcpdump». Можно легко понять, что это DNS-запрос (порт 53) с хоста 192.168.0.101 хосту 192.168.0.1 и последующий за ним ответ. Но что значат все остальные цифры и знаки?


    Цифры 16:22:41.340105 - это время отправки пакета, включая миллионные доли секунды (так называемый frac). Две буквы IP, как нетрудно догадаться, идентифицируют используемый протокол сетевого уровня, далее следуют адрес: порт отправки и адрес: порт назначения пакета. Все, что идет после двоеточия, напрямую зависит от используемого протокола транспортного или прикладного уровня. С некоторыми протоколами tcpdump знаком и умеет расшифровывать их до понятного человеку вида, другие он оставляет как есть и просто приводит содержимое пакета. В данном случае tcpdump расшифровал DNS-сообщения и вернул строку 49244+ A? ya.ru. (23) , что означает: был послан запрос (A?) адреса, ассоциированного с именем ya.ru., общая длина пакета за вычетом TCP/IP-заголовков составила 23 байт. Первая цифра - это идентификатор запроса.

    В следующей строке мы видим ответ, формат представления которого практически аналогичен запросу, с той лишь разницей, что теперь после идентификатора запроса идет информация о количестве найденных записей (8/2/3) и сами записи (A 213.180.204.3, A 77.88.21.3, A 87.250.250.3...).

    В арсенале tcpdump есть поддержка многих протоколов, благодаря чему он может представить в читаемом виде информацию о протоколах TCP, UDP и ICMP, SMB/CIFS, NFS, AFS, AppleTalk. Но что, если tcpdump ничего не знает об используемом протоколе прикладного уровня или не может определить его? В обычной ситуации он просто выведет информацию о пакете. Она может выглядеть примерно так:

    Flags [.], seq 3666073194:3666074622, ack 3281095139, win 2000, options , length 1428

    Это TCP-пакет, формат представления информации о котором в tcpdump следующий (поля разделяются запятыми):

    • flags - установленные флаги. Обозначаются символами S (SYN), F (FIN), P (PUSH) и R (RST), точка означает отсутствие установленных флагов;
    • data-seqno - описывает данные, содержащиеся в пакете, в таком формате: first:last, где first и last - номер последовательности первого и последнего байта передаваемых данных, nbytes;
    • ack - следующий номер последовательности (ISN + 1);
    • window - размер окна;
    • options - здесь могут указываться дополнительные сведения, например (максимальный размер сегмента);
    • length - длина пакета.

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

    # tcpdump -i wlan0 -c 10 -n -X host 192.168.0.1 and port 80

    Эту функцию очень удобно использовать для анализа протоколов, в которых передача данных идет открытым текстом, например HTTP. Для бинарных протоколов и протоколов с шифрованием она, конечно же, будет бесполезна.
    Кроме того, для получения дополнительных сведений о пакете можно использовать флаг -v. Тогда после IP в скобках появится подробная информация об IP-пакете:

    (tos 0x0, ttl 64, id 8339, offset 0, flags , proto UDP (17), length 51)

    В общем-то, здесь все довольно прозаично. Вначале идет тип обслуживания (TOS), далее время жизни пакета (TTL), идентификатор пакета, смещение от начала первого пакета в цепочке, флаги, используемый прокол транспортного уровня (TCP, UDP, ICMP) и длина.


    Продвинутые возможности

    Мы уже рассмотрели большинство самых важных возможностей tcpdump, но его функциональность намного шире. Например, мы использовали операторы host и port для указания нужных нам адреса и порта для фильтрации вывода, но что, если нам надо увидеть только пакеты, идущие к указанному адресу, но не исходящие с него? Для этого можно использовать оператор src:

    # tcpdump -i wlan0 -c 10 -n src 192.168.0.1

    Есть и его обратный вариант dst, предназначенный для указания адреса назначения. Как было показано выше, все операторы можно комбинировать с помощью оператора and (мониторинг сетевого трафика, исключая SSH-сессии и DNS-запросы):

    # tcpdump -i wlan0 port not 22 and port not 53

    Также можно использовать or (или) и except (не). Кроме того, tcpdump понимает диапазоны портов:

    # tcpdump -i wlan0 -c 10 -n portrange 21-23

    Умеет отфильтровывать пакеты по их размеру:

    # tcpdump -i wlan0 -c 10 -n > 32 and <= 128

    И понимает маски подсетей:

    # tcpdump -i wlan0 c 10 -n src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

    Одна из самых интересных возможностей tcpdump - это умение фильтровать пакеты по содержанию конкретных битов или байтов в заголовках протоколов. Для этого используется такой формат: proto, где proto - протокол, expr - смещение в байтах от начала заголовка пакета, а size - необязательное поле, указывающее на длину рассматриваемых данных (по умолчанию 1 байт). Например, чтобы отфильтровать только пакеты с установленным флагом SYN (инициация TCP-рукопожатия), следует использовать такую запись:

    # tcpdump "tcp==2"

    Как это работает? Очень просто. 13 байт TCP-заголовка содержит флаги, ровно восемь штук, по биту на каждый. Под флаг SYN отведен второй бит. Приведенная запись просто проверяет факт установки этого бита. Кстати, более читаемый вид этой записи будет выглядеть так:

    # tcpdump "tcp & tcp-syn != 0"

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

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

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

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

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

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



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

    192.168.0.100.48585 > 192.168.0.111.22: Flags [S], seq 1679394613, ... 192.168.0.111.22 > 192.168.0.100.48585: Flags , seq 625029896, ack 1679394614, ... 192.168.0.100.48585 > 192.168.0.111.22: Flags [R], seq 1679394614, ...

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

    16:41:48.798310 IP 192.168.0.100.61020 > 192.168.0.111.18869: UDP, length 0 16:41:48.798346 IP 192.168.0.111 > 192.168.0.100: ICMP 192.168.0.100 udp port 18869 unreachable, length 36

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

    192.168.0.100.39132 > 192.168.0.111.256: Flags , win 3072, length 0 192.168.0.111.256 > 192.168.0.100.39132: Flags , ...

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

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

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

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

    16:43:06.008305 IP 192.168.0.100 > 192.168.0.111: ICMP type-#68, length 1032 16:43:06.008383 IP 192.168.0.100 > 192.168.0.111: ICMP type-#34, length 1032 16:43:06.008714 IP 192.168.0.100 > 192.168.0.111: ICMP type-#183, length 1032 16:43:06.008831 IP 192.168.0.100 > 192.168.0.111: ICMP type-#192, length 1032

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

    Взаимодействие с другими программами

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

    $ ssh [email protected] tcpdump -w - "port !22" | wireshark -k -i -

    Здесь мы использовали опцию -w - для записи дампа в стандартный вывод и перенаправили его wireshark, работающему на локальной машине. Таким же образом можно проанализировать трафик с помощью snort:

    $ ssh [email protected] "tcpdump -nn -i eth1 -w -" | snort -c /etc/snort/snort.conf -r -

    Перенаправив вывод программы на вход grep, можно найти различные проблемы в работе сети, например выявить пакеты с неправильной контрольной суммой, вывести информацию о которой можно с помощью флага -vv:

    # tcpdump -nnvv -r dump.cap tcp | grep -v "tcp sum ok" | wc –l

    Админские штучки

    Возможность фильтрации пакетов по данным, содержащимся в заголовке, которую мы рассмотрели в начале первого раздела, очень удобно использовать для отладки различных протоколов и поиска сетевых проблем. Например, мы можем применить ее для отлова сетевых пакетов, передаваемых по протоколу Cisco Discovery Protocol, по которому маршрутизаторы Cisco обмениваются информацией о топологии и состоянии сети:

    # tcpdump -nn -v -i eth0 -s 1500 -c 1 "ether == 0?2000"

    Таким же образом можно отловить все пакеты, передаваемые по протоколу DHCP (DISCOVER, REQUEST, INFORM), чтобы выявить проблемы подключения клиентов:

    # tcpdump -i eth0 -vvv -s 1500 "((port 67 or port 68) and (udp = 0x1))"

    Или поймать пакеты, передаваемые в рамках POP3-аутентификации:

    # tcpdump -i eth0 "tcp port pop3 and ip = 85 and ip = 83" -s 1500 -n

    Сетевой grep

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

    Например, чтобы найти параметры, передаваемые методами GET и POST в рамках HTTP-сессии, можно использовать следующую команду:

    # ngrep -l -q -d eth0 "^GET |^POST " tcp and port 80

    Выявляем бездельников:

    # ngrep -i "game*|p0rn|adult" -W byline -d eth0 > slackers.txt

    Анализируем SMTP-трафик на всех сетевых интерфейсах:

    # ngrep -i "rcpt to|mail from" tcp port smtp

    Опции tcpdump

    Таблица наиболее интересных и полезных флагов tcpdump.

    • -i [интерфейс] - прослушиваемый сетевой интерфейс, для всех следует указать any.
    • -n - не преобразовывать IP-адреса в DNS-имена.
    • -nn - не преобразовывать IP-адреса и номера портов.
    • -X - показывать содержимое пакета в текстовом и шестнадцатеричном форматах.
    • -XX - то же самое плюс содержимое Ethernet-фрейма.
    • -v, -vv, -vvv - увеличить количество показываемой информации и пакетов (больше, еще больше, все).
    • -c [n] - показывать только первые n пакетов.
    • -s [n] - количество байтов, отображаемых для каждого пакета (можно уменьшить для удобства чтения или увеличить для получения большей информации).
    • -S - показывать абсолютные номера TCP-последовательности (TCP sequence numbers).
    • -e - показывать заголовки Ethernet-фреймов.
    • -q - показывать меньше информации (для удобства чтения).
    • -E - расшифровать IPsec-трафик с помощью указанного ключа.
    • -w - сохранить дамп программы в файл, аргумент - используется для указания stdout.

    Выводы

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

    Похожие публикации