Как перехватить ack или syn пакеты с помощью Tcpdump?

48

Я хочу использовать правило фильтра для захвата только пакетов подтверждения или синхронизации. Как мне это сделать?

Larry
источник
Лично я бы не стал этого делать. Я бы перехватил все пакеты, а затем отфильтровал флаги SYN и ACK. Если вы устраняете неполадки TCP, вы почти всегда хотите видеть весь разговор, а не просто рукопожатие или ACK. Если вас не интересует фактическая полезная нагрузка данных, вы можете ограничить размер пакета с помощью tcpdump -s SIZE. Заголовок TCP может иметь переменную длину, поэтому при захвате -s 128будут получены все возможные заголовки и, возможно, немного данных.
suprjami
4
Может быть, вы не устраняете неполадки TCP. Может быть, вы хотите посмотреть, насколько болтливой является программа, и вы хотите сосчитать ее исходящие соединения. Как я, сейчас.
Дэн Притц

Ответы:

81

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

С tcpdump я бы использовал такой фильтр.

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

Посетите справочную страницу tcpdump и обратите пристальное внимание на флаги tcpdump.

Обязательно ознакомьтесь с разделами в Wireshark Wiki о фильтрах захвата и отображения. К сожалению, два типа фильтров используют совершенно разный синтаксис и разные имена для одной и той же вещи.

Если вы хотите использовать фильтр отображения вместо фильтра захвата, вам, вероятно, потребуется создать выражение, объединяющее tcp.flags.ack и tcp.flags.syn. Я гораздо лучше знаком с фильтрами захвата, так что вам придется решить это самостоятельно.

Zoredache
источник
1
Мне нравится ваш ответ лучше. Похоже, вы пошли на усилие. Upvote для вас.
Абле
4
Это отличный ответ с хорошими ссылками, но имейте в виду, что этот синтаксис будет захватывать любые пакеты, для которых установлены флаги SYN или ACK, даже если установлены и другие флаги. Это может или не может быть тем, что задумал ОП. Пожалуйста, смотрите мой ответ ниже для более строгого фильтра, если желательны только пакеты TCP SYN или ACK. Приветствия.
JJC
14

Хотя ответ @ Zoredache хорош и полон, обратите внимание, что этот синтаксис приведет к любым пакетам с установленным флагом TCP SYN или 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'

Ура!

JJC
источник
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 отображаются, но они отображаются в другом месте вывода, а не в поле флагов]

Castet
источник
2
На Stack Exchange не разрешено плагиат . Пожалуйста, отредактируйте этот пост, чтобы было ясно, что вы скопировали контент со связанного сайта. Спасибо.
Крис С
4

Я хотел получить только пакеты SYN самостоятельно, я использовал следующую команду:

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

Это должно работать для вас сразу.

Sidharth
источник
3
Это будет захватывать любые пакеты с установленным флагом SYN, включая SYN, SYN-ACK и т. Д. Если вы хотите только пакеты SYN, используйте вместо этого «tcp [13] == 2». Ура!
JJC
1

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

Синий
источник
Ваш ответ технически правильный, но ОП, вероятно, хотел включить слово «только» в свой вопрос. ;-) Ура!
JJC