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)' ```