Chyba każdy admin zna to narzędzie (dla tych którzy nie znają – chyba najlepszy skaner portów), ale niewiele osób wgryzało się w nie trochę bardziej. Właściwie nazywanie go skanerem portów omija sporo prawdy, oreślenie z mana “Network exploration tool and security / port scanner” jest dużo bardziej trafne. Ale do rzeczy. O ile zalecam każdemu poważnemu adminowi przeczytanie mana od deski do deski (można nauczyć się sporo nt. zasadzy działania różnych typów skanów oraz metod omijania IDS) to zdaje sobie sprawę że większośc opcji jest raczej rzadko używana lub słabo rozumiana. Stąd ten tutorial ;]. Bazuję na wersji >=5.0 i radzę zrobić upgrade (jest w Debianie Stable)

Podstawowe typy skanów

TCP Syn scan (-sS) – domyślny typ skanu gdy nmap lata z roota. Wyślij SYN, czekaj na SYN/ACK. W tym typie skanu aplikacja nie “widzi” przychodzącego połaczenia, połączenie jest zostawiane w stanie half-open ponieważ cel nie dostaje finalnego ACK,

TCP Connect scan (-sT) – domyślny (właściwie jedyny możliwy skan portów) gdy nmap odpalony jest ze zwykłego userka. Po prostu zwykłe połączenie się do docelowych portów

UDP Scan (-sU) – Jak sama nazwa wskazuje.  Z razji natury UDP (domyślnie nie odpowiada niczym na pakiet jeżeli port jest otwarty) nie rozróżnia między portami otwartymi i filtrowanymi (bo w obu przypadkach nie dostaje pakietu zwrotnego)

-sN; -sF; -sX – Te typy skanów polegają na nietypowym odpowiadaniu stosu sieciowego na “nieprawidłowe” (odpowiednio: puste, FIN i FIN/PSH/URG) kombinacje flag. Generalnie rzadko używane, chyba że przy unikaniu IDSów, ale większość będzie miała regułki na nie. Nie potrafią też wykryć czy port jest open czy filtered.

-sA -sW – Używane głównie do mapowania reguł firewalla. Osobiście jeszcze nie zdarzyło mi się ich użyć, ale warto wiedziec o ich istnieniu

-sP – Nie skanuj, puść tylko pingi i zwróć czy hosty żyją

IP protocol scan(-sO) – Skanuje dostępne protokoły IP, używałem może z 2 razy żeby sprawdzić czy IPSec przechodzi, chociaż zwykle zwraca wszystkie jako open|filtered (polega na ICMP a nadgorliwi admini często blokują wszystkie typy ICMP na firewallu)

Pominąłem parę (tak, jest więcej, można też definiować swoje własne) ale i tak większość z nich (oprócz skanu UDP ) ma bardzo wąskie zastosowanie.

Przydatne funkcje

Podczas skanu v/V zwiększa/zmniejsza verbosity, d/D debugging p/P pokazuje wysyłane/odbierane pakiety,? pokazuje helpa a każdy inny (oprócz  C-c) pokazuje postęp skanowania

-A – Detekcja OS/usług/traceroute  – Robi skan portu, detekcję usług, traceroute, po prostu “powiedz mi wszystko o tym hoście”. O składni za chwilę

-PN (w starszych wersjach -P0) – Nie pinguj hosta. Domyślnie nmap sprawdza czy host żyje przez ping ICMP + ping TCP na port 80 +443, gdy wiesz że ten host nie odpowiada na pingi (np. ma wystawione tylko SSH i SMTP).

-T4 – Prędkość skanowania 0-5. 3 to wartość domyślna, mniej jak chcesz wolniejszy skan (z tym że 2 to już dużo wolniej), więcej jak chcesz szybciej. W LANie zalecam **4 **jak skanujesz dużo hostów (domyślny jest raczej szybki), 5 to jednak przesada, można dostać złe wyniki jak jakiś host zalagował lub jest za paroma hopami. Nie radziłbym dawać wyższej do skanowania czegoś w WAN, RTT może ugryźć ;].

-e ip1,ip2,ip3... – wysyła jednocześnie z Twoim skanem pakiety ze “spoofowanym” IP, można testować IDS albo udawać skan od konkurencji ;]

-n – nie resolwuj DNS. Dobre jak NS jest spsuty/niedostępny

Analiza wyniku skanu

Weźmy na warsztat przykładowy skan (ip i nazwa hosta odrobine zmieniona, wyciąłem też trochę spamu):

$ sudo nmap -A -p1-65535 axxxx.rev.netart.pl
Interesting ports on axxxx.rev.netart.pl (81.8.18.38):
Not shown: 65504 filtered ports
PORT     STATE  SERVICE         VERSION
21/tcp   open   ftp             ProFTPD 1.2.10
23/tcp   open   telnet          Linux telnetd
80/tcp   open   http            Apache httpd 2
|  robots.txt: has 14 disallowed entries
|  /administrator/ /cache/ /components/ /images/
|  /includes/ /installation/ /language/ /libraries/ /media/
|_ /modules/ /plugins/ /templates/ /tmp/ /xmlrpc/
|_ html-title: blaargs.pl - Bezpiecze\xC5\x84stwo Audyt IT < IT Unsecurity >
81/tcp   open   http            Apache httpd 2
|  robots.txt: has 14 disallowed entries
|  /administrator/ /cache/ /components/ /images/
|  /includes/ /installation/ /language/ /libraries/ /media/
|_ /modules/ /plugins/ /templates/ /tmp/ /xmlrpc/
|_ html-title: blaargs.pl - Bezpiecze\xC5\x84stwo Audyt IT < IT Unsecurity >
82/tcp   closed xfer
84/tcp   closed ctf
110/tcp  open   pop3            Courier pop3d
|_ pop3-capabilities: USER IMPLEMENTATION(Courier Mail Server) UIDL PIPELINING LOGIN-DELAY(10) TOP
113/tcp  closed auth
443/tcp  closed https
465/tcp  open   ssl/smtp
|_ sslv2: server still supports SSLv2
|_ smtp-commands: EHLO gmedia.serwery.pl, ENHANCEDSTATUSCODES, AUTH LOGIN PLAIN, AUTH=LOGIN PLAIN, PIPELINING, 8BITMIME, SIZE 104857600
587/tcp  open   smtp
|_ smtp-commands: EHLO gmedia.serwery.pl, ENHANCEDSTATUSCODES, AUTH LOGIN PLAIN, AUTH=LOGIN PLAIN, STARTTLS, PIPELINING, 8BITMIME, SIZE 104857600
995/tcp  open   ssl/pop3        Courier pop3d
|_ sslv2: server still supports SSLv2
|_ pop3-capabilities: USER IMPLEMENTATION(Courier Mail Server) UIDL PIPELINING LOGIN-DELAY(10) TOP
3305/tcp open   mysql           MySQL 5.0.85-log
|  mysql-info: Protocol: 10
|  Version: 5.0.85-log
|  Thread ID: 3129957
|  Some Capabilities: Connect with DB, Compress, Transactions, Secure Connection
|  Status: Autocommit
|_ Salt: v,qx(Yh!f`1pauJO-5`g
3306/tcp open   mysql           MySQL 5.0.85-log
|  mysql-info: Protocol: 10
|  Version: 5.0.85-log
|  Thread ID: 3129935
|  Some Capabilities: Connect with DB, Compress, Transactions, Secure Connection
|  Status: Autocommit
|_ Salt: $Emu'\|zpDCa>Q^e`3y+
5432/tcp open   postgresql      PostgreSQL DB
5433/tcp open   postgresql      PostgreSQL DB
8080/tcp open   ssl/http        Apache httpd 2
|_ html-title: Net.admin - Logowanie do systemu
8081/tcp closed blackice-icecap
8082/tcp closed blackice-alerts
8083/tcp closed unknown
8090/tcp closed unknown
2 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at http://www.insecure.org/cgi-bin/servicefp-submit.cgi :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port465-TCP:V=5.00%T=SSL%I=7%D=2/12%Time=4B759310%P=x86_64-unknown-linux-gnu%r(NULL,1D,"220\x20gmedia\.serwery\.pl\x20ESMTP\r\n")%r(Hello,45,"220\
SF:x20gmedia\.serwery\.pl\x20ESMTP\r\n501\x205\.0\.0\x20EHLO\x20requires\x
SF:20domain\x20address\r\n")%r(Help,3D,"220\x20gmedia\.serwery\.pl\x20ESMT
SF:P\r\n502\x205\.3\.0\x20HELP\x20not\x20implemented\r\n");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port587-TCP:V=5.00%I=7%D=2/12%Time=4B7592F5%P=x86_64-unknown-linux-gnu%
SF:r(NULL,1D,"220\x20gmedia\.serwery\.pl\x20ESMTP\r\n")%r(GenericLines,65,
SF:"220\x20gmedia\.serwery\.pl\x20ESMTP\r\n500\x205\.5\.1\x20Command\x20un
SF:recognized:\x20\"\"\r\n500\x205\.5\.1\x20Command\x20unrecognized:\x20\"
SF:\"\r\n")%r(Hello,45,"220\x20gmedia\.serwery\.pl\x20ESMTP\r\n501\x205\.0
SF:\.0\x20EHLO\x20requires\x20domain\x20address\r\n")%r(Help,3D,"220\x20gm
SF:edia\.serwery\.pl\x20ESMTP\r\n502\x205\.3\.0\x20HELP\x20not\x20implemen
SF:ted\r\n");
Aggressive OS guesses: DD-WRT v23 (Linux 2.4.36) (93%), Linux 2.6.18 (OSSIM) (93%), Linux 2.6.24 (88%), HP Brocade 4100 switch; or Actiontec MI-424-WR, Linksys WRVS4400N, or Netgear WNR834B wireless broadband router (87%), Google Mini search appliance (87%), HP Brocade 4Gb SAN switch (87%), Linksys WRT300N wireless broadband router (87%), DD-WRT v23 (Linux 2.4.34) (87%), Linux 2.6.15 - 2.6.26 (87%), Linux 2.6.20 (Ubuntu 7.04 server, x86) (87%)
No exact OS matches for host (test conditions non-ideal).
Service Info: OS: Linux

TRACEROUTE (using port 445/tcp)
HOP RTT   ADDRESS
1   ... 2 no response
3   27.81 war-ru9.neo2.tpnet.pl (213.25.2.121)
4   71.58 war-r3.tpnet.pl (213.25.5.49)
5   88.81 war-ar3.tpnet.pl (195.205.0.210)
6   68.45 80.50.129.46
7   65.89 do-atman-tpnet.netart.pl (194.153.134.74)
8   32.35 akh238.rev.netart.pl (85.128.138.238)

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1394.22 seconds

Co nam to mówi ? Zacznę od początku:

Interesting ports on axxxx.rev.netart.pl (81.8.18.38):
Not shown: 65504 filtered ports

Porty przeskanowane ale nie pokazane tutaj są filtered – tzn. między nami a serwerem jest firewall który odcina TCP RST i/lub ICMP

PORT     STATE  SERVICE         VERSION
21/tcp   open   ftp             ProFTPD 1.2.10
23/tcp   open   telnet          Linux telnetd
...

Otwarte porty, co na nich chodzi (na tyle ile detekcją mogła ustalić). Telnet? WTF Thougth it died few years ago… ale cóż ;]

80/tcp   open   http            Apache httpd 2
|  robots.txt: has 14 disallowed entries
|  /administrator/ /cache/ /components/ /images/
|  /includes/ /installation/ /language/ /libraries/ /media/
|_ /modules/ /plugins/ /templates/ /tmp/ /xmlrpc/
|_ html-title: blaargs.pl - Bezpiecze\xC5\x84stwo Audyt IT < IT Unsecurity >
81/tcp   open   http            Apache httpd 2
|  robots.txt: has 14 disallowed entries
|  /administrator/ /cache/ /components/ /images/
|  /includes/ /installation/ /language/ /libraries/ /media/
|_ /modules/ /plugins/ /templates/ /tmp/ /xmlrpc/
|_ html-title: blaargs.pl - Bezpiecze\xC5\x84stwo Audyt IT < IT Unsecurity >

oo tu coś ciekawego – wygląda na to że ktoś albo wystawił to samo na 2ch portach, albo ma jakąś wersję devowską (coś podobnego zdarza się często, np. http://www.logicaltrust.net:81/ ,od razu wiadomo jaką grę lubi admin ;] ). Jedziemy dalej.

82/tcp   closed xfer
84/tcp   closed ctf
110/tcp  open   pop3            Courier pop3d
|_ pop3-capabilities: USER IMPLEMENTATION(Courier Mail Server) UIDL PIPELINING LOGIN-DELAY(10) TOP
113/tcp  closed auth
443/tcp  closed https

Tu widzimy parę zamkniętych portów, gdy oprócz tego reszta portów jest filtorwana oznacza to zwykle tyle że kiedys coś pod tymi portami chodziło a po skończonych testach ktoś zapomniał zamknąć portów na FW. Oraz jak nmap zeskanował co potrafi ten serwer POP3

3306/tcp open   mysql           MySQL 5.0.85-log
|  mysql-info: Protocol: 10
|  Version: 5.0.85-log
|  Thread ID: 3129935
|  Some Capabilities: Connect with DB, Compress, Transactions, Secure Connection
|  Status: Autocommit
|_ Salt: $Emu'\|zpDCa>Q^e`3y+
5432/tcp open   postgresql      PostgreSQL DB
5433/tcp open   postgresql      PostgreSQL DB
8080/tcp open   ssl/http        Apache httpd 2
|_ html-title: Net.admin - Logowanie do systemu

Porty baz danych otwarte na świat, wersja bazy + jakiś webadmin. Ktoś chyba naprawdę nie potrafi używać firewalla….

2 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at http://www.insecure.org/cgi-bin/servicefp-submit.cgi :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port465-TCP:V=5.00%T=SSL%I=7%D=2/12%Time=4B759310%P=x86_64-unknown-linux-gnu%r(NULL,1D,"220\x20gmedia\.serwery\.pl\x20ESMTP\r\n")%r(Hello,45,"220\
SF:x20gmedia\.serwery\.pl\x20ESMTP\r\n501\x205\.0\.0\x20EHLO\x20requires\x
SF:20domain\x20address\r\n")%r(Help,3D,"220\x20gmedia\.serwery\.pl\x20ESMT
SF:P\r\n502\x205\.3\.0\x20HELP\x20not\x20implemented\r\n");
...

To mówi nam mówiąc w skrócie “Nie wiem co to jest, jak wiesz to powiedz nam to dodamy fingerprint do następnej edycji nmapa. Jak widać można sobie wyczytać co serwer odpowiedział i zinterpretować

Aggressive OS guesses: DD-WRT v23 (Linux 2.4.36) (93%), Linux 2.6.18 (OSSIM) (93%), Linux 2.6.24 (88%), HP Brocade 4100 switch; or Actiontec MI-424-WR, Linksys WRVS4400N, or Netgear WNR834B wireless broadband router (87%), Google Mini search appliance (87%), HP Brocade 4Gb SAN switch (87%), Linksys WRT300N wireless broadband router (87%), DD-WRT v23 (Linux 2.4.34) (87%), Linux 2.6.15 - 2.6.26 (87%), Linux 2.6.20 (Ubuntu 7.04 server, x86) (87%)
No exact OS matches for host (test conditions non-ideal).
Service Info: OS: Linux

Tutaj nmap próbuje zgadnąć na podstawie fingerprintów (ogólnie mówiąc jak dany OS odpowiada na różne pakiety) zgadnąć z czym mamy doczynienia

TRACEROUTE (using port 445/tcp)
HOP RTT   ADDRESS
1   ... 2 no response
3   27.81 war-ru9.neo2.tpnet.pl (213.25.2.121)
4   71.58 war-r3.tpnet.pl (213.25.5.49)
5   88.81 war-ar3.tpnet.pl (195.205.0.210)
6   68.45 80.50.129.46
7   65.89 do-atman-tpnet.netart.pl (194.153.134.74)
8   32.35 akh238.rev.netart.pl (85.128.138.238)

OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1394.22 seconds

A tutaj jak dotarliśmy do hosta i podsumowanie skanu. Widać że skan trochę zajął ale to glatego że dałem mu jako zakres wszystkie porty (standardowo sprawdza 1000 najpopularniejszych). Jak widać wystarczy “prosty” skan żeby uzyskać sporą ilość informacji nt. celu.

Finish – recepty

nmap -A host – Raczej nie bedziesz potrzebował więcej info niż to zwróci ;]. Obowiązkowa rzecz w przypadku gdy dostaje nowy serwer do administracji ;].

nmap -sU – UDP, czy porty DNS są otwarte itp.

nmap -p22 -PN 10.0.0.0/16 – znajdź wszystkie hosty z otwartym ssh w sieci 10.0.0.0/255.255.0.0, nie polegaj na pingach

Te trzy komendy ( + nmap bez argumentów) właściwie wystarczą, reszta przydaje się do bardzo specyficznych zastosowań. Nmap ma też wbudowany język skryptowy do robienia testów (jak ktoś chce może sobie napisać brute-force cracker), parę formatów wyjścia (chociażby xml czy csv) i tonę innych opcji, zwykle jest jedną z pierwszych rzeczy jaką instaluje na nowym serwerze ;]. Ma też graficzną nakładkę zwaną zenmap, dostęp do całych możliwości nmapa z poziomu graficznego wyklikacza + ciekawy ficzer rysowania mapki po traceroute tzn. graf pokazujący trasę pakietów do przeskanowanych hostów, można sobie pooglądać czy dane cele dzielą ostatnie hopy i na podstawie tego np. sprawdzić czy stoja w tej samej serwerowni. I to chyba tyle ;]