2013-04-17 6 views
5

Provo a calcolare GET Richiesta dal mio server.Come filtrare i risultati di tshark prima di scrivere su file?

Io uso tshark.

corro comando seguito per filtrare il traffico in entrata e prendere solo GET richieste:

/usr/sbin/tshark -b filesize:1024000 -b files:1 \ 
'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' \ 
-w samples.pcap -R 'http.request.method == "GET"' 

Come vedi ho definito per memorizzare i risultati filtrati per 1 file con dimensione massima 1G e il nome: samples.pcap.

Il problema è che quando cerco di aprire il file pcap vedo che tshark stored all traffic there:

3245 172.692247 1.1.1.1 -> 2.2.2.2 HTTP [TCP Retransmission] Continuation or non-HTTP traffic 
3246 172.730928 1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic 
3247 172.731944 1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic 
3248 172.791934 1.1.1.1 -> 2.2.2.2 HTTP GET /services/client/client.php?cnc=13 HTTP/1.1 
3249 172.825303 1.1.1.1 -> 2.2.2.2 HTTP HTTP/1.1 200 OK [Unreassembled Packet [incorrect TCP checksum]] 
3250 172.826329 1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic 
3251 172.826341 1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic 
3252 172.826347 1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic 
3253 172.826354 1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic 
3254 172.826359 1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic 

devo davvero grande traffico, durante 10 min ottengo pcap dimensioni del file 950M. E ci vogliono circa 4 minuti per analizzarlo.

La cosa interessante è quando provo a farlo funzionare, senza per memorizzare al file locale (ma sotto/tmp):

/usr/sbin/tshark \ 
'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' \ 
-R 'http.request.method == "GET"': 

3.776587 1.1.1.1 -> 2.2.2.2 HTTP GET /services/client/client.php?cnc=13 HTTP/1.1 
4.775624 1.1.1.1 -> 2.2.2.2 HTTP GET /services/client/clsWebClient.php HTTP/1.1 
8.804702 1.1.1.1 -> 2.2.2.2 HTTP GET /services/client/client.php?cnc=13 HTTP/1.1 

funziona, ma in questo caso ho sotto/tmp diversi file temporanei con dimensioni enormi 1G +.

Mi sono perso qualcosa?

Grazie

======================================== ===============

Modifica

Lars ha chiesto di aggiungere -f:

sudo /usr/sbin/tshark -T fields -e 'http.request.uri contains "cnc=13"' \ 
     -b filesize:1024000 -b files:1 \ 
     -f 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' \ 
     -w samples.pcap 

non aiuta, ancora negozi samples.pcap tutto traffico:

74 6.908388 172.20.0.23 -> 89.78.170.96 HTTP Continuation or non-HTTP traffic 
75 6.908394 172.20.0.23 -> 89.78.170.96 HTTP Continuation or non-HTTP traffic 
+0

Hai provato a fornire l'espressione del filtro di acquisizione all'opzione '-f'? –

+0

Ho provato, ho ancora tutto il traffico. Dove metti '-f'? –

+0

Proprio davanti all'espressione filtro, ovvero '-f 'tcp ...' –

risposta

3

Questo sembra funzionare quando ci si desidera combinare filtri di pacchetti -w e BPF (vale a dire, ciò che si mette sulla -f):

tcpdump -nli en1 -w - 'tcp port 80' | tshark -i - -R'http.request.method == "GET"' 

(sostituendo il tcpdump iniziale con risultati tshark in questo errore nel mio sistema locale: tshark: formato libpcap non riconosciuto)

Il salvataggio del risultato di un filtro di lettura (-R) non sembra essere più supportato dalla versione 1.4.0 quando si acquisisce (o si legge da un cattura) e scrivendo nuovamente il risultato (vedi: http://ask.wireshark.org/questions/10397/read-filters-arent-supported-when-capturing-and-saving-the-captured-packets). Presumibilmente le versioni pre 1.4.0 consentirebbero di scrivere su pcap e limitare l'output con -b (non l'hanno testato).

Se si desidera solo l'output di testo di -R (in contrapposizione all'output di pcap). Il comando sopra sarebbe la tua soluzione, penso.

Per limitare l'output (cioè si parla si vuole solo prendere un campione.) È possibile utilizzare head -c <bytes> in qualsiasi punto della pipeline di elaborazione:

tcpdump -nli en1 -w - 'tcp port 80' | \ 
    tshark -i - -R'http.request.method == "GET"' | \ 
    head -c 1024000 > output.txt 

per produrre un file di testo-output 1.024.000 byte di chiamata produzione.txt o

tcpdump -nli en1 -w - 'tcp port 80' | \ 
    head -c 1024000 | \ 
    tshark -i - -R'http.request.method == "GET"' > output.txt 

per elaborare 102400 byte di ingresso pcap che è stato pre-filtrato per la porta TCP 80, e mettere l'output di testo in un file denominato output.txt

+0

Quindi nel tuo esempio se ho 100M di traffico al minuto, solo "GET" verrà catturato e dove posizionato ? Voglio evitare di creare file temporanei cosa tshar fa sotto/tmp. Per questo uso '-w' –

+0

Per quanto posso vedere sul mio sistema locale (Mac OS X) questo metodo non produce file temporanei in/tmp e cattura solo richieste" GET "nel file di output specificato. –

+0

Il primo e il secondo comando che hai inviato funzionano, ma ho ancora il file 'etherXXXX **' nella cartella '/ tmp'. –

1

bene, non usare -w, essa salverà i dati grezzi, dovresti usare l'operatore di reindirizzamento ">" per specificare la directory di destinazione.

Problemi correlati