Tcpdump — главный инструмент сетевого анализа для специалистов по информационной безопасности. Для тех, кто хочет получить полное представление о TCP / IP обязательно нужно обладать достаточным пониманием этого важного приложения. Многие предпочитают использовать инструменты более высокого уровня, такие как Wireshark, но я считаю это ошибкой.
Когда используешь инструмент, который отображает сетевой трафик более естественным (простым) способом, сложность анализа взваливается непосредственно на человека, а не на приложение. Этот подход развивает понимание набора TCP / IP, именно поэтому я настоятельно рекомендую использовать tcpdump вместо других инструментов, когда это возможно.
15:31:34.079416 IP (tos 0x0, ttl 64, id 20244, offset 0, flags [DF],
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 [none], 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 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] замечает смещение 13 в заголовке TCP, число представляет местоположение в байте, а ! = 0 означает, что данный флаг установлен в 1, т.е. он включен. ]
Показать все URGENT (URG) пакеты …
# tcpdump 'tcp[13] & 32!=0'
Показать все ACKNOWLEDGE пакеты (ACK) …
# tcpdump 'tcp[13] & 16!=0'
Показать все PUSH пакеты (PSH) …
# tcpdump 'tcp[13] & 8!=0'
Показать все RESET пакеты (RST) …
# tcpdump 'tcp[13] & 4!=0'
Показать все SYNCHRONIZE пакеты (SYN) …
# tcpdump 'tcp[13] & 2!=0'
Показать все FINISH (FIN) пакеты …
# tcpdump 'tcp[13] & 1!=0'
Показать все SYNCHRONIZE / ACKNOWLEDGE пакеты (SYNACK) …
# tcpdump 'tcp[13]=18'
[Примечание: только флаг PSH, RST, SYN и FIN отображаются в выводе поля tcpdump. Отображаются URG и ACK, но они показаны в другом месте на выходе, а не в поле flags. ]
Однако, как и в случае с самыми мощными инструментами, существует множество способов сделать то, что нужно. В следующем примере показан другой способ захвата пакетов со специфическими наборами TCP-флагов.
# tcpdump 'tcp[tcpflags] == tcp-syn'
Снять флаги RST с помощью параметра tcpflags …
# tcpdump 'tcp[tcpflags] == tcp-rst'
Снять флаги FIN с помощью параметра tcpflags…
# tcpdump 'tcp[tcpflags] == tcp-fin'
[Примечание: тот же метод может быть использован и для других флагов; они были опущены в интересах экономии места. ]
Определение заслуживающего внимания трафика
Наконец, есть несколько быстрых рецептов, которые вы захотите запомнить, чтобы поймать специфический и специализированный трафик, например, неправильные / вероятно-вредоносные пакеты.
ПАКЕТЫ С ОБЫЧНЫМИ КОМПЛЕКТАМИ RST И SYN (ЭТОГО НЕ ДОЛЖНО БЫТЬ)
# tcpdump 'tcp[13] = 6'
НАЙТИ ОТКРЫТЫЙ ТЕКСТ HTTP И ПОЛУЧИТЬ ЗАПРОС
# tcpdump 'tcp[32:4] = 0x47455420'
НАЙДИТЕ SSH-СОЕДИНЕНИЯ НА ЛЮБОЙ ПОРТ (ЧЕРЕЗ БАННЕР)
# tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'
ПАКЕТЫ С TTL МЕНЬШЕ 10 (КАК ПРАВИЛО ПОКАЗЫВАЕТ ПРОБЛЕМУ ИЛИ ИСПОЛЬЗУЕТ TRACEROUTE)
# tcpdump 'ip[8] < 10'
ПАКЕТЫ С УСТАНОВКОЙ EVIL BIT
# tcpdump 'ip[6] & 128 != 0'
Заключение
tcpdump — это ценный инструмент для всех, кто хочет вступить в сетевую или информационную безопасность.
Необычный способ взаимодействия с трафиком в сочетании с точностью, которую он предоставляет при проверке пакетов, делает его наилучшим инструментом для изучения TCP / IP.
Анализаторы протоколов, такие как Wireshark, великолепны, но если вы хотите действительно овладеть пакетами, вы должны сначала овладеть tcpdump.
В общем, этот учебник должен помочь вам стать сильным, но страница руководства всегда должна быть удобной для самых продвинутых и одноразовых сценариев использования. Я искренне надеюсь, что это было полезно вам, и не стесняйтесь обращаться ко мне, если у вас есть какие-либо вопросы.
Спасибо за уделенное время на прочтение статьи!
Если возникли вопросы, задавайте их в комментариях.