2013-04-17 13 views
5

Próbuję obliczyć GET Żądanie z mojego serwera.Jak filtrować wyniki tshark przed napisaniem do pliku?

Używam tshark.

biegnę następnie polecenie, aby filtrować ruch przychodzący i pobrać tylko GET wnioski:

/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"' 

Jak widzisz zdefiniowałem do przechowywania filtrowane wyniki do 1 pliku o rozmiarze max 1G i nazwy: samples.pcap.

Problem jest, gdy próbuję otworzyć plik pcap widzę, że 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 

Mam naprawdę duży ruch, w ciągu 10 minut dostaję pcap rozmiar pliku 950m. Parsowanie zajmuje około 4 minut.

Interesującą rzeczą jest, gdy próbuję go uruchomić bez przechowywać go do lokalnego pliku (ale w/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 

To działa, ale w tym przypadku mam pod tmp kilka plików/Temp z ogromnym rozmiarem 1G +.

Czy coś mi umknęło?

Dziękuję

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

Edit

Lars poprosił, aby dodać -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 

nie pomaga, nadal samples.pcap przechowuje wszystkie ruch:

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

Czy próbowałeś podać wyrażeniu filtru przechwytywania opcję '-f'? –

+0

Próbowałem, nadal mam cały ruch. Gdzie umieszczasz '-f'? –

+0

Bezpośrednio przed wyrażeniem filtru, tj. '-f 'tcp ...' –

Odpowiedz

3

To wydaje się działać, kiedy tylko chcesz łączyć filtry pakietów -w i BPF (czyli co na siebie włożyć -f):

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

(zastępując początkową tcpdump z wynikami tshark w ten błąd w moim lokalnym systemie: tshark: Nierozpoznany format libpcap)

Zapisywanie wyniku filtru odczytu (-R) nie jest już obsługiwane od wersji 1.4.0 podczas przechwytywania (lub odczytu z przechwytywania) i ponowne zapisanie wyniku (patrz: http://ask.wireshark.org/questions/10397/read-filters-arent-supported-when-capturing-and-saving-the-captured-packets). Prawdopodobnie wcześniejsze wersje 1.4.0 pozwoliłyby na zapisanie do pcap i ograniczenie wyjścia z -b (nie przetestowałem tego).

Jeśli chcesz tylko tekst wyjściowy -R (w przeciwieństwie do wyjścia PCAP). Powyższe polecenie byłoby moim zdaniem rozwiązaniem.

Aby ograniczyć wyjścia (czyli można wymienić po prostu chcesz pobrać próbkę.) Można użyć head -c <bytes> w dowolnym punkcie rurociągu przetwarzania:

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

produkować plik tekstowy wyjściowy 1024000 bajtów nazwie wydajność.txt lub

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

przetwarzać 102400 bajtów wejściowych pcap, który został filtracji wstępnej na porcie TCP 80, i umieścić wyjście tekstu do pliku o nazwie output.txt

+0

Tak więc w twoim przykładzie, jeśli mam 100M ruchu na minutę, tylko "GET" zostanie przechwycony i gdzie zostanie umieszczony ? Chcę uniemożliwić tworzenie plików tymczasowych, co robi tshar w/tmp. Do tego używam '-w' –

+0

O ile widzę w moim systemie lokalnym (Mac OS X) ta metoda nie generuje plików tymczasowych w/tmp i przechwytuje tylko żądania "GET" do określonego pliku wyjściowego. –

+0

Polecenia 1 i 2, które opublikowałeś, działają, ale nadal otrzymuję plik 'etherXXXX **' w folderze '/ tmp'. –

1

dobrze, nie używaj -w, to zapisze surowe dane, powinieneś użyć operatora przekierowania ">", aby określić katalog docelowy.

Powiązane problemy