Zkoumáme síť s Nmapem 23.08.2004, Bobek Vladimír Nástroj Nmap má v povědomí asi každý linuxový administrátor. Na otázku, co je to Nmap většina administrátorů odpoví, že se jedná zřejmě o nejpoužívanější skener portů. Funkcionalita Nmapu je však širší. Je to volně dostupný opensourcový program pro průzkum sítě nebo bezpečnostní audit. Byl navržen tak, aby umožňoval rychle získat informace o rozsáhlých sítích, i když nejčastěji se používá ke skenování jednotlivých počítačů.
Nmap umí pomocí různých druhů IP paketů zjistit, jaké počítače jsou v síti dostupné, jaké služby nabízí, jaké operační systémy na nich běží, typy použitých paketových filtrů a firewallů a mnoho dalších charakteristik. Dnes existuje Nmap na mnoha platformách (samozřejmostí je Linux, ale také BSD systémy, Solaris, MAC OS X a dokonce i MS Windows), má jak konzolovou verzi, tak grafické rozhraní. Nmap má možná trochu neprávem pověst nástroje „zlých hochů" snažících se proniknout do cizích počítačů, přitom je velmi užitečný i při každodenní správě síťových systémů. V tomto článku vám chci přiblížit princip činnosti Nmapu a některé techniky, které používá. Zaměřím se na linuxovou verzi, samozřejmě nebudou chybět praktické příklady pro příkazovou řádku. Text předpokládá alespoň základní znalosti protokolů TCP/IP.
Instalace Přímo na domovských stránkách projektu se nalézají jak zdrojové kódy, tak balíček ve formátu RPM. Nmap je součástí mnoha linuxových distribucí, a nechybí ani v mnou používaném SuSE Linuxu 9.0. Tato distribuce však obsahuje v jádře bug, který zabraňuje korektnímu použití Nmapu pod uživatelem root. Jelikož škála voleb dostupných obyčejnému uživateli je omezená, skončil jsem u kompilace zdrojových kódů vlastními silami. Proces se skládal z klasické trojkombinace ./configure ./make ./make install jen po konfigurační fázi bylo nutno nastavit hodnotu HAVE_IP_IP_SUM v souboru nbase/nbase_config na nulu, čímž bylo chování Nmapu v SL 9 napraveno.
Jak to vlastně funguje Pokud máme Nmap nainstalován, můžeme jej rovnou začít používat. Jediným povinným parametrem je IP adresa zařízení, které má Nmap zkoumat, pomocí přepínačů lze jeho chování mnoha způsoby modifikovat. Činnost Nmapu má obecně 3 fáze. Nejdříve probíhají testy dostupnosti cílového stroje (nebo jejich skupiny). Teprve v případě, že je cílový stroj považován za dostupný, přichází na řadu vlastní skenování portů. V poslední fázi se Nmap snaží uhodnout typ a verzi operačního systému, který je na stroji provozován. Věnujme se jednotlivým fázím blíže.
První fáze - testování dostupnosti Ať už je Nmap spuštěn ve kterémkoli režimu (nejjednodušeji např. nmap 192.168.145.1), testuje nejdříve dostupnost cíle zkoumání, popř. může být explicitně spuštěn přímo s úkolem jen ověřit, že daný stroj běží (např. nmap -sP 192.168.145.1). Během tohoto procesu vysílá na všechny cílové stroje jednak ICMP pakety „Žádost o echo", jednak tzv. TCP ping – paket s nastaveným příznakem ACK pro port 80 na cílovém stroji. Pokud je cílový stroj dosažitelný, má povinnost na zmíněný ICMP paket odpovědět paketem ICMP Echo. Co
se týče TCP pingu, příznak ACK mají normálně nastaveny pakety spojení, které bylo navázáno již dříve, v tomto případě se jedná o první paket komunikace, který není součástí předchozího spojení a předpokládá se tedy, že cílový stroj na TCP ping odpoví TCP paketem s příznakem RST (tj. odmítnutí spojení). Tyto odpovědi signalizují, že cílový uzel dostupný je, ale nemusí to být tak jednoduché. Uzel může být chráněn firewallem, který může být nakonfigurován tak, že žádosti o echo popř. odpovědi na ně blokuje a iniciátor komunikace tak na ně nedostane odpověď, i když dané stroje v síti jsou. Pokud se standardním procesem dostupnost cíle např. díky firewallu na cestě zjistit nepodaří, nemusí být všem dnům konec. Když stavový firewall přijme klasický TCP ping s příznakem ACK, podívá se do stavové tabulky, zda daný paket přísluší k nějakému dříve navázanému spojení. Jakmile zjistí opak, paket zahodí. Nmap však dovoluje TCP ping dále konfigurovat. Například lze nastavit paketu příznak SYN, který signalizuje, že jde o paket navazující spojení: nmap -sP -PS 192.168.145.1 popřípadě lze určit cílový port paketu: nmap -sP -PS25 192.168.145.1 paket je v tomto případě směrován na port 25 (standardně SMTP). Snažíme se tak zjistit, zda je stroj dostupný alespoň na některých portech, stále se ale nejedná o sken. Podobně lze změnit pakety typu ICMP: nmap -sP -PP 192.168.145.1 vysílá ICMP paket typu timestamp request, tj. požadavky na časovou synchronizaci a očekává odpověď typu timestamp reply. I když takto nastavené pakety projdou firewallem, může se stát, že odpovědi nepřijdou, protože tyto požadavky nejsou implementovány v cílovém zařízení. Cílový uzel nmapu může být definován rozsahem IP adres, nebo dokonce síťovou adresou a v průběhu činnosti nmapu jsou pak testovány všechny IP adresy dané specifikace: nmap -sP 192.168.145.0/24 Starting nmap 3.55 ( http://www.insecure.org/nmap/ ) at 2004-08-08 04:29 PDT Host 192.168.145.1 appears to be up. Host 192.168.145.131 appears to be up. Nmap run completed -- 256 IP addresses (2 hosts up) scanned in 4.252 seconds
Druhá fáze - sken Když už víme, že objekt našeho zájmu je dostupný, jistě bychom rádi věděli jaké služby daný stroj nabízí. Chceme tedy zjistit, na jakých portech stroj naslouchá a je připraven přijmout příchozí spojení. Nmap k tomuto účelu má několik technik, některé z nich si popíšeme v následujících řádcích.
TCP ping Jedná se o základní formu skenu, který se snaží prostřednictvím systémového volání implementovaného vaším operačním systémem otevřít spojení na jakémkoliv portu cílového stroje. Jedná se o techniku popsanou výše u testování dostupnosti. Výhodou je, že sken může provést uživatel bez zvláštních oprávnění. Dalším kladem je rychlost – požadavky lze paralelizovat. Nevýhodou je jednoduchá detekce a filtrace skenů tohoto typu – cílový stroj generuje chybová hlášení pro každou službu, jejíž port je otevřen a se kterým tedy
bylo iniciováno spojení. Syntaxe: nmap -sT 192.168.145.1
TCP SYN Tato technika byla také popsána výše, často nazývána tzv. half-open, protože neotvírá úplné TCP spojení. Odesílán je tedy paket s příznakem SYN. Pokud jako odpověď přijde paket s příznakem SYN/ACK, což znamená otevřený port, spojení je ihned uzavřeno paketem s příznakem RST. Zavřenému portu na cílovém stroji odpovídá paket s příznakem RST. Výhodou je, že tento druh skenu není tak často odhalen. Syntaxe: nmap -sS 192.168.145.1
TCP FIN Tato metoda patří k pokročilejším. Odesílané pakety mají příznak FIN (popřípadě navíc URG a PUSH). Vychází z toho, že podle RFC 793 specifikujícího protokol TCP by měl cílový stroj v případě zavřených portů odpovědět na paket tohoto typu paketem s příznakem RST, zatímco otevřené porty pakety FIN zcela ignorují. Existují však systémy, které tuto specifikaci nedodržují (MS Windows, Cisco, i některé UNIXy) a odpovídají příznakem RST na všech portech. Syntaxe: nmap [-sF|sX|sN] 192.168.145.1
Informativnější sken Nmap nabízí režim, který vám dodá další informace o případných otevřených portech. Po detekci otevřených portů Nmap pokračuje v komunikaci, během níž se snaží odhalit protokol služby, která běží na daném portu, název a verzi programu, který ji na cílovém stroji zajišťuje verzi a případně další údaje. Syntaxe: nmap -sV 192.168.145.0/24 Starting nmap 3.55 ( http://www.insecure.org/nmap/ ) at 2004-08-08 05:20 PDT Interesting ports on 192.168.145.1: (The 1655 ports scanned but not shown below are in state: closed) PORT
STATE SERVICE
VERSION
135/tcp open msrpc Microsoft Windows msrpc 139/tcp open netbios-ssn 445/tcp open microsoft-ds Microsoft Windows XP microsoft-ds 1025/tcp open msrpc Microsoft Windows msrpc 5000/tcp open upnp Microsoft Windows UPnP
Interesting ports on 192.168.145.131: (The 1657 ports scanned but not shown below are in state: closed) PORT
STATE SERVICE VERSION
22/tcp open ssh OpenSSH 3.7.1p2 (protocol 1.99) 111/tcp open rpcbind 2 (rpc #100000) 6000/tcp open X11 (access denied) Nmap run completed -- 256 IP addresses (2 hosts up) scanned in 52.306 seconds
UDP ping Tato technika slouží k detekci služeb založených na protokolu UDP (například RPC). Na každý port odesílá UDP paket o nulové velikosti. Pokud neobdržíme ICMP zprávu, která informuje o nedostupnosti portu, předpokládá se, že port je otevřený. Sken může být velmi pomalý na mnoha systémech, protože podle RFC 1812 by měla být omezena četnost odesílání chybových zpráv ICMP. Specifikaci nedodržují systémy MS Windows, tudíž jejich sken naopak proběhne velmi rychle. Syntaxe: nmap -sU 192.168.145.1
Idle sken Nmap nabízí ještě mnoho dalších typů skenů, z nichž mě nejvíce zaujal právě tzv. idle sken, který vlastně rozšiřuje funkčnost ostatních typů skenů – z nich vychází. Umožňuje totiž určitým způsobem falšovat identitu stroje, ze kterého sken probíhá - podvrhuje zdrojovou IP adresu. Jistě se ptáte, jak tedy dovede Nmap získat příslušné informace, když z pohledu cílového stroje žádný kontakt mezi ním a strojem spouštějícím Nmap není.Princip je následující: Port je považován za otevřený, pokud na něm naslouchá nějaká aplikace (většina síťových služeb naslouchá na TCP portech). Jednou z cest, jak určit, že port je otevřený, je odeslání paketu SYN, na který odpoví cílový stroj v případě otevřeného portu paketem SYN/ACK (potvzení navázání spojení), v případě zavřeného portu paketem RST. Na nevyžádaný paket SYN/ACK odpoví příjemce paketem RST, nevyžádané pakety RST jsou ignorovány. Každý IP paket má tzv. IPID – své identifikační číslo. Mnoho operačních systémů implementuje přidělování tohoto čísla jednoduše tak, že každý následující paket má IPID o 1 vyšší než předchozí. Zdrojový stroj zaměňuje svou identitu za identitu jiného stroje a vypadá to, jako by skenování prováděl tento jiný stroj – pouhý prostředník. Zdrojový stroj dále udržuje postranní kanál mezi sebou a tímto prostředníkem a testuje právě IPID. Pomocí této techniky lze jednat prověřovat, zda mezi prostředníkem a cílovým strojem existuje nějaký jiný vztah než mezi zdrojovým a cílovým strojem – skenování probíhá z perspektivy prostředníka. Dále pokud na cílovém stroji běží IDS, který odhalí skenování, je za jeho původce považován prostředník a případné akce IDS nejsou tedy směrovány vůči skutečnému viníkovi.
Třetí fáze – hádání typu a verze OS Operační systém vzdáleného stroje lze hádat různými způsoby. Nejjednodušší klasickou technikou je navazování spojení se vzdáleným strojem pomocí obyčejných aplikací. Různé síťové služby při připojení k nim často hlásí název a verzi aplikace, která danou službu na vzdáleném stroji implementuje:
ftp 193.51.37.2 Connected to 193.51.37.2 220 FTP server (Version wu-2.4.2-academ[BETA-18](1) Wed Nov 28 19:04:27 GMT 2001) ready. Name (193.51.37.2:xvlad): Těmto zprávám se říká tzv. bannery. Mnoho systémů v implicitním nastavení naivně hlásí identitu svých programů a mnoho administrátorů si nedá tu práci tato hlášení odstranit. Nmap však využívá jinou metodu, tzv. tcp stack fingerprinting. Doslovný překlad by zněl asi otisk tcp zásobníku – v čem to spočívá? Ačkoli existuje standardizovaný návrh protokolů TCP/IP, jednotlivé operační systémy mají tyto protokoly v některých ohledech implementován různě. Nmap si udržuje vlastní databázi otisků různých systémů a ví tedy, jak dané systémy na různé testy reagují. Při provádění těchto testů tedy porovnává získané odpovědi se svou databází a podle toho vydedukuje výsledek. Testuje se například velikost počátečního TCP okna, způsob výpočtu IPID, hodnota pole ACK, a mnohé další parametry TCP komunikace. Implicitně Nmap verzi operačního systému nezjišťuje, k tomu slouží přepínač -O. Příkaz pak může mít například tento tvar: nmap -O -vvv 192.168.145.1 Starting nmap 3.55 ( http://www.insecure.org/nmap/ ) at 2004-08-10 03:13 CEST Host www1.intra-net.cz (192.168.145.1) appears to be up ... good. Initiating SYN Stealth Scan against www1.transmeta.com (63.209.4.201) at 03:13 Adding open port 80/tcp The SYN Stealth Scan took 126 seconds to scan 1660 ports. For OSScan assuming that port 80 is open and port 443 is closed and neither are firewalled Interesting ports on www1.intra-net.cz (192.168.145.1): (The 1658 ports scanned but not shown below are in state: filtered) PORT STATE SERVICE 80/tcp open http 443/tcp closed https Device type: general purpose Running: Linux 2.1.X|2.2.X OS details: Linux 2.1.19 – 2.2.25 OS Fingerprint: Tseq(Class=RI%gcd=1%SI=1B981B%IPID=I%TS=100HZ) T1(Resp=Y%DF=Y%W=7F53%ACK=S++%Flags=AS%Ops=MENNTNW) T2(Resp=N) T3(Resp=N) T4(Resp=N) T5(Resp=Y%DF=N%W=0%ACK=S++%Flags=AR%Ops=) T6(Resp=N) T7(Resp=N)
PU(Resp=Y%DF=N%TOS=0%IPLEN=164%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) Uptime 170.030 days (since Sun Feb 22 01:33:17 2004) TCP Sequence Prediction: Class=random positive increments Difficulty=1808411 (Good luck!) TCP ISN Seq. Numbers: 783855AD 78044726 784DCFB7 78800C72 78FEAF66 78B22D13 IPID Sequence Generation: Incremental Nmap run completed -- 1 IP address (1 host up) scanned in 134.626 seconds
Závěr No a jsme u konce. I já používám Nmap hlavně pro triviální ověření, zda na mých strojích běží všechny služby, které tam běžet mají. Ale jak vidíte, jeho uplatnění může být širší. Doufám, že tento článek pro vás nebyl zbytečným čtením. Až si budete s Nmapem sami hrát, berte si na mušku radši jen stroje, které máte pod správou. Jednak se vám může stát, že se dočkáte protiakcí různých účinků, jednak skenování cizích strojů je přece pod vaši administrátorskou etiku.