====== 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"