tag: #N/S/Seedlings #N/T/Linux #N/T/Tool/Util #N/T/Public
2022-12-26 23:47, [Source](),
Related: [[& Networking|Linux network]]
Docs:
- https://danielmiessler.com/study/tcpdump/
- https://forum.ivorde.com/tcpdump-how-to-to-capture-only-icmp-ping-echo-requests-t15191.html
## Описание
Tcpdump — главный инструмент сетевого анализа для специалистов по информационной безопасности. Для тех, кто хочет получить полное представление о TCP / IP обязательно нужно обладать достаточным пониманием этого важного приложения. Многие предпочитают использовать инструменты более высокого уровня, такие как Wireshark, но я считаю это ошибкой.
Когда используешь инструмент, который отображает сетевой трафик более естественным (простым) способом, сложность анализа взваливается непосредственно на человека, а не на приложение. Этот подход развивает понимание набора TCP / IP, именно поэтому я настоятельно рекомендую использовать tcpdump вместо других инструментов, когда это возможно.
#### Обходит ли tcpdump iptables
[Does tcpdump bypass iptables?](https://superuser.com/questions/925286/does-tcpdump-bypass-iptables)
As a matter of fact, tcpdump is the first software found after the wire (and the NIC, if you will) on the way IN, and the last one on the way OUT.
`Wire -> NIC -> tcpdump -> netfilter/iptables -> tcpdump -> NIC -> Wire`
## Шаблон
```bash
```
## Примеры:
##### Отобразить доступные сетевые интерфейсы
```bash
tcpdump --list-interfaces
```
> [!example]
> 1.lxdbr0 [Up, Running]
> 2.wg1 [Up, Running]
> 3.enp0s31f6 [Up, Running]
##### Вывести список всех интерфейсов, на которых tcpdump может слушать
```bash
tcpdump -D
```
##### Посмотреть, что происходит, на всех интерфейсах
```bash
tcpdump -i any
```
##### Отфильтровать и отобразить весь трафик на конкретном интерфейсе
Основное представление о том, что происходит на конкретном интерфейсе.
```bash
tcpdump -i eth0
```
###### ПРЕДСТАВЛЕНИЕ НЕОБРАБОТАНОГО ВЫВОДА
Подробный вывод без разрешения имен хостов или номеров портов, абсолютных порядковых номеров и удобочитаемых временных меток.
```bash
tcpdump -ttttnnvvS
```
##### Отфильтровать и отобразить весь трафик с определенного IP
Один из самых распространенных запросов, это покажет вам трафик из 1.2.3.4, будь то источник или место назначения.
```bash
tcpdump host 1.2.3.4
```
##### Проверить содержимое пакета
`-A` для печати содержимого в ASCII.
```bash
tcpdump -i lo port 514 -A
```
Для полноценной работы с не зашифрованным контентом, полезна друая утилита [[% ngrep]]
##### Вывести больше информации о пакете, с выводом в шеснадцетеричную систему.
`-X` для печати содержимого в шестнадцатеричном формате (HEX) и
Шестнадцатеричный вывод полезен, когда вы хотите увидеть содержимое рассматриваемых пакетов, и его часто лучше всего использовать, когда вы изолируете несколько кандидатов для более тщательного изучения.
```bash
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 captured1 packets received by filter0 packets dropped by kernel
```
```
##### Фильтрация по источнику и назначению
Выделить трафик на основе источника или назначения очень просто, используя src и dst.
```bash
tcpdump src 2.3.4.5tcpdump dst 3.4.5.6
```
##### Поиск пакетов по подсети
Чтобы найти пакеты, идущие в или из определенной сети, используйте опцию net. Вы можете комбинировать это с опциями src или dst.
```bash
tcpdump net 1.2.3.0/24
```
##### Отфильтровать и отобразить весь трафик со специфичного порта
Вы можете найти определенный порт трафика, используя опцию port, за которой следует номер порта.
```bash
tcpdump port 3389
tcpdump src port 1025
```
##### Отфильтровать и отобразить весь трафик с одного протокола
Если вы ищете определенный тип трафика, вы можете использовать tcp, udp, icmp и многие другие.
```bash
tcpdump icmp
```
##### Показать толко ipv6 трафик
Вы также можете найти весь трафик IP6, используя опцию протокола.
```bash
tcpdump ip6
```
##### Найти трафик с диапазона портов
Вы также можете использовать диапазон портов, чтобы найти трафик.
```bash
tcpdump portrange 21-23
```
##### Фильтровать трафик по размеру пакета
Если вы ищете пакеты определенного размера, вы можете использовать эти параметры. Вы можете использовать маленький, большой или их соответствующие символы, которые вы ожидаете от математики.
```bash
tcpdump less 32tcpdump greater 64tcpdump <= 128
```
##### Запись резултатов в файл
Часто полезно сохранять результат пакетов в файл для анализа в будущем. Эти файлы известны как файлы PCAP (PEE-cap), и их можно обрабатывать сотнями различных приложений, включая сетевые анализаторы, системы обнаружения вторжений и, конечно же, самим tcpdump. Здесь мы пишем файл с именем capture_file, используя ключ -w.
```bash
tcpdump port 80 -w capture_file
```
##### Чтение файлов PCAP
Вы можете читать файлы PCAP с помощью ключа -r. Обратите внимание, что вы можете использовать все регулярные команды в tcpdump при чтении в файле; вы ограничены только тем фактом, что вы не можете захватывать и обрабатывать то, чего не существует в файле.
```bash
tcpdump -r capture_file
```
#### Комбинированные запросы
##### Из определенного IP и на определенный порт
Давайте найдем весь трафик с 10.5.2.3 к любому хосту на порте 3389.
```bash
tcpdump -nnvvS src 10.5.2.3 and dst port 3389
```
##### Трафик от одной сети к другой
Давайте посмотрим на весь трафик, идущий от 192.168.x.x, и двигающийся к сетям 10.x или 172.16.x.x, и мы покажем шестнадцатиричный вывод без имени хоста и один уровень дополнительной детализации.
```bash
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.
```bash
tcpdump dst 192.168.0.2 and src net and not icmp
```
##### Весь исходящий трафик, не на ssh порт
Это покажет нам весь трафик от хоста, который не является трафиком SSH (если предположить использование порта по умолчанию).
```bash
tcpdump -vv src mars and not dst port 22
```
#### Изолирование специфических TCP-флагов
Вы также можете захватывать трафик на основе определенных флагов (-ов) TCP.
[ПРИМЕЧАНИЕ: Фильтры ниже находят эти различные пакеты, потому что tcp [13] замечает смещение 13 в заголовке TCP, число представляет местоположение в байте, а ! = 0 означает, что данный флаг установлен в 1, т.е. он включен. ]
##### Показать все URGENT (URG) пакеты …
```bash
tcpdump 'tcp[13] & 32!=0'
```
##### Показать все ACKNOWLEDGE пакеты (ACK) …
```bash
tcpdump 'tcp[13] & 16!=0'
```
##### Показать все PUSH пакеты (PSH) …
```bash
tcpdump 'tcp[13] & 8!=0'
```
##### Показать все RESET пакеты (RST) …
```bash
tcpdump 'tcp[13] & 4!=0'
```
##### Показать все SYNCHRONIZE пакеты (SYN) …
```bash
tcpdump 'tcp[13] & 2!=0'
```
##### Показать все FINISH (FIN) пакеты …
```bash
tcpdump 'tcp[13] & 1!=0'
```
##### Показать все SYNCHRONIZE / ACKNOWLEDGE пакеты (SYNACK) …
```bash
tcpdump 'tcp[13]=18'
```
[Примечание: только флаг PSH, RST, SYN и FIN отображаются в выводе поля tcpdump. Отображаются URG и ACK, но они показаны в другом месте на выходе, а не в поле flags. ]
Однако, как и в случае с самыми мощными инструментами, существует множество способов сделать то, что нужно. В следующем примере показан другой способ захвата пакетов со специфическими наборами TCP-флагов.
```bash
tcpdump 'tcp[tcpflags] == tcp-syn'
```
##### Снять флаги RST с помощью параметра tcpflags …
```bash
tcpdump 'tcp[tcpflags] == tcp-rst'
```
##### Снять флаги FIN с помощью параметра tcpflags…
```bash
tcpdump 'tcp[tcpflags] == tcp-fin'
```
[Примечание: тот же метод может быть использован и для других флагов; они были опущены в интересах экономии места. ]
#### Определение заслуживающего внимания трафика
Наконец, есть несколько быстрых рецептов, которые вы захотите запомнить, чтобы поймать специфический и специализированный трафик, например, неправильные / вероятно-вредоносные пакеты.
##### ПАКЕТЫ С ОБЫЧНЫМИ КОМПЛЕКТАМИ RST И SYN (ЭТОГО НЕ ДОЛЖНО БЫТЬ)
```bash
tcpdump 'tcp[13] = 6'
```
##### НАЙТИ ОТКРЫТЫЙ ТЕКСТ HTTP И ПОЛУЧИТЬ ЗАПРОС
```bash
tcpdump 'tcp[32:4] = 0x47455420'
```
##### НАЙДИТЕ SSH-СОЕДИНЕНИЯ НА ЛЮБОЙ ПОРТ (ЧЕРЕЗ БАННЕР)
```bash
tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'
```
##### ПАКЕТЫ С TTL МЕНЬШЕ 10 (КАК ПРАВИЛО ПОКАЗЫВАЕТ ПРОБЛЕМУ ИЛИ ИСПОЛЬЗУЕТ TRACEROUTE)
```bash
tcpdump 'ip[8] < 10'
```
##### ПАКЕТЫ С УСТАНОВКОЙ EVIL BIT
```bash
tcpdump 'ip[6] & 128 != 0'
```
### Шпаргалки:
```bash
tcpdump -nnvvS -i any dst port 443 s! src 23.253.248.101 and ! src 144.76.182.198
```
## Используемые или важные ключи.
ВЫРАЖЕНИЯ
В tcpdump выражения позволяют вам отфильтровать различные типы трафика и найти именно то, что вы ищете. Освоение выражений и умение объединить их творчески — вот что делает по-настоящему мощным tcpdump.
Существует три основных типа выражений: type, dir и proto.
- Типы опций: хост, сеть и порт.
- Назначения позволяют вам выполнять src, dst и их комбинации.
- Протокол позволяет вам определять: tcp, udp, icmp, ah и многие другие.
ОПЦИИ
- -i any: прослушивать все интерфейсы, чтобы увидеть, видите ли вы какой-либо трафик.
- -i eth0: прослушивать интерфейс eth0.
- -D: Показывать список доступных интерфейсов
- -n: отображать IP адреса вместо имени хостов.
- -nn: отображать IP адреса и номера портов вместо имени хостов и названия протоколов.
- -q: показывает минимальное количество информации о пакете.
- -t: не отображать метку времени в каждой строке.
- -tttt: задает вывод временных меток в принятом по умолчанию формате для каждой строки.
- -X: Показывать содержимое пакета как в шестнадцатеричной кодировке, так и в ASCII.
`-A` для печати содержимого в 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 исходит из способности сочетать варианты креативными способами, чтобы изолировать именно то, что вы ищете. Есть три способа сделать комбинации, и если вы вообще изучали программирование, они вам будут очень знакомы.
```
AND
and or &&
OR
or or ||
EXCEPT
not or !
```
Ключ должен сначала определить именно то, что вы ищете, а затем построить синтаксис, чтобы изолировать определенный тип трафика.
СЛОЖНАЯ ГРУППИРОВКА И СПЕЦСИМВОЛЫ
Также имейте в виду, что при создании сложных запросов вам, возможно, придется группировать свои параметры, используя одинарные кавычки. Одиночные кавычки используются для того, чтобы указать tcpdump, что нужно игнорировать некоторые специальные символы — в этом случае то, что в скобках «()». Этот же метод можно использоваться для группировки с использованием других выражений, таких как хост, порт, сеть и т.д. Посмотрите на приведенную ниже команду.
```bash
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)
```
Если вы попытались выполнить эту очень полезную команду в другом случае, вы получите ошибку из-за скобок. Вы можете исправить это, выйдя из скобок (поставив перед каждой из них \) или поставив всю команду в одинарные кавычки:
```bash
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)'
```