Hlavní navigace

Skenování portů: techniky

31. 10. 2006
Doba čtení: 11 minut

Sdílet

 Autor: 29
V dnešním pokračování tématu skenování portů se konečně dostaneme k jednotlivým technikám skenování. Jedná se o postupy pojmenované jako Connect, Stealth SYN, FIN, X-MAS, NULL, ACK, Window, UDP a Idle skenování. Všechny techniky jsou v článku detailně rozebrány a je možné si je odzkoušet (samozřejmě s ohledem na etičnost této činnosti v prostředí Internetu).

Při praktickém skenování je totiž dobré mít na paměti otázku legálnosti, případně etiky této činnosti. Podle platných zákonů samotné skenování trestné není, ovšem způsobíme-li skenováním nějaké potíže nebo škodu, pak už trestné být může. V této souvislosti vám mohu jenom doporučit články Jak silná je naše „softwarová policie“? a (Ne)legální port scanning. V každém případě platí, že určité skupiny lidí považují skenování portů za neetické a jiní zase za normální věc. Proto vám doporučuji uváděné techniky zkoušet pouze na svých počítačích, předejdete tím případným problémům.

Connect skenování (pouze TCP)

Jméno tohoto skenování vychází ze způsobu, jakým je prováděno. Jedná se totiž o klasické připojování k TCP portům, kde proběhne obvyklý TCP handshake. K tomuto skenování vám stačí i obyčejný Telnet. Zadáte IP adresu a port vzdáleného počítače a Telnet se k němu bude snažit připojit. Když se spojení podaří, port je otevřen, v opačném případě nikoliv. Toto skenování je ovšem nejvíce nápadné, protože i když vzdálený počítač nebude mít žádný program na detekování skenování portů, bude přesto vaše IP adresa uložena v logovacích souborech, protože úspěšná připojení se většinou zaznamenávají.

Vlastní skenování provedeme spuštěním programu nmap s parametry nmap –sT –p 0-65536 (ROZSAH_PORTU) IP_ADRESA_OBETI. Dole na obrázku vidíte, jak vypadá komunikace, když je port otevřený a když je zavřený. Pokud budete skenování zkoušet proti systému Windows, je potřeba vypnout jeho firewall, jinak zavřené porty budou filtrované. Nakonec dodám, že IP adresa 192.168.0.242 patří útočníkovi a 192.168.0.1 je adresa oběti.

TCP scan - connect

Stealth SYN skenování (pouze TCP)

Tento typ skenování je neúplné Connect skenování (také se podobá DoS útoku SYN Flood). Pro ověření, zda je port otevřen, není potřeba úplného spojení, ale stačí, když nám server odpoví TCP paketem s příznaky SYN+ACK. Správně bychom měli odpovědět TCP paketem s příznakem ACK a spojení by bylo navázáno.

Ovšem my už neodpovíme, tudíž spojení nebude navázáno a naše IP adresa nebude zapsána v logovacích souborech. Svého času byl tento sken neodhalitelný, jelikož rozšíření programů, které by hlídaly dění na síti, bylo minimální a navíc tyto programy ze začátku nedokázaly toto skenování detekovat. V současné době tomu je již jinak, všechny programy (kontrolující dění v síti) včetně těch jednodušších dokáží tento druh skenování odhalit, ovšem rozšíření těchto programů se nedá považovat za příliš velké.

Pro provedení tohoto skenování je potřeba spustit program nmap s parametry nmap –sS –p 0-65536 (ROZSAH_PORTU) IP_ADRESA_OBETI. V Linuxu je potřeba pro provedení tohoto skenování mít práva uživatele root.

Stealth synchronization

FIN, X-mas a Null skenování (pouze TCP)

Poté, co nebylo Stealth SYN skenování tajné a bylo programy detekováno, vznikly další druhy skenování. Tyto spočívají v posílání neočekávaných dat na porty. Poznat, že jsou data neočekávaná, je lehké v případě TCP protokolu. V rámci TCP protokolu musí být totiž každé spojení zahájeno pomocí TCP handshake a pak dále musí být správně nastavována a potvrzována sekvenční čísla. Tyto typy skenování nevytváří žádné spojení a sekvenční čísla jsou volena náhodně nebo jsou nastavena na nulu.

Pokud na portu běží nějaká služba, měly by být tyto pakety ignorovány. Pokud na portu nic neběží, měl by být zpátky poslán TCP paket s příznaky RST a ACK. Bohužel toto skenování je na systém Windows XP SP2 (nejspíše i Windows 2000, 2003 a NT) neúčinné. Poslaný paket totiž pošlou zpátky, i když je port otevřen nebo zavřen. Toto chování bych označil jako obranu proti těmto druhům skenování, vloženou přímo do jádra systému.

Skenování X-mas posílá TCP pakety s příznaky FIN, URG a PSH, říká se mu vánoční (X-mas = Christmas), jelikož má „rozsvíceny“ příznaky jako vánoční stromeček. Skenovaní FIN zase posílá TCP pakety s příznakem FIN a konečně skenování typu Null používá TCP pakety bez jakéhokoliv příznaku. V současné době jsou tyto druhy skenování proti některým verzím systému Windows neúčinné. Tyto typy skenování již také nejsou příliš tajné a každý program specializující se na sledování sítě je odhalí.

Program nmap umí všechny tyto typy skenování, parametry jsou stejné jako vždy, jediné, co se mění, je první parametr, který zaměníme za –sF pro FIN skenování, -sX pro X-mas skenování a –sN pro skenování typu Null. Na obrázku dole vidíte Null skenování, všimněte si, že u zavřeného portu nám zpátky přišel TCP paket s příznaky RST a ACK, což je správně. U otevřeného portu nám zpátky nic nepřišlo a místo toho jsme poslali paket dvakrát. Pokud si říkáte, proč, je odpověď jednoduchá: pokud je port otevřený, nemá na tyto pakety reagovat. Paket byl zaslán dvakrát z toho důvodu, abychom potvrdili, že se opravdu jedná o otevřený port a ne situaci, kdy se paket ztratil v síti.

TCP scan - null

ACK skenování (pouze TCP)

Tento druh skenování je velice podobný předchozím typům. Posílá se zde TCP paket s příznakem ACK, sekvenční číslo a potvrzované číslo jsou nastaveny na náhodnou hodnotu. Tento paket tedy není očekáván, vzdálený systém ho považuje za nekorektní a pošle zpátky TCP paket s příznakem RST. Pokud je ovšem port filtrován firewallem, tak se zpátky nic nevrátí. Nejspíše se ptáte, jak pomocí tohoto skenování zjistíme, jestli je port otevřený. Bohužel nijak, toto skenování slouží pouze ke zjišťování, zda je port filtrovaný, nebo nefiltrovaný.

Window scan (pouze TCP)

Toto skenování je ACK skenování se sledováním dalších parametrů, což umožňovalo poznat otevřený port. Tento typ skenování již není aktuální, využíval totiž neškodné chyby v implementaci TCP protokolu. Vtip byl v tom, že když přišla od oběti odpověď TCP s RST příznakem, tak se nahlédlo na parametr window, ten byl v případě uzavřeného portu 0 a v případě otevřeného portu nenulový. Ovšem tato chyba je již dlouho opravena.

UDP skenování (pouze UDP)

Toto je jediné skenování, které umí odhalit otevřené UDP porty. Nejspíše se vám zdá divné, proč pro TCP porty jich je taková spousta a pro UDP pouze jedno. Důvod je jednoduchý, protokol UDP je primitivní, nemá téměř žádné parametry a jeho používání je minimální. Ovšem tato podoba je zcela záměrná, jelikož jeho použití je pro data, u kterých nám příliš nezáleží na ztrátě, ale požadujeme, aby co nejméně zatěžoval linku a data dorazila k příjemci co nejrychleji.

Skenování tedy spočívá v posílání prázdných UDP paketů oběti na skenované porty. Pokud na portu není žádná služba, tak nám zpátky přijde ICMP paket s tím, že port je nedostupný. V opačném případě nám přijdou nějaká data z onoho UDP portu, nebo nepřijde nic. Ovšem zde je to složitější, jelikož ICMP zprávy jsou často filtrovány, takže nám nemusí dorazit zpráva o tom, že port je nedostupný a my ho budeme považovat za otevřený. Proto nmap zobrazuje porty, ze kterých nepřijde žádná odpověď jako open|filtered.

Možnost, jak získat více informací, je pomocí přepínače –sV. Ten zajistí to, nmap se bude snažit získat více informací o těchto portech, a to tím, že na ně bude posílat určitá data. Tento přepínač lze použít u všech skenování. Skenování tedy provedeme takto:  nmap –sV –sU -p 0-65536 (ROZSAH_PORTU) IP_ADRESA_OBETI.

UDP Scan

Idle skenování (pouze TCP)

Tento způsob skenování je z technik uváděných v tomto článku nejsložitější a nejzajímavější. Nabízí nám totiž možnost skenovat oběť, aniž by se k ní někdy dostala naše IP adresa. K provedení tohoto skenování je využíváno prostředníka a určitých faktů o síťové komunikaci.

Potřebná teorie

Prvním faktem je, že každý IP paket obsahuje identifikační číslo. Toto identifikační číslo nabývá hodnot 0–65536 (jelikož se jedná o 2bajtový parametr). Identifikační číslo slouží ještě s dalšími parametry k fragmentování paketů. O fragmentaci paketů jsem se okrajově zmiňoval ve článku o DoS útocích využívajících chyb a vyčerpání systémových prostředků. Toto číslo se s každým odeslaným IP paketem mění. To, jak se toto identifikační číslo změní, je na operačním systému. Například operační systém Linux toto číslo mění náhodně, to znamená, že se nedá předpovědět, jaké bude následující identifikační číslo. Ovšem na operačních systémech Windows se identifikační číslo inkrementuje o určitou konstantu (tato konstanta je závislá na verzi Windows) a je možné předpovědět následující identifikační čísla.

Další fakt je proces TCP Handshake, což je způsob, jakým se navazuje spojení v rámci TCP protokolu. O TCP Handshake jsem se již zmiňoval v článku Denial of Service (DoS) útoky: typy využívající chyb a vyčerpání systémových prostředků (2.). Zde pouze zopakuji to, co potřebujeme vědět pro pochopení tohoto typu skenování. Například pokud se připojujeme k webovému serveru, tak musí systém nejdříve navázat spojení s tímto serverem. To provede zasláním TCP paketu s příznakem SYN na port TCP 80. Pokud server akceptuje připojení, pošle zpět TCP paket s příznaky SYN a ACK, a vy mu zpátky pošlete TCP paket s příznakem ACK, poté je spojení vytvořeno a mohou být přenášena data.

Poslední věcí, kterou je potřeba znát, je reakce počítače (operačního systému) na TCP paket s příznakem SYN a ACK, aniž by předtím poslal TCP paket s příznakem SYN. Standardně takový počítač odpoví TCP paketem s příznaky RST a ACK, čímž ukončí spojení. Jedná se o reakci na nečekaná data. V dnešní době je ovšem komunikace často filtrována firewallem a RST paketu se nedočkáme. Pokud si tedy budete toto skenování zkoušet, tak je třeba toho, aby byl na prostředníku vypnut firewall.

Jak tedy teoreticky vypadá skenování?

Na obrázku je vidět jak jsou posílány pakety, každá šipka je jeden paket. Nyní si popíšeme jednotlivé kroky:

Idle scan
  1. Útočník posílá na prostředníka TCP paket s příznaky SYN + ACK na jakýkoliv port. Prostředník tato data nečeká a zpátky posílá TCP paket s příznakem RST; jediné, co nás na tomto paketu zajímá, je hodnota ID uvedená v IP hlavičce. Kvůli této hodnotě je také celý tento první krok prováděn (například ID=111, a inkrement bude roven jedné).
  2. Nyní posíláme oběti TCP paket s příznakem SYN na port, u kterého nás zajímá jeho stav. Vlastně se tváříme, jako bychom chtěli vytvořit spojení. Ovšem IP adresu odesílatele nastavíme na IP adresu prostředníka.
  3. Oběť si myslí, že se s ní prostředník snaží navázat spojení. Pokud je port na oběti zavřený nebo filtrovaný, žádné pakety se v tomto kroku neposílají (nic se neděje). Je-li port na oběti otevřený, tak oběť pošle prostředníkovi TCP paket s příznaky SYN+ACK. Jakmile prostředník obdrží tento paket, odpoví TCP paketem s příznakem RST, jelikož si žádnou komunikaci navazovat nepřál (u tohoto paketu bude ID=112).
  4. Tento krok je stejný jako první. Jakmile zjistíme hodnotu ID, porovnáme ji s tou, kterou jsme zjistili v prvním kroku. Pokud bude hodnota ID rovna 112, znamená to, že v kroku číslo tři se neposlaly žádné pakety, z čehož vyplývá, že port je zavřený. Pokud je ovšem hodnota ID rovna 113, pak v kroku číslo tři proběhla výměna paketů a port je otevřen.

V čem se liší praxe od teorie?

Teoreticky vše vypadá jednoduše, ovšem v praxi to je složitější. Jak jsem již psal, inkrement se liší podle operačního systému, takže je nejprve potřeba zjistit jeho hodnotu.

Mnohem větší problém nám ovšem vytvoří síťová komunikace na prostředníkovi, jelikož hodnota ID je měněna s každým odeslaným IP paketem. Takže pokud by skenování probíhalo tak, jak bylo zmíněno výše, mohli bychom detekovat zavřené porty jako otevřené, jelikož by nám cizí komunikace inkrementovala hodnotu ID. Pokud bude na prostředníku cizí komunikace pouze minimální, pak se dá toto skenování použít s několikanásobným opakováním.

Pokud tedy shrnu, co potřebujeme ke zdárnému skenování, pak je to prostředník, u kterého se dají předvídat ID hodnoty uvedené v IP záhlaví, dále musí být na prostředníku minimální síťový provoz a nakonec je potřeba, aby prostředník odpovídal na neočekávaný TCP paket s příznaky SYN+ACK zasláním TCP paketu s příznakem RST.

Implementace Idle skenování v programu nmap

Tento typ skenování umí i program nmap. Parametry pro spuštění jsou následující: nmap –sI IP_ADRESA_PROSTREDNIKA IP_ADRESA_OBETI. Program nmap nejprve zjišťuje, zda se dá u prostředníka předvídat hodnota ID a velikost inkrementu. Toho dosáhne několikanásobným opakování prvního kroku (viz výše) a sledováním rozdílů.

Dále zlepšuje skenování tím, že v kroku dva pošle více paketů tak, aby si oběť s prostředníkem vyměnila co nejvíce paketů (v kroku 3), pokud je port otevřen. Tím se zvýší počet inkrementací a poté lze rozhodnout o stavu portu, i když na prostředníkovi existuje cizí komunikace.

Nmap má toto skenování velice dobře promyšlené a v určitých ohledech přináší i některá vylepšení. Pokud vás toto téma zajímá více, pak doporučuji článek Idle scanning and related IPID games.

Výhody Idle skenování

Toto skenování je naprosto anonymní v tom, že k oběti se nikdy nedostane vaše IP adresa. Dále s ním můžete v určitých případech obejít i firewall, a to tak, že správně zvolíte prostředníka. Pomocí sledování inkrementace ID můžete i odhadnout zatížení vzdáleného serveru nebo odhadnout operační systém. Dokonce můžete odhalit, zda komunikujete s firewallem nebo jiným počítačem, a to opět pouhým sledováním hodnoty ID (viz Idle scanning and related IPID games).

BRAND24

Nmap umí i víc

Pokud vás zajímá více možností velice mocného programu nmap, pak vás odkáži na jeho online příručku. Pokud jste něco nepochopili, nebo jsem udělal v článku chybu, dejte mi prosím vědět v názorech pod článkem.

Příští týden se podíváme na techniku zvanou FTP bounce-scanning, která nemusí sloužit pouze ke skenování, ale může udělat i pořádnou neplechu jako reflektivní DoS útok.

Rozumíte anglicky psaným odborným textům?

Byl pro vás článek přínosný?

Autor článku

Autor je spolumajitelem firmy PATRON-IT a celým srdcem technik. Specializuje se na kybernetickou bezpečnost a má zkušenosti etického hackera. Věří, že aby mohl síť dobře zabezpečit, musí ji nejprve umět prolomit.

Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).