transparent a virus... Dodał: grzywka18 Dnia: 2008-05-13 11:19:58 hmm Dodał: dzibi Dnia: 2007-12-12 10:01:14 Bez tytułu Dodał: grzywka18 Dnia: 2007-12-11 17:46:06 Bez tytułu Dodał: termid Dnia: 2007-05-09 18:01:11 Bez tytułu Dodał: sarelo33 Dnia: 2006-12-30 23:50:14 Jest ok ale.. Dodał: theviant Dnia: 2006-11-16 08:10:05
Google
Newsletter
Zapisz się na nasz newsletter, jeżeli chcesz być na bieżąco informowany o aktualnościach..
Podstawy używania narzędzia tcpdump
wtorek, 13 stycznia 2004 -
Napisał: Łukasz Bromirski (14443 odsłon)
tcpdump jest najpopularniejszym i najbardziej przenośnym snifferem. Są
oczywiście łatwiejsze w użyciu i efektowniejsze graficznie, ale nie o to nam
przecież chodzi.
tcpdump to naprawdę potężne i wydajne narzędzie. Jak to zwykle z takimi bywa -
zastosowań są miliony, musisz tylko wiedzieć co chcesz logować. A jak widać po
powstaniu czegoś takiego jak
Museum of the broken packets lcamtufa, pakietów
godnych uwagi jest całkiem sporo :).
SZYBKI START
Co muszę mieć?
Aby móc skorzystać z tcpdumpa, musisz mieć po pierwsze kernel skompilowany z
opcją BPF (Berkeley Packet Filter) czyli w konfiguracji kernela musi znaleźć się
linijka:
options BPF
Po drugie, musisz mieć urządzenie /dev/bpf* i dostęp do niego. Jeśli
pracujesz na koncie root po normalnej instalacji systemu, wszystko to jest
prawdą. Jeśli dostałeś do administracji po kimś starszy system, mogą być
problemy ;).
Podstawy podstaw
Jednym z pierwszych parametrów, które warto dla porządku podać jest interfejs, z
którego tcpdump ma zbierać pakiety. Bez tego parametru, tcpdump rozpocznie
nasłuchiwanie na pierwszym interfejsie sieciowym systemu (przy czym jego wybór
determinowany jest przez budowę wewnętrznych struktur systemu). Aby wskazać
interfejs xl0 należy wywołać program w ten sposób:
# tcpdump -i xl0
Drugą istotną opcją jest wskazanie, gdzie skierować wyjście programu.
Domyślnie program będzie wyrzucał pakiety pasujące do wzorca (o nim później) na
standardowe wyjście (czyli w większości wypadków po prostu konsolę). Standardowo
włączony jest mechanizm buforowania i pakiety będą pojawiały się z pewnymi
opóźnieniami w stosunku do ich fizycznego odebrania przez tcpdump - jeśli chcesz
ten mechanizm buforowania wyłączyć, dodaj do linii poleceń parametr `-l', tak
jak poniżej:
# tcpdump -l -i xl0
Oczywiście wyjście na konsolę nie zawsze jest wygodne - możliwe jest również
zapisywanie zbieranych pakietów do pliku. Struktura pliku to właśnie legendarny
format tcpdump, z którym zgodne są (tzn. potrafią go odczytać a często również
zapisać dane w tym formacie) wszystkie liczące się sniffery (np. bardzo
popularny obecnie ethereal). Aby zatem zmusić tcpdump do logowania informacji do
pliku, dodajemy parametr `-w nazwa_pliku', gdzie nazwa_pliku to jak nietrudno
zgadnąć, miejsce gdzie program zapisze dane:
# tcpdump -i xl0 -w /tmp/zrzut01.dmp
Zwykle po zakończeniu podsłuchiwania, interesuje nas również proces odwrotny,
tj. obejrzenie tego co zostało zalogowane. Można to wykonać zamieniając parametr
`-w nazwa_pliku' na `-r nazwa_pliku'. Przy okazji, aby dane prezentowane były w
dokładniejszej formie, można posłużyć się dodatkowymi parametrami:
`-v', `-vv' i `-vvv' służą do coraz dokładniejszego analizowania zawartości pakietu
`-t', `-tt', `-ttt' i `-tttt' powodują coraz dokładniejsze określenie czasu
`-x', `-tt', `-ttt' i `-tttt' zawartość pakietu prezentowana jest w postaci heksdecymalnej
`-X' zawartość pakietu prezentowana jest w postaci ASCII
Interpretację logów zostawmy sobie na koniec.
Wzorce
Prawdziwą siłą tcpdump jest możliwość konstruowania wzorców. Wzorzec to po
prostu warunek logiczny sprawdzający jakąś właściwość pakietu (lub zbiór
właściwości). Jeśli wynik sprawdzenia wzorca jest logiczną prawdą, pakiet
zostaje zalogowany/zapisany/pokazany.
Jeśli chcesz zalogować cały ruch pomiędzy stacją moja a komputerami serwer
lub stacja1 powinieneś napisać:
# tcpdump -i xl0 -w /tmp/zrzut02.dmp
host moja and (serwer or stacja1)
Notatka: Znaki backslash (`') są konieczne, by powłoka nie zinterpretowała
nawiasów jako swoich oznaczeń. Jest to prawda dla powłoki, w której przykłady te
były testowane - bash. Twoja powłoka może mieć inny tzw. escape-char, sprawdź to
na jej stronie podręcznika.
Częściej jednak chcesz zrzucić pakiety określonego protokołu skierowane od
komputera o określonym IP (ew. z sieci) do innego komputera (sieci). Aby
zalogować pakiety TCP z hosta 192.168.1.10, skierowane do portu 80 możesz
napisać:
# tcpdump -i xl0 -w /tmp/zrzut03.dmp
src 192.168.1.10 and tcp dst port 80
Ponieważ zwykle chodzi nam przy okazji o logowanie pakietów typu SYN
(początków połączeń), musimy posłużyć się dodatkowo inną cechą tcpdumpa:
traktowaniem pakietu jak tablicy bajtów. Zaadresowanie n-tego bajtu pakietu,
polega na odwołaniu się w ten sposób: [n]. Zapis ten należy poprzedzić
specyfikacją, do nagłówka której warstwy się odwołujemy (np. ether[x] dla całej
ramki Ethernetowej, ip[x] dla pakietów IP, tcp[x] dla pakietów TCP,
udp[x] dla
pakietów UDP, icmp[x] dla pakietów ICMP czy w końcu ip6[x] dla pakietów IPv6), a
następnie podać warunek matematyczny i wartość. Najprostsze są warunki, w
których po prostu sprawdzamy ustawienie bajtu (bitu) na określoną wartość.
Wiedząc, że flaga SYN jest bitem znajdującym się w 13 bajcie nagłówka TCP i
dodatkowo wiedząc, że jest to bit o numerze 1, możemy przechwycić wszystkie
pakiety z ustawioną flagą SYN w ten sposób:
# tcpdump -i xl0 -w /tmp/zrzut04.dmp
src 192.168.1.10 and dst port 80 and tcp[13] == 2
Mało przyjazne, prawda? tcpdump od wersji 3.7.1 oferuje jeszcze inną
możliwość - zastąpienie numeru bajtu słowem kluczowym. Dla flag TCP i typów oraz
rodzajów pakietów ICMP możemy posłużyć się zapisem słownym, co jest zdecydowanie
korzystniejsze. Ten sam przykład wygląda wtedy tak:
# tcpdump -i xl0 -w /tmp/zrzut04.dmp
src 192.168.1.10 and dst port 80 and tcp[tcpflags]=tcp-syn
Notatka: Nie rozumiesz dlaczego akurat 13 bajt i dlaczego ma mieć
wartość 2? Pierwszą informację możesz zdobyć przeglądając odpowiednie RFC (dla
określonego protokołu), w których dokładnie opisana jest struktura nagłówka.
Polecam jednak legendarną już "Biblię Stevensona", czyli "TCP/IP Illustrated", w
którym wszystko jest wytłumaczone dokładnie i jednocześnie językiem dużo
bardziej przyjaznym niż ten używany w RFC. Książkę tą posiada większość dobrych
księgarni, w tym sieć EMPiK - istotny jest przede wszystki pierwszy i trzeci
tom, drugi poświęcony jest implementacjom, co nie musi być dla wszystkich
ciekawe.
Druga wartość bierze się z reprezentacji dwójkowej ciągu 00000010,
oznaczającego, że drugi bit ustawiony jest na prawdę. Tak się składa, że ten
właśnie bit przyporządkowany jest fladze SYN. Wartością dwójkowego zapisu
00000010 jest właśnie 2, ponieważ jeśli rozpiszemy kolejne pozycje oktetu a
poniżej ich wartość decymalną, otrzymujemy:
A jak łatwo wyłapać i zalogować pakiety NetBIOS, rozsyłane ze słabo
zabezpieczonych stacji z systemem Microsoft Windows? Pakiety te przenosi
protokół TCP i UDP a numery portów to zakres od 137 do 139. Mamy już w zasadzie
wszystko co potrzeba do skonstruowania warunku:
# tcpdump -i xl0 -w /tmp/zrzut05.dmp
(tcp or udp) and (dst port 137 or dst port 138 or dst port 139)
Łatwo zauważyć, że posiadając takie narzędzie i inne, przeznaczone do
zautomatyzowanego uzyskiwania z takich stacji list użytkowników, współdzielonych
zasobów itd. łatwo przeprowadzić zautomatyzowany skan ;)
Ostatnia (powiedzmy ;) )ciekawa rzecz do zalogowania: pakiety z podejrzanie
małym TTL. Istnieje parę technik skanowania, łącznie nazywanych `firewalking',
które umożliwiają zmapowanie sieci za ścianą ogniową, nie potrafiącą filtrować z
utrzymaniem stanów. Jeśli używasz filtrowania z utrzymaniem stanów przy użyciu
ipfw czy ipf nie masz się o co martwić (ściana ogniowa odrzuci losowo generowane
pakiety jako nie należące do istniejących połączeń), ale warto wtedy wiedzieć,
że takie próby są podejmowane. `Podejrzanie' małe TTL to kwestia konkretnego
skanowania lub narzędzia, ale generalnie wartości od 5 w dół są już podejrzane.
Poniżej właśnie taki test:
Kolejne pozycje oddzielane spacjami w pierwszej linijce to:
23:33:39.280960 godzina w formacie HH:MM:SS.MS; format zapisu ściśle związany jest z podanymi
opcjami `-t', `-tt' itd.
192.168.10.10 adres IP hosta-nadawcy pakietu
> kierunek przepływu pakietu
192.168.0.10 adres IP hosta-adresata pakietu
icmp: protokół ponad IP - w tym przypadku ICMP
echo request typ pakietu - w tym przypadku żądanie echa
(DF) Ustawiony bit Don't Fragment, czyli nie fragmentować. Jeśli ten bit jest
ustawiony, a z jakiegoś powodu router musi pakiet sfragmentować, pakiet zostanie
odrzucony a kernel wygeneruje komunikat ICMP - Need Fragmentation (dotyczy to
tylko TCP i UDP, generowanie takiego pakietu dla ICMP mogłoby spowodować pętle i
nie jest stosowane).
Druga linijka obrazuje ruch pakietu w przeciwnym kierunku, ale typem pakietu
jest już echo reply - czyli normalna odpowiedź na ping. Przyjrzyjmy się teraz
pakietom dokładniej:
# tcpdump -v -r /tmp/zrzut01.dmp
23:33:39.280960 192.168.10.10 > 192.168.0.10: icmp: echo request (DF)
(ttl 63, id 0, len 84)
23:33:39.283636 192.168.0.10 > 192.168.10.10: icmp: echo reply (DF)
(ttl 64, id 17568, len 84)
Pomijając znane już pola, mamy:
ttl 63 TTL pakietu, wynosi 63. Standardowe TTL to zwykłe okrągłe potęgi dwójek, mamy
więc systemy ustawiające na starcie TTL równe 32 (zwykle drukarki i bardzo stare
systemy), 64 (większość *BSD i Linuksy po tuningu), 128 (Windowsy, część
routerów) i 255 (również Windowsy i część routerów).
id 0 id pakietu, wynosi 0
len 84 długość całkowita pakietu wynosi 84 bajty
Zajrzyjmy w takim razie do środka pakietu - podając parametr -x otrzymujemy
zrzut heksdecymalny jego zawartości, a dodając do tego -X dodatkowo
reprezentację ASCII. Poniżej przykład:
ICMP jest mało ciekawe - TCP (odpowiednie RFC:
793 i uzupełnienia w
3168) daje
cały ogrom nowych możliwości. Popatrzmy na pakiet TCP SYN do serwera HTTP
nasłuchującego pod adresem 192.168.0.10 na porcie 80:
S Pakiet ma ustawioną flagę SYN. Inne możliwe flagi to (R)ST, (P)USH, (F)IN, oraz
kropka `.' na oznaczenie braku ustawionych flag. Flaga (A)CK oznaczana jest
obecnością w dalszej części opisu słowa ack - w powyższym zrzucie nie jest
ustawiona.
2957663764:2957663764(0) Numer sekwencyjny - oddzielone dwukropkami pierwszy i ostatni numer sekwencyjny
dla danych, a w nawiasie znajduje się różnica - jak widać, pakiet nie zawiera
danych (0).
win 5840 Ogłoszenie rozmiaru `okna' pakietu TCP, tutaj 5840 bajtów. O koncepcji okien (i
tzw. sliding windows) najlepiej poczytać u Stevensa lub w
RFC813.
mss 1460 Wartość MSS, czyli Maximum Segment Size (dosł. Maksymalny Rozmiar Segmentu).
Segmenty danych (wartość nie dotyczy nagłówków ani innych opcji a jedynie dane)
o długości większej niż ta wartość będą podlegały fragmentacji - chyba, że
ustawiono w pakiecie bit `Don't Fragment' (jest ustawiony - (DF)). W takim
wypadku, router nie mogąc sfragmentować pakietu odeśle do jego źródła pakiet
ICMP - Fragmentation needed. Wartość MSS powinna być ustawiona według wzoru MSS=MTU-rozmiar_nagłówka_TCP-rozmiar_nagłówka_IP.
Dla Ethernetu domyślną wartością MTU jest 1500. Jeśli założymy, że pakiet
przenosi nagłówki IP i TCP w najkrótszych wersjach (po 20 oktetów) uzyskujemy
wynik 1460 dla MSS. Więcej informacji możesz znaleźć w
RFC879.
sackOK Opcja informująca odbiorcę, że może wysyłać selektywne potwierdzenia
poszczególnych części otrzymywanych danych. Więcej informacji znajduje się w
RFC1072
timestamp 190417 0 Stempel czasowy z pakietu IP, 32-bitowa liczba modulo północ. Więcej w
RFC781
nop Wyrównanie, `pusta' opcja. Na podstawie ułożenia opcji w pakiecie, a także
ilości dodanych opcji `nop' programy takie jak
nmap,
p0f v1/v2 czy
xprobe2
próbują określić typ stosu TCP/IP - a pośrednio, system operacyjny.
wscale 0 Współczynnik skalowania okna. Jest to opcja określona w
RFC1323 i w skrócie
dotyczy tego, w jaki sposób (i czy w ogóle) hosty mogą uzgodnić skalowanie okna.
Opcja ta powinna pojawiać się tylko podczas nawiązywania połączenia.
(DF) Ustawiony bit `Don't Fragment'
[tos 0x10] Pole ToS (ang. Type of Service, Typ Usługi) pakietu TCP. Ustawienie go jest
charakterystyczne m.in. dla hostów pracujących pod Linuksem.
1472218990:1472218990(0) Numer sekwencyjny, ponownie pakiet nie zawiera danych.
ack 2957663765 Potwierdzenie od zdalnego hosta, że następny pakiet powinien mieć numer
sekwencyjny 2957663765 (pierwszy pakiet miał numer sekwencyjny równy 2957663764
i nie przenosił danych). W TCP potwierdzenia wysyła się wskazując następny bajt
danych, który odbierający spodziewa się otrzymać.
win 57344 Ponownie ogłoszenie rozmiaru okna, tutaj widać rozmiar dużo większy - 57344
bajty.
timestamp 190382 190417 Stempel czasowy pakietu IP. Pakiet jest odpowiedzią na pakiet z ustawionym
stemplem 190417, obecny ma 190382 - różnica wynosi jak widać 35 milisekund.
No dobrze, przyjrzeliśmy się pierwszym dwóm pakietom z fazy nawiązywania
połączenia. Normalne połączenie TCP powinno mieć swój początek - składający się
z tzw. three-way handshake:
Pakiet od hosta inicjującego, ma ustawioną tylko flagę SYN
Pakiet od hosta odpowiadającego ma ustawione flagi SYN i ACK (jeśli chce odebrać
połączenie)
Pakiet od hosta inicjującego ma ustawioną flagę ACK i zawiera pierwszą porcję
danych.
Kolejne pakiety nie stanowią specjalnej zagadki, ponieważ powinny przenosić dane
- popatrzmy od początku na zrzut pierwszych paru pakietów, podróżujących od i do
hosta inicjującego połączenie:
W trzeciej z kolei linijce widać wpis ack 1. Normalnie, tcpdump po podaniu
pełnych numerów sekwencyjnych dla połączenia, kolejne podawać będzie już
relatywnie - w kolejnej linicje widzimy pakiet z flagą PUSH (P) i numery
1:18(17). Oznacza to po prostu, że pakiet zawierał 17 bajtów danych a relatywne
numery sekwencyjne tych danych to od 1 do 18. Aby zawsze tcpdump wyświetlał
faktyczne numery sekwencyjne, użyj opcji `-S'.
Poprawne i niepoprawne kombinacje flag TCP
`Normalne' kombinacje flag to takie, które opisane w odpowiednich RFC mogą się
zdarzyć. `Nienormalne' kombinacje flag, to takie których nigdzie oficjalnie nie
opisano. Są zwykle używane przez programy typu nmap, p0f v1/v2 czy xprobe2 do
określenia rodzaju stosu TCP/IP - a pośrednio systemu operacyjnego. Poniżej małe
podsumowanie `normalnych' kombinacji:
SYN prośba o nawiązanie połączenia
SYN+ACK potwierdzenie prośby o nawiązanie połączenia
ACK, czasami również PSH+ACK i ewentualnie URG
Normalny pakiet przenoszący dane, lub pojawiający się jako odpowiedź na pakiet z
ustawionymi flagami FIN+ACK - opis niżej. Tutaj jest wyjątek - pakiet ACK nigdy
nie powinien zawierać potwierdzenia dla bajtu o numerze 0.
FIN+ACK lub PSH+FIN+ACK
Normalne zakończenie połączenia.
RST lub RST+ACK
Awaryjne zakończenie połączenia
...i dla kontrastu pakiety które `nie powinny się zdarzyć':
SYN+FIN
Bardzo często spotykana nieprawidłowa kombinacja flag.
FIN
Flaga FIN nigdy nie powinna znaleźć się w pakiecie jako jedyna ustawiona.
Czyli pusto :) - to również nieprawidłowa kombinacja. Jakaś flaga musi być
ustawiona.
Typowe skanowania
Poniżej parę typowych przykładów skanowania. Twój
snort powinien wyłapać je bez
problemu:
Typowy przykład skanowania SYN (lub floodingu SYN) - masa pakietów wysłanych w
bardzo krótkim okresie czasu na losowe porty komputera 192.168.0.10. Po nich
widzimy odpowiedź z ustawionymi flagami RST+ACK - z jakiegoś powodu host nie
chce obsłużyć tych połączeń. Do wygenerowania takiej powodzi pakietów może
posłużyć flaga -sS programu nmap.
Tu widzimy jeszcze jedną właściwość tcpdump jeśli chodzi o pakiety -
fragmentację. Pierwsza linijka pokazuje pakiet z ustawioną flagą SYN (S), ale o
złej długości nagłówka (bad hdr length) a następnie podaje informacje jak
skonstruowany jest fragment - (frag 302:16@0+). 302 oznacza identyfikator
fragmentu, 16 to rozmiar fragmentu bez nagłówka IP a 0+ oznacza po prostu offset
tego fragmentu w całości - widzimy, że jest to pierwszy fragment. Błąd [bad
hdr length] spowodowany jest tym, że pierwszy fragment zawierał jakieś opcje, które
nie zmieściły się w tym fragmencie - jest to niedopuszczalne. Inny błąd, który
może pojawić się podczas skanowania to [bad opt] - oznaczające, że opcje podane
we fragmencie są nieprawidłowe (np. za krótki rozmiar pola lub długość
przekraczająca długość całości).
W drugiej linijce mamy jeszcze mniejszy pakiet, ale będący najwyraźniej częścią
pierwszego - id jest równe 302, rozmiar 4 a offset 16. Ten pakiet, jako kolejny
należący do otrzymanego już fragmentu jest odbierany poprawnie.
Tutaj pakiet, który przyszedł z hosta 192.168.10.10 od razu z ustawioną flagą
ACK (ack) na losowo najwyraźniej wybrany numer. W drugiej linijce widzimy
odpowiedź systemu, który nie ma w swoich buforach sieciowych połączenia
pasującego do tych parametrów - pakiet ma ustawioną flagę RESET (R). Podobnie
poniżej - system nie wie nic o połączeniu z 192.168.10.10:61929 z dziwnie
ustawionymi flagami FIN i PSH (FP) więc odpowiada pakietem RST (druga linijka,
R):
Widać, że komputer o adresie 192.168.0.10 wysyła ze swojego portu 1044,
zapytanie do komputera o adresie 192.168.0.1 na port 53. tcpdump jest w stanie
zinterpretować proste rekordy DNS i tutaj widzimy taką interpretację: 15696
oznacza identyfikator zapytania wskazujący na zapytania dla klienta; + oznacza
ustawioną flagę `pożądana rekursja', oznaczająca, że jeśli możliwe będzie
odpytanie `w górę' serwerów DNS to należy to zrobić; PTR? to zapytanie o adres
IP dla wskazanej nazwy a cały pakiet zawierał 44 bajty danych.
Typowe skanowania
Podstawowy typ skanowania - wysyłamy puste (udp 0) pakiety UDP na port i
czekamy, czy system zdalny odpowie komunikatem ICMP, czy będzie milczał.
Poniżej, na wskazanych portach nic nie nasłuchuje i system pod adresem
192.168.0.10 posłusznie zwraca pakiety ICMP: