====== Tcpdump ====== ==== Общее ==== Выводит заголовки пакетов походящих через сетевой интерфейс, которые совпадают с указанным выражением\\ Может сохранять резы в файл (-w) или читать из файла (-r), можно задать нужное кол-во (-c)\\ В конце работы пишет статистику полученных ("received by filter") и отброшенных ядром (по разным причинам, "dropped by kernel")\\
:!: Некоторые ключи * **-C file_size** - При записи в файл, определяет мах размер, при достижении файл ротируется, указывается в миллионах байт (1,000,000) * **-F file** - Файл для ввода фильтрующего выражения, выражение в командной строке игнорируется * **-i interface** - Интерфейс для сбора, по умолчанию первый в списке, кроме loop * **-n (-nn)** - Выкл резолв IP DNS (порт и протокол) * **-p** - Не переводить интерфейс в смешанный режим ("promiscuous") * **-t (-tt, -ttt, -tttt)** - Не выводить stamp в каждой строке (выводить не форматированный, выводить разницу в микросекундах, выводить stamp вместе с датой по умолчанию) * **-v (-vv, -vvv)** - Более подробный вывод * **-w (-r)** - Писать в файл (читать из файла) * **-x (-X)** - Писать каждый пакет (без заголовков уровня соединения) в шестнадцаричном виде (помиио шестнадцаричного выводить их ASCII-значения) * **-D** - Интерфейсы, доступные для захвата * **-X (-A)** - Содержимое пакета, шестнадцаричная (ASCII) форма
==== Фильтрующие выражения ==== Без него выводятся все пакеты идущие через интерфейс, выражение состоит из одного или более примитивов\\
:!: Примитивы и классификаторы Примитив состоит из ID (имя или номер) следующего за одним или более классификаторами\\ Три вида классификаторов:\\ * **type** - К какому виду относить ID. Возможные значения: host, net, port. Если не указан то подразумевается host. (Прим: 'host foo', 'net 128.3', 'port 20')\\ * **dir** - Направление передачи, 'к' и/или 'от' ID. Возм значения: src, dst, src or dst and src and dst. (Прим: 'src foo', 'dst net 128.3', 'src or dst port 22'). По умолчению 'src or dst'\\ * **proto** - Ограничивает совпадение конкретным протоколом. Возм значения: ether, fddi, tr, ip, ip6, arp, rarp, decnet, tcp, udp. (Прим: 'ether src foo', 'arp net 128.3', 'tcp port 21'). По умолчанию все перечисленные типы протоколов\\ Еще есть несколько спец примитивов - ключевых слов **gateway**, **broadcast**, **less**, **greater** и арифметич выражения\\ Примитивы могут объединяться операторами **and**, **or** и **not**. Прим:\\ host foo and not port ftp and not port ftp-data Некоторые примитивы (не все):\\ * **dst (src) host ** - назначение/источник пакета\\ * **host ** - источник или назначение\\ * **net mask ** - истина если IP адрес входит в сеть с указанной сетевой маской\\ * **net ** - истина если IP входит в сеть с указанной сетевой маской, с заданным кол-вом бит\\ * **dst (src) port ** - порт в назначении/источнике (tcp src port port)\\ * **port** - так же, или назначение или источник (tcp (udp) port port)\\ * **portrange** - диапазон портов (tcpdump portrange 6000-6500)\\ * **less length** - истина если пакет имеет длинну меньше или равную указанной (эквивалент len <= lenth)\\ * **greater length** - больше или равно\\ * **ip proto ** - фильтрация по протоколу, из числа: icmp,icmp6,igmp,igrp,pim,ah,esp,vrrp,udp,tcp. Идентификаторы tcp,udp и icmp - ключевые слова, надо экранировать слешем (\)\\
:!: Примеры # Ловим весь входящий трафик из локальной сети на сервер tcpdump -i eth0 -n -nn -ttt dst host 192.168.2.254 # Ловим весь входящий трафик исключая генерируемый нашей ssh сессией tcpdump -i eth0 -n -nn -ttt 'dst host 192.168.2.254 and not (src host 192.168.2.100 and dst port 22)' # Информация об DNS-общении между сервером и каким-нибудь узлом сети tcpdump -i eth0 -n -nn -ttt 'host 192.168.2.13 and port 53' # Отлавливаем исключительно icmp пакеты tcpdump -i eth0 -n -nn -ttt 'ip proto \icmp' # Конкретные протоколы tcpdump -i eth0 icmp tcpdump -i eth0 udp tcpdump -i eth0 tcp and port 443
:!: Формат пакета В общем виде информация о пакете выглядит следующим образом:\\ [Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length] * **Timestamp** - * **Protocol** - протокол сетевого уровня * **Src(Dst) IP. Src(Dst) Port** - IP адрес и порт источника (назначения) * **Flags** - TCP флаги * **[.]** - ACK (Acknowledgment) (подтверждение) * **[S]** - SYN (Start Connection) * **[P]** - PSH (Push Data) * **[F]** - FIN (Finish Connection) * **[R]** - RST (Reset Connection) * **[S.]** - SYN-ACK (SynAck Packet) * **Seq** - порядковый номер данных, содержащихся в пакете. Для первого захваченного пакета это абсолютное число, последующие используют относительное число. Прим: 196:568 означает что пакет содержит байты с 196 по 568 этого потока * **Ack** - номер подтверждения, например Ack 1 у отправляющей стороны, для принимающей стороны будет следующий ожидаемый байт (568 из примера выше) * **Win size** - размер окна, кол-во байт, доступных в приемном буфере * **Options** - далее такие параметры TCP как например **MSS** (Maximum Segment Size, максимальный размер сегмента) или масштаб окна, **nop** - заполнение, например для того чтобы добить заголовок до 4 байт, **TS val** - временная метка TCP, **ecr** - означает эхо-ответ * **Data Length** - длинна в байтах полезной нагрузки. Разница между первым и последним байтами порядкового номера
:!:
====== Wireshark ====== Анализ сетевого трафика.\\ Обычно пакеты, не предназначенные ПК, фильтруются сетевой картой и не доходят до уровня приложений, для перехвата всех доступных пакетов, необходимо сетевую карту перевести в "неразборчивый режим".\\ ===Linux провод:=== **# ifconfig eth0 promisc** - после чего, в выводе команды **netstat -i**, на против адаптера будет флаг **BMPRU**, буква P и означает активацию режима.\\ ===Linux wifi:=== **# ifconfig wlan0 down && iwconfig wlan0 mode monitor && ifconfig wlan0 up** ===== tshark - консоль ===== **apt install tshark** - установка.\\ Для использования программы не привилегированными пользователями, нужно добавить его в группу **wireshark**.\\ Запуск **tshark** без аргументов, запустит полный сбор всего что есть, с выводом результатов на экран.\\ * **-D** - список доступных интерфейсов * **-i** - нужный интерфейс (можно номер) * **-a** - условие для остановки захвата * **duration:** - заданное время, сек (-a duration:60) * **files:** - кол-во пакетов * **filesize:** - размер в килобайтах. * **-b** - кольцевое сохранение, к имени файла (-w) добавляется метка, аргументы как и у **-a** * **-d** - протокол декодирования * **-f** - выражение фильтра захвата * **-Y** - фильтры отображения (ip.addr==1.1.1.1) * **-n (-N)** - отключить разрешение dns (разрешить только определенным) * **-q** - не выводить счетчик захваченных пакетов * **-w** - файл для сохранения * **-r** - просмотр указанного файла ==== Фильтры захвата ==== Используется аргумент **-f**, затем выражение в кавычках, после можно дисплейный фильтр применять. * **[src|dst] host** - хост * **[src|dst] net** - подсеть * **[src|dst] port** - порт ==== Просмотр ==== При **просмотре runtime**, аргументом **-Y** можно фильтровать вывод данных: # tshark -Y "ip.addr==192.168.0.1 and tcp.port==80 and http.request" # tshark -Y "tcp.anallysis.retransmission" # tshark -Y "not arp or icmp" ==== Статистика ==== Для просмотра статистики указывается аргумент **-z**\\ Отчет по протоколам **SMB, DNS, IP** # tshark -z smb,srt -z dns,tree -z http,tree -z hosts **Список IP соединений** # tshark -r cap.pcap -z conv,ip Указывает что из файла нужно извлечь инфо о порте-источнике всех пакетов # tshark -z "proto,colinfo,tcp.srcport,tcp.srcport" -r cap.pcap Извлечет из файла инфо обо всех пакетах изображений и выведет поля **content_type** и **content_length** # tshark -R "http.response and http.content_type contains image" -z "proto,colinfo,http.content_length,http.content_length" -z "proto,colinfo,http.content_type,http.content_type" \ -r cap.pcap ==== Примеры ==== # tshark -f "! port 22" -Y "! arp || icmp"