Wykrywanie hostów

Jednym z pierwszych kroków rekonesansu sieciowego jest redukcja (czasami ogromnych) zakresów adresów IP do listy aktywnych lub interesujących hostów. Skanowanie każdego portu na każdym adresie IP jest wolne i przeważnie niepotrzebne. Oczywiście to co czyni host interesującym głównie zależy od celu skanowania. Administratorzy sieci mogą być zainteresowani hostami udostępniającymi określoną usługę podczas gdy audytorzy bezpieczeństwa mogą chcieć przyjrzeć się każdemu urządzeniu posiadającemu adres IP. Administratorowi może wystarczać wykorzystanie pinga ICMP do zlokalizowania hostów w jego wewnętrznej sieci, podczas gdy audytor przeprowadzający zewnętrzne testy penetracyjne może wykorzystywać dziesiątki różnych testów do ominięcia reguł filtrowania systemu zaporowego.

Ponieważ niezbędne są różne metody wykrywania hostów, Nmap oferuje szeroki wachlarz opcji pozwalających na wybieranie wykorzystywanych technik. Wykrywanie hostów często jest zwane skanowaniem Ping, jednak wykracza daleko poza proste wysyłanie zapytania ICMP echo request znanego z programu ping. Użytkownik może pominąć etap wykrywania poprzez wykorzystanie opcji skanowania listy (-sL), poprzez wyłączenie pingowania (-P0) lub wykorzystania różnych kombinacji wieloportowego badania za pomocą testów TCP SYN/ACK, UDP, i ICMP. Celem tych testów jest uzyskanie informacji o adresach IP, które są aktualnie dostępne (są wykorzystywane przez urządzenie sieciowe lub komputer). W przypadku wielu sieci tylko mały procent wykorzystywanych adresów IP jest równocześnie aktywnych. Jest to szczególnie powszechne w sieciach prywatnych zgodnych z adresacją RFC1918, takich jak 10.0.0.0/8. Ta sieć zawiera 16 milionów adresów IP, ale widziałem nie raz firmy wykorzystujące niecały tysiąc z nich. Opcja wykrywania hostów pozwala na szybkie wykrycie rzeczywiście wykorzystywanych adresów IP z całej dostępnej puli.

Jeśli nie podano opcji wybierającej metodę wykrywania hostów, Nmap wysyła pakiety TCP ACK na port 80 i zapytanie ICMP Echo Request query do każdego badanego adresu. Wyjątkiem od tej reguły jest skanowanie ARP przeprowadzane dla aktualnego segmentu sieci ethernet. W przypadku uruchamiania przez nie uprzywilejowanych użytkowników systemów UNIX, wysyłany jest pakiet SYN zamiast ACK z wykorzystaniem wywołania systemowego connect(). Ustawienia domyślne są tożsame z opcjami -PA -PE. Takie wykrywanie hostów jest najczęściej wystarczające podczas skanowania sieci lokalnej, jednak podczas audytów bezpieczeństwa zalecane jest wykorzystywanie bardziej zaawansowanych opcji.

Opcje -P* (które wybierają sposób pingowania) mogą być łączone. Możesz poprawic dokładność wykrywania hostów za systemem zaporowym poprzez stosowanie wielu różnych portów/flag TCP i typów ICMP. Zwracam uwagę, że wykrywanie hostów ARP (-PR) jest z założenia włączane podczas testów sieci lokalnej w ramach tego samego segmentu, nawet jeśli podasz inne opcje -P*, ponieważ praktycznie zawsze tak jest szybciej i efektywniej.

Opcje kontroli wykrywania hostów.

-sL (Lista skanowania)

Lista skanowania jest okrojoną funkcją wykrywania hostów, która po prostu wyświetla wszystkie adresy z podanych zakresów skanowania i nie wysyła żadnych pakietów do nich. Domyślnie Nmap wykonuje odwrotne zapytania DNS o badane adresy aby poznać ich nazwy. Często niespodzianką jest jak dużo informacji mogą udzielić już same nazwy hostów. Na przykład fw.chi.playboy.com jest systemem zaporowym w biurze Playboy Enterprises w Chicago. Na końcu Nmap podaje także całkowitą liczbę adresów IP. Lista skanowania jest dobrym sposobem na sprawdzenie i uzyskanie pewności, że prawidłowo podano zakres skanowania. Jeśli nie rozpoznajesz nazw domen na uzyskanej liście, warto sprawdzić podany zakres, co pozwala unikąć niepotrzebnego skanowania sieci nieznanej firmy.

Ideą tej opcji jest wyświetlanie prostej listy adresów, z tego powodu bardziej zaawansowana funkcjonalność taka jak skanowanie portów, wykrywanie systemu operacyjnego czy pingowanie nie może być łączone z tą metodą. Jeśli chcesz wyłączyć pingowanie podczas skanowania, poczytaj na ten temat w opisie opcji -P0.

-sP (Skanowanie Ping)

Ta opcja nakazuje Nmapowi przeprowadzać tylko skanowanie typu Ping (wykrywanie hostów), a wynikiem jej działania jest lista aktywnych hostów. Dodatkowe testy (takie jak skanowanie portów lub wykrywanie systemu operacyjnego) nie są przeprowadzane. Metoda ta idzie krok dalej niż lista skanowania i może być wykorzystywana w podobnym celu. Pozwala na przeprowadzenie delikatnego rekonesansu bez zwracania zbytniej uwagi. Posiadanie wiedzy na temat ilości aktywnych hostów jest bardziej wartościowe dla atakujących niż sama lista adresów zawierająca adres IP i nazwę hosta.

Również administratorzy systemów często korzystają z tej opcji. Pozwala ona na łatwe i szybkie określenie liczby hostów w sieci lub monitorowanie dostępności serwerów. Opcja ta często jest nazywna Ping Sweep i daje bardziej wiarygodne wyniki niż pingowanie adresu broadcast, ponieważ niektóre adresy mogą na niego nie odpowiedzieć.

Domyślnie opcja -sP wysyła pakiety ICMP echo request i pakiety TCP na port 80. W przypadku wykonywania z konta nie uprzywilejowanego użytkownika wysyłane są pakiety SYN (z wykorzystaniem funkcji systemowej connect()) na port 80 badanego hosta. Jeśli uprzywilejowany użytkownik próbuje przeskanować adresy w lokalnej sieci ethernet, wykorzystywane są zapytania ARP (-PR), chyba że dodano opcję --send-ip. Dla większej wygody opcja -sP może być łączona w dowolny sposób z innymi metodami wykrywania hostów (opcje -P*, nie dotyczy -P0). Jeśli wybrano któryś z typów testów i numer portu, nie są wykorzystywne domyślne ustawienia (ACK i echo request). Wykorzystywanie tych opcji jest szczególnie zalecane, jeśli pomiędzy badanym systemem, a hostem na którym jest uruchomiony Nmap jest system zaporowy, inaczej niektóre (lub wszystkie) hosty nie zostaną wykryte.

-P0 (Bez pinga)

Ta opcja wyłącza całkowicie wykrywanie hostów. Normalnie Nmap próbuje wykryć aktywne adresy przed rozpoczęciem właściwego skanowania. Domyślnie Nmap przeprowadza tylko testy takie jak skanowanie portów, wykrywanie wersji i systemu operacyjnego tylko dla hostów, które zostały wcześniej wykryte jako aktywne. Wyłączenie wykrywania hostów za pomocą opcji -P0 powoduje, że Nmap próbuje wykonać wszystkie żadane typy skanowania na każdym podanym adresie IP. Jeśli więc jako cel w linii pleceń podano klasę B (/16), wszystkie 65,536 adresów zostanie przeskanowane. Drugi znak w opcji -P0 jest zerem, a nie literą O. Wykrywanie hostów jest pomijane jak przy wyświetlaniu listy skanowania, jednak zamiast zatrzymać się i wyświetlić listę, Nmap kontynuuje i przeprowadza założone testy na każym adresie IP, tak jak by był wykryty jako aktywny.

-PS [listaportów] (TCP SYN Ping)

Opcja ta powoduje wysyłanie pustych pakietów TCP z ustawioną flagą SYN. Domyślnie port docelowy to 80 (konfigurowalne przed kompilacją za pomocą stałej DEFAULT_TCP_PROBE_PORT w pliku nmap.h), ale inny port może być podany jako parametr. Możliwe jest również podanie listy portów, odzielonych przecinkami (np. -PS22,23,25,80,113,1050,35000), co spowoduje przeprowadzenie testów na wszystkich podanych portach równolegle.

Ustawiona flaga SYN sugeruje badanemu systemowi, że próbujesz nawiązać z nim połączenie. Normalnie zdalny port będzie zamknięty i zostanie wysłany z powrotem pakiet z flagą RST (reset). Jeśli port będzie otwarty, host będzie próbował wykonać drugi krok z trójstopniowego procesu nawiązywania połączenia odpowiadając za pomocą pakietu TCP SYN/ACK. Nmap zamiast wysłać pakiet ACK, który by pomyślnie zakończył nawiązywanie połączenia, w tym momencie przerwie połączenie wysyłając pakiet RST. Pakiet RST jest wysyłany przez kernel systemu na którym pracuje Nmap automatycznie, w odpowiedzi na niespodziwany pakiet SYN/ACK, a nie przez samego Nmapa.

Nmap nie zwraca uwagi czy port jest otwarty czy zamknięty. W zależności od uzyskanej omówionej wcześniej odpowiedzi (RST lub SYN/ACK) host jest uznawany za dostępny.

W systemach UNIX, tylko użytkownik uprzywilejowany - root - może wysyłać niskopoziomowe pakiety raw TCP. W przypadku użytkowników nie posiadających odpowiednich uprawnień wykorzystywane jest obejście w postaci wykorzystania funkcji systemowej connect() do wykonania połączeń ze wskazanymi portami. Jeśli connect() zwróci poprawność wykonania operacji lub błąd odmowy połączenia ECONNREFUSED, stos TCP musiał otrzymać pakiet z flagami SYN/ACK lub RST i host jest uznawany za dostępny. Jeśli próba nawiązania połączenia została przerwana po przekroczeniu maksymalnego czasu oczekiwania, host jest oznaczany jako niedostępny. To obejście jest również wykorzystywane dla protokołu IPv6, ponieważ wysyłanie niskopoziomowych pakietów raw TCP nie jest jeszcze dostępne w Nmapie.

-PA [lista portów] (TCP ACK Ping)

Metoda TCP ACK ping jest dosyć podobna do powyżej opisanego SYN ping. Różnica, jak łatwo zgadnąć, polega na wykorzystaniu flagi ACK zamiast SYN. Flaga ACK jest wykorzystywana do potwierdzania otrzymania danych za pomocą utworzonego wcześniej połączenia TCP, jednak w tym wypadku połączenie takie nie istnieje. Z tego powodu badany system powinien zawsze odpowiedzieć pakietem z flagą RST, świadczącą o nie isnieniu takiego połączenia.

Opcja -PA, tak jak SYN, używa portu numer 80 i również może przyjmować listę portów jako argument (w takim samym formacie). Jeśli program został uruchomiony przez nie uprzywilejowanego użytkownika lub badany jest adres IPv6, wykorzystywane jest opisane wcześniej obejście za pomocą connect(). Obejście to nie jest idealne, ponieważ funkcja connect() wysyła pakiet SYN zamiast oczekiwanego ACK.

Powodem udostępniania zarówno metody SYN jak i ACK jest zwiększenie szansy na ominięcie systemu zaporowego. Wielu administratorów konfiguruje routery i proste systemy zaporowe tak, żeby blokowały przychodzące pakiety SYN, poza przychodzącymi do publicznych serwerów takich jak WWW czy pocztowych. Zabezpiecza to przed przychodzeniem innych połączeń przy jednoczesnym nie zakłucaniu pozostałej transmisji wychodzącej do Internetu. Takie bezstanowe (non-stateful) rozwiązanie zajmuje mało zasobów systemu zaporowego/routera i jest szeroko wspierane przez filtry sprzętowe i programowe. Linuxowy firewall Netfilter/iptables dla wygody posiada opcję --syn, która implementuje takie właśnie bezstanowe filtrowanie. W przypadku takiego systemu zaporowego testy wykorzystujące metodę SYN ping (-PS) zostaną prawdopodobnie zablokowane w przypadku zamkniętych portów. W tym przypadku metoda ACK pozwoli na obejście tych zabezpieczeń.

Innym popularnym typem jest firewall wykorzystujący stany (stateful) do blokowania niechcianych pakietów. Taka funkcjonalność jest najczęściej spotykana w wysokiej klasy systemach zaporowych, które stają się z roku na rok coraz popularniejsze. Linuxowy Netfilter/iptables posiada opcję --state, która kategoryzuje pakiety na podstawie stanu połączenia. Metoda SYN prawdopodobnie będzie działała poprawnie dla tego typu systemów, ale już pakiet z ACK zostanie rozpoznany jako nieprawidłowy i zostanie zablokowany. Rozwiązaniem tego problemu jest wykorzystywanie jednocześnie obu metod SYN i ACK poprzez podanie parametrów -PS i -PA.

-PU [listaportów] (UDP Ping)

Kolejną metodą wykrywania hostów jest UDP ping, który wysyła puste (o ile nie wykorzystano opcji --data-length) pakiety UDP na wskazane porty. Lista portów jest podawana w takim samym formacie jak dla wcześniej opisanych opcji -PS i -PA. Jeśli nie podano numerów portów, domyślnie używany jest port 32338. Port ten może być zmieniony przed kompilacją poprzez zmianę stałej DEFAULT_UDP_PROBE_PORT w pliku nmap.h. Wybór tak mało popularnego portu został podyktowany chęcią uniknięcia wysyłania pakietów do otwartych portów, co w przypadku tego testu nie przyniosło by oczekiwanego efektu.

W przypakdu kiedy port jest zamknięty na badaniej maszynie, w odpowiedzi na pakiet UDP powinien zostać odesłany pakiet ICMP port unreachable oznaczający brak możliwości komunikacji z wybranym portem. Po otrzymaniu takiej odpowiedzi Nmap oznacza host jako dostępny. Inne typy odpowiedzi ICMP, takie jak host/sieć niedostępna czy przekroczony czas życia TTL oznaczają, że badany host nie jest dostępny, podobnie interpretowany jest brak odpowiedzi. Jeśli badany port jest otwarty, większość typowych usług zignoruje pusty pakiet i nie zostanie wysłana żadna informacja zwrotna. Właśnie dla tego domyślnie testowanym portem jest 31338, który jest bardzo rzadko wykorzystywany. Wiele usług, takich jak chargen, odpowie na pusty pakiet co spowoduje, że Nmap uzna host za dostępny.

Główną zaletą tego typu skanowania jest fakt, że omija systemy zaporowe i filtry skupiające sie tylko na TCP. Przykładowo, miałem kiedyś szerokopasmowy router bezprzewodowy Linksys BEFW11S4. Zewnętrzny interfejs tego urządzenia filtrował domyślnie wszystkie porty TCP, za to testy UDP zwracały odpowiedzi ICMP port unreachable, co ujawnia istnienie urządzenia.

-PE; -PP; -PM (Typy ICMP Ping)

Dodatkowo poza opisanymi wcześniej metodami wykrywania hostów TCP i UDP, Nmap może wysyłać standardowe pakiety ICMP znane z typowego programu ping. Nmap wysyła pakiety ICMP typu 8 (echo request) do badanego hosta i oczekuje typu 0 (echo reply) w odpowiedzi. Niestety wiele hostów i systemów zaporowych blokuje tego typu pakiety, zamiast odpowiadać prawidłowo i zgodnie z RFC 1122. Z tego powodu skanowania nieznanych hostów w internecie za pomocą tej metody przeważnie nie są wiarygodne. Jednakże administratorzy systemów monitorujący wewnętrzne sieci mogą z powodzeniem efektywnie wykorzystywać tą metodę. Takie wykorzystanie zapytań ICMP echo request jest możliwe za pomocą opcji -PE.

Zapytanie echo request jest standardowym zapytaniem ICMP ping, jednak Nmap nie poprzestaje na tym. Standard ICMP (RFC 792) opisuje także zapytania timestamp request, information request, i address mask request o kodach odpowiednio 13, 15 i 17. Podczas kiedy założonym efektem działania tych zapytań jest uzyskanie informacji typu maska sieci czy aktualny czas, mogą być one wykorzystane do wykrywania aktywności hostów. System który odpowiada, jest uznawany za aktywny. Nmap nie obsługuje zapytań information request, jako że nie są one często spotykane. RFC 1122 zaleca, że host NIE POWINIEN obsługiwać tych zapytań. Zapytania timestamp i address mask mogą być wysyłane z wykorzystaniem opcji odpowiednio -PP i -PM. Odpowiedzi timestamp reply (ICMP kod 14) lub address mask reply (kod 18) ujawniają aktywność hosta. Te dwa zapytania mogą być pomocne, kiedy administrator specyficznie blokuje zapytania echo request zapominając przy tym blokować inne typy ICMP, które mogą być wykorzystane w tym samym celu.

-PR (ARP Ping)

Jednym z najczęściej spotykanych scenariuszy wykorzystania Nmapa jest skanowanie sieci lokalnej ethernet. W większości sieci LAN, w szczególności wykorzystujących adresację prywatną zalecaną przez RFC1918, większość adresów IP nie jest wykorzystywana. Kiedy Nmap próbuje wysłać pakiet raw IP taki jak ICMP echo request, by poprawnie zaadresować ramkę ethernet system operacyjny musi określić (ARP) docelowy adres sprzętowy korespondujący z docelowym adresem IP. Takie zachowanie jest często powolne i problematyczne, ponieważ systemy operacyjne nie zostały napisane z uwzględnieniem potrzeby wysyłania milionów zapytań ARP o niedostępne hosty w krótkim czasie.

Skanowanie ARP wykorzystuje zoptymalizowany algorytm Nmapa do wysyłania zapytań ARP. Po otrzymaniu odpowiedzi Nmap nie musi się nawet martwić o oparte na IP pakiety ping, ponieważ już wie, że host jest aktywny. Takie zachowanie pozwala na dużo szybsze i bardziej wiarygodne skanowanie. Z tego powodu zachowanie takie jest domyślne podczas skanowania sieci, którą Nmap wykryje jako sieć lokalną należącą do tego samego segmentu. Nawet jeśli zostaną podane inne typy skanowania ping (takie jak -PE lub -PS), Nmap używa ARP zamiast nich do wykrywaia hostów w lokalnej sieci ethernet. Jeśli nie chcesz używać ARP do skanowania, dodaj opcję --send-ip.

-n (Wyłącz zapytania DNS)

Nakazuje Nmapowi nigdy nie używać zapytań odrotnych do serwerów DNS o nazwy przypisane do adresów IP. Jako że zapytania DNS są najczęściej długo trwają, opcja ta przyspiesza pracę.

-R (Wymuś zapytania DNS)

Nakazuje Nmapowi zawsze wykonywać odwrotne zapytania do serwera DNS o nazwy dla skanowanych adresów IP. Domyślnie zapytania są wykonywane tylko dla aktywnych hostów.

--system-dns (Używaj systemowego DNS)

Domyślnie Nmap określa nazwy dla adresów IP poprzez wysyłanie zapytań bezpośrednio do serwerów DNS skonfigurowanych w systemie, o ile są dostępne. Wiele zapytań (często dziesiątki) jest wykonywanych równolegle dla uzyskania wiekszej szybkości. Dodanie tej opcji wymusza wykorzystywanie rozwiązywania nazw za pośrednictwem systemu operacyjnego (każdorazowo o pojedyncze IP za pomocą funkcji getnameinfo()). Ta opcja jest wolniejsza i jest użyteczna tylko w sporadycznych przypadkach, chyba że w Nmapie jest błąd w kodzie DNS - prosze się z nami skontaktować w tym przypadku. W przypadku skanowania sieci IPv6, rozwiązywanie nazw jest zawsze wykonywane z wykorzystaniem systemu operacyjnego.

--dns-servers <server1[,server2],...> (Serwery do wykonywania zapytań DNS)

Domyślnie Nmap próbuje odczytać serwery DNS wpisane do pliku resolv.conf (UNIX) lub rejestru (Win32). Alternatywnie, możesz użyć tej opcji do podania własnych serwerów. Opcja ta nie jest uwzględniana, jeśli użyto również opcji --system-dns lub skanowane są adresy IPv6. Używanie wielu serwerów DNS jest często dużo szybsze, niż tylko jednego.