Come acquisire pacchetti ack o syn da Tcpdump?


48

Voglio usare una regola di filtro per acquisire solo pacchetti ack o syn. Come faccio a fare questo?


Personalmente non lo farei. Catturerei tutti i pacchetti, quindi filtrerei in seguito i flag SYN e ACK. Se stai risolvendo il problema con TCP, vuoi quasi sempre vedere un'intera conversazione, non solo una stretta di mano o ACK. Se non sei interessato al payload di dati effettivo, puoi limitare la dimensione del pacchetto con tcpdump -s SIZE. L'intestazione TCP può avere una lunghezza variabile, quindi l'acquisizione -s 128probabilmente otterrà tutte le possibili intestazioni e forse un po 'di dati.
suprjami,

4
Forse non stai risolvendo il problema con TCP. Forse vuoi vedere quanto è loquace un programma e vuoi contare le sue connessioni in uscita. Come me, adesso.
Dan Pritts,

Risposte:


81

La sintassi del filtro pcap utilizzata per tcpdump dovrebbe funzionare esattamente allo stesso modo sul filtro di acquisizione di WireShark.

Con tcpdump userei un filtro come questo.

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

Dai un'occhiata alla pagina man di tcpdump e presta molta attenzione alle tcpflags.

Assicurati di controllare anche le sezioni nel Wiki di Wireshark sui filtri di acquisizione e visualizzazione. Sfortunatamente i due tipi di filtri usano una sintassi completamente diversa e nomi diversi per la stessa cosa.

Se si desidera un filtro di visualizzazione anziché il filtro di acquisizione, è probabilmente necessario creare un'espressione che combini tcp.flags.ack e tcp.flags.syn. Conosco molto meglio i filtri di acquisizione, quindi dovrai risolverlo da solo.


1
Mi piace di più la tua risposta. Sembra che tu abbia fatto uno sforzo. Promuovi per te.
Ablue,

4
Questa è un'ottima risposta con buoni riferimenti, ma si noti che questa sintassi catturerà tutti i pacchetti che hanno i flag SYN o ACK impostati, anche se sono impostati anche altri flag. Potrebbe essere o meno ciò che intendeva l'OP. Si prega di vedere la mia risposta di seguito per un filtro più rigoroso se si desiderano solo pacchetti TCP SYN o ACK. Saluti.
JJC

14

Mentre la risposta di @ Zoredache è piacevole e completa, nota che quella sintassi produrrà tutti i pacchetti che hanno il flag TCP SYN o TCP ACK impostato, compresi i pacchetti che non sono rigorosamente solo pacchetti "TCP SYN" o "TCP ACK", perché hanno anche impostato altri flag. Questo potrebbe essere o meno ciò che tu (o i tuoi futuri lettori) intendevi. Ad esempio, quella sintassi acquisirà anche pacchetti TCP SYN-ACK, TCP FIN-ACK, ecc. Se si desidera solo pacchetti TCP SYN o TCP ACK (ovvero SOLO uno di questi flag impostati), la sintassi del filtro di acquisizione corretta è:

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

Equivalentemente:

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

Saluti!


9

Ho realizzato una sceneggiatura per vedere i migliori "sincronizzatori". Per questo, considero solo il pacchetto syn iniziale (il primo pacchetto della stretta di mano dei tre pacchetti). Cioè, 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
Questo è un bell'esempio. Puoi semplificare ulteriormente il filtro di acquisizione di tcpdump sostituendo "'tcp [tcpflags] & (tcp-syn)! = 0' e 'tcp [tcpflags] & (tcp-ack) == 0'" con solo 'tcp [tcpflags ] == tcp-syn '. Ciò escluderà automaticamente i pacchetti con ACK impostato. Saluti!
JJC

9
tcpdump 'tcp[13] = 3'

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

Avanzate

Puoi anche filtrare in base a parti specifiche di un pacchetto, nonché combinare più condizioni in gruppi. Il primo è utile quando si cercano solo SYNS RST, ad esempio, e il secondo per un isolamento del traffico ancora più avanzato.

UAP RSF

[Suggerimento: un anagramma per le bandiere TCP: Unskilled Attackers Pester Real Security Folk]

il tuo promemoria: ...

Mostrami tutti i URGpacchetti URGENT ( ) ...

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

Mostrami tutti i ACKpacchetti ACKNOWLEDGE ( ) ...

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

Mostrami tutti i PSHpacchetti PUSH ( ) ...

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

Mostrami tutti i RSTpacchetti RESET ( ) ...

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

Mostrami tutti i SYNpacchetti SYNCHRONIZE ( ) ...

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

Mostrami tutti i FINpacchetti FINISH ( ) ...

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

Mostrami tutti i SYNACKpacchetti SYNCHRONIZE / ACKNOWLEDGE ( ) ...

tcpdump 'tcp[13] = 18'

[ Nota: Solo il PSH, RST, SYN, e FINle bandiere vengono visualizzati in uscita campo flag di tcpdump. URGs e ACKs vengono visualizzati, ma sono mostrati altrove nell'output anziché nel campo flag]


2
Il plagio non è consentito su Stack Exchange . Modifica questo post per chiarire che hai copiato il contenuto dal sito collegato. Grazie.
Chris S,

4

Volevo ottenere solo pacchetti SYN, ho usato il seguente comando:

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

Questo dovrebbe funzionare subito per te.


3
Ciò acquisirà tutti i pacchetti con il set di flag SYN, inclusi SYN, SYN-ACK, ecc. Se si desidera solo pacchetti SYN, utilizzare invece 'tcp [13] == 2'. Saluti!
JJC,

1

dovrebbe mostrarli senza filtri o argomenti.


La tua risposta è tecnicamente corretta, ma probabilmente il PO intendeva includere la parola "solo" nella sua domanda. ;-) Saluti!
JJC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.