Як захопити пакети Ack або Syn Tcpdump?


48

Я хочу використовувати правило фільтра для захоплення лише пакетів ack або syn. Як це зробити?


Особисто я б цього не робив. Я б захопив усі пакети, потім пізніше відфільтрував би прапорці SYN та ACK. Якщо ви вирішите проблеми з TCP, ви майже завжди хочете бачити цілу розмову, а не лише рукостискання чи ACK. Якщо вас не цікавить фактична корисна навантаження даних, ви можете обмежити розмір пакету tcpdump -s SIZE. Заголовок TCP може бути різної довжини, тому захоплення -s 128, ймовірно, отримає всі можливі заголовки та, можливо, трохи даних.
suprjami

4
Можливо, ви не усуваєте проблеми з TCP. Можливо, ви хочете побачити, наскільки балакуча програма, і ви хочете порахувати її вихідні з'єднання. Як я, зараз.
Dan Pritts

Відповіді:


81

Синтаксис PCAP фільтра використовується для ТСРйітр повинен працювати точно так само , як на захоплення Wireshark фільтра.

З tcpdump я би використовував такий фільтр.

tcpdump "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"

Перегляньте сторінку man tcpdump і зверніть пильну увагу на tcpflags.

Не забудьте також ознайомитись з розділами у Wireshark Wiki про фільтри захоплення та відображення. На жаль, два типи фільтрів використовують абсолютно різні синтаксиси та різні назви для однієї і тієї ж речі.

Якщо ви хочете відобразити фільтр замість фільтра захоплення, вам, ймовірно, потрібно буде створити вираз, що поєднує tcp.flags.ack і tcp.flags.syn. Я набагато більше знайомий з фільтрами захоплення, тому вам доведеться працювати над собою.


1
Мені подобається ваша відповідь краще. Схоже, ви доклали зусиль. Оновлення для вас.
Аблуація

4
Це чудова відповідь з хорошими посиланнями, але зауважте, що цей синтаксис буде охоплювати будь-які пакети, у яких встановлені прапори SYN або ACK, навіть якщо також встановлені інші прапори. Це може бути, а може і не бути тим, що планувала ОП. Будь ласка, дивіться мою відповідь нижче для більш суворого фільтра, якщо потрібні лише пакети TCP SYN або ACK. Ура.
JJC

14

Хоча відповідь @ Zoredache є приємною і повною, зауважте, що цей синтаксис видасть усі пакети, у яких встановлений прапор TCP або прапор TCP ACK, включаючи пакети, які не є просто простими пакетами "TCP SYN" або "TCP ACK", оскільки вони також встановлені інші прапори. Це може бути або не бути тим, що ви (або майбутні читачі) задумали. Наприклад, цей синтаксис також буде захоплювати пакети TCP SYN-ACK, TCP FIN-ACK і т. Д. Якщо ви хочете лише пакети TCP SYN або TCP ACK (тобто ВСТАНОВИТИ один з цих прапорів), правильний синтаксис фільтра захоплення:

'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'

Рівнозначно:

'tcp[13] == 2 or tcp[13] == 16'

Ура!


9

Я створив сценарій, щоб побачити топ "синхроністів". Для цього я вважаю лише початковий пакет синхронізації (перший пакет рукостискання з трьох пакетів). Тобто, syn = 1, ack = 0

while :; do
  date; 
  tcpdump -i eth1 -n -c 100 \
  'tcp[tcpflags] & (tcp-syn) != 0' and 
  'tcp[tcpflags] & (tcp-ack) == 0' 2> /dev/null \
  | awk '{ print $3}' \
  | sort | uniq -c | sort | tail -5;
  echo;
  sleep 1
done

5
Це приємний приклад. Ви можете ще більше спростити свій фільтр захоплення tcpdump, замінивши "'tcp [tcpflags] & (tcp-syn)! = 0" і "tcp [tcpflags] & (tcp-ack) == 0'" просто "tcp [tcpflags ] == tcp-syn '. Це автоматично виключає пакети з набором ACK. Ура!
JJC

9
tcpdump 'tcp[13] = 3'

http://danielmiessler.com/study/tcpdump/

Розширений

Ви також можете фільтрувати на основі певних частин пакету, а також комбінувати декілька умов у групи. Перший корисний , наприклад, для пошуку лише SYNs або RSTs, а другий для ще більш розвиненої ізоляції трафіку.

UAP RSF

[Підказка: Анаграма для прапорів TCP: Некваліфіковані нападники Pester Real Security Folk]

ваше нагадування: ...

Показати мені всі НЕПІШНІ ( URG) пакети ...

tcpdump 'tcp[13] & 32 != 0'

Показати мені всі ACKпакети ACKNOWLEDGE ( ) ...

tcpdump 'tcp[13] & 16 != 0'

Показати мені всі PSHпакети PUSH ( )

tcpdump 'tcp[13] & 8 != 0'

Показати всі RSTпакети RESET ( )

tcpdump 'tcp[13] & 4 != 0'

Показати мені всі SYNпакети SYNCHRONIZE ( )

tcpdump 'tcp[13] & 2 != 0'

Показати всі FINпакети FINISH ( )

tcpdump 'tcp[13] & 1 != 0'

Показати мені всі SYNACKпакети SYNCHRONIZE / ACKNOWLEDGE ( ) ...

tcpdump 'tcp[13] = 18'

[ Примітка: Тільки PSH, RST, SYN, і FINпрапори відображаються в поле виведення прапора TCPDUMP в. URGs і ACKs відображаються, але вони відображаються в іншому місці виводу, а не в полі прапорів]


2
Плагіат не дозволяє на Stack біржі . Відредагуйте цю публікацію, щоб зрозуміти, що ви скопіювали вміст із пов’язаного веб-сайту. Дякую.
Chris S

4

Я хотів отримати лише SYN-пакети, я використав таку команду:

tcpdump -i eth7 'tcp[13] & 2 != 0'

Це повинно працювати для вас відразу.


3
Це дозволить захопити будь-які пакети із набором прапора SYN, включаючи SYN, SYN-ACK тощо. Якщо ви хочете лише SYN-пакети, використовуйте замість цього "tcp [13] == 2". Ура!
JJC

1

він повинен показувати їх без жодних фільтрів чи аргументів.


Ваша відповідь технічно правильна, але ОП, ймовірно, означало включити слово "тільки" у своє запитання. ;-) Привіт!
JJC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.