Jest to jedno z najpopularniejszych narzędzi wykorzystywanych do skanowania sieci. Poza wykrywaniem hostów, również dobrze spisuje się w wykrywaniu popularnych usług oraz systemów operacyjnych na jakich pracują skanowane maszyny. Narzędzie daje nam do wyboru wiele rodzajów skanowania, wybór zależy oczywiście od indywidualnego przypadku, w zależności czy bardziej zależy nam na czasie, czy jednak wolimy nie być “odrzuceni” przez zaporę. Dla miłośników okienek istnieje graficzna wersja Nmapa - Zenmap. Jeśli interesuje nas skanowanie większej sieci, a sam proces skanowania możemy uruchomić na kilku hostach jednocześnie to przydatny może okazać się tutaj dnmap.

Nmapa możemy znaleźć na Kali Linux, jeśli jednak korzystamy z innego systemu operacyjnego (inna dystrybucja Linuxa, Mac OS, Windows) to nic nie stoi na przeszkodzie, aby i tu zainstalować to narzędzie. Dokładne instrukcje jak przeprowadzić ten proces znajdziemy na oficjalnej stronie narzędzia.

Należy pamiętać, że skanowanie urządzeń w sieci, bez zgody właściciela jest niezgodne z prawem. Do nauki najlepiej korzystać z lokalnego środowiska lub stron, które pozwalają na skanowanie, czasem po spełnieniu pewnych warunków np. scanme.nmap.org.

Wykrywanie hostów w sieci

Podstawowe użycie Nmapa wymaga od nas podania jedynie adresu, np.

nmap 192.168.10.10
simple nmap command

Tutaj Nmap wykonuje skanowanie hostów, połączone z wykrywaniem dostępnych usług. Gdy chcemy ograniczyć się tylko do wykrycia aktywnych hostów, wystarczy przełącznik -sn.

simple nmap command

Istnieje też tzw. agressive mode. W tym trybie wykrywane są hosty, porty, usługi i systemy operacyjne. Dodatkowo uruchamianych jest kilka skryptów Nmapa, należących do kategorii default.

nmap -A 192.168.10.10

Sposób wskazywania adresów

Listę adresów do przeskanowania możemy podać na kilka sposobów:

  • nmap 192.168.10.10 192.168.10.11
  • nmap 192.168.10.1-10
  • nmap 192.168.10.0/24
  • nmap scanme.nmap.org
  • nmap -iL scan-ip.txt

Ponad to możemy również wykluczyć pewne adresy (np gdy skanujemy całą podsieć):

  • nmap 192.168.10.0/24 --exclude 192.168.10.5
  • nmap 192.168.10.0/24 --excludefile excluded-ip.txt

Techniki wykrywania hostów

Domyślnie Nmap w celu zwiększenia skuteczności, korzysta z kilku metod skanowania hostów. Oczywiście my sami również możemy sprecyzować z jakich metod chcemy skorzystać. Oto najpopularniejsze z nich:

  • ICMP, -PE

    Metoda bazuje na wysłaniu komunikatów ICMP Echo Request, powszechnie wykorzystywanych podczas diagnostyki sieci np. w poleceniu ping. Host, który otrzyma takie żądanie, musi na nie odpowiedzieć. W niektórych sieciach ze względów bezpieczeństwa te komunikaty mogą być zablokowane.

    Protokół ICMP jest stosowany głównie w celach kontrolnych. Odpowiednie komunikaty ICMP są wysyłane gdy TTL pakietu osiągnie 0 i pakiet musi zostać porzucony przez router. Protokół jest również wykorzystywany przez polecenie tracert/traceroute służące do uzyskania informacji, adresów IP urządzeń na trasie pakietu między hostami.

    icmp

    Ósmy przechwycony pakiet jest odpowiedzią hosta na nasz wysłany pakiet ICMP Echo Request (pakiet 7), uzyskana odpowiedź wskazuje na nam, że dany host jest aktywny.

  • ARP, -PR

    Ten sposób opiera się na wysyłaniu komunikatów ARP Request, służących do ustalenia MAC urządzenia o podanym w zapytaniu adresie IP. Nmap domyślnie wykorzystuje to rozwiązanie, ze względu na fakt, że jest najszybszą i najbardziej skuteczną metodą wykrywania hostów w sieciach lokalnych. Jeśli na nasze zapytanie ARP otrzymamy odpowiedź to znaczy, że w sieci istnieje host o danym adresie IP. ARP może być użyty jedynie do skanowania sieci lokalnych, gdzie jest używany. Działanie tego protokołu jest niezbędne do zapewnienia poprawnej komunikacji w sieci lokalnej.

    arp

    W sieciach lokalnych do wykrywania aktywnych hostów domyślnie jest wykorzystywany protokół ARP, dlatego użycie przełącznika -PR jest praktycznie zbędne. 51 przechwycony pakiet w Wiresharku jest odpowiedzią na rozgłoszenie ARP, które zawiera pakiet numer 50.

  • TCP, -PS, -PA

    Tutaj korzystamy z procesu uzgadniania trójetapowego (3-way handshake), które ma miejsce podczas nawiązywania połączenia między hostami, wykorzystując połączeniowy protokół TCP.

    Przełącznik -PS wysyła pakiet TCP z flagą SYN na wskazany port, domyślnie jest to port 80. Jeśli jakaś usługa nasłuchuje na danym porcie to odpowie nam flagami SYN/ACK, czasami jeśli port nie może odebrać połączenia odpowie nam flagą RST. Każda odpowiedź od hosta wskazuje nam, że jest on aktywny. Metoda sprawdza się dobrze gdy próbujemy skanować pod kątem serwerów udostępniających wybrane usługi. Jednak niekoniecznie dobrze działa podczas wykrywania hostów, które nie świadczą żadnych usług w sieci, w takim przypadku możemy nawet nie uzyskać odpowiedzi w postaci flagi RST.

    ps

    Na załączonym zrzucie ekranu można zaobserwować odpowiedź serwera(pakiet 14) na wysłany jako odpowiedź na próbę nawiązania połączenia(pakiet 12), która następnie jest zrywana, flagą RST(pakiet 15).

    Dla przełączników PS, PA, PU można wskazywać listę portów. Przykładowo użycie przełącznika -PS20-23,53,80,443 skutkuje wysłaniem pakietu TCP z flagą SYN, na porty 20,21, 22, 23, 53, 80, 443.

    Wykorzystanie przełącznika -PA, powoduje wysłanie pakietu TCP z flagą ACK, która normalnie jest odpowiedzią na flagę SYN-ACK. Tutaj pojawia się małe oszustwo z naszej strony, ponieważ nigdy nie inicjowaliśmy połączenia TCP. Skanowany host otrzymując potwierdzenie nawiązania połączenia z innym hostem, z którym nie nawiązywał wcześniej sesji, zazwyczaj przerywa/zrywa takie połączenie flagą resetu - RST.

  • UDP, -PU

    Ta metoda polega na wysłaniu pakietu UDP na dany port. Ze względu na fakt, że UDP jest protokołem bezpołączeniowym, to o braku dostępności danego portu poinformuje nas inny protokół - ICMP, a dokładnie ICMP Destination Unreachable.

    simple nmap command

    Jak można zauważyć, po próbie nawiązania połączenia, odpowiedzią jest pakiet ICMP Destination Unreachable, który informuje nadawcę, że dany port jest nieosiągalny lub najprawdopodobniej żadna aplikacja na nim nie nasłuchuje i jest on zamknięty.

Jeśli chcemy przeanalizować w jaki sposób działają poszczególne techniki warto skorzystać z Wiresharka, popularnego sniffera, który pozwala nam na przechwytywanie i późniejsze analizowanie pakietów.

Jeśli taką obserwację chcemy przeprowadzić w ramach sieci lokalnej to musimy pamiętać o dodaniu przełącznika --disable-arp-ping. Dzieje się tak dlatego, że zazwyczaj wysyłanie zapytań ARP jest najszybszą i najskuteczniejszą metodą wykrywania hostów w sieciach lokalnych. W ramach sieci lokalnej Nmap domyślnie pomija inne opcje, które nie są aż tak skuteczne. Wskazany wyżej przełącznik wymusza mimo wszystko wykorzystanie innej metody wykrywania hostów. Często i tak sprowadza się to do wysłania zapytania ARP w celu uzyskania adresu MAC urządzenia o danym adresie IP, a później wysłania przykładowo TCP SYN, w przypadku użycia przełącznika -PS. Jednak jeśli ktoś woli przeprowadzać analizę pakietów w ramach sieci lokalnej to nic nie stoi na przeszkodzie, aby mimo wszystko ją przeprowadzić.

Bez wyraźnego wskazania, z jakich metod wykrywania hostów chcemy skorzystać nmap, dla hostów zdalnych domyślnie wyśle ICMP Echo Request (5), TCP SYN na port 443 (6), TCP ACK na port 80 (7) i ICMP Timestamp (8), który nie został omówiony.

normal-host-scan

Wiadomo, że numer portu źródłowego pakietu, generowanego przez Nmapa wybierany jest losowo z zakresu portów należących do grupy dynamic/private. Może się zdarzyć sytuacja, że ruch pochodzący od tego typu pakietów będzie filtrowany przez firewalla. Z pomocą może przyjść nam tutaj przełącznik --source-port, który zmienia numer portu źródłowego na ten wskazany przez nas. Dobrym pomysłem może być tutaj użycie portu 53, na którym powszechnie uruchomiona jest usługa DNS.

Jeśli chcemy podnieść naszą skuteczność w wykrywaniu hostów, dobrym rozwiązaniem jest połączenie kilku metod. Dosyć stary przegląd strategii wykrywania hostów możemy znaleźć w dokumentacji narzędzia.

Więcej o wykrywaniu hostów.


Wykrywanie otwartych portów i usług

Wykrywanie otwartych portów to nic innego jak sprawdzanie w jakim stanie znajdują się poszczególne porty. Nmap wyróżnia 6 stanów, do których przyporządkowuje porty w zależności od wykorzystanej techniki i otrzymanej odpowiedzi. Najpopularniejsze stany:

  • open - port akceptuje datagramy UDP lub połączenia TCP, np. kontynuuje rozpoczęty 3-way handshake. Wskazuje również, że na tym porcie nasłuchuje jakaś usługa.
  • closed - port odpowiada na pakiety, jednak żadna aplikacja nie nasłuchuje na tym porcie
  • filtered - narzędzie nie jest w stanie określić czy port jest otwarty. Zazwyczaj jest to spowodowane fitrowaniem ruchu na poziomie firewalla

Wyróżniamy jeszcze stany takie jak:

  • unfiltered
  • open|filtered
  • closed|filtered

W przypadku otrzymania 3 powyższych stanów, zaleca się wykonać ponowny skan wykorzystujący inną metodę wykrywania otwartych portów, w celu uzyskania lepszych rezultatów. Podrzucam link do ciekawego artykułu opisującego stany portów.

Do określenia stanu portu Nmap wykorzystuje rozmaite techniki, których dokładniejszy opis mógłby być tematem osobnego artykułu. Ograniczę się do wymienienia i krótkiego opisu kilku z nich:

  • TCP SYN, -sS - polega na wysłaniu pakietu TCP z ustawioną flagą SYN, na podstawie odpowiedzi serwera narzędzie przypisuje odpowiedni stan dla testowanego portu.

  • TCP ACK, -sA - wysyłamy pakiet TCP z flagą ACK, podobnie jak w przypadku przełącznika -PA. Ta metoda może służyć do określenia typu firewalla, który może znajdować się w sieci. Zazwyczaj na firewallu blokowana jest możliwość nawiązywania połączeń rozpoczynanych przez hosty pochodzące z Internetu (czyli przychodzących pakietów TCP SYN). Problem zaczyna się gdy, do naszej sieci przychodzi pakiet TCP z ustawioną flagą ACK. Bezstanowy firewall(stateless firewall) nie ma możliwości ocenienia czy dany pakiet jest częścią nawiązanego wcześniej połączenia czy nie. Sytuacja wygląda inaczej w przypadku stanowego firewallu, który nie będzie miał problemu z określeniem, że przychodzący pakiet nie jest częścią żadnego ustanowionego wcześniej połączenia. Z tego też względu stanowy firewall wykorzystuje do swojej pracy znacznie więcej zasobów.

  • TCP Connect, -sT - metoda polegająca na nawiązaniu zwykłego połączenia, wykonaniu całej procedury 3-way handshake, a następnie zerwaniu nawiązanego połączenia

  • UDP, -sU - wykorzystywane do wykrywania portów, na których aplikacje nasłuchują pakietów UDP. Ta metoda skanowania jest znacznie dłuższa niż skanowanie pod kątem portów TCP.

Domyślnie narzędzie skanuje 1000 najpopularniejszych portów. Możemy również jawnie wskazać, które porty trzeba przeskanować za pomocą przełącznika -p.

  • -p 22 - pojedynczy port
  • -p 20-22 - zakres portów
  • -p 22,23,80
  • -p 20-25,80
  • -p- - wszystkie porty
port scan

Gdy Nmap określi, że dany port jest otwarty, podejmuje próbę “zgadnięcia” nazwy danej usługi, porównując ją z portem. Odwzorowanie port-usługa znajduje się w pliku /usr/share/nmap/nmap-services. Możemy pójść krok dalej i spróbować określić wersję danej usługi. W tym przypadku Nmap porównuje pewne uzyskane dane np. banner(sposób przedstawiania się usługi) z próbkami w pliku /usr/share/nmap/services-probes. Za pomocą przełącznika -sV narzędzie próbuje jeszcze wykryć wersję usługi.

nmap -sV 192.168.10.10
normal-host-scan

Wykrywanie systemu operacyjnego

Kolejna ciekawą i wartą poznania funkcją w Nmapie jest OS fingerprinting. Zadanie to polega wykryciu wersji lub rodzaju systemu operacyjnego. W określeniu systemu pomagają różnice między implementacjami protokołów, które często wynikają z niejasności opisujących je dokumentów RFC. Nmap do wykrycia tych różnic wysyła specjalnie przygotowane próbki TCP, UDP i ICMP.

Skuteczność OS fingerprinting daje znacznie lepsze rezultaty, gdy Nmap znajdzie chociaż jeden otwarty i zamknięty port.

Najbardziej widoczne różnice w implementacji stosu TCP/IP to rozmiar ramki i domyślna wartość TTL.

Nic nie stoi na przeszkodzie, aby samemu napisać krótki skrypt, który w podstawowy sposób “zgaduje” wersję systemu analizując wartość TTL w sieci lokalnej. Dla przykładu poniżej skrypt w pythonie, opierający się na wartości pola TTL.

import pyping
import sys

print "Pinging " + sys.argv[1]
res = pyping.ping(sys.argv[1], udp=True)
res = res.output[1]

print res
ttl = res.split()[-3]
ttl = ttl.split('=')[-1]

if ttl == '128':
	print "System: Windows"
elif ttl == '64':
	print "System: Linux / Unix"
elif ttl == '254':
	print "System: Solaris / AIX" 
else:
	print "Unknown OS"

Należy pamiętać, że część wartości można zmienić w systemie, więc nigdy nie powinniśmy być pewni uzyskanego wyniku. To tylko podstawowe wykrywanie systemu - bardziej szczegółowe wartości TTL dla systemów można znaleźć tutaj. Sam Nmap opiera się na wielu dodatkowych parametrach - pełną informację o nich możecie znaleźć w dokumentacji nmapa. Do uruchomienia Nmapa w trybie skanowania z próbą wykrycia systemu operacyjnego wystarczy poniższe polecenie.

nmap -O 192.168.10.10
normal-host-scan

Porównując ten screen do poprzedniego pojawiają się nam następujące pola:

  • Device type - na podstawie zebranych odcisków urządzenie jest przyporządkowane do odpowiednich grup tj. router, printer, general purpose.
  • Running - jeśli jest możliwe to tutaj podawana jest rodzina i wersje systemów operacyjnych. Prezentowane tutaj wartości są predefiniowane
  • OS CPE - przedstawienie wykrytej wersji OS w formacie CPE(Common Platform Enumeration), czyli ustrukturyzowanym sposobie nazywania oprogramowania
  • OS details - w tym miejscu znajdują się najważniejsze informacje, w których można odnaleźć dodatkowe określenia modelu urządzenia i wykorzystywanej architektury, lecz nie znajdują się w nich żadne predefiniowane wartości.
  • Network Distance - liczba przeskoków, które trzeba wykonać, aby osiągnąć skanowane urządzenie. Podobne rezultaty zwróci polecenie traceroute/tracert. 1 przeskok oznacza że urządzenie znajduje się w sieci lokalnej, co można było też zaobserwować po adresie IP należącym do grupy prywatnych. 0 przeskoków oznacza, że skanujemy sami siebie. To pole nie jest zawsze dostępne.

Ze względu na wysyłanie przygotowanych próbek, Nmap jest klasyfikowany jako active OS fingerprinting. Istnieją także programy, które starają się wykryć wersję OS bez generowania pakietów, przechwytują i analizują pakiety, których źródłem lub celem jest wybrany host. Takie programy zaliczamy do passive OS fingerprinting, przykładem takiego narzędzia jest p0f.


Zapisywanie wyników

Najpopularniejsze formaty zapisu wyników działania programu:

  • plik tekstowy -oN

    normal-save

  • xml -oX - może być konwertowany do raportu HTML, ten typ zapisu może ułatwić możliwość zapisów wyników do bazy danych. Ze względu na popularność i strukturę, może być łatwo parsowany i przetwarzany przez skrypty i programy.

    xml-save

  • grepable -oG - format przyjazny do szybkiego manipulowania wynikami za pomocą narzędzi takich jak grep i awk.

    grepable-save

Zapisywanie rezultatów swojej pracy jest bardzo ważne, pozwala nie tylko przeglądać wyniki skanowania sieci, ale również umożliwia wznowienie przerwanej pracy, za pomocą przełącznika --resume. Od Nmapa 7.40 jest to również dostępne dla formatu XML.


Szybkość pracy

W zależności od celu i typu skanowanej sieci Nmap wyróżnia 6 trybów intensywności pracy, zwanymi również szablonami skanowania. Tryby określane są za pomocą przełączników od -T0 do -T5, -T3 jest to domyślna intensywność skanowania. Parametry T0 i T1 spowodują również, że skan będzie wykonywany znacznie wolniej niż przy innych opcjach, jednak te opcje mogą być pożądane jeśli chcemy zminimalizować ryzyko wykrycia przez IDS.


NSE - Nmap Scripting Engine

Nmap posiada wbudowany silnik, umożliwiający tworzenie swoich własnych skryptów. Obecnie w Nmap znajduje się prawie 600 skryptów. Istnieje również możliwość pobrania skryptów przygotowanych przez innych użytkowników. Skrypty pozwalają na uzyskanie dodatkowych informacji o usługach, mogą oferować prosty skaner podatności, próbę wykorzystania znalezionych luk, przeprowadzania ataków bruteforce na pewne usługi, czy enumerację DNS.

Poniżej widoczny jest skrypt NSE, który zwróci w odpowiedzi rekord z bazy WHOIS, dotyczący wyszukiwanej domeny.

nmap -sn --script whois-domain nmap.org
script-whois-domain

Do uzyskania informacji o skrypcie wystarczy przełącznik --script-help.

nmap --script-help whois-domain

Skrypty znajdują się w katalogu /usr/share/nmap/scripts.

Podsumowanie

Nmap jest jednym z najpopularniejszych narzędzi do przeprowadzania rekonesansu sieciowego dla pentesterów, jednak z powodzeniem może być również wykorzystywany przez administratorów. Dzięki rozbudowanym możliwościom i opcjom to doskonałe narzędzie nie tylko do wykrywania aktywnych hostów i skanowania portów, ale również do rozpoznawania usług i systemów operacyjnych na skanowanych hostach. Pozwala także na rozpoznawanie usług i systemów operacyjnych na skanowanych hostach. Kolejną jego siłą jest możliwość rozszerzania możliwości poprzez wykorzystywanie rozbudowanych skryptów NSE. Ze względu na ogromne możliwości jakie oferuje Nmap, czas poświęcony na poznawanie tego narzędzia nigdy nie będzie czasem straconym.

Biblioteczka:

https://www.nastykusieci.pl/arp-podstawy/

https://emvi.eu.org/icmp/index3.html

https://sekurak.pl/nmap-i-12-przydatnych-skryptow-nse/

http://securitysynapse.blogspot.com/2013/08/refining-your-nmap-scan-strategy.html

https://www.hackingarticles.in/comprehensive-guide-on-nmap-port-status/

https://nmap.org/book/osdetect-methods.html

https://nmap.org/book/port-scanning-options.html