- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 11/2000

Ochrana před scanováním portů: Portsentry

David Häring, 5. listopadu 2000

Scanování portů se používá ke zjištění otevřených portů systému, tedy portů, na kterých "poslouchá" nějaká aplikace. Scanování probíhá tak, že se určitá aplikace (port scanner) postupně pokouší navázat spojení s vybranými porty na počítači, který je předmětem zájmu. Tímto způsobem lze získat přehled o službách, které na daném systému běží. Nástroje pro scanování portů ovšem neslouží pouze útočníkům pro získávání informací o vzdálených systémech. Scanování portů lze využít i pro kontrolu konfigurace systému - tedy pro ověření, že na stroji běží jen ty služby, které jsou skutečně potřebné, případně odkud jsou dostupné.

Připomeňme si, že v rámci síťových protokolů TCP či UDP je úplné síťové spojení dáno typem protokolu, IP adresou a číslem portu lokálního systému, IP adresou a číslem portu vzdáleného systému. K identifikaci portu slouží 16-bitové číslo (platná čísla portů jsou tedy v rozsahu 1 až 65535). Existují tzv. známé porty (v angličtině "well-known ports", RFC 1700), které jsou vyhrazeny hojně používaným službám - tyto jsou definovány v souboru /etc/services.

Metody scanování portů

Existuje řada způsobů jak porty scanovat. Některé jsou více nápadné, jiné jsou postaveny takovým způsobem, aby si administrátor vzdáleného systému pokud možno ničeho nevšimnul. Protože portscan může být předzvěstí chystaného útoku, je pochopitelně žádoucí, aby administrátor včas scan rozpoznal a posoudil. Podívejme se proto nyní krátce na některé běžné metody užívané při scanování portů (dostupné např. v utilitě nmap).

Nejjednodušší je tzv. "TCP connect scan". V tomto případě se pokusíme navázat normální TCP spojení na určitý port vzdáleného počítače pomocí volání jádra connect(). Takové pokusy o navázání spojení jsou ovšem zpravidla nepřehédnutelné v systémovém logu vzdáleného počítače, protože řada aplikací na takové pokusy reaguje zapsaním chybového hlášení do systémového logu (např. časté hlášky "NOQUEUE: Null connection" od sendmailu apod.). Méně nápadné jsou metody, které neotevírají plnohodnotná spojení, anebo využívají nestandardních typů paketů (paketů s nesmyslně nastavenými příznaky). Podle reakcí systému právě na tyto pakety pak odhadují, zda jsou porty otevřené či nikoliv.

Velmi častý "TCP SYN scan" neotevírá úplné TCP spojení, ale pouze realizuje první část navazování TCP spojení; t.j. pošle SYN paket (žádost o navazání spojení) a vyhodnotí odpověď. Vzdálený počítač odpoví buď SYN+ACK paketem pokud je port otevřený (spojení je možno navázat) anebo RST paketem (port je zavřený). Takové pokusy nemusí skončit v logu vzdáleného počítače, pokud není instalován software, který s těmito pakety počítá (firewall, portsentry apod.).

Metoda "FIN scan" používá paket, ve kterém je nastavený pouze příznak FIN (používaný při žádosti o ukončení spojení). Variantou je třeba "Xmas scan", kdy jsou kromě příznaku FIN nastaveny příznaky URG a PUSH. Na takový paket vzdálený počítač odpoví paketem RST v případě, že je port zavřený, zatímco pokud je port otevřený, bude ho ignorovat. Některé operační systémy (např. produkty Microsoftu) se ale chovají nestandardně a odpovídají RST paketem v obou případech, což je mimochodem v rozporu s RFC 793.

Metodou "ACK scan" můžeme zjistit, zda je příslušný port vzdáleného počítače filtrován firewallem. Funguje tak, že vysíláme paket s nastaveným příznakem ACK a náhodně vygenerovaným číslem sekvence. Pokud port není filtrován, vzdáleným systém odpoví paketem RST (protože neodpovídá číslo sekvence). Pokud obdržíme jinou odpověď anebo neobdržíme žádnou, lze předpokládat že port je filtrován firewallem.

Existují i další typy neobvyklých TCP/IP paketů, které lze při monitorování otevřených portů použít.

Co umí portsentry?

Portsentry bychom do češtiny přeložili jako "hlídač portů" a dělá přesně to, co bychom od něj čekali. Detekuje pokusy o scanování vybraných portů našeho systému a umí na ně v závislosti na konfiguraci okamžitě reagovat. Jsou dostupné tři typy akcí:

  • zabránění dalším pokusům o spojení ze stroje, ze kterého scan pochází (zablokování spojení pomocí firewallu anebo úpravou směrovací tabulky);
  • zápis detekovaných pokusů do logu;
  • vykonání libovolného předem specifikovaného příkazu.

Portsentry nabízí 3 režimy detekce scanů: v režimu "Classic mode" neboli "Basic port-bound TCP/UDP mode" se portsentry po startu naváže na zvolené TCP či UDP porty a čeká na příchozí spojení. V tomto režimu detekuje pouze "connect" scany. V režimu "Enhanced Stealth mode" se naváže na specifikované porty pomocí bind(), ale pro analýzu spojení používá tzv. "raw socket" a detekuje klasické connect(), SYN, FIN, Xmas, NULL scany apod. V režimu "Advanced Stealth Mode" portsentry nejprve zjistí, které porty ve zvoleném rozsahu jsou otevřené a tyto si zapamatuje. Dále pak "hlídá" všechny ostatní porty zvoleného rozsahu. Pokud je později otevřen další port, portsentry to zaregistruje a po dobu, po kterou je port otevřený jej ignoruje. Tím se vyhne falešným poplachům v případech, kdy se například u služby FTP otevírá datové spojení na dalším portu.

Oct 18 13:00:04 server1 portsentry[28805]: adminalert: \
Psionic PortSentry 1.0 is starting. 
Oct 18 13:00:04 server1 portsentry[28806]: adminalert: Advanced mode will \
monitor first 1023 ports
Oct 18 13:00:04 server1 portsentry[28806]: adminalert: Advanced mode will \
manually exclude port: 113 
Oct 18 13:00:04 server1 portsentry[28806]: adminalert: Advanced mode will \
manually exclude port: 139 
Oct 18 13:00:04 server1 portsentry[28806]: adminalert: Advanced Stealth scan \
detection mode activated. Ignored TCP port: 21 
Oct 18 13:00:04 server1 portsentry[28806]: adminalert: Advanced Stealth scan \
detection mode activated. Ignored TCP port: 22 
ukázka logu portsentry - start portsentry

Pasivní nebo aktivní ochrana?

Portsentry nabízí několik způsobů, jak na detekovaný scan reagovat. Zapisování událostí je řešeno přes syslog(), záleží tedy na konfiguraci syslogu, zda pro logy portsentry vyhradíme zvláštní soubor anebo necháme události zapisovat standardním způsobem (což bývá zpravidla do souboru /var/log/messages). Protože portsentry nabízí možnost při detekování scanu vykonat určitý příkaz, můžeme to využít např. k poslání e-mailu, SMS zprávy apod. Důležitým aspektem je možnost zablokovat přístup vzdálenému stroji, z něhož scan přichází a to buď úpravou směrovací tabulky (na Linuxu příkazem route, toto ale není ideální řešení) anebo pomocí firewallu (nástroj ipchains, nebo starší ipfwadm). Je třeba si ovšem uvědomit, že automatické blokování IP adres potenciálně útočníkovi umožňuje navenek znepřístupnit služby poskytované takto chráněným systémem (tzv. "Denial of Service" útok). Útočník poté co zjistí, že je jeho přístup blokován, může server zahltit pakety s podvrženými odchozími IP adresami a tím docílit odříznutí přístupu na server z použitých adres. Jestliže tedy na stroji provozujeme kritickou službu, je rozumnější porty pouze monitorovat a na jednotlivé případy reagovat individuálně.

Oct 18 13:00:53 server1 portsentry[28806]: attackalert:\
   SYN/Normal scan from host: server2.domena.cz/10.12.34.56 to TCP port: 1
Oct 18 13:00:53 server1 portsentry[28806]: attackalert:\
   Ignoring TCP response per configuration file setting.

ukázka logu portsentry - záznam scanu

Instalace a konfigurace

Instalace a konfigurace portsentry je snadná. Pokud kompilujeme ze zdrojových kódů, pouze v souboru portsentry_config.h nastavíme cestu ke konfiguračnímu souboru portsentry.conf, cestu k souboru hosts.deny (součást balíčku tcp_wrappers) a způsob logování. Pokud chceme události portsentry zapisovat do zvláštního souboru, předefinujeme SYSLOG_FACILITY z LOG_DAEMON na dejme tomu LOG_LOCAL0 a doplníme konfiguraci syslogu v souboru /etc/syslog.conf o řádek

local0.* /var/log/portsentry

(viz. dokumentace k balíčku syslog). Poté si prohlédneme a případně upravíme soubor Makefile (jsou zde definovány cesty, kam budeme portsentry instalovat), zkompilujeme ("make linux") a instalujeme ("make install"). Toto je stručný popis instalace, samozřejmě není na škodu prostudovat si dokumentaci v přiložených souborech README*.

Konfigurace je také jednoduchá. Provádí se editací souboru portsentry.conf, ve kterém nastavíme vybrané porty, či rozsahy portů, které budou monitorovány v jednotlivých režimech a nadefinujeme příkazy, kterými se bude provádět blokace IP adres - v podstatě stačí odkomentovat jeden z předpřipravených řádků v sekci "Dropping Routes". Podle verze jádra zvolíme buď starší ipfwadm nebo pro jádra verze 2.102 a vyšší ipchains. Pokud Vaše jádro neobsahuje podporu firewallu a nechcete jej kvůli tomu překompilovat, můžete vystačit i s příkazem

/sbin/route add -host TARGET reject

ovšem mějme na paměti, že takto zabráníme komunikaci pouze jedním směrem - pakety ze vzdáleného systému mohou stále přicházet. V sekci "External Command" můžete nadefinovat libovolný příkaz, který se vždy po detekci scanu provede (poslání mailu, SMS apod.). Pokud chceme porty pouze monitorovat, bez blokace IP adres, nastavíme v sekci "Ignore Options" BLOCK_TCP či BLOCK_UDP na hodnotu 0. Hodnota 2 znamená monitorování a provádění nadefinovaných akcí, ale bez blokování IP adres. Defaultní hodnota 1 znamená blokování IP adres i spouštění nadefinovaných akcí.

Porstsentry spustíme ve zvoleném režimu (volby "-tcp", "-udp", "-stcp", "-sudp", "-atcp" a "-audp", popsáno v souboru README.install). Po startu např. v režimu "atcp" by se měla objevit zhruba hlášení podobná ukázce logu ().

V tomto případě bylo konfigurací zadáno, aby portsentry pouze monitoroval TCP porty v rozsahu 1-1023 (defaultní nastavení) a ignoroval pakety příchazející na TCP porty 113 a 139. Dále portsentry rozpoznal otevřené porty 21 a 22, na kterých běží služby ftp a ssh a pakety příchazející na tyto porty ignoruje. Portsentry jednoduše otestujeme tak, že se pomocí telnetu pokusíme přihlásit dejme tomu na port 1. V systémovém logu se pak objeví odpovídající záznam (K čemu slouží identd?).

Co říci závěrem?

Monitorováním portů lze mnohdy předejít bezpečnostnímu incidentu. Na základě analýzy logů se můžeme pokusit odhadnout, zda se jedná o součást masového (a mnohdy značně nápadného) scanování služeb, anebo jde o cílené monitorování systému, které může předcházet připravovanému útoku. Pochopitelně zdaleka ne každý scan končí pokusem o napadení systému, nicméně dostatek včasných informací nikdy není na škodu a instalace portsentry je jednoduchou záležitostí, která se může vyplatit. *


- předchozí článek - následující článek - obsah - úvodní stránka -