Wie erfasst man Ack- oder Syn-Pakete mit Tcpdump?


48

Ich möchte eine Filterregel verwenden, um nur Bestätigungs- oder Synchronisierungspakete zu erfassen. Wie mache ich das?


Persönlich würde ich das nicht tun. Ich würde alle Pakete erfassen und später nach SYN- und ACK-Flags filtern. Bei der Fehlerbehebung bei TCP möchten Sie fast immer eine ganze Konversation sehen, nicht nur einen Handshake oder eine Bestätigung. Wenn Sie nicht an der tatsächlichen Datennutzlast interessiert sind, können Sie die Paketgröße mit begrenzen tcpdump -s SIZE. Der TCP-Header kann eine variable Länge haben, daher werden bei der Erfassung -s 128wahrscheinlich alle möglichen Header und möglicherweise ein wenig Daten abgerufen.
Suprjami

4
Möglicherweise beheben Sie keine TCP-Probleme. Vielleicht möchten Sie sehen, wie gesprächig ein Programm ist, und Sie möchten seine ausgehenden Verbindungen zählen. So wie ich jetzt.
Dan Pritts

Antworten:


81

Die für tcpdump verwendete pcap-Filtersyntax sollte beim wireshark capture-Filter genau so funktionieren.

Mit tcpdump würde ich einen Filter wie diesen verwenden.

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

Schauen Sie sich die tcpdump-Manpage an und achten Sie genau auf die tcpflags.

Lesen Sie auch die Abschnitte im Wireshark Wiki über Erfassungs- und Anzeigefilter. Leider verwenden die beiden Filtertypen eine völlig andere Syntax und unterschiedliche Namen für dasselbe Objekt.

Wenn Sie einen Anzeigefilter anstelle eines Erfassungsfilters wünschen, müssen Sie wahrscheinlich einen Ausdruck erstellen, der tcp.flags.ack und tcp.flags.syn kombiniert. Ich kenne mich mit Capture-Filtern weitaus besser aus, daher musst du das selbst herausfinden.


1
Ihre Antwort gefällt mir besser. Sie haben sich anscheinend angestrengt. Upvote für dich.
Ablue,

4
Dies ist eine gute Antwort mit guten Referenzen. Beachten Sie jedoch, dass diese Syntax alle Pakete erfasst, für die die SYN- oder ACK-Flags gesetzt sind, auch wenn andere Flags ebenfalls gesetzt sind. Dies kann oder kann nicht das sein, was das OP beabsichtigt hat. Bitte sehen Sie meine Antwort unten für einen strengeren Filter, wenn nur TCP SYN- oder ACK-Pakete gewünscht werden. Prost.
JJC

14

Die Antwort von @ Zoredache ist schön und vollständig. Beachten Sie jedoch, dass diese Syntax alle Pakete liefert, für die das TCP-SYN- oder das TCP-ACK-Flag gesetzt ist, einschließlich der Pakete, die nicht nur reine "TCP-SYN" - oder "TCP-ACK" -Pakete sind auch haben andere Flaggen - Set. Dies kann oder kann nicht das sein, was Sie (oder zukünftige Leser) beabsichtigt haben. Diese Syntax erfasst beispielsweise auch TCP-SYN-ACK-Pakete, TCP-FIN-ACK usw. Wenn Sie nur TCP-SYN- oder TCP-ACK-Pakete (dh NUR eines dieser Flags) festlegen möchten, lautet die korrekte Erfassungsfiltersyntax:

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

Äquivalent:

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

Prost!


9

Ich habe ein Skript erstellt, um die Top-"Synner" zu sehen. Dafür betrachte ich nur das anfängliche Syn-Paket (das erste Paket des Drei-Pakete-Handshakes). Das heißt, 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
Das ist ein schönes Beispiel. Sie können Ihren tcpdump-Erfassungsfilter noch weiter vereinfachen, indem Sie "'tcp [tcpflags] & (tcp-syn)! = 0' und 'tcp [tcpflags] & (tcp-ack) == 0'" durch "tcp [tcpflags" ersetzen ] == tcp-syn '. Das schließt automatisch Pakete mit eingestellter ACK aus. Prost!
JJC

9
tcpdump 'tcp[13] = 3'

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

Fortgeschritten

Sie können auch nach bestimmten Teilen eines Pakets filtern und mehrere Bedingungen in Gruppen zusammenfassen. Ersteres ist nützlich, wenn Sie beispielsweise nur nach SYNs oder RSTs suchen , und letzteres für eine noch weitergehende Verkehrsisolation.

UAP RSF

[Hinweis: Ein Anagramm für die TCP-Flags: Unqualifizierte Angreifer belästigen echte Sicherheitsleute]

Ihr Memo: ...

Zeige mir alle DRINGEND ( URG) Pakete ...

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

Zeige mir alle ACKNOWLEDGE ( ACK) Pakete ...

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

Zeige mir alle PUSH ( PSH) Pakete ...

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

Zeige mir alle RESET ( RST) Pakete ...

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

Zeige mir alle SYNCHRONIZE ( SYN) -Pakete ...

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

Zeige mir alle FINISH ( FIN) Pakete ...

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

Alle SYNCHRONIZE / ACKNOWLEDGE ( SYNACK) -Pakete anzeigen ...

tcpdump 'tcp[13] = 18'

[ Anmerkung: Nur die PSH, RST, SYNund FINFahnen in der tcpdump - Flag - Feld Ausgabe angezeigt werden. URGs und ACKs werden angezeigt, aber sie werden an anderer Stelle in der Ausgabe und nicht im Flags-Feld angezeigt.]


2
Plagarism ist nicht erlaubt auf Stapel von Exchange . Bitte bearbeiten Sie diesen Beitrag, um zu verdeutlichen, dass Sie den Inhalt der verlinkten Site kopiert haben. Danke.
Chris S

4

Ich wollte nur SYN-Pakete selbst bekommen, ich habe den folgenden Befehl verwendet:

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

Dies sollte sofort für Sie funktionieren.


3
Dadurch werden alle Pakete mit gesetztem SYN-Flag erfasst, einschließlich SYN, SYN-ACK usw. Wenn Sie nur SYN-Pakete möchten, verwenden Sie stattdessen 'tcp [13] == 2'. Prost!
JJC

1

Es sollte sie ohne Filter oder Argumente anzeigen.


Ihre Antwort ist technisch korrekt, aber das OP sollte wahrscheinlich das Wort "nur" in seine Frage aufnehmen. ;-) Prost!
JJC
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.