Metody ukrywania skanowania portów Michał Kozak Skanowanie ([3], [2]) Skanowanie jest to sondowanie docelowego systemu (sieci komputerowej lub hosta) w celu jego rozpoznania (poznania topologii sieci komputerowej) i zebrania informacji dotyczących uruchomionych usług (skanowanie portów danego hosta). Podstawowe techniki skanowania: " Ping Sweeps (testowanie aktywności hostów) " Port Scans (skanowanie w poszukiwaniu otwartych portów danego hosta) " Fingerprinting (metody określania systemu operacyjnego) Skanowanie sieci komputerowej polega po prostu na sprawdzaniu aktywności hostów o adresach IP z pewnego zakresu. Najprostszą metodą, ale również najłatwiej wykrywaną i najczęściej blokowaną jest wykorzystanie w tym celu protokołu ICMP (metoda znana również jako ICMP sweeps jest to wykorzystanie popularnego pinga). Zwykle jednak jesteśmy w stanie poznać topologię niechronionej części sieci tzw. demilitarized zone. Bardziej zaawansowanie techniki dostarczają również informacji o funkcjonujących w danej sieci firewallach, a nawet pozwalają poznać ich zasady filtrowania pakietów. Podstawowe metody skanowania sieci to: ICMP sweeps (wspomniany powyżej), Broadcast ICMP, TCP sweep, UDP sweep. W przypadku dwóch ostatnich skanowanie polega na wysyłaniu pakietów odpowiednio TCP/UPD na dobrze znane porty m. in. 21 (FTP), 22 (SSH), 23 (Telnet), 25 (SMTP), 80 (HTTP) (więcej informacji [2]). Skanowanie portów polega na przeglądaniu kolejnych portów sieciowych aktywnego hosta w celu określenia jakie porty są otwarte oraz jakie usługi na tych portach realizuje system. Skanowanie takie można w najprostszy sposób zrealizować poprzez badanie rezultatów funkcji connect(...). Funkcja ta służy do inicjowania połączenia sieciowego między gniazdem (socket) programu klienta i odległym gniazdem serwera. Metoda ta ma podstawową wadę jest bardzo łatwa do wykrycia przez skanowany system. Systemy IDS (Intrusion Detection System) bez problemu wykrywają sekwencyjne próby połączeń na różne porty z tego samego adresu zródłowego. Dlatego też bardzo często stosuje się metody mające na celu ukrywanie skanowania portów w szumie zwyczajnych połączeń . Ukrywanie skanowania portów Wcześniej wspomniałem już o najprostszej metodzie skanowania portów TCP connect(). Oczywistą wadą jest łatwość jej wykrycia i zablokowania. Często też gateway uniemożliwia nawiązywania połączeń TCP z zewnątrz sieci. Zaletą jednak jest szybkość i możliwość wykonania jej w systemach UNIX z uprawnieniami każdego użytkownika. Ulepszeniem tej metody jest metoda znana jako TCP SYN. Modyfikacją w stosunku do TCP connect() jest wysłanie pakietu z ustawioną flagą RST zaraz po otrzymaniu w drugiej fazie nawiązywania połączenia pakietu z flagami SYN/ACK (port otwarty) albo RST/ACK (port zamknięty). Zaletą w stosunku do TCP connect() jest zmniejszona wykrywalność. Metoda ta może jednak przypominać atak DoS SYN Flood dlatego też duża liczba systemów IDS (np. Snort) jest w stanie skuteczne ją powstrzymać. Istnieją jednak skuteczne metody ukrywania procesu skanowania. Większość wykorzystuje podstawową zasadę (RFC 793) mówiącą, że każdy zamknięty port powinien odpowiedzieć pakietem z flagą RST na każdy pakiet niezgodny z kolejnością nawiązywania połączenia TCP (three-handshake). [4] "If the state is CLOSED (i.e., TCB does not exist) then all data in the incoming segment is discarded. An incoming segment containing a RST is discarded. An incoming segment not containing a RST causes a RST to be sent in response." (RFC793, str. 65) FIN ([5], [4], [2], [6]) W metodzie tej wysyłane są na dany port pakiety TCP z ustawioną flagą FIN, która w normalnym połączeniu rozpoczyna jego zakończenie. Jeśli jednak połączenie nigdy nie było nawiązywane to właśnie zgodnie z wcześniej wspomnianą zasadą (RFC 793) otwarty port powinien zignorować taki pakiet, a port zamknięty odpowiedzieć pakietem RST. Jest to jednak metoda zależna od implementacji stosu TCP. I tak, nie sprawdzi się w przypadku systemów Windows 95/NT, Cisco, BSDI, HP/UX, MVS oraz IRIX ([6], nawet przy otwartym porcie odpowiadają pakietem RST), których stos TCP nie jest w pełni zgodny z RFC 973. Ma to jednak swoją zaletę. Dostarcza nam to informacji o prawdopodobnym systemie operacyjnym (przykładowo jeśli skanowanie TCP SYN wskaże jakieś porty otwarte a FIN wykaże, że wszystkie porty są zamknięte to skanowany system to prawdopodobnie Windows). Metoda FIN jest stosunkowo trudna do wykrycia i zablokowania. System IDS aby wykrywać skanowanie FIN musi w jakiś sposób zapamiętywać prawidłowo rozpoczęte połączenia TCP i na tej podstawie odrzucać pakiety FIN dla których połączenie nigdy nie zostało nawiązane. Gromadzenie takich informacji na pewno powoduje spadek jego wydajności oraz naraża go na ataki typu DoS. Urządzenia tego typu są również droższe. Można zatem uznać że skanowanie FIN jest metodą stosunkowo dobrze ukrywającą agresora. Jednak wykorzystana jako jedyna metoda skanowania nie zawsze da wiarygodne informacje, ze względu na niezgodność implementacji stosu TCP niektórych systemów operacyjnych z RFC 793. Na rysunku pierwszym (od lewej) zobrazowana jest sytuacja gdy port jest zamknięty. Drugi natomiast pokazuje sytuację kiedy skanowany host ma otwarty port 23. Opcje uruchamiające skanowanie typu FIN w nmap [7]: nmap -sF 192.168.1.10 NULL, XMAS, YMAS ([1], [4], [7], [8]) Działanie poniżej scharakteryzowanych metod jest bardzo podobne do metody FIN. Różnicą są jedynie ustawione flagi w pakietach wykorzysty6wanych podczas skanowania hosta. " XMAS (zwane również choinką ) to skanowanie przy użyciu pakietów z ustawionymi flagami: URG, ACK, PSH, RST, SYN i FIN. Na tak udziwniony pakiet port zamknięty powinien odpowiedzieć pakietem RST, a otwarty zignorować taki pakiet. Metoda ta ma tą samą przypadłość co FIN. Niektóre systemy operacyjne odpowiadają pakietem RST również na otwartym porcie. nmap -sX 192.168.1.10 Czasem spotykana jest odmiana tej metody wysyłająca segment z nieużywaną flagą 0x40. Poniższy przykład pokazuje jak za pomocą hping2 wysłać taki pakiet XMAS na port 25. [8] hping2 -X -p 25 192.168.1.10 " Metoda NULL do skanowania wykorzystuje pakiety, które nie mają ustawionej żadnej flagi. Zachowanie portów powinno być dokładnie takie samo jak poprzednio. nmap -sN 192.168.1.10 " Kolejną modyfikację pakietu wykorzystywanego podczas skanowania wprowadza metoda YMAS. Wysyłany jest segment z ustawioną nieużywaną flagą 0x80. hping2 -Y -p 25 192.168.1.10 Przedstawione już metody skanowania: FIN, XMAS, NULL, YMAS na pewno są trudniejsze do wykrycia niż TCP connect() czy TCP SYN przez co skanowanie może stać się niezauważone, niewykryte przez systemy IDS lub firewalle. Przy omawianiu metody FIN wspomniałem, że jednak istnieje sposób na wykrywanie tego typu niewłaściwych pakietów. Możliwości odfiltrowywania takich pakietów mają firewalle z inspekcją stanu (statefull inspection) niekiedy zwane też firewalle obwodów. Posiada on możliwość całkowitego śledzenia sesji protokołów warstwy transportowej. Dzięki temu wie czy np. jakiś pakiet FIN należy do otwartego połączenia, czy należy go odfiltrować i dokonać odpowiedniego wpisy w logach. Testowałem przedstawione metody używając nmap. Skanowanie hosta z zainstalowanym Windows XP Professional nie przyniosło żadnych interesujących wyników (w tym wypadku implementacja stosu TCP niezgodnie ze standardem przyniosło korzyść nie otrzymałem żadnych konkretnych informacji o hoście docelowym), więc zastosowałem prostszą metodę, łatwą do wykrycia TCP connect() i okazało się, że cztery porty są jednak otwarte. Natomiast po skanowaniu systemu z rodziny Linux otrzymałem następujące wyniki (użyłem metody FIN): nmap -sF 192.168.5.233 Starting Nmap 4.03 ( http://www.insecure.org/nmap ) Interesting ports on 192.168.5.233: (The 1666 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open|filtered ssh 53/tcp open|filtered domain 80/tcp open|filtered http 113/tcp filtered auth 135/tcp open|filtered msrpc 445/tcp open|filtered microsoft-ds 1080/tcp filtered socks 8080/tcp open|filtered http-proxy MAC Address: 00:02:B3:8B:60:F9 (Intel) Nmap finished: 1 IP address (1 host up) scanned in 8.422 seconds Na powyższym listingu stan open | filtered oznacza porostu, że nie otrzymano pakietu RST, co może oznaczać, że port jest otwarty lub pakiet porostu został odfiltrowany. Ciekawostką jest, że namp na podstawie adresu MAC podał producenta karty sieciowej (w tym wypadku jest to Intel). W dalszej części omówię metody, których głównym celem jest uniemożliwienie zidentyfikowania agresora nawet jeśli wykryliśmy skanowanie i dysponujemy odpowiednimi danymi z przechwyconych pakietów. FTP bounce ([1], [6]) Jest to bardzo ciekawa metoda ukrywania adresu nadawcy pakietów skanujących. Polega ona na wykorzystaniu serwera FTP. Jak wiadomo podczas połączenia wykorzystuje on dwa porty do różnych zadań: port 21 jako połączenie do kontrolowania, wysyłania komend, port 20 jako połączenie do przesyłania danych. Protokół FTP wykorzystuje polecenie PORT do kontrolowania połączenia, za jego pomocą ustawiany jest port oraz adres IP klienta łączącego się z serwerem. Można zatem wykorzystać to polecenie i ustawić numer portu i adres IP hosta, którego chcemy przeskanować (np. PORT 192,168,5,10,A,B gdzie port jest obliczany: A + 256*B). Jeśli tylko serwer FTP nie porównuje adresu IP hosta wydającego mu polecenie PORT z adresem ustawianym w tym poleceniu ta metoda zakończy się powodzeniem. Jeśli już udało nam się ustawić pożądany adres hosta, oraz port który chcemy sprawdzić wykonujemy jakąś operację, np. LIST co spowoduje próbę nawiązania połączenia przez serwer FTP pod wskazany przez nas wcześniej adres i port w celu wysłania wyników polecenia. Jeśli zwrócony zostanie komunikat o kodzie 150 lub 266, będzie to oznaczało, że interesujący nas port jest otwarty, a jeśli komunikat będzie oznaczony kodem 426 to port jest zamknięty. Nmap jest na tyle potężnym narzędziem, że może takie skanowanie przeprowadzić automatycznie: nmap -b user:haslo@ftp.domena.com:nr_portu host_docelowy Poniższy rysunek w sposób poglądowy przedstawia przebieg całego procesu. W 2004 roku przeprowadzono test na 2491 serwerach FTP. Okazało się, że 193 akceptowało anonimowe połączenia wśród których 10 zezwalało na ustawienie poleceniem PORT nieswojego adresu IP!!! IP ID idle scan ([1], [4], [6]) Jest to następna metoda, która wykorzystuje inny, pośredniczący host do skanowania naszego celu. Jej podstawą jest błąd, a raczej niedbałość producentów systemów operacyjnych o odpowiednią losowość pola ID w nagłówku datagramu IP (Windows NT inkrementuje to pole stopniowo o 256, Linux o 1, jedynie OpenBSD losuje tą wartość przez co nie może być wykorzystany w tej metodzie). Agresor działając na komputerze A, najpierw musi odnalezć w sieci host C nie przejawiający żadnej aktywności (tzw. host niemy dumb host), nie wysyłający i nie odbierający żadnych pakietów. Kolejnym krokiem jest wysłanie kilku pakietów ICMP ECHO REQUEST (ping) do C i kontrola pola ID pakietów od niego otrzymanych. W przypadku np. Linuxa wartości tego pola powinny rosnąć o 1. Od tej pory proces nadzorowania pola ID musi być prowadzony ciągle. Następnie agresor (A) wysyła pakiet o adresie docelowym hosta do przeskanowania (B), adresie zródłowym C i ustawionej fladze SYN. Host B może odpowiedzieć na dwa sposoby (do hosta C): " SYN/ACK jeśli port jest otwarty w trybie nasłuchu. Host C odebrawszy taki pakiet i nie wiedząc nic o inicjowaniu połączenia z B odpowie segmentem z flagą RST, a więc podczas kontroli pola ID w pewnym momencie zaobserwujemy jego zwiększenie o wartość większą niż 1 (poniżej moment ten został wyróżniony). 60 bytes from C: seq=17 ttl=64 id=x time=96 ms 60 bytes from C: seq=18 ttl=64 id=x+1 time=80 ms 60 bytes from C: seq=19 ttl=64 id=x+3 time=83 ms 60 bytes from C: seq=20 ttl=64 id=x+4 time=94 ms 60 bytes from C: seq=21 ttl=64 id=x+5 time=92 ms 60 bytes from C: seq=22 ttl=64 id=x+6 time=82 ms " RST jeśli port jest zamknięty. Wtedy host C zignoruje taki pakiet co nie spowoduje już gwałtownego (większego niż 1) wzrostu pola ID w wysyłanych przez niego pakietach. 60 bytes from C: seq=80 ttl=64 id=x time=96 ms 60 bytes from C: seq=81 ttl=64 id=x+1 time=82 ms 60 bytes from C: seq=82 ttl=64 id=x+2 time=60 ms 60 bytes from C: seq=83 ttl=64 id=x+3 time=75 ms 60 bytes from C: seq=84 ttl=64 id=x+4 time=91 ms 60 bytes from C: seq=85 ttl=64 id=x+5 time=60 ms Narzędzia jakie można do tego celu wykorzystać to nmap jak i również napisane do tego celu narzędzie idlescan (http://www.securiteam.com/tools/3G5PWR5QAM.html). Poniżej krótki przykład użycia nmap'a. nmap -sI host_niemy_C host_docelowy_B Poniższy rysunek przedstawia schematycznie przebieg całego procesu. Decoy ([1]) Metoda ta polega na wysyłaniu pakietów skanujących z różnymi adresami zródłowymi. Sprawia to wrażenie, jakbyśmy skanowali z większej liczby hostów równocześnie. Oczywiście wśród wielu adresów zródłowych powinien się znajdować także nasz adres. Nie ma jednak prostej metody odgadnięcia, który ze skanujących adresów jest akurat naszym adresem. Program nmap wspomaga wykonywanie skanowania tą właśnie metodą: nmap -sS -D 10.0.0.1,10.0.0.2,ME,10.2.3.1 192.168.5.11 Powyższe polecenie spowoduje skanowanie metodą TCP SYN (opcja -sS, oczywiście można użyć innych wcześniej omówionych metod) komputera o adresie 192.168.5.11, przez komputery o adresach znajdujących się na liście decoy (po opcji -D). ME zastępowane jest adresem naszej karty sieciowej. Jeśli nie wpiszemy nigdzie ME nasz adres będzie losowo wplatany w listę. Jeśli adresów będzie wystarczająco dużo to niektóre systemy wykrywające tego typu działania nawet nie podadzą naszego adresu IP w raporcie. Jednak ważne jest to, aby podszywać się pod istniejące hosty, ponieważ jeśli administrator skanowanego systemu (albo jakiś system automatyczny) sprawdzi istnienie adresów z jakich dokonywane było skanowanie i okaże się, że tylko jeden jest aktywny to na pewno będzie to nasz. Slow scan ([1], [7]) Slow scan polega na skanowaniu hosta pakietami wysyłanymi odpowiednio rzadko, tak aby nie budziły one podejrzeń. Pomaga to oszukać systemy IDS, które zaliczają takie pakiety jako zagubione w sieci (dopóki nie przekroczą one pewnej ilości na jednostkę czasu nie są uznawane za podejrzane). Jeśli na przykład będziemy wysyłać jeden pakiet na 15 min. to raczej nie zostaniemy zauważeni przez system IDS. Jednak w tym przypadku skanowanie wszystkich 65535 portów zajmie nam prawie dwa lata (683 dni). Właśnie z uwagi na to powinniśmy zawęzić nasze skanowanie tylko do interesujących nas portów (opcja -p w nmap określa porty do skanowania). W programie nmap możemy sterować szybkością wysyłanych pakietów za pomocą opcji -T, po której podajemy sposób wysyłania pakietów: " Paranoid (0) 5 min. pomiędzy wysyłanymi pakietami " Sneaky (1) 15 sek. pomiędzy wysyłanymi pakietami " Polite (2) 0,4 sek. pomiędzy wysyłanymi pakietami " Normal (3) pakiety wysyłane są tak szybko jak to możliwe, ale bez przeciążania sieci (jest to ustawienie domyślne) " Aggressive (4) maksymalnie opóznienie pomiędzy pakietami to 10ms przy czym jeśli na wysłany pakiet nie nadejdzie odpowiedz w ciągu 1.25s to następuje ponowienie próby wysłanie go ponownie (taka sytuacja może wystąpić co najwyżej 6 razy) " Insane (5) - maksymalne opóznienie pomiędzy pakietami to 5ms przy czym jeśli host nie odpowie na wysłany pakiet w ciągu 300ms to następuje ponowne jego wysłanie (taka sytuacja może się powtórzyć co najwyżej 2 razy). Przykłady: nmap -sS -T 4 192.168.1.10 nmap -sS -T Polite 192.168.1.10 Distrybuted/coordinated scan ([1]) Kolejną metodą ukrywania się przed systemami IDS jest dokonywanie wysyłania pakietów skanujących z wielu komputerów równocześnie. Oczywiście taki skanowanie musi być w jakiś sposób zsynchronizowane pomiędzy tymi hostami. Przyjmując, że mielibyśmy do dyspozycji 256 takich komputerów skanowanie opisane w poprzednim przypadku (pojedynczy host wysyła jeden pakiet na 15 min.) trwałoby juz tylko 64 godziny. Fragmented packets ([1], [6], [7]) Technika ta polega na fragmentacji nagłówka TCP na kilka mniejszych pakietów i jest głównie wykorzystywana w połączeniu z metodami FIN oraz SYN. Taka fragmentacja sprawia niemały problem systemom IDS. Aby stwierdzić czy dany pofragmentowany pakiet zagraża bezpieczeństwu sieci musi on zostać połączony (defragmentacja). Nie zawsze IDS może pozwolić sobie na długotrwałe przechowywanie w pamięci kolejno otrzymywanych fragmentów, gdyż znacznie może to obniżyć jego wydajność. W takiej sytuacji pakiety takie nie zostają wykryte, pozostajemy w ukryciu. Fragmentację pakietów można włączyć w nmap opcją -f (lub --mtu). nmap -sS -f Polite 192.168.1.10 Bibliografia [1] Karol Krysiak Sieci komputerowe Kompedium , Helion 2003 [2] Jakub Sorys, Dorota Szczpanik Skanowanie portów http://micek.no-ip.com/~sektorvx/download/044.pdf [3] agresor, jimmy Rodzaje i klasyfikacja włamań oraz ataków internetowych http://www.narf.shl.pl/content/view/56/26/ [4] Dominik Kruk Lustracja przez Internet http://www.pckurier.pl/archiwum/art0.asp?ID=5442 [5] http://www.auditmypc.com/freescan/readingroom/port_scanning.asp [6] Tomasz Wendlandt Skanowanie i Fingerprinting http://www.linuxpub.pl/administracja/skanowanie_fingerprinting.html [7] Nmap Reference Guide (Man Page) http://www.insecure.org/nmap/man/ [8] hping2 man page http://www.hping.org/manpage.html http://hping.org [9] James Messer Secrets of Network Cartography: A Comprehensive Guide to nmap http://www.networkuptime.com/nmap/index.shtml