vortal internetowy
artykuły
Powrót do listy artykułów
Temat artykułu: Skanowanie portów TCP
Tekst napisał Vatazhka dnia 08-01-2004
Streszczenie
Skanowanie portów (ang. port scanning)
jest jednym z kroków poprzedzających włamanie do systemu informatycznego.
Dostarcza ono informacji o liczbie i pośrednio o rodzaju usług uruchomionych na
skanowanej stacji.
Celem niniejszego opracowania jest zademonstrowanie
działania wszystkich obecnie znanych metod skanowania portów TCP. Ze względu na
dotychczas niewielkie rozpowszechnienie nowych protokołów z rodziny IPv6 problem
zostanie ograniczony do dziedziny IPv4. Rodzina protokołów powiązanych z IPv4
jest obecnie dominującym rozwiązaniem na rynku - pracuje w niej nie tylko
Internet, ale i spora część intra- i ekstranetów. Większość protokołów wyższego
rzędu, wykorzystywanych przez aplikacje, używaw charakterze protokołu
transportowego protokołu TCP.
Protokół IP
Protokół IP jest
w użyciu od wczesnych lat 80. Jest on protokołem warstwy sieciowej w rozumieniu
siedmiowarstwowego modelu ISO/OSI - zapewnia przekazywanie datagramów od stacji
źródłowej do stacji docelowej poprzez sieć rozległą (największą siecią rozległą,
w której wykorzystywany jest protokół IP, jest Internet).
Ze względu na
ograniczenia wynikające ze stosowania różnych technologii w warstwie kanałowej,
datagram IP może zostać podzielony na mniejsze - jest to tzw. fragmentacja.
Ustawienie bitu zakazu fragmentacji (DF, Don't Fragment) powoduje odrzucanie
przez bramę datagramów o za dużym rozmiarze (MTU, Maximum Transmission Unit) w
stosunku do określonego dla danej sieci.
Protokół
TCP
Połączeniowy protokół TCP działa "nad" protokołem IP.
Wykorzystuje on w pełni dwukierunkowe połączenia, zapewnia niezawodność
(stosowane są obustronne potwierdzenia), sterowanie przepływem danych (określana
jest ilość danych, która może jeszcze zmieścić się w buforach) oraz zachowanie
kolejności danych (co wymaga numeracji segmentów - jednostek danych
przekazywanych przez warstwę TCP do warstwy IP). Oprogramowanie TCP ustanawia
połączenie stosując uzgadnianie trójfazowe (ang. three-way handshake), kończy je
zaś wymiana czterech komunikatów. Połączenie TCP może znajdować się w danej
chwili w jednym z 11 zdefiniowanych w [8] (wraz z warunkami przejść)
stanów.
W każdej chwili wiele procesów w jednej stacji może korzystać z
protokołu TCP. W celu rozróżnienia tych procesów używa się szesnastobitowych
numerów portów. Istnieje klasa tzw. portów ogólnie znanych (ang. well-known
ports) - przeznaczonych do wykonywania ogólnie znanych usług, która jest
zdefiniowana w [10], a najnowszą wersję przypisań można znaleźć w [5].
Pewne
serwery usług zawierają błędy, które mogą posłużyć do ataku, którego skutkiem
będzie odmowa wykonania usługi (ang. denial of service) lub nawet przejęcie
kontroli nad serwerem. Skanowanie portów służy do określenia potencjalnych
usług, na które może być przeprowadzony atak (dane zebrane w ten sposób wymagają
dodatkowej weryfikacji).
Ustanawianie połączenia TCP - uzgadnianie
trójfazowe
Ustanawianie połączenia TCP przebiega według poniższego
scenariusza:
- serwer wykonuje tzw. otwarcie bierne (ang. passive
open) połączenia, wywołując funkcje interfejsu gniazdowego socket(), bind(),
listen(),
- klient wykonuje tzw. otwarcie aktywne (ang. active
open), wywołując funkcję interfejsu gniazdowego connect() - powoduje to
wysłanie segmentu SYN (synchronizacji, ang. synchronize), zawierającego
początkowy numer kolejnych danych, które klient zamierza wysyłać przez to
połączenie (w pewnych sytuacjach także dane) oraz ewentualne opcje TCP,
- serwer potwierdza przyjęcie segmentu SYN klienta i
wysyła własny segment SYN, zawierający początkowy numer danych, które serwer
będzie wysyłał przez to połączenie, wraz z segmentem ACK (potwierdzenia, ang.
acknowledgement), zawierającym początkowy numer kolejnych danych klienta
zwiększony o 1 - taki segment autor będzie określał jako SYN|ACK,
- klient sygnalizuje przyjęcie odpowiedzi serwera
segmentem ACK, zawierającym początkowy numer kolejnych danych serwera
zwiększony o 1.
Wymiana danych w
połączeniu TCP
Jest to zasadnicza część transmisji, mogąca przebiegać
według wielu scenariuszy; najczęściej obejmuje ona następującą wymianę
segmentów:
- klient wysyła żądanie do serwera,
- serwer wysyła potwierdzenie przyjęcia żądania w
postaci segmentu ACK, który może być wysłany razem z odpowiedzią,
- klient potwierdza otrzymanie odpowiedzi segmentem
ACK.
Kończenie połączenia
TCP
Schemat zamykania połączenia TCP obejmuje zwykle wymianę czterech
segmentów i wygląda następująco:
- jeden z programów - klient lub serwer - wykonuje tzw.
zamknięcie aktywne (ang. active close), wywołując funkcję close(), co powoduje
wysłanie segmentu FIN (zakończenia, ang. finish); w pewnych sytuacjach segment
ten może być wysłany razem z danymi,
- drugi z programów potwierdza przyjęcie segmentu FIN
własnym segmentem ACK, zwiększając numer segmentu FIN o 1 (segmenty FIN są
numerowane podobnie jak segmenty SYN), wykonując tzw. zamknięcie bierne (ang.
passive close),
- w tym momencie tym połączeniem mogą jeszcze przepływać
dane od stacji wykonującej zamknięcie bierne do stacji wykonującej zamknięcie
aktywne, jest to tzw. półzamknięcie (ang. half-close),
- stacja wykonująca zamknięcie bierne wykonując funkcję
close() wysyła numerowany segment FIN do stacji wykonującej zamknięcie
aktywne,
- stacja wykonująca zamknięcie aktywne potwierdza
przyjęcie segmentu FIN wysyłając stacji wykonującej zamknięcie bierne segment
ACK z numerem segmentu FIN zwiększonym o 1.
Skanowanie portów - technika i stosowane
metody
Ze względu na pewną dowolność pozostawioną przez twórców [8],
nie wszystkie stosy TCP/IP są podatne na zaprezentowane metody skanowania
portów.
Skanowanie otwarte (ang. connect() scan, open
scan)
Skanowanie otwarte jest rzadko wykorzystywane ze względu na
łatwość wykrycia i zablokowania takiego "ataku". Metoda ta polega na wykonaniu
próby uzgadniania trójfazowego dla każdego spośród skanowanych portów TCP.
Mechanizm uzgadniania trójfazowego jest dostępny w systemach zgodnych z UNIX
nawet dla nieuprzywilejowanych użytkowników w postaci funkcji connect(),
stanowiącej część interfejsu gniazdowego.
Procedura nawiązywania połączenia z
portem nasłuchującym (będącym w stanie nasłuchu - LISTENING) wygląda
następująco:
- klient wysyła na skanowany port serwera segment SYN,
- serwer odpowiada segmentem SYN|ACK,
- klient potwierdza odpowiedź serwera wysyłając segment
ACK.
Zakończone sukcesem uzgadnianie
trójfazowe powoduje powrót funkcji connect() z wartością 0, oznaczającą
sukces.
Przebieg nieudanej próby nawiązania połączenia z portem zamkniętym
(nie będącym w stanie LISTENING) wygląda następująco:
- klient wysyła na skanowany port serwera segment SYN,
- serwer odpowiada segmentem RST,
- klient potwierdza odpowiedź serwera wysyłając segment
RST.
W takiej sytuacji funkcja connect()
powraca z wartością -1, która sygnalizuje błąd.
Stacja skanująca zwykle
natychmiast zamyka dopiero co otwarte połączenie (wywołując funkcje close()),
ponieważ ilość otwartych deskryptorów jest limitowana, a wynegocjowane
połączenie nie jest używane do dalszej wymiany danych.
Skanowanie
półotwarte (ang. SYN scan, half-open scan)
Ten rodzaj skanowania
także korzysta ze zdefiniowanego w [8] uzgadniania trójfazowego i dlatego jest
równie łatwy do wykrycia i zablokowania co skanowanie otwarte, mimo że nie
zachodzi w tym przypadku pełne uzgadnianie trójfazowe (brakuje wysłania
ostatecznego potwierdzenia przez klienta).
Wymiana segmentów następuje według
poniższego schematu:
- klient wysyła na skanowany port serwera segment SYN,
- serwer odpowiada segmentem SYN|ACK jeżeli żądany port
jest w stanie nasłuchu lub RST w przeciwnym wypadku.
Skanowanie niewłaściwym polem flag
Na oktet
flag składa się 6 bitów (flag), licząc od zerowego odpowiadają one następującym
flagom: FIN, SYN, RST, PSH, ACK, URG oraz 2 niewykorzystane bity (zgodnie z [8]
powinny być one wyzerowane, podobnie jak 4 niewykorzystane bity oktetu
przesunięcia). Taka ilość flag pozwala na skonstruowanie dużej ilości różnych
segmentów o niewłaściwych flagach, dlatego też opisane zostaną jedynie wybrane,
najczęściej spotykane ich kombinacje.
Opisane niżej metody łączy wiele
wspólnych cech:
- zgodnie z [8] skanowana stacja powinna odpowiedzieć
segmentem RST jeżeli docelowy port nie jest w stanie nasłuchu lub zignorować
go w przeciwnym wypadku,
- używane we wszystkich metodach segmenty nie pojawiają
się bez uprzedniego nawiązania połączenia, a więc pojawienie się takiego
segmentu jest sytuacją wyjątkową i może być wykryte przez stanową zaporę
sieciową, analizującą przebieg połączenia i odrzucającą niepoprawne segmenty,
- powyższe cechy oznaczają, że skanowanie tymi metodami
jest wolne (segment należy uznać za zignorowany po przekroczeniu pewnego,
zwykle dość długiego czasu oczekiwania) oraz często zawodne (urządzenia
aktywne na trasie przejścia segmentu mogą go odrzucić bez poinformowania o tym
nadawcy),
- twórcy części systemów (m. in. IRIX, HP/UX, IOS,
Windows) nie zastosowali się do specyfikacji zawartych w [8] i nadejście tak
spreparowanego segmentu zawsze powoduje odpowiedź RST, niezależnie od stanu
portu docelowego.
Skanowanie FIN
(ang. FIN scan, stealth scan)
Segment z ustawioną flagą FIN normalnie
służy do zamknięcia połączenia. Jeżeli taki segment, nie należący do połączenia,
trafi na nasłuchujący port, to powinien on zostać zignorowany. Jeśli natomiast
skanowany port nie był w stanie nasłuchu, odesłany powinien zostać segment z
ustawioną flagą RST.
Skanowanie puste (ang. NULL scan)
W
tej metodzie do skanowania pojedynczego portu używa się segmentu z wyzerowanymi
wszystkimi flagami.
Skanowanie X (ang. XMAS
scan)
Odpowiednik skanowania pustego, lecz w nagłówku TCP segmentu
wysyłanego przez skanującego ustawiona jest nieużywana flaga o wartości 40hex
(pole opcji z włączonym wyłącznie szóstym bitem), tzw. flaga X - stąd nazwa
metody.
Skanowanie Y (ang. YMAS scan)
Metoda analogiczna do
poprzedniej z tym wyjątkiem, że ustawiona jest nieużywana flaga o wartości 80hex
(tj. włączony jest jedynie siódmy bit pola opcji), zwana flagą
Y.
Skanowanie Z (ang. ZMAS scan)
Ten typ skanowania jest
często określany mianem skanowania X, co prowadzi do nieporozumień. Dlatego
autor [4] zdecydował się nazywać metodę, w której stacja skanująca wysyła
segment z normalnie niespotykaną kombinacją flag FIN|PSH|URG skanowaniem Z,
analogicznie do dwóch poprzednio omawianych metod.
Skanowanie ACK
(ang. ACK scan)
Ten rodzaj skanowania polega na wysłaniu segmentu z
ustawioną flagą ACK i nie umożliwia wykrycia portów nasłuchujących, a jedynie
ustalenie faktu filtrowania danych przychodzących do skanowanego portu przez
stanową zaporę sieciową. Gdy skanowana stacja zwraca w odpowiedzi segment RST,
oznacza to, że skanowany port nie jest filtrowany przez stanową zaporę
sieciową.
Skanowanie rozmiarem okna (ang. window size
scan)
Jest to rodzaj skanowania podobny do skanowania ACK, jednak
dzięki temu, że większość systemów modyfikuje pole rozmiaru okna (nie jest to
zachowanie wyspecyfikowane w [8]) możliwe jest ustalenie nie tylko faktu
filtrowania skanowanego portu, ale także stwierdzenia, czy jest on w stanie
nasłuchu.
Skanowanie przekierowaniem odpowiedzi serwera FTP (ang. FTP
bounce scan)
W specyfikacji protokołu FTP (zawartej w [9])
zdefiniowano możliwość trybu pracy serwera FTP, w którym wyniki przekazuje on
innej stacji niż ta, która zainicjowała sesję. Aby skanować stację o adresie
A.B.C.D należy wykonać poniższą procedurę:
- skanujący loguje się na serwer FTP obsługujący
przekierowanie odpowiedzi,
- podczas sesji FTP skanujący wykonuje komendę PORT
A,B,C,D,X,Y, gdzie X _ 256 + Y określa numer skanowanego portu,
- jeżeli serwer FTP umożliwia przekierowanie, odpowie
komunikatem o kodzie 200, jeżeli nie - komunikatem o kodzie 500,
- skanujący wydaje dowolną komendę (np. LIST) inicjującą
transmisję danych pod wskazany komendą PORT A,B,C,D,X,Y adres,
- jeżeli skanowany port nie był w stanie nasłuchu,
serwer zwróci komunikat o kodzie 426, w przeciwnym wypadku - komunikaty o
kodach 150 i 226.
Najważniejszą zaletą
tej metody jest zapewnienie anonimowości skanującemu, ponieważ z perspektywy
stacji skanowanej wydaje się, że to serwer FTP prowadzi skanowanie otwarte. Nie
jest to jednak anonimowość pełna - w logach serwera FTP pozostają informacje,
które mogą doprowadzić do wykrycia inicjatora skanowania
portów.
Skanowanie bezczynne (ang. IP ID idle scan, dumb
scan)
Najnowsza metoda skanowania, po raz pierwszy przedstawiona w
[3]. Jej największą zaletą jest zapewnianie praktycznie zupełnej anonimowości
skanującemu.
Metoda ta opiera swe działanie na fakcie, iż większość stosów
TCP/IP zwiększa pole ID w nagłówku IP o stałą wartość (najczęściej 1); do
działania wymagane jest użycie stacji pośredniczącej, której oprogramowanie
TCP/IP zachowuje się właśnie w taki sposób. Aby skanowanie tego rodzaju było w
ogóle możliwe, stacja pośrednicząca musi być w czasie skanowania pojedynczego
portu bezczynna, tzn. nie może w tym czasie wysłać żadnego pakietu poza
opisanymi w poniższym schemacie:
- stacja skanująca pobiera wartość IP ID stacji
pośredniczącej wysyłając bezpośrednio do niej dowolny pakiet IP, najczęściej
wykorzystując żądania echa ICMP (ang. ICMP Echo Request), na które stacja
pośrednicząca powinna odpowiadać odpowiedziami echa ICMP (ang. ICMP Echo
Reply) - w ten sposób, kilkakrotnie powtarzając procedurę, skanujący może
obliczyć przyrost wartości IP ID stacji pośredniczącej,
- stacja skanująca wysyła do stacji skanowanej segment
TCP z ustawioną flagą SYN o sfałszowanym adresie źródłowym, wskazującym na
stację pośredniczącą,
- stacja skanowana odpowiada segmentem SYN|ACK jeżeli
port docelowy był w stanie nasłuchu lub RST w przeciwnym wypadku (odpowiedź
jest oczywiście "odsyłana" stacji pośredniczącej),
- jeżeli do stacji pośredniczącej dotarł segment
SYN|ACK, odpowiada ona stacji skanowanej segmentem RST, co powoduje
zwiększenie licznika IP ID; w przeciwnym wypadku (tj. jeżeli stacja
pośrednicząca otrzymała segment RST) ignoruje go, co nie powoduje zwiększenia
licznika IP ID,
- stacja skanująca ponownie pobiera aktualną wartość
licznika IP ID stacji pośredniczącej i tej postawie oblicza, czy skanowany
port był w stanie nasłuchu czy nie.
Od
czasu opublikowania tej metody sukcesywnie nanoszone są poprawki do stosów
TCP/IP w systemach operacyjnych, np. w systemie OpenBSD pole IP ID jest
zwiększane standardowo o pseudolosową wartość, a dla Linuksa istnieją "łaty"
zawierające wspomniany kod z OpenBSD oraz taką korektę obsługi protokołu ICMP,
aby odpowiedzi ICMP (ang. ICMP Reply) zawierały kopie pól z żądań ICMP (ang.
ICMP Request).
Istnieją również implementacje powodujące zablokowanie lub
czasowe ograniczenie wysyłania segmentów RST, zawarte np. w systemie FreeBSD,
lecz nie powinny być one używane ze względu na to, że łamią one zalecenia
zawarte w [8].
Obrona przed skanowaniem portów
Jak wynika z
wyżej opisanych własności poszczególnych metod skanowania portów,
administratorowi sieci nie jest łatwo stwierdzić, czy ma on do czynienia ze
skanowaniem portów, czy z innego rodzaju aktywnością (np. powtarzanymi próbami
nawiązania połączenia z usługami nieobsługiwanymi przez daną
stację).
Podejrzenia powinny budzić:
- wielokrotne próby nawiązania połączenia na różnych
portach TCP w krótkim okresie czasu,
- duża ilość wychodzących z sieci segmentów RST,
pochodzących z jednej stacji,
- pojawiające się przychodzące segmenty TCP o adresach
docelowych obejmujących stacje z tej sieci o ustawionych flagach innych niż
SYN, których numer sekwencyjny nie wskazuje na przynależność tego segmentu do
żadnego z nawiązanych połączeń).
Wymienione zdarzenia należy uwzględnić w konfiguracji zapór
sieciowych i zdefiniować odpowiednie reakcje lub zastosować gotowe pakiety IDS
(Intrusion Detection System). Reakcją nie polecaną jest automatyczne "odcinanie"
ruchu przychodzącego ze stacji, którą zidentyfikowano jako skanującą ze względu
na możliwość sfałszowania adresu źródłowego (ang. spoofing).
Nieocenionym
narzędziem do wykrywania ataków (także skanowania portów) i zapobiegania im jest
odpowiednio skonfigurowana zapora sieciowa (ang. firewall).
Zapora sieciowa
jest mechanizmem służącym do filtrowania transmisji drogą analizy adresów
protokołowych (w przypadku, gdy jest to bezstanowa zapora sieciowa, ang.
non-stateful firewall, screening router) lub dodatkowo informacji protokołowych
(zapora stanowa, ang. stateful firewall). Zapory sieciowe działają w oparciu o
tzw. zestawy reguł (ang. rulesets), które uwzględniają takie kryteria, jak
adresy oraz inne informacje protokołowe (w tym aktualny stan połączeń TCP). W
zależności od stopnia zaawansowania oprogramowania zapory sieciowejmożliwe jest
zastosowanie różnych akcji.
Do najczęściej spotykanych należą:
- przekazanie pakietu odbiorcy w niezmienionej postaci
("akceptuj", ang. accept),
- zwrócenie pakietu nadawcy w niezmienionej postaci
("odbij", ang. mirror), odrzuceniu pakietu z odesłaniem informacji o tym
nadawcy ("odrzuć", ang. reject),
- skasowanie bez śladu ("usuń", ang. drop), zapisanie
informacji o pakiecie do logu systemowego "loguj", ang. log oraz przekazanie
pakietu do innej stacji ("przekaż", ang. jump).
Sporym problemem może być wysyłanie sfragmentowanych
datagramów IP przez stację skanującą. Nie każda zapora sieciowa działa w ten
sposób, że przed zbadaniem datagramu próbuje go zdefragmentować (ograniczeniem
jest w tym przypadku głównie pojemność pamięci oraz moc przetwarzania). W ten
sposób można "przemycić" do sieci m. in. wykorzystywane w skanowaniu portów
nietypowe segmenty TCP.
Warto także zabezpieczyć się przed pośredniczeniem w
skanowaniu portów, odpowiednio konfigurując serwery FTP (uniemożliwiając FTP
bounce scan) oraz nałożyć "łaty" wprowadzające losowe zmiany licznika IP
ID.
Dobra polityka bezpieczeństwa powinna uwzględniać tego rodzaju próby
naruszenia bezpieczeństwa (niektórzy skłaniają się ku zdaniu, że skanowanie
portów jest już formą ataku). Jednocześnie nie zaleca się eskalacji działań
odwetowych, a jedynie poprzestanie na zapisaniu informacji do logów systemowych
i, w szczególnie uciążliwych przypadkach, odcięciu transmisji od intruza oraz
powiadomieniu odpowiedniego operatora sieciowego.
Technika ukrywania
źródła skanowania portów
Często stosowanie technik "anonimowych" (IP
ID idle scan, FTP bounce scan) nie jest pożądane lub możliwe. Wówczas skanujący
mają do wyboru wyłącznie metody ujawniające ich adres IP. Ponieważ podanie
prawdziwego adresu źródłowego jest wymagane gdy oczekuje się odpowiedzi od
stacji docelowej, w grę wchodzi jedynie wysłanie dużej ilości pakietów, które
różnią się wyłącznie adresem źródłowym. Wśród nich jest jeden pakiet z adresem
źródłowym stacji atakującego, a pozostałe stacje służą jako tzw. przynęty (ang.
decoys). Właśnie z tego powodu - wszak "przynętą" może być dowolnie wybrany
adres - nie poleca się przeprowadzania odwetu ani "odcinania" ruchu.
Niestety, jak już wspomniano, wykrycie skanowania portów jest możliwe
jedynie poprzez zliczanie ilości nieprawidłowych lub niezakończonych połączeń
przychodzących w jednostce czasu. Jeżeli skanowanie poszczególnych portów jest
dokonywane w na tyle dużych odstępach czasowych, aby nie uaktywnić IDS (w celu
skrócenia całkowitego czasu skanowanie portów można prowadzić z różnych stacji -
w sposób rozproszony), jest ono praktycznie niemożliwe do
wykrycia.
Literatura
[1] W. Richard Stevens: UNIX.
Programowanie usług sieciowych. T.1, Wydawnictwa Naukowo-Techniczne, Warszawa
2000
[2] Computer Emergency Response Team: TCP SYN Flooding and IP
Spoofing Attacks. Advisory CA-96.21, Computer Emergency Response Team,
Pittsburgh 1996
[3] Salvatore "Antirez" Sanfilippo: dumbscan.txt,
http://www.kyuzz.org/antirez/papers/dumbscan.html
[4] Marcin
Dawcewicz: Techniki skanowania sieci komputerowych, Software 2.0 nr
9/2001
[5] Internet Assigned Numbers Authority: Assigned Port Numbers,
ftp://ftp.ftp.isi.edu/in-notes/iana/assignments/port-numbers
[6] J. B.
Postel (red): Internet Protocol. RFC 791, 1981
[7] J. B. Postel:
Internet Control Message Protocol. RFC 792, 1981
[8] J. B. Postel
(red): Transmission Control Protocol. RFC 793, 1981
[9] J. B. Postel,
J. K. Reynolds: File Transfer Protocol. RFC 959, 1985
[10] J. K.
Reynolds, J. B. Postel: Assigned Numbers. RFC 1700, 1994