Как захватить и проанализировать сетевой трафик с помощью tcpdump
Life-Hack [Жизнь-Взлом]/Хакингtcpdump — это замечательный инструмент командной строки для анализа сетевого трафика.
Это стандартное средство для сбора и анализа пакетов TCP / IP.
Инструмент tcpdump может оказать большую помощь при решении проблем с сетью.
Пакеты могут быть сохранены в файл и позже проанализированы.
Рекомендуется периодически запускать этот инструмент для наблюдения за вашей сетью.
Как выглядит вывод tcpdump?
tcpdump позволяет вам проверять заголовки пакетов TCP / IP.
Он выводит одну строку для каждого пакета, и команда продолжает работать, пока вы не нажмете Ctrl + C для завершения.
Давайте рассмотрим одну строку для примера из вывода:
20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0
Каждая строка включает в себя:
- Метка времени Unix (20: 58: 26.765637)
- протокол (IP)
- имя хоста или IP-адрес источника и номер порта (10.0.0.50.80)
- имя хоста или IP адрес и номер порта (10.0.0.1.53181)
- Флаги TCP (Флаги [F.]). Флаги указывают на состояние соединения. Может включать более одного значения, как в этом примере [F.] для FIN-ACK. Это поле может иметь следующие значения:
- S — SYN. Первый шаг в установлении связи.
- F — FIN. Завершение соединения.
- , — ACK. Пакет подтверждения получен успешно.
- P — Push. Сообщает получателю обрабатывать пакеты, а не буферизировать их.
- R — RST. Связь прервана.
- Порядковый номер данных в пакете. (след. 1)
- Номер подтверждения (подтверждение 2)
- Размер окна (победа 453). Количество байтов, доступных в приемном буфере. Далее следуют параметры TCP.
- Длина полезных данных. (длина 0)
Установка
В дистрибутивах на основе Debian tcpdump можно установить с помощью команды APT:
# apt install tcpdump -y
В дистрибутивах на основе RPM tcpdump может быть установлен с YUM:
yum install tcpdump -y
Или используя DNF, если RHEL 8
# dnf install tcpdump -y
Опции команды tcpdump
Для запуска tcpdump вы должны быть пользователем root.
Инструмент включает в себя множество опций и фильтров.
Запуск tcpdump без каких-либо опций захватит все пакеты, проходящие через интерфейс по умолчанию.
Чтобы увидеть список сетевых интерфейсов, доступных в системе и по которым tcpdump может захватывать пакеты:
# tcpdump -D
или
# Tcpdump --list-interfaces 1.eth0 2.nflog (Linux netfilter log (NFLOG) interface) 3.nfqueue (Linux netfilter queue (NFQUEUE) interface) 4.eth1 5.any (Pseudo-device that captures on all interfaces) 6.lo [Loopback]
Это особенно полезно в системах, в которых нет команды для вывода списка интерфейсов.
Для захвата пакетов, проходящих через определенный интерфейс, используйте флаг -i с именем интерфейса.
Без -i tcpdump подберет первый сетевой интерфейс, с которым столкнулся.
# tcpdump -i eth1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 1, length 64 01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 4761, seq 1, length 64 01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 2,
Флаг -v увеличивает количество информации, которую вы видите о пакетах, -vv дает вам еще больше деталей.
По умолчанию tcpdump резолвит IP-адреса в имена хостов, а также использует имена сервисов вместо номеров портов
Если DNS не работает или вы не хотите, чтобы tcpdump выполнял поиск имен, используйте параметр -n.
# tcpdump -n listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100 04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0 04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36 04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0 04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, len
Чтобы захватить только определенное количество строк, скажем, 5, используйте флаг -c:
#tcpdump -c 5 04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100 04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0 04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36 04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0 04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100 5 packets captured
Вывод tcpdump по умолчанию использует временные метки Unix.
Для захвата пакетов с удобочитаемой отметкой времени:
# tcpdump -tttt 2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, length 36 2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0 2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 36:72, ack 1, win 37232, length 36 2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0 2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 72:108, ack 1, win 37232, length 36
Использование фильров tcpdump
Если фильтры не применяются вовсе, отображаются все заголовки пакетов.
Обычно используемые фильтры — это port, host, src, dst, tcp, udp, icmp.
фильтр по порту
Используйте фильтр port для просмотра пакетов, поступающих на определенный порт:
# Tcpdump -i eth1 -c 5 port 80 23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80: Flags [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0 23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971: Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0 23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80: Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0 23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972: Flags [S.E], seq 1363851389, ack 226341106, win 28960, options
фильтр по хосту
Для захвата всех пакетов, поступающих или исходящих из хоста с IP-адресом 10.0.2.15:
# tcpdump host 10.0.2.15 03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36 03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0 03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 36:72, ack 1, win 37232, length 36 03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0 03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 72:108, ack 1, win 37232, length 36
Чтобы захватить пакеты определенного типа протокола, например, icmp, на интерфейсе eth1:
# tcpdump -i eth1 icmp 04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 75, length 64 04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 75, length 64 04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 76, length 64 04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 76, length 64 04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 77, length 64
Объединение фильтров
Вы можете объединить эти выражения с операторами AND, OR и NOT.
Это позволит вам писать команды, которые могут более точно изолировать пакеты:
Пакеты с определенного IP и предназначеные для определенного порта:
# tcpdump -n -i eth1 src 10.0.0.1 and dst port 80 00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80: Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0 00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0 00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80: Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499: HTTP: GET / HTTP/1.1 00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174
Чтобы перехватить все пакеты, кроме ICMP, используйте оператор NOT:
# tcpdump -i eth1 not icmp
Сохранение заголовков пакетов в файл
Поскольку выходные данные tcpdump могут быстро прокручиваться за пределы экрана, вы можете сохранять заголовки пакетов в файле с флагом -w.
Файлы для сохранения вывода используют формат pcap и имеют расширение .pcap.
PCAP обозначает packet capture.
Следующая команда сохранит 10 строк вывода на интерфейсе eth1 в icmp.pcap.
# tcpdump -i eth1 -c 10 -w icmp.pcap tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 10 packets captured 10 packets received by filter 0 packets dropped by kernel
Вы можете прочитать этот файл с флагом -r:
tcpdump -r icmp.pcap reading from file icmp.pcap, link-type EN10MB (Ethernet) 05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 33, length 64 05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 33, length 64 05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 34, length 64 05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 34, length 64 05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 35, length 64
Просмотр информации о пакете
До сих пор мы с вами видели только заголовки пакетов, а для просмотра содержимого пакета необходимо использовать опцию -A.
Инструмент выведет содержимое пакета в ASCII, что может помочь при устранении неполадок в сети.
Также флаг -X может использоваться для отображения вывода в шестнадцатеричном формате.
Это не сильно поможет, если соединение зашифровано.
# tcpdump -c10 -i eth1 -n -A port 80 23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1 E..'..@.@.%. ... ..2...P..M. uE............ .6.}.Q.bGET / HTTP/1.1 Host: 10.0.0.50 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT
Заключение
tcpdump прост в настройке, и как только вы поймете вывод, различные флаги и фильтры, его можно использовать для решения проблем с сетью и защиты вашей сети.