Como capturar pacotes ack ou syn pelo Tcpdump?

48

Eu quero usar uma regra de filtro para capturar apenas pacotes ack ou syn. Como eu faço isso?

Larry
fonte
Pessoalmente, eu não faria isso. Eu capturava todos os pacotes e depois filtrava os sinalizadores SYN e ACK posteriormente. Se você estiver solucionando problemas do TCP, quase sempre desejará ver uma conversa inteira, não apenas um aperto de mão ou um ACK. Se você não estiver interessado na carga útil real dos dados, poderá limitar o tamanho do pacote tcpdump -s SIZE. O cabeçalho TCP pode ter um comprimento variável; portanto, a captura -s 128provavelmente obterá todos os cabeçalhos possíveis e talvez um pouco de dados.
Suprjami
4
Talvez você não esteja solucionando problemas de TCP. Talvez você queira ver o quão falador é um programa e conte suas conexões de saída. Como eu agora.
Dan Pritts

Respostas:

81

A sintaxe do filtro pcap usada para tcpdump deve funcionar exatamente da mesma maneira no filtro de captura do wireshark.

Com o tcpdump eu usaria um filtro como este.

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

Verifique a página do manual tcpdump e preste muita atenção às tcpflags.

Verifique também as seções no Wiki do Wireshark sobre filtros de captura e exibição. Infelizmente, os dois tipos de filtros usam uma sintaxe completamente diferente e nomes diferentes para a mesma coisa.

Se você quisesse um filtro de exibição em vez do filtro de captura, provavelmente precisaria criar uma expressão combinando tcp.flags.ack e tcp.flags.syn. Porém, eu estou muito mais familiarizado com os filtros de captura, então você terá que resolver isso sozinho.

Zoredache
fonte
1
Eu gosto mais da sua resposta. Parece que você se esforçou. Voto positivo para você.
ablue
4
Esta é uma ótima resposta com boas referências, mas observe que essa sintaxe irá capturar todos os pacotes com os sinalizadores SYN ou ACK definidos, mesmo se outros sinalizadores também estiverem definidos. Isso pode ou não ser o que o OP pretendia. Por favor, veja minha resposta abaixo para obter um filtro mais rigoroso, se apenas forem desejados pacotes TCP SYN ou ACK. Felicidades.
9119 JJC
14

Embora a resposta do @ Zoredache seja agradável e completa, observe que essa sintaxe produzirá todos os pacotes com o sinalizador TCP SYN ou TCP ACK definido, incluindo pacotes que não sejam estritamente pacotes "TCP SYN" ou "TCP ACK", porque eles também tem outros sinalizadores definidos. Isso pode ou não ser o que você (ou futuros leitores) pretendeu. Por exemplo, essa sintaxe também captura os pacotes TCP SYN-ACK, TCP FIN-ACK etc. Se você deseja apenas pacotes TCP SYN ou TCP ACK (por exemplo, APENAS um desses sinalizadores configurados), a sintaxe apropriada do filtro de captura é:

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

Equivalentemente:

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

Felicidades!

JJC
fonte
9

Eu criei um script para ver os principais "sincronizadores". Para isso, considero apenas o pacote syn inicial (o primeiro pacote do handshake de três pacotes). Ou seja, 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
Edward
fonte
5
Esse é um bom exemplo. Você pode simplificar ainda mais o filtro de captura do tcpdump substituindo "'tcp [tcpflags] & (tcp-syn)! = 0' e 'tcp [tcpflags] e (tcp-ack) == 0'" por apenas 'tcp [tcpflags ] == tcp-syn '. Isso excluirá automaticamente os pacotes com o ACK definido. Felicidades!
JJC
9
tcpdump 'tcp[13] = 3'

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

Avançado

Você também pode filtrar com base em partes específicas de um pacote, bem como combinar várias condições em grupos. O primeiro é útil ao procurar apenas SYNs ou RSTs, por exemplo, e o último para isolamento de tráfego ainda mais avançado.

UAP RSF

[Dica: um anagrama para os sinalizadores do TCP: invasores não qualificados incomodam a segurança real]

sua nota: ...

Mostre-me todos os URGpacotes URGENTES ( ) ...

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

Mostre-me todos os ACKpacotes RECONHECIMENTO ( ) ...

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

Mostre-me todos os PSHpacotes PUSH ( ) ...

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

Mostre-me todos os RSTpacotes RESET ( ) ...

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

Mostre-me todos os SYNpacotes SYNCHRONIZE ( ) ...

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

Mostre-me todos os FINpacotes FINISH ( ) ...

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

Mostre-me todos os SYNACKpacotes SYNCHRONIZE / RECONHECIMENTO ( ) ...

tcpdump 'tcp[13] = 18'

[ Nota: Apenas o PSH, RST, SYN, e FINbandeiras são exibidos na saída de campo a bandeira do tcpdump. URGs e ACKs são exibidos, mas são mostrados em outro lugar na saída e não no campo sinalizadores]

castet
fonte
2
O plagarismo não é permitido no Stack Exchange . Edite esta postagem para deixar claro que você copiou o conteúdo do site vinculado. Obrigado.
Chris S
4

Eu queria obter apenas pacotes SYN, usei o seguinte comando:

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

Isso deve funcionar para você imediatamente.

Sidharth
fonte
3
Isso capturará todos os pacotes com o conjunto de sinalizadores SYN, incluindo SYN, SYN-ACK, etc. Se você quiser apenas pacotes SYN, use 'tcp [13] == 2'. Felicidades!
JJC
1

deve mostrá-los sem filtros ou argumentos.

Um azul
fonte
Sua resposta está tecnicamente correta, mas o OP provavelmente pretendia incluir a palavra "somente" em sua pergunta. ;-) Felicidades!
JJC