Nmap a jeho možnosti
Nmap umožňuje systémovým administrátorům (a nejen jim) zjistit, jaké síťové služby nabízí který počítač. Mezi velice užitečné vlastnosti patří též takzvaný OS fingerprinting, který Vám možná prozradí, jaký operační systém ne ktrém počítači běží. Můžete jej s úspěchem použít k mapování pravidel paketových filtrů a podobně.
Port scan
Port scan je asi jednou z nejznámějších technik, jak zjistit, které služby jsou dostupné. Nejjednodušší technikou je připojení se na každý port a podle odpovědi scanovaného zařízení zjistit, zda je daný port otevřený. Mechanismus funguje tak, že pošleme tzv. SYN paket, který slouží k navázání spojení. Server buď naši žádost o sestavení spojení potvrdí (pošle paket s příznakem ACK), nebo zamítne (pošle paket s příznakem RST). V praxi si to lze vyzkoušet například takto:[paja@paja]$ telnet www.webbezi.cz 80 Trying 192.168.1.23... Connected to www.webbezi.cz. Escape character is '^]'.
Takto server odpoví v případě, že na daném portu systém naslouchá a příchozí paket obslouží nějaká služba. Nic to ovšem neříká o tom, jaká služba to je. Na portu 80 obvykle naslouchá nějaký webserver, ale můžeme na něm samozřejmě rozběhnout jinou službu.
[paja@paja]$ telnet www.bezwebu.cz 80 Trying 192.168.1.24... telnet: connect to address 192.168.1.24: Connection refused
V tomto případě daný port nikdo neobsluhuje a systém navázání spojení zamítne. Z toho se dá usoudit, že na daném portu žádná služba neběží - v takovém případě ovšem musíme vědět, jak vypadá přístupová trasa k zařízení, ke kterému se snažíme připojit. Můžeme se setkat i s takovouto odezvou:
[paja@paja]$ telnet www.zafirewallem.cz 80 Trying 192.168.1.25... telnet: connect to address 192.168.1.25: Connection timed out
Interpretace takového výsledku je jednoduchá: buď je zařízeníchráněno paketovým filtrem, který naše pokusy zahazuje, nebo je po cestě špatný routing a pakety se ztrácí.
Nmap takový scan umí, navíc je schopen výsledky svých pokusů o připojení i interpretovat, i když výsledky je nutno brát s rezervou. Pojďme se podívat, jak takový výstup z Nmapu vypadá:
[root@root]# nmap www.webbezi.cz Starting nmap 3.15BETA3 ( www.insecure.org/nmap/ ) at 2003-03-17 13:55 CET Interesting ports on www.webbezi.cz (192.168.1.23): (The 1610 ports scanned but not shown below are in state: filtered) Port State Service 80/tcp open http Nmap run completed – 1 IP address (1 host up) scanned in 72.613 seconds
Z výpisu uvedeného výše je vidět, že na zařízení www.webbezi.cz se můžeme připojit službou http - to lze ověřit tak, že se pokusíme připojit browserem, nebo budeme imitovat web browser ručně:
[root@root]# telnet www.webbezi.cz 80 Trying 192.168.1.23... Connected to www.webbezi.cz. Escape character is '^]'. HEAD http://www.webbezi.cz/ HTTP/1.0 HTTP/1.1 200 OK Date: Mon, 17 Mar 2003 13:08:48 GMT Server: Apache Set-Cookie: LastVisit=1047906529; expires=Tue, 16-Mar-04 13:08:49 GMT; path=/ Set-Cookie: LastVisitTemp=deleted; expires=Sun, 17-Mar-02 13:08:48 GMT; path=/; domain=http://www.webbezi.cz Connection: close Content-Type: text/html Connection closed by foreign host.
Jak vidíme, tak na www.webbezi.cz na portu 80 opravdu běží webserver, protože nám webserver opravdu korektně odpověděl.
Nmap používá jako základní typ portscanu takzvaný SYN stealth scan nebo TCP connect scan, ale umí jich podstatně více. Následující tabulka uvádí základní druhy scanů a jejich stručný popis:
| Scan | Popis |
|---|---|
| TCP SYN | Tato technika je pravděpodobně nejpoužívanější. Často se jí říká half-open - pošleme SYN paket, stejně jako když chceme otevřít spojení, a čekáme na odpověď - RST znamená, že zařízení na daném portu neposlouchá, ovšem obdržíme-li SYN/ACK paket, odpovídá zařízení na náš pokus otevřít spojení. Nmap okamžitě pošle RST paket, čímž spjení zavře. Díky tomu, že spojení vlastně nebylo otevřeno je dost pravděpodobné, že zeřízení na druhé straně náš pokus nezapíše do logu a zÚstáváme neodhaleni. |
| TCP connect() | Jedná se o nejzákladnější formu port scanu - zavoláme systémové volání connect() a systém nám otevře spojení. Pokud na portu nějaká služba poslouchá, bude volání connect úspěšné, jinak vrátí chybu. Problém je, že spojení se opravdu otevře a tím pádem na cílové stanici bude většina služeb logovat chyby v obsluze daného portu. Naproti tomu má jednu výhodu: na systémové volání connect nepotřebujete žádná zvláštní privilegia. |
| Ping scan | Jak již název napovídá jedná se o zaslání ICMP echo request paketu, pokud obdržíme ICMP echo reply, můžeme říci, že dané zařízení je aktivní. Nmap ovšem používá i techniku, kdy pošle TCP ACK na port 80 a čeká na RST. To je užitečné ve chvíli, kdy scanovaný počítač nebo firewall před ním blokuje ICMP echo request. S pomocí dodatečných parametrů lze použít i další možnosti jak doladit ping scan. |
| UDP scan | Tento scan slouží k zjištění, které UDP porty jsou obsluhovány. Vzhledem k tomu, že protokol UDP není stavový, funguje tento scan velmi jednoduše: pošle UDP paket na daný port a čeká na odpověď - pokud zařízení odpoví paketem ICMP port unreachable, je port za zavřený, jinak jej považujeme za otevřený. |
| Protocol | Můžeme se pokusit zjistit jaké protokoly jsou na cílovém zařízení aktivní. Pošleme IP paket s číslem protokolu a čekáme na odpověď - dostaneme-li ICMP protocol unreachable, není protokol podporován, jinak předpokládáme, že ano. Tento scan je velmi podobný UDP scanu a trpí tudíž v reálném provozu určitými neduhy, které popíšeme níže. |
| RPC scan | Tento scan se používá v kombinaci s nějakým jiným druhem scanu - vezme všechny otevřené porty a pošle na ně SunRPC NULL, čímž se dá zjistit, zda jsou to RPC porty a jejich program number. |
Toto jsou základní typy scanů, Nmap jich ovšem umí podstatně více a některé jsou lehce řečeno zákeřnější. Pro audit sítě si však administrátor většinou vystačí i s těmi výše popsanými. My si dále popíšeme i ty zákeřnější typy scanů a to především proto, abychom administrátorům ukázali, že když jim IDS systém nahlásí, že z adresy A.B.C.D někdo zkouší provést port scan, nemusí to být vždy úplně přesná zpráva...
Některé zajímavé metody port scanningu
Nmap a některé další scannery nabízí několik zajímavých možností, jak skrýt svoji identitu - to je pro legitimní používání takových nástrojů prakticky zbytečné, nicméně můžete se s takovým použitím setkat. Jedná se zejména o využití ftp bounce, idle proxy a decoy.
V případě ftp bouncelze využít zajímavou vlastnost protokolu ftp, kterou je příkaz PORT. Standardní spojení přes ftp probíhá tak, že klient se připojí k ftp serveru a požádá o nějaký soubor:
# ftp ftp.ftpserver.cz Connected to ftp.ftpserver.cz. 220 ProFTPD 1.2.5rc1 Server (FTP.FTPSERVER.CZ) [ftp.ftpserver.cz] Name (ftp.ftpserver.cz:root): anonymous 331 Anonymous login ok, send your complete email address as your password. Password: 230-This is ftp server. Behave correctly, or we call Your mother. 230 Anonymous access granted, restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd pub/kde 250 CWD command successful. ftp> get README 200 PORT command successful. 150 Opening BINARY mode data connection for README (1027 bytes). 226 Transfer complete. local: README remote: README 1027 bytes received in 0.038 seconds (26.55 Kbytes/s) ftp> bye 221 Goodbye.
Nás zde zajímá tučná řádka, která říká, že klient serveru řekl, na který port má server poslat data. Syntaxe příkazu port v protokolu FTP vypadá takto: PORT h1,h2,h3,h4,p1,p2, kde h1-h4 jsou čtyři bajty IP adresy a p1, p2 dva bajty portu. Klientovi nic nebrání specifikovat hodnoty v příkazu PORT tak, aby se ftp server připojil na nic netušící oběť a poslal jí nějaká data. Naštěstí novější verze ftp serverů nepovolí příkaz port, pokud parametry h1-h4 nejsou IP adresou připojeného klienta a pokud všechny hodnoty nejsou nenulové. Server, který takovéto humpolácké chování akceptuje, lze využít ke scanu, při kterém se používá se následující technika:
- Připojíme se k serveru a najdeme nějaký soubor, který můžeme stáhnout.
- Pošleme serveru příkaz PORT, který specifikuje jako příjemce dat scanované zařízení a port, který chceme prověřit.
- Pokusíme se stáhnout výše zmíněný soubor.
- Pokud server odpoví hlášením o úspěšném přenosu (kódy 1xx a 2xx), podařilo se data přenést a port je tedy otevřen.
- Jestliže server odpoví chybovým kódem (většinou 425) tak se spojení nepodařilo a port je pravděpodobně zavřený.
Idle proxy je další možnost, jak skrýt svoji identitu při scanu. Tomuto druhu scanu se někdy říká zombie scan, protože je třeba, aby zařízení přes které se scan provádí nebyla zatížena. Zařízení navíc musí mít předvídatelnou sekvenci generování IPID. V lokální síti lze použít například některé tiskárny od HP, stanice s Windows 95 a další zařízení. Technika scanu je následující:
- Pošleme na zombie a SYN/ACK paketem a z RST paketu, který dostaneme zpět získáme IPID.
- Pošleme paket na porvěřovaný port zařízení, které nás zajímá. Paket má zdrojovou adresu našeho zombie.
- Pokud zařízení odpoví na pokus o otevření spojení SYN/ACK paketem (port je otevřen), náš zombie odešle RST, protože on žádné takové spojení nenavázal. Přitom se posune v sekvenci generování IPID.
- Jestliže scanované zařízení odpoví RST (port je zavřen), bude ho náš zombie ignorovat.
- Znovu zkusíme zombie pomocí SYN/ACK a kontrolujeme IPID v RST paketu, posunulo-li se v sekvenci jednou, pak je port zavřen, posunulo-li se dvakrát, pak je port otevřen.
Pokud budeme kontrolovat logy jak na zombie,tak na cílovém stroji zjistíme, že na obou dvou to vypadá, jako by se scanovaly navzájem.
Třetí možností je použití decoy. Decoy flare je označení klamné světlice, kterou vypouští některá bojová letadla, když se snaží zmást raketu naváděnou infračerveným zářením. Raketa si pak hůře vybírá na který z cílů se má zaměřit. Nmap umí použít decoy pakety přesně stejně. Zadáme Nmapu seznam IP adres, které mají být vidět v logu scanovaného stroje. Nmap potom mimo paketů na které očekává odpověď generuje ještě další pakety se zdrojovými adresami ze seznamu.
Další zajímavý aspekt je možnost mapování firewallových pravidel pomocí Nmapu, případně detekce stavových firewallů. K tomu slouží několik typů scanů, o kterých jsme se ještě nezmínili. Jedním z nich je například ACK scan, který sice neukáže, které porty jsou otevřené, ale napoví nám, zda před zařízením je stavový firewall nebo paketový filtr a v případě paketového filtru ještě ukáže, které porty jsou propuštěny a které nikoliv. Metodika se dá velmi zhruba popsat takto:
- Pošleme ACK paket s náhodně vypadajícím ACK/SEQ.
- Pokud dostaneme RST, je velmi pravděpodobné, že paket pochází z cílového zařízení a port tedy není na firewallu filtrován (navíc protože nešlo o součást otevřeného spojení není firewall stavový).
- Jestliže nedostaneme žádnou odpověď a nebo ICMP port unreachable, je pravděpodobné, že firewall daný port nepropouští.
- Pokud jsou všechny porty filtrovány, je pravděpodobné, že firewall je stavový.
Detekce operačního systému
Nmap nabízí možnost detekce operačního systému pomocí metody tzv. TCP/IP fingerprinting, což se sada několika testů, kdy se podle odpovědí testovaných zařízení dá usoudit na použitý operační systém. Autor Nmapu napsal vynikající studii o detekci operačních systémů [Alternativní link], kterou velmi doporučuji prostudivat.
Reference
- Nmap security scanner - insecure.org
- Nmap man page - nmap.org
- File transfer protocol - ietf.org
- Kdyby napsal Nmap Microsoft - counterhack.net
- Remote OS detection via TCP/IP fingerprinting - phrack-dont-give-a-shit-about-dmca.org
- Remote OS detection via TCP/IP fingerprinting - insecure.org
-p6-


