Nmap to bezpłatne narzędzie open source służące do skanowania i analizy sieci komputerowych. Jest szeroko używany przez administratorów systemów oraz specjalistów ds. bezpieczeństwa do wykrywania urządzeń w sieci, sprawdzania otwartych portów, identyfikacji usług działających na tych portach oraz ustalania wersji oprogramowania i systemów operacyjnych. Oczywiście Nmap nie jest jedynym narzędziem tego typu. Jednak niewątpliwie jest najczęściej stosowany. Dużą jego zaletą są wbudowane skrypty, za pomocą których można także szukać podatności, a nawet wykonywać exploity.
W poradniku tym skupię się tylko i wyłącznie na skanowaniu portów za pomocą Nmapa. Omówię jakie są możliwe rodzaje skanowania, a także wyjaśnię kiedy należy ich używać i na co warto zwrócić uwagę.
Czym są porty protokołu
Porty protokołu są to punkty końcowe komunikacji, które umożliwiają wymianę danych pomiędzy urządzeniami. Każdy port przypisany jest do konkretnego numeru (od 0 do 65535), co pozwala systemom identyfikować rodzaj usługi, z jaką ma być nawiązana komunikacja. Więcej o portach protokołu przeczytasz w osobnym artykule: Port protokołu – co to jest?
Kiedy komputer uruchamia wybraną usługę sieciową (np. otwiera w przeglądarce stronę google.com), otwiera port co umożliwia odbieranie połączeń. Porty są niezbędne, aby umożliwić jednoczesne obsługiwanie wielu żądań sieciowych lub oferować różne usługi na tym samym urządzeniu. Na przykład, gdy w przeglądarce otwierasz kilka stron internetowych naraz, program musi jakoś rozpoznać, która karta ładuje którą stronę. Dzieje się to poprzez nawiązywanie połączeń zdalnych z serwerami za pomocą różnych portów lokalnych na Twoim komputerze, jak na poniższym zrzucie.

Połączenia sieciowe nawiązywane są pomiędzy dwoma portami – jednym otwartym portem nasłuchującym na serwerze i losowo wybranym portem na Twoim urządzeniu. Na przykład podczas łączenia się ze stroną google.com Twój komputer może otworzyć port 52456, aby połączyć się z portem 443 serwera.
Należy także wiedzieć, że niektóre numery portów są standardowo przypisane do danych usług, np.:
- Port 20, 21 – protokół FTP (File Transfer Protocol) – używany do przesyłania plików między serwerami i klientami. Port 21 służy do przesyłania poleceń i komunikatów między klientem a serwerem. Natomiast port 20 jest używany do transferu danych.
- Port 22 – protokół SSH (Secure Shell) – umożliwia bezpieczne zdalne logowanie i zarządzanie systemami.
- Port 25 – protokół SMTP (Simple Mail Transfer Protocol) – wykorzystywany do wysyłania wiadomości e-mail.
- Port 53 – protokół DNS (Domain Name System) – służy do tłumaczenia nazw domenowych na adresy IP.
- Port 80 – protokół HTTP (HyperText Transfer Protocol) – obsługuje standardowe strony internetowe.
- Port 443 – protokół HTTPS (HTTP Secure) – zapewnia szyfrowane połączenia na stronach internetowych.
- Port 110 – protokół POP3 (Post Office Protocol) – używany do odbierania wiadomości e-mail.
- Port 143 – protokół IMAP (Internet Message Access Protocol) – umożliwia dostęp do wiadomości e-mail bez ich pobierania na lokalny komputer.
- Port 3389 – protokół RDP (Remote Desktop Protocol) – wykorzystywany do zdalnego pulpitu na systemach Windows.
Oczywiście powyższe usługi można przypisać do innych numerów portów. Jednak takie ustawienia są najczęściej spotykane.
Z punktu widzenia bezpieczeństwa, otwarte porty mogą być potencjalnym celem ataków, dlatego ważne jest monitorowanie i ograniczanie dostępu do tych, które nie są niezbędne do działania systemu.
Oznaczenia portów
Nmap w wynikach skanowania określa porty korzystając z kilku statusów.
- Otwarty (open) – port jest oznaczony jako otwarty, wtedy gdy aplikacja akceptuje połączenia TCP lub UDP na tym porcie. Ten status oznacza, że port ma przypisaną usługę nasłuchującą. Otwarty port stanowi cel dalszych badań pod kątem bezpieczeństwa. Przykład: Serwer WWW działający na porcie 80.
- Zamknięty (closed) – port odbiera i wysyła pakiety otrzymane z Nmapa, ale na porcie tym nie ma żadnej włączonej usługi, która obsługuje połączenia. Zamknięte porty mogą być użyteczne do sprawdzania, czy host jest aktywny oraz do identyfikowania systemu operacyjnego.
- Filtrowany (filtered) – komunikacja na tym porcie jest filtrowana (poprzez np. firewall), przez co Nmap nie jest w stanie określić, czy port ten jest otwarty czy zamknięty. Brak odpowiedzi może świadczyć o zabezpieczeniach chroniących ten port.
- Niefiltrowany (unfiltered) – dany port jest dostępny, ale Nmap nie jest w stanie określić czy jest otwarty czy zamknięty. Takie oznaczenie może zostać nadane tylko poprzez skanowanie ACK. W takiej sytuacji potrzebne jest dalsze skanowanie (np. Window, SYN czy FIN), które może pomóc w określeniu czy dany port jest otwarty czy zamknięty.
- Otwarty|filtrowany (open|filtered) – status występuje zwykle wtedy, gdy Nmap nie otrzymuje odpowiedzi na wysłane pakiety i nie jest w stanie rozpoznać, czy port jest otwarty, czy filtrowany. W ten sposób oznaczane są porty podczas skanowania UDP, FIN, Null, Xmas.
- Zamknięty|filtrowany (closed|filtered) – Nmap zazwyczaj stosuje ten status w sytuacjach, gdy nie może jednoznacznie stwierdzić, czy port jest zamknięty czy filtrowany. Taki wynik jest bardzo rzadko spotykany i może się pojawić tylko podczas skanowania IPID Idle.
Podstawowe polecenia Nmapa
Podstawowa składnia polecenia ma poniższą strukturę. Możemy wybrać metodę skanowania, dodatkowe opcje oraz określić cel:
nmap <metoda skanowania> <opcje> <cel>Wybór portów
W Nmap przełącznik -p służy do określenia, które porty mają zostać przeskanowane. Domyślnie Nmap skanuje 1000 najczęściej używanych portów, ale dzięki przełącznikowi -p można dokładnie wskazać, które porty mają być sprawdzone.
Skanowanie konkretnego portu (Nmap sprawdzi tylko port 80 na podanym hoście):
nmap -p 80 192.168.0.1Skanowanie wielu portów (skanuje tylko porty 21, 80, 443):
nmap -p 21,80,443 192.168.0.1Zakres portów (skanuje porty od 21 do 45):
nmap -p 21-45 192.168.0.1Sprawdzenie wszystkich 65535 portów:
nmap -p- 192.168.0.1Przeskanowanie najczęściej używanych portów zawartych w pliku nmap-services:
nmap -F 192.168.0.1Zapis wyników
W Nmap możesz zapisywać wyniki skanowania na kilka różnych sposobów.
Zapis do pliku w formacie zwykłego tekstu:
nmap -p 80,443 192.168.0.1 -oN wynik.txtZapis w formacie XML:
nmap -p 80,443 192.168.0.1 -oX wynik.xmlZapisanie wyników w formacie łatwym do filtrowania poleceniem grep:
nmap -p 80,443 192.168.0.1 -oG wynik.txtZapis w trzech formatach jednocześnie:
nmap -p 80,443 192.168.0.1 -oA wynikMetody skanowania portów
Nmap oferuje kilka metod skanowania. Warto je znać, ponieważ dzięki temu możemy odpowiednio podejść do danego problemu. Domyślny skan Nmapa może nie być wystarczający w sytuacjach wymagających większej precyzji lub gdy chcemy uniknąć wykrycia.
Wyróżnia się trzy podstawowe metody skanowania:
- TCP SYN (-sS)
- TCP Connect (-sT)
- UDP (-sU)
Ponadto są także dodatkowe, aczkolwiek mniej popularne metody m.in.:
- TCP Null (-sN)
- TCP FIN (-sF)
- TCP Xmas (-sX)
- TCP ACK (-sA)
- TCP Maimon Scan (-sM)
- Idle Scan (-sI)
Najczęściej będziesz używać trzech pierwszych metod skanowania. Jednak warto wiedzieć także o pozostałych technikach. Niestety niektóre z nich nie są już użyteczne we współczesnych systemach.
UWAGA! Zawsze miej na uwadze to, że wyniki z Nmapa nie muszą być prawdziwe. Dane są zwracane z systemów, które są chronione zaporami sieciowymi, tak więc celowo mogą zwracać nieprawdziwe dane.
Skanowanie TCP SYN (-sS)
Skanowanie TCP SYN jest domyślnym ustawieniem, o ile jest możliwy taki typ skanowania (użytkownik wykonujący skanowanie musi mieć uprawnienia root). Jego główną cechą jest to, że podczas skanowania nie jest otwierane całe połączenie TCP. Dzięki temu ta metoda skanowania jest bardziej dyskretna. Skanowanie TCP SYN jest często nazywane „half open scans”, co w dosłownym tłumaczeniu oznacza pół otwarte skanowanie. Żeby lepiej to zrozumieć, zacznijmy od przypomnienia czym jest uzgadnianie trój-etapowe (ang. TCP 3-Way Handshake).
Protokół TCP jest protokołem połączeniowym. Oznacza to, że zanim zostaną przesłane jakiekolwiek dane pomiędzy klientem a serwerem, najpierw musi zostać ustanowione połączenie, które nazywa się 3-Way Handshake. W pierwszej kolejności klient wysyła do serwera pakiet z flagą SYN. Serwer jest w ten sposób informowany, że dany klient chce nawiązać z nim połączenie. Serwer jeśli może nawiązać połączenie, wysyła w odpowiedzi pakiet z flagą SYN oraz ACK. Flaga ACK informuje klienta, że serwer otrzymał poprzedni pakiet. W odpowiedzi klient wysyła do serwera pakiet z flagą ACK, co jest potwierdzeniem otrzymania komunikatu. Od tej chwili zostaje nawiązane połączenie pomiędzy klientem a serwerem i jest możliwa właściwa transmisja danych. Połączenie TCP 3-Way Handshake jest przedstawione na poniższym obrazku:

Jak już wszystkie dane zostaną przesłane pomiędzy klientem a serwerem, następuje zamknięcie sesji. Klient w tym celu wysyła do serwera pakiet z ustawioną flagą FIN. Flaga ta informuje serwer, że sesja zostanie zamknięta. Serwer odpowiada pakietem z flagą ACK, co jest potwierdzeniem odebrania wcześniejszego pakietu od klienta. Następnie serwer przesyła kolejny pakiet z flagą FIN. Klient odpowiada mu na to pakietem z flagą ACK. Po tym sesja zostaje zamknięta.

Do zarządzania sesjami wykorzystuje się następujące flagi:
- SYN (Synchronize) – inicjalizuje połączenie między klientem a serwerem.
- ACK (Acknowledge) – potwierdza otrzymanie pakietu danych.
- FIN (Finish) – sygnalizuje zamiar zakończenia połączenia.
- RST (Reset) – natychmiast zrywa połączenie.
- PSH (Push) – wymusza natychmiastowe przekazanie danych do aplikacji odbiorcy.
- URG (Urgent) – oznacza, że przesyłane dane mają priorytet i powinny być natychmiast przetworzone.
Podczas skanowania TCP SYN połączenie nie jest otwierane. Klient wysyła do serwera tylko pakiet SYN. Jeśli serwer odpowie komunikatem SYN i ACK, oznacza to, że port jest otwarty.
sudo nmap -sS <IP_celu>
Natomiast serwer jeśli odpowie komunikatem RST port jest oznaczany jako zamknięty.

W przypadku gdy serwer nie odpowiada, port jest oznaczony jako filtrowany.

Zalety skanowania SYN:
- Można używać do omijania starszych IDS (systemów wykrywania włamań), ponieważ szukają one pełnego trój-etapowego uzgadniania (3-Way Handshake).
- Skanowanie TCP SYN często nie jest zapisywane w logach.
- Jest szybsze od skanowania TCP Connect (ten typ skanowania jest opisany w kolejnym punkcie), ponieważ nie jest ustanawiane pełne 3-Way Handshake.
Wady skanowania SYN:
- Wymagane są uprawnienia root (w systemie Linux). Jest to spowodowane tym, że skanowanie SYN wymaga możliwości tworzenia surowych pakietów (raw), w przeciwieństwie do pełnego uzgadniania TCP. Pakiety raw może tworzyć tylko użytkownik z uprawnieniami root. Należy wspomnieć o tym, że skanowanie SYN można również uruchomić, nadając programowi Nmap uprawnienia CAP_NET_RAW, CAP_NET_ADMIN i CAP_NET_BIND_SERVICE. Niestety takie podejście wymaga odpowiedniej konfiguracji i może wiązać się z ryzykiem w zakresie bezpieczeństwa systemu.
Skanowanie SYN jest domyślnym skanowaniem używanym przez Nmap, jeśli jest uruchamiane z uprawnieniami root. Natomiast, jeśli skanowanie jest uruchamiane bez uprawnień sroot, Nmap domyślnie używa skanowania TCP Connect, które opisuję w kolejnym punkcie.
Skanowanie TCP Connect (-sT)
Ten typ skanowania jest domyślny w przypadku gdy nie jest możliwa metoda TCP SYN. Podczas stanowania TCP Connect Nmap nie wysyła pakietów raw, tylko prosi system o nawiązanie połączenia z badanym hostem za pomocą wywołania funkcji systemowej connect(). Niestety ta metoda jest dużo mniej efektywna od skanowania TCP SYN. Wywołanie connect() w przeciwieństwie do TCP SYN jest wysokopoziomowe i otwiera pełne połączenie (3-Way Handshake). W konsekwencji Nmap musi wysłać więcej pakietów, żeby uzyskać te same informacje. Ponadto zapytania mogą zostać zapisane w logach badanego systemu.
Jeśli badane urządzenie odpowie flagą SYN/ACK, Nmap kończy procedurę uzgadniania, odsyłając pakiet TCP z ustawioną flagą ACK. Taki port jest oznaczany jako otwarty. Natomiast jeśli badane urządzenie odeśle pakiet z flagą RST, Nmap oznacza port jako zamknięty. W przypadku gdy urządzenie nie odpowiada, oznacza to, że port jest chroniony przez zaporę i dlatego jest uważany za filtrowany.
sudo nmap -sT <IP_celu>Należy wiedzieć, że uzyskane wyniki mogą być zafałszowane. Bardzo łatwo jest skonfigurować zaporę tak, aby odpowiadała pakietem z flagą RST. Przez takie ustawienie Nmap oznaczy port jako zamknięty, pomimo że w rzeczywistości może być otwarty.
Skanowanie UDP (-sU)
W przeciwieństwie do TCP, połączenia UDP są bezstanowe. Oznacza to, że zamiast inicjować połączenie za pomocą 3-Way Handshake, połączenia UDP polegają na wysyłaniu pakietów do portu docelowego bez czekania na odpowiedź. To sprawia, że UDP jest doskonałe dla połączeń, dla których bardziej liczy się szybkość niż jakość (np. połączenia wideo, gry online, itp.). Niestety brak uzgadniania sprawia, że skanowanie UDP jest znacznie trudniejsze i wolniejsze.
Gdy Nmap otrzyma odpowiedź z badanego portu (jest to dość nietypowe), oznacza go jako otwarty. W przypadku braku odpowiedzi oznacza port jako otwarty|filtrowany. Natomiast jeśli port jest zamknięty powinien odpowiedzieć pakietem ICMP z informacją, że jest niedostępny.
Nmap podczas skanowania UDP standardowo wysyła puste żądania. Jednak w przypadku standardowych portów, które są przypisane do znanych usług, Nmap wysyła specjalnie przygotowane ładunki specyficzne dla danego protokołu. Dzięki temu istnieje większe prawdopodobieństwo, że otrzymane wyniki będą dokładniejsze.
Z tego właśnie powodu warto na początek ograniczyć skanowanie do najczęściej używanych portów:
nmap -sU -F <IP_celu>Metody skanowania, które są przedstawione w kolejnych punktach są mniej popularne, jednak warto je znać, ponieważ te typy skanowania są jeszcze bardziej dyskretne niż skanowanie TCP SYN. Bardzo często nie generują odpowiedzi, co utrudnia ich wykrycie przez systemy IDS/IPS.
Skanowanie NULL (-sN)
Podczas skanowania NULL Nmap wysyła pakiet bez żadnej flagi. Taki pakiet, gdy dotrze do otwartego portu nie wywoła żadnej odpowiedzi. Tak więc, jeśli Nmap wyśle taki pakiet i nie otrzyma żadnej odpowiedzi, oznacza badany port jako otwarty lub jako blokowany przez zaporę sieciową.
nmap -sN IP_CELU
Jeśli badany cel odpowie pakietem z flagą RST, oznacza to, że dany port jest zamknięty.

Skanowanie NULL opiera się na braku odpowiedzi przez badany cel. Niestety Nmap nie może wtedy dokładnie określić, czy port jest otwarty czy chroniony przez zaporę sieciową (filtrowany).
Poniżej znajduje się przykład skanowania NULL. Ponieważ ta metoda skanowania opiera się na braku odpowiedzi, Nmap nie był w stanie określić czy port jest filtrowany czy otwarty. Na poniższym zrzucie widać, że 8 portów zostało oznaczonych jako otwarty|filtrowany.

Skanowanie FIN (-sF)
Podczas tego typu skanowania Nmap wysyła pakiet TCP, w którym ustawiona jest jedynie flaga FIN (bez innych flag). Podobnie jak w przypadku skanowania NULL, w przypadku braku odpowiedzi, Nmap nie może określić, czy port jest otwarty, czy filtrowany przez zaporę sieciową.
nmap -sF IP_CELUPoniżej znajduje się przykładowe skanowanie FIN. Wyniki są bardzo podobne jak w przypadku skanowania NULL. Tu również Nmap nie był w stanie rozróżnić czy port jest otwarty czy filtrowany, dlatego oznaczył porty jako otwarty|filtrowany. Jednak w skanowaniu FIN Nmap znalazł o jeden port więcej niż w przypadku skanowania NULL. Warto zaznaczyć, że badany był ten sam adres IP.


W przypadku gdy badany cel odpowie pakietem z flagą RST, oznacza to, że port jest zamknięty.

Należy jednak zdawać sobie sprawę z tego, że niektóre zapory sieciowe mogą być ustawione tak, że odrzucają ruch bez wysyłania pakietu z flagą RST.
Skanowanie Xmas
Podczas skanowania Xmas Nmap wysyła pakiet z ustawionymi flagami FIN, PSH oraz URG. Podobnie jak w przypadku skanowania NULL i FIN, jeśli odebrany zostanie pakiet RST, oznacza to, że port jest zamknięty. W przeciwnym razie port jest oznaczany jako otwarty lub filtrowany.
Skanowanie Xmas jest skuteczne głównie w przypadku zapór bezstanowych. Bezstanowe zapory nie analizują pełnej zawartości pakietów, a jedynie sprawdzają, czy pakiety spełniają ogólne reguły. Dzięki temu, że pakiet Xmas zawiera dodatkowe flagi PSH i URG, może przejść przez zapory, które nie sprawdzają dokładnie tych flag. Nmap wykorzystuje ten mechanizm, aby obejść zaporę, która nie analizuje szczegółowo ustawienia flag w pakietach.
Z kolei w przypadku zapór stanowych, które analizują stan połączenia i kontekst wcześniejszych pakietów, skanowanie Xmas jest zazwyczaj nieskuteczne. Zapora stanowa może wykryć nietypowe ustawienie flag i skutecznie zablokować taki pakiet.
nmap -sX IP_CELU

Na poniższym zrzucie znajduje się wynik przykładowego skanowania Xmas. Rezultat jest podobny jak w przypadku skanowania FIN.

TCP ACK (-sA)
Podczas tej metody skanowania Nmap wysyła pakiet z flagą ACK. Badany cel, niezależnie od tego, czy port jest otwarty, czy zamknięty, odpowiada pakietem z flagą RST. Dzieje się tak, ponieważ pakiet z flagą ACK powinien być wysyłany w odpowiedzi na wcześniej odebrany pakiet TCP, aby potwierdzić jego odbiór. Z tego powodu ten typ skanowania nie pozwala ustalić, czy port jest otwarty, ponieważ zarówno porty otwarte, jak i zamknięte mogą odpowiedzieć pakietem RST. Metoda ta jest jednak użyteczna w celu wykrywania zapór sieciowych oraz sprawdzania, czy dany port jest filtrowany.
nmap -sA IP_CELU
TCP Maimon Scan (-sM)
Uriel Maimon po raz pierwszy opisał ten typ skanowania w 1996 r. W metodzie tej Nmap wysyła do badanego portu pakiet z flagą FIN i ACK. Wyczekiwana jest odpowiedź z flagą RST. Wtedy wiadomo, że port jest zamknięty. W przypadku braku odpowiedzi port jest oznaczany jako otwarty lub filtrowany. Niestety w nowoczesnych sieciach ten typ skanowania nie zadziała. Także należy to traktować bardziej jako ciekawostkę 🙂
nmap -sM IP_CELUIdle Scan
Idle scan to zaawansowana technika skanowania w Nmap, która pozwala na przeprowadzenie skanowania portów bez ujawniania prawdziwego adresu IP atakującego. Jest to metoda całkowicie pasywna, ponieważ wykorzystuje tzw. host zombie do wykonania skanowania. Poniżej znajdziesz opis działania tej metody skanowania.
W pierwszej kolejności atakujący wybiera host w sieci, który ma przewidywalną sekwencję identyfikatorów IP. Najlepiej, jeśli jest to host nieaktywny (stąd nazwa „idle” – bezczynny). Następnie wysyła pakiet SYN/ACK do hosta zombie i przechwytuje zwrócony numer IP ID:

Następnie atakujący podmienia adres źródłowy pakietu na adres IP hosta zombie i wysyła pakiety SYN do celu:

Cel odpowiada w zależności od stanu portu:
- Jeśli port jest otwarty, host zombie otrzyma pakiet SYN/ACK, na który odpowie pakietem RST.
- Jeśli port jest zamknięty, host zombie nic nie otrzyma.
Atakujący ponownie odczytuje IP ID hosta zombie. Jeśli numer wzrósł o więcej niż jeden, oznacza to, że host zombie wysłał dodatkowy pakiet RST, co wskazuje, że port był otwarty:

Podsumowanie
Nmap to potężne narzędzie, które pozwala na analizę sieci i wykrywanie otwartych portów. Dzięki różnym technikom skanowania możemy uzyskać cenne informacje o dostępnych usługach i zabezpieczeniach danej maszyny. Warto jednak pamiętać, że wyniki skanowania mogą być zafałszowane przez firewalle i inne mechanizmy obronne. Nmap jest nieocenionym narzędziem zarówno dla administratorów systemów, jak i specjalistów ds. bezpieczeństwa, ale jego skuteczność w dużej mierze zależy od naszej wiedzy, a także umiejętności interpretacji wyników.

