2012-08-01 15 views
7

Próbuję sniffować nagłówki http za pomocą tcpdump.Opis filtru Tcpdump i maskowania bitów

Filtr ten działa dobrze, ale nie mogę go zrozumieć -

(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) 

Mam googled go, ale nie mogę znaleźć żadnych użytecznych informacji

Oto cała komenda tcpdump

sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and 
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0 

Odpowiedz

15

To nie jest filtr BPF, który pobiera nagłówki http, ale przełącznik "-A" w komendzie tcpdump.

Komenda tcpdump szuka ruchu TCP do określonego miejsca docelowego lub z określonego źródła na etykiecie eth0, gdzie końcowy filtr BPF obejmuje obliczenia, które dają niezerową sumę. Za pomocą opcji "-A" drukuje każdy pakiet w ASCII minus nagłówek poziomu łącza.

Wyjaśniłem poniższe obliczenia, ale uważam, że w aktualnym filtrze są pewne problemy, prawdopodobnie poprzez kopiowanie i wklejanie. Podczas korzystania z tych filtrów w tcpdump, używasz tcp-bit maskowania, który jest zwykle używany podczas badania pola, które nie mieszczą się na granicach bajtowych

  • ip[2:2] odnosi się do dwóch bajtów (czyli 3rd & 4th bajtów) w nagłówku IP, zaczynając od bajtu 2 (pamiętaj, że zaczyna się od przesunięcia 0). Suma ta reprezentuje całkowitą długość pakietu IP, która może wynosić maksymalnie 65535 bajtów.

Dla maskę bitową tutaj, dla jasności, mam wstępnie zawieszone „0” tak maskować 0xf staje 0x0f. Prowadzące "0" na masce spada zgodnie z komentarzem GuyHarrisa poniżej.

  • ip[0]&0x0f odnosi się do drugiej połowy bajt 0 (tj 1st bajtów) w nagłówku IP, co daje długość nagłówka IP w 32 bitowych słów i jako takie, to jest zwykle pomnożona przez 4 dla takie obliczenie.

  • odnosi się do pierwszej połowy bajtu 12 (tj. Do 11 bajtu), który jest polem przesunięcia danych, które określa rozmiar nagłówka TCP w 32-bitowych słowach i jako takie jest zwykle mnożone przez 4 dla takiego obliczenia.

trzeba pomnożyć 2 ostatnie odcinki przez 4 ponieważ są 32-bitowe/4 bajty, słowa i tak musi być tłumaczone w sumie w bajtach dla obliczenia są poprawne

Twój filtr powinien być obliczenia:

  • długość IP pakietu (w bajtach) - długość nagłówka IP - długość nagłówka TCP

i szuka tej wartości należy Pań- ro, czyli coś w tym

sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

Podczas wykonywania odejmowania, szukasz niezerowej sumie.Ta niezerowa suma oznacza, że ​​istnieją dane powyżej warstwy 4, tj. Dane w ładunku tcp, zazwyczaj ruch aplikacji.

Można również dodać port 80 zakładając najbardziej ruch HTTP jest przez port 80.

Taki filtr jest powszechnie stosowany przez folk bezpieczeństwa do wykrywania danych na SYN, co nie jest normalne, ale zgodnie z RFC, to jest dozwolone. więc cała sprawa będzie wyglądać mniej więcej tak -

'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

TCPIPGuide jest bardzo dobry, bezpłatny internetowy przewodnik na TCP/IP btw.

Zaktualizowano: Zmodyfikuj sekcję "wiodącego zera" w masce bitowej zgodnie z aktualizacją Guy Harris.

+1

'0x0f' i' 0xf' to to samo; wiodące zera można pominąć w wartościach szesnastkowych. Kod może czytać więcej * wyraźnie *, jeśli jednak znajdują się wiodące zera. '<< 2' jest takie samo jak' * 4'; '>> 2' jest jednak'/2' (dziel przez 2), co jest błędne - to prawdopodobnie literówka. –

+1

Dziękuję bardzo kompleksową odpowiedzią! – kingasmk

+1

@GuyHarris thx, nie byłem pewien, czy początkowe zero zostało odrzucone, więc po prostu pomyślałem, że wstawię mój komentarz dla jasności. Jeśli chodzi o '>> 2' będący tym samym co' * 4', po prostu zmieniłem go z '>> 2' dla jasności, ponieważ' * 4' jest całkiem jasne i uznało za konieczne wyjaśnienie różnicy wartości (32 -bitowe słowa w porównaniu do bajtów) i usunąć wątpliwości wokół literówki "<< 2". –