Comment capturer les paquets ACK ou SYN par Tcpdump?

48

Je souhaite utiliser une règle de filtrage pour ne capturer que les paquets ACK ou SYN. Comment puis-je faire cela?

Larry
la source
Personnellement je ne ferais pas ça. Je capturerais tous les paquets, puis filtrerais sur les drapeaux SYN et ACK plus tard. Si vous dépannez TCP, vous voulez presque toujours voir toute une conversation, pas seulement une poignée de main ou un ACK. Si la charge de données réelle ne vous intéresse pas, vous pouvez limiter la taille du paquet avec tcpdump -s SIZE. L'en-tête TCP peut avoir une longueur variable. La capture -s 128obtiendra donc probablement tous les en-têtes possibles et peut-être un peu de données.
suprjami
4
Peut-être que vous ne dépannez pas TCP. Vous voulez peut-être voir à quel point un programme est bavard et vous voulez compter ses connexions sortantes. Comme moi, maintenant.
Dan Pritts

Réponses:

81

La syntaxe de filtre pcap utilisée pour tcpdump devrait fonctionner exactement de la même manière sur le filtre de capture de Wirehark.

Avec tcpdump, j'utiliserais un filtre comme celui-ci.

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

Consultez la page de manuel tcpdump et portez une attention particulière aux tcpflags.

Veillez également à consulter les sections du wiki Wireshark sur les filtres de capture et d'affichage. Malheureusement, les deux types de filtres utilisent une syntaxe complètement différente et des noms différents pour la même chose.

Si vous voulez un filtre d'affichage au lieu d'un filtre de capture, vous devrez probablement créer une expression combinant tcp.flags.ack et tcp.flags.syn. Cependant, je suis beaucoup plus familiarisé avec les filtres de capture, vous devrez donc le résoudre vous-même.

Zoredache
la source
1
J'aime mieux ta réponse. On dirait que vous avez fait un effort. Upvote pour vous.
Ablue
4
C'est une excellente réponse avec de bonnes références, mais veuillez noter que cette syntaxe capture tous les paquets pour lesquels les indicateurs SYN ou ACK sont définis, même si d'autres indicateurs sont également définis. Cela peut être ou ne pas être ce que le PO avait prévu. Veuillez consulter ma réponse ci-dessous pour un filtre plus strict si vous souhaitez uniquement des paquets TCP SYN ou ACK. À votre santé.
JJC
14

Bien que la réponse de @ Zoredache soit belle et complète, notez que cette syntaxe produira tous les paquets pour lesquels le drapeau TCP SYN ou TCP ACK est défini, y compris les paquets qui ne sont pas strictement des paquets «TCP SYN» ou «TCP ACK», car ils ont également d'autres drapeaux. Cela peut être ou ne pas être ce que vous (ou les futurs lecteurs) vouliez. Par exemple, cette syntaxe capture également les paquets TCP SYN-ACK, TCP FIN-ACK, etc. Si vous souhaitez uniquement des paquets TCP SYN ou TCP ACK (c'est-à-dire JUST comme l'un de ces indicateurs), la syntaxe de filtre de capture correcte est la suivante:

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

De manière équivalente:

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

À votre santé!

JJC
la source
9

J'ai fait un script pour voir les meilleurs "synners". Pour cela, je ne considère que le paquet syn initial (le premier paquet de la poignée de main des trois paquets). C'est-à-dire, 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
la source
5
C'est un bel exemple. Vous pouvez encore simplifier votre filtre de capture tcpdump en remplaçant "'tcp [tcpflags] & (tcp-syn)! = 0'" et 'tcp [tcpflags] & (tcp-ack) == 0' "par seulement 'tcp [tcpflags ] == tcp-syn '. Cela exclura automatiquement les paquets avec ACK défini. À votre santé!
JJC
9
tcpdump 'tcp[13] = 3'

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

Avancée

Vous pouvez également filtrer en fonction de parties spécifiques d'un paquet, ainsi que combiner plusieurs conditions en groupes. Le premier est utile lorsque vous recherchez uniquement SYNs ou RSTs, par exemple, et le second pour une isolation encore plus avancée du trafic.

UAP RSF

[Astuce: Une anagramme avec les drapeaux TCP: Des attaquants non qualifiés Pester Real Security Folk]

votre mémo: ...

Montrez-moi tous les URGpaquets URGENT ( ) ...

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

Montrez-moi tous les ACKpaquets ACKNOWLEDGE ( ) ...

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

Montrez-moi tous les PSHpaquets PUSH ( ) ...

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

Montrez-moi tous les RSTpaquets RESET ( ) ...

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

Montrez-moi tous les SYNpaquets SYNCHRONIZE ( ) ...

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

Montrez-moi tous les FINpaquets FINISH ( ) ...

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

Montrez-moi tous les SYNACKpaquets SYNCHRONIZE / ACKNOWLEDGE ( ) ...

tcpdump 'tcp[13] = 18'

[ Note: Seul le PSH, RST, SYN, et les FINdrapeaux sont affichés dans la sortie du champ de drapeau de tcpdump. URGs et ACKs sont affichés, mais ils sont affichés ailleurs dans la sortie plutôt que dans le champ flags]

castet
la source
2
Le plagarisme n'est pas permis sur Stack Exchange . Veuillez éditer ce message pour indiquer que vous avez copié le contenu du site lié. Je vous remercie.
Chris S
4

Je voulais obtenir uniquement les paquets SYN moi-même, j'ai utilisé la commande suivante:

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

Cela devrait fonctionner pour vous tout de suite.

Sidharth
la source
3
Cela capturera tous les paquets avec le drapeau SYN défini, y compris SYN, SYN-ACK, etc. Si vous voulez uniquement des paquets SYN, utilisez plutôt "tcp [13] == 2". À votre santé!
JJC
1

il devrait les montrer sans filtres ni arguments.

Un bleu
la source
Votre réponse est techniquement correcte, mais le PO voulait probablement inclure le mot "seulement" dans sa question. ;-) À votre santé!
JJC