Tomasz Wendlandt
juggler@cp.pl
lipiec/sierpień 2000
v1.0
Dokument ten powstał na potrzeby wykładu prowadzonego przeze mnie dla
PLUG Poznań.
[web]:: http://plug.poznan.mtl.pl/
[email]:: plug@poznan.mtl.pl
User Datagram Protocol (UDP)
UDP jest protokołem zapewniającym procedury, które umożliwiają wysyłanie
wiadomości z minimalnym nakładem mechanizmów do tego potrzebnych.UDP daje
aplikacją bezpośredni dostęp do usług rozsyłania datagramów, podobnych do
usług oferowanych przez IP. UDP nie posiada żadnych mechanizmów
umożliwiających kontrole czy wysyłane dane dotarły poprawnie do miejsca
przeznaczenia czy też nie zostały powtórnie wysłane.UDP do określenia
aplikacji nadającej i odbierającej dane wykorzystuje pierwsze słowo nagłówka
wiadomości, zawierające numery portu źródłowego i portu przeznaczenia
transmisji.
bity -----> 0 8 16 24 32
+--------+--------+--------+--------+
| Port | Port |
| źródłowy | przeznaczenia |
+--------+--------+--------+--------+
| | |
| Długość | Suma kontrolna |
+--------+--------+--------+--------+
| |
| początek danych |
+-----------------------------------+
format nagłówka UDP
- Port źródłowy: numer portu źródłowego transmisji, pole opcjonalne
jeżeli nie jest używane wstawia się wartość 0, ten
port może służyć do wysyłania odpowiedzi w
przypadku innych informacji
- Port przeznaczenia: numer portu przeznaczenia transmisji
- Długość: całkowita długość datagramu (nagłówek + dane)
wyrażona w bajtach
- Suma kontrolna: suma kontrolna dla nagłówka i danych
Wszystkie pola mają 16 bitów.
Transmission Control Protocol (TCP)
TCP jest protokołem połączeniowym, działającym na strumieniach bajtów.
Posiada on mechanizm PAR (Positive Acknowledgment with Retransmission),
czyli mechanizm potwierdzenia z retransmisją.PAR polega na wysyłaniu danych
dopóki nie otrzyma wiadomości, że wysłane dane przeszły bezbłędnie.Blok
danych, który wymieniają między sobą współpracujące moduły TCP nazywa się
segmentem.
bity --> 0 1 2 3
--> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Port źródłowy | Port docelowy |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Numer sekwencji |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Numer potwierdzenia |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset| |U|A|P|R|S|F| |
| danych|Zarezerwo- |R|C|S|S|Y|I| Okno |
| | wane |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Suma kontrolna | Pilny wskaźnik |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opcje | Puste |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| dane |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
formatu nagłówka segmentu TCP
- Port źródłowy: numer portu źródłowego, wielkość 16 bitów
- Port docelowy: numer portu docelowego, wielkość 16 bitów
- Numer sekwencji: kolejny numer pierwszego oktetu (bajtu) w tym
segmencie (tylko gdy nie jest obecny SYN), jeśli
obecny jest SYN to numerem sekwencji jest ISN, a
pierwszy oktet danych to ISN +1, wielkość 32 bity
- Numer potwierdzenia: jeśli ustawiony jest bit ACK, to pole zawiera
wartość następnego numeru sekwencji, który nadawca
segmentu spodziewa się otrzymać, gdy połączenie
zostanie już ustalone wartość ta jest zawsze
wysyłana, wielkość 32 bity
- Offset danych: liczba 32 bitowych słów w nagłówku TCP, wskazuje
początek danych, nagłówek TCP (nawet zawierający
opcje) jest integralną 32 bitową liczbą, wielkość
4 bity
- Zarezerwowane: pole musi mieć wartość 0, zarezerwowane na
przyszłość, wielkość 6 bitów
- Bity kontrolne:
URG: oznaczenie pola pilnego wskaźnika
ACK: oznaczenie pola potwierdzenia
PSH: funkcja przepychania
RST: zresetuj połączenie
SYN: zsynchronizuj numer sekwencji
FIN: nie pobieraj więcej danych od nadawcy
jest to 6 pojedynczych wartości bitowych
- Okno: liczba oktetów danych (bajtów), które nadawca
zgodzi się przyjąć, wielkość 16 bitów
- Suma kontrolna: Każdy segment zawiera sumę kontrolną, która jest
wykorzystywana przez odbiorcę do kontroli poprawności
danych.Jeżeli segment danych został odebrany bez
błędów, odbiorca wysyła potwierdzenie otrzymania
danych do nadawcy.Jeżeli odebrany segment jest
uszkodzony odbiorca odrzuca go.Po odpowiednim czasie
moduł TCP wysyłający dane ponawia transmisję
segmentu, dla którego nie otrzymał potwierdzenia.
- Pilny wskaźnik: pole zawiera bieżącą wartość wskaźnika o tej samej
nazwie (pilny wskaźnik) jako dodatni offset
kolejnego numeru tego segmentu, pliny wskaźnik
wskazuje numer sekwencji oktetu znajdującego się za
pilnymi danymi, pole jest interpretowane tylko w
segmentach z ustawionym bitem URG, wielkość 16
bitów
- Opcje: opcje zajmują przestrzeń na końcu nagłówka TCP, a
ich długość jest wielokrotnością 8 bitów, wielkość
zmienna
handshake
TCP jest protokołem połączeniowym.Ustanawia logiczne połaczenie pomiędzy
komunikującymi się hostami.Przed właściwą transmisją hosty wymieniają
komunikaty kontrolne - handshake.TCP stosuje potwierdzenie trójpoziomowe
(three-way handshake), ponieważ podczas ustalania połączenia wymieniane
są trzy segmenty kontrolne.
host A host B
+------------+ +------------+
| SYN ----|------------|-----> |
| | | | |
| | | SYN,ACK |
| | | | |
| <------|------------|------ |
| | | | |
| ACK,dane | | |
| |------|------------|-----> |
| | | początek |
| | | transmisji |
+------------+ +------------+
tree-way handshake
Nawiązujący połączenie host A wysyła do hosta B segment z ustawionym bitem
SYN ("numer sekwencji synchronizującej").Segment ten informuje host B o
tym, iż host A chce nawiązać połączenie z tym pierwszym oraz informuje jaki
będzie początkowy numer sekwencji przesyłanych danych.(Numer sekwencji to
liczba kolejnego wysłanego segmentu, pozwala ona ustawić przychodzące dane
w odpowiedniej kolejności) Host B odpowiada hostowi A segmentem z ustawionymi
bitem potwierdzenia ACK i synchronizacji SYN, potwierdzając odbiór segmentu
od A i informując go od jakiego numeru sekwencyjnego będzie odliczał wysłane
przez siebie dane.Na koniec host A wysyła do hosta B segment potwierdzający
odbiór pakietu od hosta B (ACK), zawierający pierwsze przesyłane dane.
Po takiej wymianie segmentów TCP w systemie wie, że zdalny TCP działa i jest
gotów do odbioru danych.Dane mogą zostać przesłane zaraz po nawiązaniu
połaczenia.Po zakończeniu transmisji hosty wymieniają trzy segmenty
potwierdzające z ustawionym bitem FIN (koniec danych), co powoduje zerwanie
połaczenia pomiędzy nimi.
Podsumowanie
TCP interpretuje wysłane dane jako ciągły strumień bajtów, a nie jako
niezależne pakiety.Z tego powodu ważne jest zachowanie kolejności w
jakiej bajty zostaną wysłane i odebrane.Do tego celu służą umieszczone
w nagłówku pola numer sekwencyjny i numer potwierdzenia.Dla standardu TCP
nie jest istotne, od jakiej liczby system rozpocznie numerację bajtów,
ponieważ każdy system wybiera sobie sam liczbę początkową.Żeby kolejność
bajtów u nadawcy i odbiorcy była identyczna, muszą znać wybrane przez
siebie numery początkowe.Numery te wymieniane są w segmentach potwierdzenia
z ustawionym bitem SYN.Pole numer sekwencji w segmencie SYN zawiera
ISN (Initial Sequence Number), czyli początkowy numer sekwencji, od
którego numerowane są przychodzące bajty danych.Ze względów bezpieczeństwa
ISN powinien być wybrany losowo, często jednak nadaje mu się wartość 0.
Bajtom danych nadane są numery kolejne począwszy od ISN, a pierwszy bajt
danych ma numer ISN + 1.Numer sekwencji w nagłówku segmentu danych określa
pozycję w strumieniu danych pierwszego bajtu w przesyłanym segmencie.Jeżeli
na przykład pierwszy bajt w strumieniu danych miał numer 1 (ISN = 0) i
przeszło już 4000 bajtów danych to pierwszy bajt w kolejnym segmencie
będzie bajtem 4001, a numer sekwencji wyniesie 4001.
Segment z ustawionym bitem potwierdzenia (ACK) pełni dwie funkcje.
Potwierdza otrzymanie danych i steruje ich przepływem.Informuje on
nadawcę w jakim stanie doszły dane oraz ile odbiorca może ich jeszcze
przyjąć.Liczba w polu numer potwierdzenia zawiadamia nadawcę jaki numer
sekwencyjny odbiorcy spodziewa się znaleźć w kolejnym segmencie danych.
Standard nie wymaga potwierdzenia każdego segmentu danych.Segment
potwierdzający poświadcza odbiór wszystkich danych od początku transmisji.
Jeżeli na przykład pierwszy wysłany bajt danych miał numer 1 a do tej
pory prawidłowo odebrano 2000 bajtów to liczba w polu numer potwierdzenia
będzie wynosiła 2001.
Pole okno zawiera liczbę bajtów, które może przyjąć odbiorca (wielkość
ta nazywa się również oknem).Jeżeli odbiorca jest w stanie przyjąć jeszcze
6000 bajtów, okno będzie miało wartość 6000.Nadawca może wysyłać segment
tak długo, dopóki sumaryczna liczba wysyłanych bajtów nie przekroczy
wartości okna.Za pomocą okna odbiorca steruje przepływem danych pomiędzy
nim i nadawcą.Okno o wartości 0 nakazuje nadawcy wstrzymanie transmisji
do momentu, dopóki odbiorca nie prześle segmentu z oknem o niezerowej
wartości.
|-------------okno długości 6000 bajtów--------------------|
| |
| | |
|-dane odebrane--| |sb | |
| | | | |
|1_____|1001_____|2001_____|3001_____|4001_____|5001_____|6001_____|7001____|
| | |
| | |
| | |
poczatkowy numer numer potwierdzenia numer sekwencyjny
sekwencyjny 0 2001 4001
strumień danych TCP
sb - segment bieżący
Na rysunku przedstawiony jest strumień danych TCP.Rozpoczyna się on od ISN =
0.Odbiorca otrzymał i potwierdził odbiór 2000 bajtów.Co oznacza, że wartość
numeru potwierdzenia jest równa 2001.Wielkość bufora odbiorcy zezwala na
przyjęcie jeszcze 6000 bajtów.Co oznacza, że wielkość okna jest równa 6000.
Następnie odbiorca przesyła blok danych długośći 1000 bajtów, rozpoczynający
się numerem sekwencyjnym 4001.Nie otrzymał on potwierdzenia odebrania danych
od 2001 do 4000, pomimo to kontynuuje nadawanie, aż nie przekroczy limitu
określonego wartością okna.Jeżeli nadawca zapełni okno i nie otrzyma w
określonym czasie potwierdzenia od odbiorcy, ponowi transmisję danych od
pierwszego bajtu, dla którego nie otrzymał potwierdzenia.Czyli w naszym
przypadku będzie to bajt 2001.
Techniki skanowania
- Ping scanning
ping za pomocą protokołu ICMP wysyła pakiet z zapytaniem o echo.Host, który jest
odpytywany nie musi mieć otwartych portów, ponieważ stos TCP/IP wymaga aby
odpowiedział na takie zapytanie nawet, gdy nie dostarcza żadnych usług.Wydawać
się może, że wszystkie hosty, które mają poprawnie skonfigurowany routing
odpowiedzą na ping i w ten sposób dowiemy się czy w ogóle istnieją.Jednak tak
nie jest można ukryć się przed pingiem, a jak to zrobić pokarzę później.
- TCP connect() scan
Jest to podstawowa i najprostsza metoda skaningu.Używa ona funkcji systemowej
connect() do nawiazania pełnego połączenia z interesującymi nas portami.
Jeżeli skanowany port jest otwary, wówczas dochodzi do połączenia.W przeciwnym
razie oznacza to, że dany port nie jest osiągalny czyli żadna usługa nie
pracuje na nim.Zaletą TCP connect() jest to, iż nie potrzebujesz uprawnień
administratora, aby z niej korzystać oraz jest to w miarę szybkie rozwiązanie
Natomiast wadą jest łatwe wykrycie takiego skanu.W logach pozostaje wyraźny
ślad.
- TCP SYN scan
Często nazywa się również tą technikę half-open, ponieważ korzystając z niej
nie dochodzi do pełnego połączenia TCP.Osoba wykonująca skaning wysyła segment
z ustawionym bitem SYN do skanowanej maszyny, tak jak ma to miejsce podczas
próby nawiązania normalnego połączenia.Jeżeli skanowany host odpowie segmentem
z ustawionym bitem SYN/ACK oznacza to, że dany port na tej maszynie jest
otwarty.Jeżeli otrzymamy segment z ustawionym bitem RST oznacza to, że port
jest niedostępny.Nie chcąc nawiązać połączenia tak jak ma to miejsce w TCP
connect(), do skanowanej maszyny wysyłany jest segment z ustawionym bitem RST,
który nakazuje kernelowi zerwać połączenie.Ta technika jest lepsza od TCP
connect(), ale również małym nakładem pracy możemy ją wykryć, poza tym chcąc
z niej korzystać potrzebne są uprawnienia roota.
- TCP FIN scan
Inaczej stealth scanning, polegający na wysyłaniu segmentów z ustawionym bitem
FIN.Zgodnie z RFC 793 otwarte porty nie odpowiedzą na FIN, natomiast te porty
które są zamknięte muszą odpowiedzieć bitem RST.Technika ta jednak nie
sprawdzi się w przypadku Windows 95/NT jak i Cisco, BSDI, HP/UX, MVS oraz
IRIX.Dlaczego tak jest ? Zapewne ktoś postanowił nie brać pod uwagę RFC i
samemu "lepiej" to zrobić.Plusem w takiej sytuacji jest sposób odróżnienia
Windows od innego OSa.Na przykład FIN scanning maszyny pokazuje, że wszystkie
porty na niej są zamknięte, a SYN scanning pokazał, iż pewne porty są otwarte.
Jest to wówczas prawdopodobnie Windows.W innym przypadku, gdy skanujemy maszynę
techniką FIN i pewne porty są otware mamy pewność, iż nie jest to Windows.Tak
jak w poprzednim przypadku musimy mieć uprawnienia administratora, by korzytać
z FIN scanningu.
- FTP bounce attack
Podczas skanowania tą techniką skaner sprawdza czy serwer jest podatny
na atak typu FTP bounce.Atak ten polega na wykorzystaniu pewnej ciekawej
cechy protokołu FTP.Otóż podczas przesyłania danych FTP wykorzystuje dwa
porty do różnych zadań.Port 21 jest wykorzystywany do przesyłania informacji
między naszym hostem, a hostem odległym, czyli na tym porcie jest połączenie
kontrolne.Natomiast port 20 jest wykorzystywany do przesyłania danych.Protokół
FTP wykorzystuje polecenie PORT do kontrolowania połączenia, które informuje
o porcie oraz IP klienta łączącego się z serwerem.Jeżeli za pomocą PORT
wyślemy informację do serwera, że numerem portu oraz IP klienta to nasz
obiekt skanu wówczas serwer, z którym się połączyliśmy wyśle dane na wskazany
przez nas port ofiary.Następnie jeśli serwer, z którym się łączymy otrzyma
odpowiedź informującą o błędzie od skanowanego hosta wiemy, iż ten port
jest zamknięty.W przeciwnym razie przypuszczamy, że port jest otwarty.Ta
technika sprawdza się tylko, gdy serwer FTP nie porównuje adresu IP
przesłanego przez polecenie PORT z adresem IP połączenia kontrolnego.
- UDP scan
Ta technika skanowania polega na sprawdzeniu, które porty UDP są dostępne.
Ponieważ w UDP nie ma handshake, tak jak to ma miejsce w TCP, trudniej określić,
które porty są otwarte.W tej metodzie posyła się pakiet UDP do każdego portu
badanej maszyny i czeka na odpowiedź.Jeżeli otrzymamy komunikat
ICMP_PORT_UNREACH, wówczas wiemy, że sprawdzany port jest zamknięty.W
przeciwym razie, gdy nie otrzymamy takiej wiadomości port jest otwarty lub
jest to port za firewallem, ponieważ w takim przypadku również nie otrzymamy
odpowiedzi.Ta technika może być wyjątkowo wolna jeżeli nasz obiekt starań
posłuchał rady z RFC 1812 (sekcja 4.3.2.8) i ograniczył tempo wysyłania
wiadomości ICMP oznajmujących bład.W kernelu 2.2.x jest to zdefiniowane w
net/ipv4/icmp.c.Oczywiście Microsoft i jego asy nie wiedzą co to RFC i ich
to ograniczenie nie dotyczy, dlatego Windowsa skanuje się znacznie szybciej.
Uprawnienia roota są niezbędne do korzystania z UDP scanningu.
- ACK scan
Skanowanie tą metodą służy głównie do sprawdzania firewalli.Dzięki tej
technice możemy określić czy firewall jest typu stateful, czy też zwykłym
filtrem pakietów blokującym pakiety z ustwawionym bitem SYN.Pomysł polega
na tym, iż wysyłane są pakiety z ustawionym bitem ACK wraz z losowo
wyglądającym numerem potwierdzenia.Jeżeli wróci do nas pakiet z RST wówczas
taki port uważa się za niefiltrowany, a jeżeli otrzymujemy ICMP unreachable,
lub też żaden komunikat, port uznaje się za filtrowany.Zwykły użytkownik nie
może korzystać z tej metody, potrzebne są uprawnienia admina.
- Window scan
Jest to technika bardzo podobna do ACK scanningu.Różnica polega na tym, iż
czasami dzięki wielkości okna (w protokole TCP), a właściwie różnym ich
wielkością można określić czy port jest otwarty.Oczywiście poza tym czy port
jest filtrowany czy też nie.Jak podaje Fyodor w dokumentacji do nmap głównie
systemy, które są na to podatne to: Amiga, BeOS, BSDI, Cray, Tru64 UNIX,
DG/UX, OpenVMS, Digital UNIX, FreeBSD, HP-UX, OS/2, IRIX, MacOS, NetBSD,
OpenBSD, OpenStep, QNX, Rhapsody, SunOS 4.X, Ultrix, VAX, VxWorks oraz pewne
AIXy.Linux 2.2.x nie jest podatny, nie wiem jak z innymi wersjami kernela.
Oczywiście uprawnienia roota wymagane.
- Reverse ident
Ta technika działa podobnie jak TCP connect().Również nawiązuje pełne
połączenie z hostem, a gdy już to zrobi stara się za pomocą protokołu
ident sprawdzić kto jest właścicielem procesu słuchającego na danym porcie.
Ta technika nie będzie działać jeżeli skanowany host nie ma uruchomionego
demona ident.
- Fragmentacja
Istnieje też technika polegająca na fragmentacji pakietów i jest
wykorzystywana w SYN i FIN scanningu.Polega ona na fragmentacji nagłówka TCP
na kilka mniejszych pakietów, zmniejszając tym szanse na odrzucenie go przez
firewall.Tak jak poprzednio nie można skanować tą metodą będąc userem.
- ip.id
Autorem tej techniki jest antirezer.Największą zaletą ip.id dla skanującego
jest możliwość sfałszowania pola source address, dzięki czemu w logach
skanowanego hosta nie pojawi się nasz adres.Niestety, aby móc z tej techniki
korzystać potrzebny nam będzie jeszcze jedne host nie wysyłający pakietów,
czyli poprosu maszyna stojąca sobie cicho w Sieci :-).Jak sprawdzić czy host
nie wysyła w danej chwili pakietów ? Można to zrobić za pomocą programu
hping2 [1], również autorstwa antirezera.W dokumentacji tego programu jest
dokładnie opisane jak to zrobić, a najważniejszą rzeczą jest pole id, które
zwiększając swoją wartość o +1 (id=+1) inforuje, że dana maszyna pomiędzy
zapytaniami od naszego hosta nie wysłała żadnych innych pakietów.
# hping B -r
HPING B (eth0 xxx.yyy.zzz.jjj): no flags are set, 40 data bytes
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=0 ttl=64 id=41660 win=0 time=1.2
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=1 ttl=64 id=+1 win=0 time=75 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=3 ttl=64 id=+1 win=0 time=90 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=4 ttl=64 id=+1 win=0 time=91 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=5 ttl=64 id=+1 win=0 time=87 ms
Następnie z naszego hosta podszywając się pod host stojący w Sieci "cicho",
wysyłamy pakiet z ustawionym bitem SYN na port maszyny, która jest naszym
celem.Znów można to zrobić za pomocą hping2 [1].Następnie cel naszego
skanowania odpowie maszynie pod którą się podszywamy pakietem z ustawionymi
bitami SYN/ACK jeżeli port jest otwarty lub pakietem z ustawionym bitem RST,
jeżeli sprawdzany port jest zamknięty.Co to znaczy dla nas ? Otóż jeżeli host
pod który się podszywamy otrzyma pakiet z SYN/ACK wyśle pakiet z ustawionym
bitem ACK, a jeżeli otrzyma pakiet z RST nic nie wyśle.Oznacza to tyle, że
jeżeli port na skanowanym hoscie jest otwarty, to wtedy host pod który się
podszywamy wyśle o jeden pakiet więcej.Co możemy sprawdzić przy pomocy
hping2 [1].(pole id zwiększy się o 2, id=+2).
Próby zabezpieczenia się przed skanowaniem
Wszystkie techniki opisane wyżej, poza ip.id, są zaimplementowane w skanerze
nmap [2].Skanerem, który wykorzystuje technikę ip.id jest na przykład
idlescan [3].Dobra teraz trochę o tym jak możemy się zabezpieczyć przed
skanowaniem.Jeżeli chodzi o program ping, możemy uciszyć naszą maszynę tak,
aby nie odpowiadała na ICMP echo request na przykład za pomocą filtra pakietów.
Linux 2.0: # ipfwadm -I -a deny -P icmp -S 0.0.0.0/0 8
Linux 2.2: # ipchains -I input -p ICMP --icmp-type echo-request -j DENY
Linux 2.4: # iptables -I INPUT -p ICMP --icmp-type echo-request -j DROP
Skan TCP connect() zostanie wykryty i pozostawi wyraźny ślad w logach nawet,
gdy nic nie zmieniałeś w swojej dystrybucji.Natomiast jeżeli chcemy wykryć
próby skanowania innymi technikami musimy zastanowić się nad instalacją
dodatkowego softu.Bardzo populary jest program scanlogd [4] autorstwa
Solar Designera, który wykrywa i loguje skany, ale im nie zapobiega.Potrafi
to natomiast PortSentry [5] rozwijany w ramach projektu Abacus.Jest to
program, który warto zainstalować.Posiada takie opcje jak: logowanie połączeń
na wybrane porty (w tym na nieistniejące), odcinanie skanujących nas hostów
z routingu, dopisywanie hostów do /etc/hosts.deny (z którego korzysta tcpd).
Niestety żaden z tych programów nie uchroni nas przed ip.id.Rozwiązaniem może
być łata antirezera, dostępna między innymi na SecurityPortalu [6]. (pod nazwą
01-ip.patch) Jest to patch przeznaczony dla kernela 2.2.13, dlatego trzeba
wprowadzić drobne poprawki dla innych wersji jądra.Istnieje również łata pod
nazwą Silenzio, która potrafi uczynić naszego Linuksa "niewidzialnym".Nie
znalazłem strony domowej Silenzio, ale autorem jest Łukasz Komsta
, autor minidystrybucji LIAP.Na koniec warto pamiętać, że w
momencie wyłączenia takiej usługi jak inentd możemy otrzymać kilka komunikatów,
które wcale nie muszą oznaczać, iż ktoś nas skanuje.
fingerprinting
fingerprinting jest techniką umożliwiającą rozpoznanie systemu operacyjnego
na wybranym hoscie.Jest to możliwe dzięki istniejącej różnicy w stosie TCP/IP
poszczególnych OSów.Oczywiście, aby taki test w ogóle się udał potrzebyn jest
przynajmniej jeden otwarty port TCP na sprawdzanej maszynie.Jednym z bardziej
popularnych programów umożliwiających to jest queso [7].Niestety prawie
wszystkie programy, w tym i queso, mają jedną wadę.Ich odpowiedzi dostarczają
bardzo mało informacji o sprawdzanym systemie.Na przykład queso nie wskaże
dokładnie czy sprawdzana maszyna to OpenBSD, FreeBSD czy też NetBSD.Udzieli
nam tylko odpowiedzi w stylu:
127.0.0.1 * FreeBSD, NetBSD, OpenBSD
Tak samo będzie z BSDi i IRIX, nie dostaniemy dokładnej odpowiedzi.
Możliwe, że nowsze wersje będą to robić, jednak do tego czasu z pomocą
przychodzi nam nmap [2], który potrafi udzielić bardziej szczegółowej
odpowiedzi.W jaki sposób program wie, jaki system sprawdza? Nie jest to tak
skomplikowane jak się wydaje.Program wysyła kilka (różnych) pakietów do
sprawdzanego systemu i uzyskuje odpowiedzi.Dzięki bazie danych programu,
przygotowanej wcześniej, można porównać te odpowiedzi z odpowiedziami w
bazie danych i w ten sposób stwierdzić jaki to system.Taka baza odcisków
nmapa jest w pliku: /usr/share/nmap/nmap-os-fingerprints
Oto jak może wyglądać taka próba sprawdzenia systemu operacyjnego:
# nmap -O -vv www.openbsd.org
[to co nas teraz nie interesuje wycinam]
Remote operating system guess: Solaris 2.6 - 2.7
OS Fingerprint:
TSeq(Class=RI%gcd=1%SI=7CFBF)
T1(Resp=Y%DF=Y%W=2297%ACK=S++%Flags=AS%Ops=NNTNWME)
T2(Resp=N)
T3(Resp=N)
T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
T7(Resp=Y%DF=Y%W=0%ACK=S%Flags=AR%Ops=)
PU(Resp=N)
a takie odpowiedzi uzyskamy sprawdzając www.freebsd.org
# nmap -O -vv www.freebsd.org
Remote operating system guess: FreeBSD 2.2.1 - 4.0
OS Fingerprint:
TSeq(Class=RI%gcd=1%SI=42A2E)
T1(Resp=Y%DF=Y%W=402E%ACK=S++%Flags=AS%Ops=M)
T2(Resp=N)
T3(Resp=Y%DF=Y%W=402E%ACK=S++%Flags=AS%Ops=M)
T4(Resp=Y%DF=N%W=0%ACK=O%Flags=R%Ops=)
T5(Resp=Y%DF=N%W=0%ACK=S++%Flags=AR%Ops=)
T6(Resp=Y%DF=N%W=0%ACK=O%Flags=R%Ops=)
T7(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
PU(Resp=Y%DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=F%RIPCK=F%UCK=0%ULEN=134%DAT=E)
Różnice są łatwe do wykrycia, w szczególności test trzeci (T3).FreeBSD
udzielił odpowiedzi:
T3(Resp=Y%DF=Y%W=402E%ACK=S++%Flags=AS%Ops=M)
Natomiast Solaris w ogóle nie odpowiedział na ten test.
Z pewnością nie jest to idealna odpowiedź, ale lepsza niż samo "Solaris" czy
"FreeBSD, NetBSD, OpenBSD".Jeżeli kogoś interesują znaczenia poszczególnych
pól i testów to odsyłam do dokumentu napisanego przez Fyodora:
http://www.insecure.org/nmap/nmap-fingerprinting-article.html
Dokument ten opisuje także prawie wszystkie techniki fingerprintingu.
Mówiąc o fingerprintingu, warto wspomnieć o passive fingerprintingu.Jak już
sama nazwa wskazuje nie jest to technika polegająca na odpytywaniu
sprawdzanego hosta, tak jak ma to miejsce w tradycyjnym fingerprintingu, ale
na przechwytywaniu pakietów, które zostały wysłane z hosta do nas.Czyli
zyskujemy informacje o pewnym hoscie bez jego wiedzy i nie pozostawiamy śladu
w jego logach.Dalsza filozofia jest taka sama jak w tradycyjnym (active)
fingerprintingu.Sprawdzamy ten przechwycony pakiet i znajdujemy w nim wartości
różnych pól, czy też opcje protokołu TCP lub IP charakterystyczne dla jakiegoś
systemu.Cztery podstawowe pola wg których możemy zidentyfikować system to:
Window - rozmiar pola okno, dla Linuksa (2.2.x) jest równy 32120.
TTL (Time To Live) - czyli czas życia pakietu.
DF (Don't Fragment bit) - niektóre systemy nie ustawiają tego bitu
TOS (Type Of Service) - niektóre systemy nie ustawiają 'Type Of Service'
Po więcej informacji odsyłam do dokumentu Lance'a Spitzner'a "Passive
Fingerprinting":
http://www.enteract.com/~lspitz/finger.html
Autor wspomina tam również o innych polach, które mogą pomóc w identyfikacji.
(np. ISN)
Natomiast pod adresem:
http://dev.whitehats.com/papers/passive/index.html
znajdziesz linki i opisy do programów wykorzystujących fingerprinting.
Próby zabezpieczenia się przed fingerprintingiem
Chcąc oszukać takie programy jak nmap trzeba zmodyfikować źródła kernela.
Początek poszukiwań rozpocznij od katalogu linux/net/ipv4.Jeżeli nie wiesz
jak za to się zabrać możesz zainstalować pakiet o sympatycznej nazwie
"The kernel OS faker" (kosf) [8].Potrafi on skutecznie nabrać nmapa i
przykładowo udawać FreeBSD w wersji 2.1 :-).Niestety jest i wada takiego
rozwiązania.Jak pisze autor kosf [8] nie tylko udaje inny system operacyjny,
ale także zachowuje się jak on, a ponieważ niektóre systemy mają słabo
zaimplementowany protokól TCP/IP nasz Linux może, stwarzać problemy po
zainstalowaniu kosf [8].Natomiast jeżeli chcemy zmienić np. wartość pola TTL
w naszych pakietach, tak aby za jego pomocą nie można było określić jaki
system używamy, wystarczy zmienić watość w pliku:
/proc/sys/net/ipv4/ip_default_ttl
źródła
ASCII obrazki :-) zostały żywcem sciągnięte z RFC i książki "TCP/IP
Administracja sieci".Poniżej są adresy do programów, o których wspomniałem oraz źródła, z których korzystałem tworząc ten dokument.
- RFC 793, "Transmission Control Protocol"
- RFC 768, "User Datagram Protocol"
- nmap.1
- Craig Hunt, "TCP/IP Administracja sieci", wyd. O'Reilly
- Passive Fingerprinting by Lance Spitzner