Подробное руководство по использованию tcpdump артефакта захвата сетевых пакетов

Linux

Оригинальная ссылка:Пример учебника по Tcpdump

Основное содержание этой статьи переведено с《Примеры TCPDump》.

tcpdumpЭто мощный инструмент захвата сетевых пакетов, который используетlibpcapБиблиотека для захвата сетевых пакетов, эта библиотека доступна почти во всех Linux/Unix. Знакомство с использованием tcpdump может помочь вам анализировать и отлаживать сетевые данные.Эта статья представит его использование в различных сценариях на конкретных примерах. Независимо от того, являетесь ли вы системным администратором, программистом, облачным инженером или инженером yaml, освоение tcpdump может дать вам большую власть, продвижение по службе и увеличение заработной платы.

1. Основной синтаксис и использование

tcpdumpОбычно используются следующие параметры:

$ tcpdump -i eth0 -nn -s0 -v port 80
  • -i: выберите интерфейс для захвата, обычно карта Ethernet или беспроводная карта, или это может бытьvlanили другой специальный интерфейс. Нет необходимости указывать, если в этой системе есть только один сетевой интерфейс.
  • -nn: один n означает, что имя домена не разрешено, и IP отображается напрямую, два n означают, что имя домена и порт не разрешены. Это не только удобно для просмотра IP-адресов и номеров портов, но также очень эффективно при извлечении больших объемов данных, поскольку разрешение доменных имен может замедлить сканирование.
  • -s0: tcpdump будет перехватывать только перед96Содержимое байтов, чтобы перехватить все содержимое сообщения, вы можете использовать-s number,numberЭто количество байт сообщения, которое вы хотите перехватить.Если оно равно 0, это означает, что перехватывается все содержимое сообщения.
  • -v: использовать-v,-vvи-vvvдля отображения более подробной информации, обычно дополнительной информации, относящейся к конкретному протоколу.
  • port 80: это общий фильтр портов, который означает только сканирование80Трафик на порту, обычно HTTP.

Введем еще несколько часто используемых параметров:

  • -p: Не переводите сетевой интерфейс в неразборчивый режим. По умолчанию при использовании tcpdump для захвата пакетов сетевой интерфейс переходит в неразборчивый режим. Как правило, компьютерные сетевые карты работают в неслучайном режиме, в это время сетевая карта принимает данные только с адреса назначения сетевого порта, который указывает на себя. Когда сетевая карта работает в неразборчивом режиме, сетевая карта захватывает все данные с интерфейса и передает их соответствующему драйверу. Если на коммутаторе, к которому подключено устройство, включен неразборчивый режим, используйте-pвозможность эффективно фильтровать шум.
  • -e: Отображает информацию о слое канала передачи данных. По умолчанию tcpdump не отображает информацию о канальном уровне, используйте-eПараметры могут отображать MAC-адреса источника и получателя, а также информацию о тегах VLAN. Например:
$ tcpdump -n -e -c 5 not ip6

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br-lan, link-type EN10MB (Ethernet), capture size 262144 bytes
18:27:53.619865 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 1162: 192.168.100.20.51410 > 180.176.26.193.58695: Flags [.], seq 2045333376:2045334484, ack 3398690514, win 751, length 1108
18:27:53.626490 00:e2:69:23:d3:3b > 24:5e:be:0c:17:af, ethertype IPv4 (0x0800), length 68: 220.173.179.66.36017 > 192.168.100.20.51410: UDP, length 26
18:27:53.626893 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 1444: 192.168.100.20.51410 > 220.173.179.66.36017: UDP, length 1402
18:27:53.628837 00:e2:69:23:d3:3b > 24:5e:be:0c:17:af, ethertype IPv4 (0x0800), length 1324: 46.97.169.182.6881 > 192.168.100.20.59145: Flags [P.], seq 3058450381:3058451651, ack 14349180, win 502, length 1270
18:27:53.629096 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 54: 192.168.100.20.59145 > 192.168.100.1.12345: Flags [.], ack 3058451651, win 6350, length 0
5 packets captured

Показать строку ASCII

-Aуказать использованиеASCIIСтрока выводит все данные сообщения, что может упростить чтение и использование.grepи другие инструменты для анализа вывода.-XУказывает, что как шестнадцатеричный, так иASCIIСтрока выводит все данные сообщения. Эти два параметра нельзя использовать вместе. Например:

$ tcpdump -A -s0 port 80

Захват данных для определенного протокола

Вы можете следить за именем протокола, чтобы фильтровать трафик определенного протокола.В качестве примера возьмем UDP, вы можете добавить параметр udp илиprotocol 17, обе команды означают одно и то же.

$ tcpdump -i eth0 udp
$ tcpdump -i eth0 proto 17

Точно так же tcp иprotocol 6значит то же самое.

Получить данные для определенного хоста

использовать фильтрhostМожет сканировать трафик для определенных целевых и исходных IP-адресов.

$ tcpdump -i eth0 host 10.10.1.1

также можно использоватьsrcилиdstЗахватите только источник или пункт назначения:

$ tcpdump -i eth0 dst 10.10.1.20

Записать очищенные данные в файл

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

-wОпции используются для вывода дейтаграмм в файл:

$ tcpdump -i eth0 -s0 -w test.pcap

режим линейного буфера

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

$ tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'

Комбинированные фильтры

Настоящая сила фильтров заключается в том, что вы можете комбинировать их по своему усмотрению, а логика их соединения обычно используется.与/AND/&&,或/OR/||и非/not/!.

and or &&
or or ||
not or !

2. Фильтры

Что касается фильтра tcpdump, то здесь его необходимо представить отдельно.

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

Фильтр хостов

Host filter используется для фильтрации пакетов данных хоста. Например:

$ tcpdump host 1.2.3.4

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

$ tcpdump src host 1.2.3.4

Сетевой фильтр

Сетевой фильтр используется для фильтрации данных определенного сегмента сети с помощьюCIDRмодель. Можно использовать четверные (x.x.x.x), тройные (x.x.x), двойные (x.x) и унарные (x) числа. Четверка указывает на определенный хост, а тройка указывает на то, что маска подсети255.255.255.0, два кортежа означают, что маска подсети255.255.0.0, кортеж, указывающий, что маска подсети255.0.0.0. Например,

Захватить все сегменты сети, отправленные на192.168.1.xили из сегмента сети192.168.1.xИсходящий трафик:

$ tcpdump net 192.168.1

Захватить все сегменты сети, отправленные на10.x.x.xили из сегмента сети10.x.x.xИсходящий трафик:

$ tcpdump net 10

Как и в случае с фильтром Host, здесь также можно указать источник и место назначения:

$ tcpdump src net 10

Также можно использовать формат CIDR:

$ tcpdump src net 172.16.0.0/12

Прото фильтр

Протофильтр используется для фильтрации данных определенного протокола, ключевое словоproto, можно опустить. proto может сопровождаться номером протокола или именем протокола, поддержкаicmp, igmp, igrp, pim, ah, esp, carp, vrrp, udpиtcp. Поскольку обычное имя протокола является зарезервированным полем, оно должно быть экранировано одной или двумя обратными косыми чертами (/) в зависимости от типа оболочки при использовании с директивой proto. Оболочка в Linux должна быть экранирована двумя обратными косыми чертами, MacOS нужен только один.

Например, для перехвата пакетов протокола icmp:

$ tcpdump -n proto \\icmp
# 或者
$ tcpdump -n icmp

Фильтр портов

Фильтр порта используется для фильтрации пакетов данных, проходящих через порт, ключевое словоport. Например:

$ tcpdump port 389

3. Разберитесь с выводом tcpdump

Перехват данных — это только первый шаг.Второй шаг — понять данные.Смысл каждой части вывода команды tcpdump объясняется ниже.

21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
    192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0

21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
    124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0

21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0

Самой основной и наиболее важной информацией является адрес/порт источника и адрес/порт назначения дейтаграммы.В первой дейтаграмме приведенного выше примера IP-адрес источника равен192.168.1.106, исходный порт56166, адрес назначения124.192.132.54, порт назначения80.>Символы представляют направление данных.

Кроме того, указанные выше три фрагмента данных по-прежнему представляют собой процесс трехэтапного рукопожатия протокола tcp.SYNсообщение, которое можно передатьFlags [S]видеть. Ниже приведены флаги общих TCP-пакетов:

  • [S]: SYN (начать соединение)
  • [.]: нет флага
  • [P]: PSH (Push-данные)
  • [F]: FIN (концевое соединение)
  • [R]: RST (сброс соединения)

И вторые данные[S.]выражатьSYN-ACK,этоSYNОтветное сообщение на сообщение.

4. Примеры

Ниже приведены некоторые конкретные примеры, каждый из которых может использовать несколько методов для получения одного и того же вывода. Используемый метод зависит от желаемого вывода и трафика в сети. Когда мы устраняем неполадки, мы обычно просто хотим получить то, что хотим, чего можно добиться с помощью фильтров и вывода ASCII в сочетании с конвейерами и такими инструментами, как grep, cut, awk и т. д.

Например, при очистке пакетов HTTP-запросов и ответов флаг можно снять, удаливSYN/ACK/FINдля фильтрации шума, но есть более простой способ, который состоит в том, чтобыgrep. Достигая цели, мы должны выбрать самый простой и эффективный метод. Давайте посмотрим пример.

Извлечь пользовательский агент HTTP

Извлеките HTTP User-Agent из заголовка HTTP-запроса:

$ tcpdump -nn -A -s1500 -l | grep "User-Agent:"

пройти черезegrepМожно извлечь как пользовательский агент, так и имя хоста (или другие заголовки):

$ tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'

Сканировать только трафик HTTP GET и POST

Захватите трафик HTTP GET:

$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

Также можно перехватывать трафик запросов HTTP POST:

$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'

Примечание. Этот метод не может гарантировать захват действительного трафика данных HTTP POST, поскольку запрос POST будет разделен на несколько пакетов TCP.

Шестнадцатеричный код в двух приведенных выше выражениях будет таким же, как в запросах GET и POST.ASCIIСовпадение строк. Например,tcp[((tcp[12:1] & 0xf0) >> 2):4]сначала будетОпределяем расположение интересующих нас байтов(после заголовка TCP), а затем выберите 4 байта, которые мы хотим сопоставить.

Извлечь URL-адрес HTTP-запроса

Извлеките имя хоста и путь HTTP-запроса:

$ tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"

tcpdump: listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
    POST /wp-login.php HTTP/1.1
    Host: dev.example.com
    GET /wp-login.php HTTP/1.1
    Host: dev.example.com
    GET /favicon.ico HTTP/1.1
    Host: dev.example.com
    GET / HTTP/1.1
    Host: dev.example.com

Извлечь пароль из запроса HTTP POST

Извлеките пароль и имя хоста из запроса HTTP POST:

$ tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:25:54.799014 IP 10.10.1.30.39224 > 10.10.1.125.80: Flags [P.], seq 1458768667:1458770008, ack 2440130792, win 704, options [nop,nop,TS val 461552632 ecr 208900561], length 1341: HTTP: POST /wp-login.php HTTP/1.1
.....s..POST /wp-login.php HTTP/1.1
Host: dev.example.com
.....s..log=admin&pwd=notmypassword&wp-submit=Log+In&redirect_to=http%3A%2F%2Fdev.example.com%2Fwp-admin%2F&testcookie=1

Извлечь куки

извлекатьSet-Cookie(файлы cookie на стороне сервера) иCookie(Клиентский файл cookie):

$ tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp58s0, link-type EN10MB (Ethernet), capture size 262144 bytes
Host: dev.example.com
Cookie: wordpress_86be02xxxxxxxxxxxxxxxxxxxc43=admin%7C152xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxfb3e15c744fdd6; _ga=GA1.2.21343434343421934; _gid=GA1.2.927343434349426; wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_86be654654645645645654645653fc43=admin%7C15275102testtesttesttestab7a61e; wp-settings-time-1=1527337439

Захват пакетов ICMP

Просмотреть все пакеты ICMP в сети:

$ tcpdump -n icmp

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:34:21.590380 IP 10.10.1.217 > 10.10.1.30: ICMP echo request, id 27948, seq 1, length 64
11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64
11:34:27.680307 IP 10.10.1.159 > 10.10.1.1: ICMP 10.10.1.189 udp port 59619 unreachable, length 115

Захват ICMP-пакетов, отличных от ECHO/REPLY

Исключая пакеты типа эха и ответа, захваченные пакеты не включают стандартныеpingСумка:

$ tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:37:04.041037 IP 10.10.1.189 > 10.10.1.20: ICMP 10.10.1.189 udp port 36078 unreachable, length 156

Получение электронной почты по протоколу SMTP/POP3

Тело и другие данные электронной почты могут быть извлечены. Например, чтобы извлечь только получателей писем:

$ tcpdump -nn -l port 25 | grep -i 'MAIL FROM\|RCPT TO'

Захват запросов и ответов от служб NTP

$ tcpdump dst port 123

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:02:19.112502 IP test33.ntp > 199.30.140.74.ntp: NTPv4, Client, length 48
21:02:19.113888 IP 216.239.35.0.ntp > test33.ntp: NTPv4, Server, length 48
21:02:20.150347 IP test33.ntp > 216.239.35.0.ntp: NTPv4, Client, length 48
21:02:20.150991 IP 216.239.35.0.ntp > test33.ntp: NTPv4, Server, length 48

Захват запросов и ответов от служб SNMP

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

$ onesixtyone 10.10.1.10 public

Scanning 1 hosts, 1 communities
10.10.1.10 [public] Linux test33 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64

Может быть захвачен tcpdumpGetRequestиGetResponse:

$ tcpdump -n -s0  port 161 and udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp58s0, link-type EN10MB (Ethernet), capture size 262144 bytes
23:39:13.725522 IP 10.10.1.159.36826 > 10.10.1.20.161:  GetRequest(28)  .1.3.6.1.2.1.1.1.0
23:39:13.728789 IP 10.10.1.20.161 > 10.10.1.159.36826:  GetResponse(109)  .1.3.6.1.2.1.1.1.0="Linux testmachine 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64"

вырезать pcap-файл

При захвате большого объема данных и записи в файл его можно автоматически разрезать на несколько файлов одинакового размера. Например, следующая команда означает создание нового файла каждые 3600 секунд.capture-(hour).pcap, размер каждого файла не превышает200*1000000байт:

$ tcpdump  -w /tmp/capture-%H.pcap -G 3600 -C 200

Эти файлы называютсяcapture-{1-24}.pcap, через 24 часа предыдущий файл будет перезаписан.

Захватить трафик IPv6

может пройти фильтрip6для захвата трафика IPv6, и вы можете указать протокол, например TCP:

$ tcpdump -nn ip6 proto 6

Чтение дейтаграмм IPv6 UDP из ранее сохраненного файла:

$ tcpdump -nr ipv6-test.pcap ip6 proto 17

Обнаружить сканирование портов

В следующем примере вы обнаружите, что источник и место назначения захваченных пакетов остаются неизменными с флагами[S]и[R], которые сопоставляются с рядом, казалось бы, случайных портов назначения. при отправкеSYNПосле этого, если порт целевого хоста не открыт, он вернетRESET. ЭтоNmapСтандартная практика для других инструментов сканирования портов.

$ tcpdump -nn

21:46:19.693601 IP 10.10.1.10.60460 > 10.10.1.199.5432: Flags [S], seq 116466344, win 29200, options [mss 1460,sackOK,TS val 3547090332 ecr 0,nop,wscale 7], length 0
21:46:19.693626 IP 10.10.1.10.35470 > 10.10.1.199.513: Flags [S], seq 3400074709, win 29200, options [mss 1460,sackOK,TS val 3547090332 ecr 0,nop,wscale 7], length 0
21:46:19.693762 IP 10.10.1.10.44244 > 10.10.1.199.389: Flags [S], seq 2214070267, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.693772 IP 10.10.1.199.389 > 10.10.1.10.44244: Flags [R.], seq 0, ack 2214070268, win 0, length 0
21:46:19.693783 IP 10.10.1.10.35172 > 10.10.1.199.1433: Flags [S], seq 2358257571, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.693826 IP 10.10.1.10.33022 > 10.10.1.199.49153: Flags [S], seq 2406028551, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.695567 IP 10.10.1.10.55130 > 10.10.1.199.49154: Flags [S], seq 3230403372, win 29200, options [mss 1460,sackOK,TS val 3547090334 ecr 0,nop,wscale 7], length 0
21:46:19.695590 IP 10.10.1.199.49154 > 10.10.1.10.55130: Flags [R.], seq 0, ack 3230403373, win 0, length 0
21:46:19.695608 IP 10.10.1.10.33460 > 10.10.1.199.49152: Flags [S], seq 3289070068, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695622 IP 10.10.1.199.49152 > 10.10.1.10.33460: Flags [R.], seq 0, ack 3289070069, win 0, length 0
21:46:19.695637 IP 10.10.1.10.34940 > 10.10.1.199.1029: Flags [S], seq 140319147, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695650 IP 10.10.1.199.1029 > 10.10.1.10.34940: Flags [R.], seq 0, ack 140319148, win 0, length 0
21:46:19.695664 IP 10.10.1.10.45648 > 10.10.1.199.5060: Flags [S], seq 2203629201, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695775 IP 10.10.1.10.49028 > 10.10.1.199.2000: Flags [S], seq 635990431, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695790 IP 10.10.1.199.2000 > 10.10.1.10.49028: Flags [R.], seq 0, ack 635990432, win 0, length 0

Фильтрация результатов тестирования сценария Nmap NSE

Тестовый скрипт Nmap NSE в этом примереhttp-enum.nseДействительный URL-адрес, используемый для обнаружения служб HTTP.

На хосте, где выполняются скриптовые тесты:

$ nmap -p 80 --script=http-enum.nse targetip

На целевом хосте:

$ tcpdump -nn port 80 | grep "GET /"

GET /w3perl/ HTTP/1.1
GET /w-agora/ HTTP/1.1
GET /way-board/ HTTP/1.1
GET /web800fo/ HTTP/1.1
GET /webaccess/ HTTP/1.1
GET /webadmin/ HTTP/1.1
GET /webAdmin/ HTTP/1.1

Сканирование DNS-запросов и ответов

Исходящий трафик на Google Public DNSDNSЗапросы и ответы на записи могут быть перехвачены через tcpdump:

$ tcpdump -i wlp58s0 -s0 port 53

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp58s0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:19:06.879799 IP test.53852 > google-public-dns-a.google.com.domain: 26977+ [1au] A? play.google.com. (44)
14:19:07.022618 IP google-public-dns-a.google.com.domain > test.53852: 26977 1/0/1 A 216.58.203.110 (60)

Захват действительных пакетов HTTP

Захватите действительные HTTP-пакеты порта 80, за исключением пакетов процесса установления TCP-соединения (SYN/FIN/ACK):

$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Перенаправить вывод в Wireshark

как правилоWireshark(или tshark) легче анализировать протоколы прикладного уровня, чем tcpdump. Общая практика заключается в том, чтобы сначала использовать удаленный сервер.tcpdumpзахватите данные и запишите их в файл, затем скопируйте файл на локальную рабочую станцию ​​с помощьюWiresharkанализировать.

Существует также более эффективный способ отправки захваченных данных в Wireshark в режиме реального времени через ssh-соединение для анализа. Взяв в качестве примера систему MacOS, вы можете использоватьbrew cask install wiresharkустановить, а затем проанализировать его с помощью следующей команды:

$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - not port 22' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -

Например, если вы хотите проанализировать протокол DNS, вы можете использовать следующую команду:

$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - port 53' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -

Захваченные данные:

-cВозможность ограничить размер очищаемых данных. Если вы не ограничиваете размер, вы можете пройти толькоctrl-cчтобы остановить парсинг, который отключает не только tcpdump, но и wireshark.

Найдите IP с наибольшим количеством пакетов

Чтобы узнать IP-адрес, который отправляет наибольшее количество пакетов за определенный период времени, или найти IP-адрес, который отправляет наибольшее количество пакетов из группы пакетов, вы можете использовать следующую команду:

$ tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
200 packets captured
261 packets received by filter
0 packets dropped by kernel
    108 IP 10.10.211.181
     91 IP 10.10.1.30
      1 IP 10.10.1.50
  • cut -f 1,2,3,4 -d '.': от.является разделителем, выведите первые четыре столбца каждой строки. То есть IP-адрес.
  • sort | uniq -c: сортировать и считать
  • sort -nr: сортировать в обратном порядке по значению

Возьмите имя пользователя и пароль

В этом примере основное внимание уделяется стандартному текстовому протоколу, фильтрующему пакеты, связанные с именем пользователя и паролем:

$ tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '

Захват DHCP-пакетов

В последнем примере захватываются пакеты запроса и ответа службы DHCP, 67 — это порт DHCP, а 68 — порт клиента.

$ tcpdump -v -n port 67 or 68

tcpdump: listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:37:50.059662 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:xx:xx:xx:d5, length 300, xid 0xc9779c2a, Flags [none]
      Client-Ethernet-Address 00:0c:xx:xx:xx:d5
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: Request
        Requested-IP Option 50, length 4: 10.10.1.163
        Hostname Option 12, length 14: "test-ubuntu"
        Parameter-Request Option 55, length 16: 
          Subnet-Mask, BR, Time-Zone, Default-Gateway
          Domain-Name, Domain-Name-Server, Option 119, Hostname
          Netbios-Name-Server, Netbios-Scope, MTU, Classless-Static-Route
          NTP, Classless-Static-Route-Microsoft, Static-Route, Option 252
14:37:50.059667 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:xx:xx:xx:d5, length 300, xid 0xc9779c2a, Flags [none]
      Client-Ethernet-Address 00:0c:xx:xx:xx:d5
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: Request
        Requested-IP Option 50, length 4: 10.10.1.163
        Hostname Option 12, length 14: "test-ubuntu"
        Parameter-Request Option 55, length 16: 
          Subnet-Mask, BR, Time-Zone, Default-Gateway
          Domain-Name, Domain-Name-Server, Option 119, Hostname
          Netbios-Name-Server, Netbios-Scope, MTU, Classless-Static-Route
          NTP, Classless-Static-Route-Microsoft, Static-Route, Option 252
14:37:50.060780 IP (tos 0x0, ttl 64, id 53564, offset 0, flags [none], proto UDP (17), length 339)
    10.10.1.1.67 > 10.10.1.163.68: BOOTP/DHCP, Reply, length 311, xid 0xc9779c2a, Flags [none]
      Your-IP 10.10.1.163
      Server-IP 10.10.1.1
      Client-Ethernet-Address 00:0c:xx:xx:xx:d5
      Vendor-rfc1048 Extensions
        Magic Cookie 0x63825363
        DHCP-Message Option 53, length 1: ACK
        Server-ID Option 54, length 4: 10.10.1.1
        Lease-Time Option 51, length 4: 86400
        RN Option 58, length 4: 43200
        RB Option 59, length 4: 75600
        Subnet-Mask Option 1, length 4: 255.255.255.0
        BR Option 28, length 4: 10.10.1.255
        Domain-Name-Server Option 6, length 4: 10.10.1.1
        Hostname Option 12, length 14: "test-ubuntu"
        T252 Option 252, length 1: 10
        Default-Gateway Option 3, length 4: 10.10.1.1

5. Резюме

Эта статья в основном знакомитtcpdumpБазовый синтаксис и использование , а также несколько примеров, демонстрирующих его мощную функцию фильтрации. Сочетание tcpdump и wireshark может быть более мощным, и в этой статье также показано, как элегантно и плавно объединить tcpdump и wireshark. Если вам нужна дополнительная информация, вы можете проверить tcpdumpmanруководство.

Публичный аккаунт WeChat

Отсканируйте QR-код ниже, чтобы подписаться на официальную учетную запись WeChat, и ответьте на официальную учетную запись ◉Добавить группу◉, чтобы присоединиться к нашей облачной коммуникационной группе и обсудить облачные технологии с Сунь Хунляном, директором Чжаном, Ян Мином и другими важными шишками.