IDS SNORT
IDS Snort
IDS
Co je systém detekce průniku (IDS)?
Intrusion Detection Systems (systémy detekce průniku) patří mezi bezpečnostní nástroje
počítačových sítí a začaly se používat v druhé polovině devadesátých let minulého století. IDS může
být definován jako soubor zdrojů, metod a nástrojů, které nám pomáhají identifikovat a hlásit
neschválené či neautorizované aktivity. Podstata těchto nástrojů vychází z předpokladu, že činnost
útočníka (narušitele) bude odlišitelná na základě identifikátorů od běžné činnosti uživatelů.
IDS se dá přirovnat k alarmovému systému v rodinném domě. Zabezpečení dveří a oken by
zde zajišťoval firewall, nicméně sám o sobě by nijak nevaroval majitele domu o narušení. Alarmový
systém nezabrání narušení, ale dovede varovat před potencionálním narušením.
Kategorie IDS
Systémy detekce průniku řadíme do dvou kategorií a to do tzv. hostitelských (hostbased
intrusiondetection
systems, HIDS) a síťových (networkbased
intrusiondetection
systems, NIDS).
Hostitelské IDS vyžadují určitý software, který je umístěn na tomto systému. Využívá se například
logovacích souborů (systémových a událostních) a sleduje se v nich, zda nedochází k nějakým
významným a podezřelým změnám. HIDS mají výhodu v tom, že se provádí pouze kontrola
událostí na vlastním systému, a také, že umí detekovat útok vedený přes šifrovací kanál. Slabinou
těchto systémů je možnost jejich napadení v rámci útoku na hostitelský systém a jejich možným
vyřazení z činnosti při DoS útoku. Síťové IDS se nasazují do jednoho ze segmentů sítě a zde
analyzují síťové pakety, z čehož se pak vyhodnocuje narušení. NIDS nijak do komunikace
nezasahují a data nechávají procházet dále, dojdeli
však k vyhodnocení napadení, vyhlásí IDS
poplach. Hlavním problémem těchto IDS je objem analyzovaných dat a vysoká míra falešných
poplachů.
IDS Snort
Snort je program, patřící do kategorie síťových IDS, založených na pravidlech. Jak je z
předchozích odstavců patrné, Snort plní funkci detekce útoků a odposlechu v síti. Hledá vzorky
známých útoků a v případě nalezení je schopen provádět různé akce, probíhající provoz však
nepřerušuje. Snort je vyvíjen tak, aby pracoval na velkém spektru operačních systémů. Neměl by
být tedy problém jej nainstalovat na Linux, Windows NT/2000/XP, Unix (Solaris, *BSD, a jiných).
Určitě potěšující skutečností je i fakt, že Snort je vyvíjen jako open source.
Režimy Snortu
Snort může běžet ve třech různých módech: sniffer mode (režim slídiče), packet logger mode
(režim záznamníku) a network intrustion detection system mode (režim detekce narušení).
● Sniffer mode – tento mód zachytává pakety (sniffuje) procházející sítí a zobrazuje je
uživateli na obrazovku,
● Packet logger mode – logger je v podstatě rozšířený sniffer mode, rozdíl je v tom, že se
paketová data nebo hlavičky zaznamenávají do log souborů na pevný disk,
● Network intrustion detection system mode nejvýznamnější
režim programu, Snort zde
odchytává síťová data a analyzuje je v kontextu s uživatelem definovanými pravidly a
provádí akce podle nálezu,
● Inline Získává
pakety z iptables. Na základě pravidel rozhoduje o zahození nebo povolení
paketů. V tomto módě pracuje jako HIDS.
Komponenty Snortu
Snort je logicky rozdělený do několika komponent. Tyto komponenty pracují společně,
detekují tak jednotlivé útoky a generují výstup v požadovaném formátu. IDS Snort se skládá z
následujících hlavních komponent:
● Jednotka paketového záchytu
● Zásuvné moduly preprocesoru
● Detekční jednotka
● Systém logování a výstrah
● Výstupní zásuvné moduly
Jednotka paketového záchytu:
Komponenta bere pakety z různých síťových rozhraní počítače a před zpracovává pakety pro
zaslání detekční jednotce. Rozhraním může být Ethernet, SLIP, PPP a tak dále.
Zásuvné moduly preprocesoru:
Preprocesory jsou komponenty, které lze použít ve Snortu k uspořádání nebo úpravě datových
paketů, předtím než detekční jednotka provede operace, aby zjistila, jestli je paket generován
vetřelcem. Některé preprocesory také hledají neobvyklosti v hlavičce paketu. Preprocesory jsou
velmi důležité pro NIDS k přípravě datových paketů pro analýzu v detekční jednotce. Hackeři
užívají různou techniku a různé způsoby k oklamání IDS. Například, můžete vytvořit pravidlo
k nalezení signatury „scripts/iisadmin“ v HTTP paketech. Jestliže se paket testuje na výskyt
tohoto řetězce, může být IDS snadněji hackerem oklamán, ten totiž může udělat nepatrné úpravy
tohoto řetězce, např.:
● „scripts/./iisadmin“
● „scripts/examples/../iisadmin
● „scripts\iisadmin“
● „scripts/.\issadmin“
Komplikovanější situací je, že hacker může také vkládat do URI hexadecimální nebo unicode
znaky, které jsou zcela legální. Všimněte si, že webové servery rozumějí všem těmto řetězcům a
jsou je schopny přijmout jako stejný požadavek „scripts/iisadmin“. Nicméně jestliže IDS
nepozná takové změny řetězce, není pak schopno odhalit útok. Preprocesor může tedy uspořádat či
seskupit řetězec tak, že bude pro IDS jednoznačně detekovatelný.
Preprocesory se také používají pro paketovou defragmentaci. Když se přenášejí velká data,
jsou vetšinou pakety rozděleny. Např. implicitní velikost paketu v Ethernetové síti je obvykle 1500
bajtů. Tato hodnota je řízena MTU hodnotou. MTU (Maximum transfer unit) je hodnota udávající
maximální velikost přenosové jednotky na úrovni vrstvy síťového rozhraní (nejnižší vrstvy)
komunikačního modelu TCP/IP. Jestliže pošleme data, která jsou větší než 1500 bajtů, ty se rozčlení
do mnohočetných datových paketů tak, aby délka byla menší nebo rovna 1500 bajtům. Přijímací
systémy jsou schopné zkompletovat rozčleněné jednotky, a tak vytvořit originální datový paket.
Předtím, než můžeme použít některé pravidlo nebo vyzkoušet najít signaturu, musí dojít ke
kompletaci paketu, protože například polovina signatury může být přítomna v jedné části
(fragmentu) a druhá polovina v další části. K správnému detekování signatury je tedy třeba spojení
všech paketových fragmentů. Je tedy jasné, že právě hackeři používají fragmentaci k oklamání IDS.
Detekční jednotka:
Detekční jednotka je nejdůležitější část Snortu. Její úkolem je systematicky porovnávat data
uvnitř každého paketu, zda obsahuje zvláštní řetězec nebo hodnotu sdruženou s nějakým pravidlem.
Detekční jednotka pro tento účel využívá Snortovské pravidla. Pravidla jsou načítána do vnitřních
datových struktur nebo řetězců a jsou porovnávána proti všem paketům. Jestliže paket odpovídá
některému pravidlu, vyvolá se příslušná akce. Příslušnou akcí zde může být zápis do logu nebo
vytvoření výstrahy.
Detekční jednotka je časově náročný modul Snortu. Hodně proto záleží na tom, jak je počítač
výkonný a kolik pravidel má definovaných. Jestliže je zatížení Vaší sítě příliš vysoké a Snort pracuje
v NIDS režimu, může docházet k zahazování některých paketů, což vede k nesprávné odezvě
v reálném čase. Zatížení detekční jednotky je ovlivněno následujícími faktory:
● Počet pravidel,
● výkon počítače, na kterém Snort právě běží,
● rychlost vnitřní sběrnice, používané v počítači kde běží Snort,
● zatížení sítě.
Při navrhování Intrusion Detection Systém bychom měli tyto všechny faktory zohlednit.
Detekční jednotka pracuje různými způsoby pro jednotlivé verze Snortu. V 1.x verzích Snortu, se
zastaví další zpracovávání paketu, když vyhovuje některému z pravidel. To znamená, že jestliže
paket odpovídá kriteriím definovaných ve více pravidlech, je aplikováno pouze první pravidlo.
Dochází zde k jednomu problému. Uvědomme si, že nízká priorita pravidla implikuje nízkou
prioritu výstrahy, a že vysoká priorita pravidla si zasluhuje vysokou prioritu výstrahy. Pokud se tedy
zpracovávání zastaví díky pravidlu s nízkou prioritou, přicházíme o potenciální porovnávání s
pravidlem, který má vyšší prioritu. Tento problém je napraven ve Snortu verzích 2.x, kde všechny
pravidla jsou porovnávána proti paketu před tvořením výstrahy. Po porovnání všech pravidel, se
vybere vyhovující pravidlo s nejvyšší prioritou a vytvoří se příslušná výstraha.
Detekční jednotka ve Snortu verze 2.0 byla kompletně přepsána, takže je o mnoho rychlejší v
porovnávání s dřívějšími verzemi Snortu. Analýzy ukazují, že rychlost nových detekčních jednotek
se může zvýšit až 18 krát oproti detekční jednotce používané ve Snortu verze 1.x .
Systém logování a výstrah
Tato část Snortu závisí na tom, co detekční jednotka najde podezřelého uvnitř paketu, což je
následně použito k záznamu do logu nebo k vytvoření výstrahy. Logy mají strukturu jednoduchého
textovém souboru v tcpdump
tvaru nebo v jiných formách. Všechny logovací soubory se implicitně
ukládají do adresáře /var/log/snort.
Výstupní zásuvné moduly
Výstupní jednotka nebo zásuvný modul provádí operace podle toho, jak chceme mít uleženy
výstupy vytvořené systémem logování a výstrah. S ohledem na nastavení, mohou výstupní moduly
dělat následující věci:
● Zaznamenávat (pouze) do /var/log/snort/alert souboru (nebo nějakého jiného),
● zasílání SNMP trapů,
● zasílání zprávy do syslogu,
● zapisovat do databáze jako MySQL nebo Oracle,
● generovat XML výstup,
● modifikovat konfigurace routerů a firewallů.
Další nástroje mohou také zasílat výstrahy v jiných formátech jako je email,
nebo nám
umožňují sledovat výstrahy prostřednictvím webu, atd.. .
Pravidla Snortu
Jednou z nejlepších vlastností Snortu je možnost snadného vytváření a přidávání (aktualizace)
pravidel. Jednotka pravidel programu Snort poskytuje rozšířený jazyk, který nám umožňuje napsat
si vlastní pravidla. To vede k tomu, že si vše můžeme přizpůsobit potřebám naší sítě.
Každé pravidlo se skládá ze dvou části: hlavičky a volby (options). Hlavička pravidla
obsahuje akci pro vykonání, protokol ke kterému se pravidlo vztahuje, zdrojové a cílové adresy s
porty. Options pravidla nám dovolují vytvořit popisnou zprávu spojenou s pravidlem, a taky
kontrolovat různé druhy dalších atributů paketu, které Snort používá v rozsáhlé knihovně zásuvných
modulů.
Takto vypadá obecný tvar pravidla Snortu:
action protokol zdroj_ip zdroj_port směr cíl_ip cil_port (options)
Když přijde paket, porovná se jeho zdrojová i cílová IP adresa a porty s pravidly v množině
pravidel. Jestliže některé pravidlo odpovídá paketu, pak se vyhodnotí options. Jestliže souhlasí
všechna porovnání, vykoná se příslušná akce.
Snort poskytuje několik vestavěných akcí, které můžeme použít, když pravidla vytváříme:
1. Pass (předání) – ignoruje paket,
2. log (zaznamenání) – zaznamená paket,
3. alert (výstraha) – vygeneruje výstrahu a paket zaznamená,
4. activate (aktivace) – vygeneruje výstrahu a vyvolá k otestování další pravidlo,
5. dynamic (dynamika) – akce „dynamic“ jsou vyvolávány pouze dalšími pravidly užitím akce
„activate“. Za normálních okolností nejsou používány na paket,
6. drop (zahození) – přidá do iptables pravidlo pro zahození paketu a paket zaznamená,
7. reject (odmítnutí)– přidá do iptables pravidlo pro zahození paketu, paket zaznamená a pošle
TCP reset, jestliže je protokolem TCP nebo ICMP zprávu o nedostupnosti portu, jestliže je
protokolem UDP,
8. sdrop přidá
do iptables pravidlo pro zahození paketu, ale paket nezaznamená.
Implicitně se jako první testují pravidla Aktivace, poté pravidla Dynamiky, následují pravidla
Výstrahy, poté přijdou pravidla Předání a končí pravidly Zaznamenání. Nicméně se dá pořadí měnit.
Hlavička pravidla :
Akce:
Hlavička pravidla obsahuje informaci, která lze popsat slovy "kdo, kde a co". První
položka v pravidle je akce. Vestavěné akce jsem popsal v předchozích dvou
odstavcích. Základní tři akce jsou výstraha (alert), zaznamenání (log) a předání
(pass).
Protokoly:
Další položka v pravidle je protokol. Snort je schopen analyzovat tři IP protokoly
tcp, udp a icmp.
IP adresy:
Další částí z hlavičky pravidla jsou IP adresy a porty. Slovo „any“ definuje
jakoukoliv adresu. Snort nedisponuje žádným mechanismem na zpracování
jmenných adres pro práci s pravidly. Adresy jsou tvořené přímo číselnou IP adresou
v CIDR notaci.
V následující ukázce je použita libovolná zdrojová IP adresa a za cílovou IP adresu
je brána 81.31.46.0 třídy C.
alert tcp any 3389 -> 81.31.46.0/24 3389 (msg: "RDP spojeni";
content: "|03|"; offset: 0; depth: 1; content: "|D0|";
offset: 5; depth: 1; flags: A+;)
Je možno taky použít operátor „!“, který značí „všechno mimo této adresy“. Pokud
tedy chceme například rozlišit vnitřní síť od vnější, použijeme operátor přibližně
takto:
vnitřní: 10.154.210.0/24
vnější: !10.154.210.0/24
Čísla portu:
Porty můžeme definovat více způsoby, a to buď klasicky číselně, použitím
neurčitého „any“, definicí statického portu, rozsahem a nebo negací. Statické porty
jsou definované jedinečným číslem portu, jako například 23 pro telnet nebo 80 pro
http. Rozsahy jsou zapsány operátorem „:“.
Záznam udp paketu, přicházejícího z neurčité adresy (sítě) a neurčitého portu na
cílový port (v rozsahu 1 až 80) na adresu sítě 10.154.210.0/24 – si vyžádámě tímto
pravidlem:
log udp any any -> 10.154.210.0/24 1:80
Záznam udp paketu, přicházejícího z neurčitého portu na cílový port menší nebo
roven 10000:
log tcp any any -> 10.154.210.0/24 :10000
Záznam udp paketu, přicházejícího z portu menší nebo rovno 80, jdoucí na cílový
port větší rovno 10000:
log tcp any :80 -> 192.168.1.0/24 10000:
Operátor určující směr:
Operátor určující směr provozu (značí se „>“)
říká, že se pravidlo bude aplikovat
pouze na pakety proudící daným směrem. V pravidlech také můžeme používat
operátor, který se značí symbolem ostrých závorek „<>“. Tento operátor využijeme v
situacích, když potřebujeme použít pravidlo v obou směrech proudících dat, jako
například pro telnet či pop3.
log !10.154.210.0/24 any <> 10.154.210.0/24 23
Volby pravidla (options) :
Volby pravidla tvoří srdce detekční jednotky Snortu. Všechny volby pravidla jsou
od sebe odděleny středníkem „;“. Za jednotlivá klíčová slova následuje dvojtečka,
která oddělí jméno od argumentu.
K dispozici jsou tyto volby pravidla:
● msg: "text zprávy";
hlášení pro výstrahu a log paketu
● reference: id_systému,id;
popisuje, kde lze nalézt informace o dané signatuře, viz reference.config
● sid: id_pravidla_snortu;
jedinečná identifikace pravidla
● rev: číslo;
číslo revize pravidla
● classtype: jméno;
označuje zařazení (klasifikaci) události (viz. tabulka níže)
● priority: číslo;
číslo definuje prioritu (vážnost) útoku (viz. tabulka níže)
● logto: "jméno souboru";
zaznamená paket do uživatelem definovaného souboru
● ttl: "číslo";
parametr životnosti paketu (time-to-live), testuje hodnotu pole ttl havičky IP
● id: "číslo";
testuje ID pole z hlavičky IP fragmentu, na specifickou hodnotu
● dsize: [>|<] číslo;
velikost dat paketu
● content: "řetězec";
pátrá po vzoru v paketu, binární data se uzavírají mezi znaky roury „|“
● nocase;
nebude rozlišovat malá a velká písmena
● offset: číslo;
posunutí počáteční pozice pro hledání vzoru
● depth: číslo;
jak daleko se bude hledat datové části paketu
● flags: příznaky;
položka flags v TCP hlavičce. Testuje se TCP flags na jisté hodnoty (F –
FIN, S – SYN, R – RST, P – PSH, A – ACK, U – URG, 2 – rezervovaný bit
2, 1 – rezervovaný bit 1)
● seq: číslo;
testuje TCP číselné sekvence na specifickou hodnotu
● itype: číslo;
testuje ICMP typ pole na specifickou hodnotu
● icode: číslo;
testuje ICMP kódové pole na specifickou hodnotu
● session: [printable|all];
výpis informací o sezení z aplikační vrstvy
Ještě uvedu tabulku zařazení výstrah (využito pro class type a priority):
Formát výstrahy z logu
Pro popis formátu zaznamenané výstrahy jsem si náhodně jednu výstrahu vybral ze souboru
„/var/log/snort/alert“ a na následujícím obrázku ji celou vysvětlím.
Praktická část
Síťová topologie
Na obrázku je uvedeno schéma zapojení síťové topologie. Počítač útočníka se nachází ve
vnější síti a k routeru je připojen přes rozhraní „e0“. Do vnitřní sítě patří rozbočovač, který je k
routeru připojený přes rozhraní „e1“. K rozbočovači jsou připojené dva počítače - „cíl“ (může např.
poskytovat služby SMTP, WWW, DNS atd.) a „IDS“ (zde poběží náš IDS systém Snort). Místo
rozbočovače lze použít přepínač, ale počítač s IDS systémem musí být připojen na monitorovací
port (v Cisco terminologii SPAN port), který lze nakonfigurovat tak, aby na něj byl kopírován
provoz z ostatních portů.
Instalace Snortu
IDS snort můžeme nainstalovat dvěma způsoby. Pokud Vaše linuxová distribuce disponuje
příslušným balíčkem a spokojíte se s danou verzí, zvolte tento způsob.
(Debian, Ubuntu):
● apt-get install snort
Druhou možností je instalace ze zdrojových kódů:
● přejdeme do adresáře
cd /usr/local/src
● stáhneme si zdrojové kódy
wget http://www.snort.org/dl/current/snort-2.4.4.tar.gz
● příslušný archiv rozbalíme
tar -zxf snort-2.4.4.tar.gz
● přejdeme do adresáře
cd snort-2.4.4
● použijeme klasickou trojkombinaci pro přeložení a nainstalování
./configure && make && make install
Musím poznamenat, že jsem ještě doinstaloval některé balíčky, bez kterých by se mi Snort
nepodařilo přeložit. V distribuci Ubuntu nebyly nainstalované tyto balíčky:
libpcre3-dev - Perl 5 Compatible Regular Expression Library - development files
libpcap0.8-dev - Development library and header files for libpcap 0.8
● vytvoříme adresář pro zápis logu
mkdir /var/log/snort
● Vytvoříme adresář pro konfigurační soubory a soubory se signaturami
mkdir /usr/local/snort
● Překopírujeme konfigurační soubory
cp -r etc /usr/local/snort
● Stáhněte si soubor se signaturami, rozbalte a překopírujte
wget http://www.snort.org/pubbin/
downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz
tar -zxf snortrules-pr-2.4.tar.gz
cp -r rules /usr/local/snort
Soubor se signaturami se na webových stránkách aktualizuje pouze v případě vydání nové
verze Snortu.
Spuštění snortu
Sniffer mode
Zobrazení IP a TCP/UDP/ICMP hlaviček: snort -v
Pro vyzkoušení tohoto modu nám stačí spustit program ping z jiného počítače.
Například: ping 192.168.1.2
Odchycené pakety:
04/28-16:26:34.733730 10.154.210.79 -> 192.168.1.2
ICMP TTL:58 TOS:0x0 ID:8368 IpLen:20 DgmLen:28
Type:8 Code:0 ID:45841 Seq:34552 ECHO
Zobrazení hlaviček spojové vrstvy: snort -ve
04/28-15:41:03.481718 0:0:C:46:3E:8B -> 0:2:B3:2B:6B:25 type:0x800 len:0x62
10.154.210.79 -> 192.168.1.2 ICMP TTL:63 TOS:0x0 ID:0 IpLen:20 DgmLen:84 DF
Type:8 Code:0 ID:27395 Seq:1 ECHO
Zobrazení včetně datové části paketu: snort -ved
Spustíme příkaz z útočníkova počítače: telnet 192.168.1.2
Když se naváže TCP spojení (první tři pakety), dochází pak už jen k přenosu dat:
04/28-15:46:16.135204 0:0:C:46:3E:8B -> 0:2:B3:2B:6B:25 type:0x800 len:0x4A
10.154.210.79:1035 -> 192.168.1.2:23 TCP TTL:63 TOS:0x10 ID:41626 IpLen:20 DgmLen:60
DF
******S* Seq: 0x65AA3326 Ack: 0x0 Win: 0x16D0 TcpLen: 40
TCP Options (5) => MSS: 1460 SackOK TS: 233916 0 NOP WS: 0
04/28-15:46:16.135376 0:2:B3:2B:6B:25 -> 0:0:C:46:3E:8B type:0x800 len:0x4A
192.168.1.2:23 -> 10.154.210.79:1035 TCP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:60 DF
***A**S* Seq: 0x62DE8CEA Ack: 0x65AA3327 Win: 0x16A0 TcpLen: 40
TCP Options (5) => MSS: 1460 SackOK TS: 133491 233916 NOP WS: 0
04/28-15:46:16.136541 0:0:C:46:3E:8B -> 0:2:B3:2B:6B:25 type:0x800 len:0x42
10.154.210.79:1035 -> 192.168.1.2:23 TCP TTL:63 TOS:0x10 ID:41627 IpLen:20 DgmLen:52
DF
***A**** Seq: 0x65AA3327 Ack: 0x62DE8CEB Win: 0x16D0 TcpLen: 32
TCP Options (3) => NOP NOP TS: 233916 133491
04/28-15:46:16.168213 0:0:C:46:3E:8B -> 0:2:B3:2B:6B:25 type:0x800 len:0x5D
10.154.210.79:1035 -> 192.168.1.2:23 TCP TTL:63 TOS:0x10 ID:41628 IpLen:20 DgmLen:79
DF
***AP*** Seq: 0x65AA3327 Ack: 0x62DE8CEB Win: 0x16D0 TcpLen: 32
TCP Options (3) => NOP NOP TS: 233919 133491
FF FD 03 FF FB 18 FF FB 1F FF FB 20 FF FB 21 FF ........... ..!.
FB 22 FF FB 27 FF FD 05 FF FB 23 ."..'.....#
Paket logger mode
Při specifikování adresáře pro logování Snort automaticky přejde do módu logování:
snort -vde -l /var/log/snort
V sítích s velkým provozem je výhodnější logovat do binárního souboru:
snort -vde -l /var/log/snort -b
Formát binárního souboru je stejný jako u programu tcpdump. Proto může být přečten
programy tcpdump, ethereal a také Snortem:
snort -vd -r packet.log
Význam použitých parametrů:
● „-r“ - snort čte a zpracovává tcpdump soubor
● „-l“ - loguje do (uvedeného) adresáře
NIDS mode
Pro zapnutí NIDS módu je třeba specifikovat konfigurační soubor s definovanými pravidly.
snort -c /usr/local/snort/etc/snort.conf -l /var/log/snort
Konfigurační soubor
Snort načítá konfigurační soubor při startu. Vzorový konfigurační soubor je obsažený v
distribuci Snortu. Název tohoto souboru si můžeme zvolit libovolný, nicméně implicitně má
jméno snort.conf. Pro načtení konfiguračního souboru se v příkazovém řádku využívá direktiva
-c , pomocí které se dá specifikovat jméno konfiguračního souboru.
Proměnné
V konfiguračním souboru můžeme vytvářet proměnné, což je velice výhodné pro tvorbu pravidel. Například si můžeme v konfiguračním souboru definovat proměnnou HOME_NET
(jako reprezentaci vnitřní sítě) a EXTERNAL_NET (vnější síť):
var HOME_NET 192.168.1.0/24
var EXTERNAL_NET any
Později můžeme tuto proměnnou využít při tvorbě pravidel například takto:
alert ip any any -> $HOME_NET any (…)
Pokud totiž uvedeme například vnitřní síť v proměnné a v pravidlech tuto proměnnou budeme
využívat, stačí nám pro změnu upravit danou síť na jednom místě (čili upravíme pouze
HOME_NET). Nemusí se tak procházet všechna pravidla a upravovat příslušné záznamy ručně.
Seznam serverů - explicitní konfigurace seznamu serverů umožní Snortovi hledat útoky na
systémy, na kterých služby opravdu běží. Je zbytečné hledat např. HTTP útoky, pokud nikde
neběží web server. Takto nadefinované proměnné nejsou však implicitně použity v pravidlech.
var DNS_SERVERS 192.168.1.2
var SMTP_SERVERS 192.168.1.2
var HTTP_SERVERS $HOME_NET
Dalším vhodným způsobem použití proměnných je nastavení cesty k pravidlům:
var RULE_PATH ../rules/
Nastavení direktiv
Použitím direktiv v souboru snort.conf můžeme konfigurovat mnoho nastavení Snortu. Např.
umístění logovacího souboru, dále pak možnost nastavit Snort, aby běžel jako démon (config
daemon) nebo vypnout generování varování.
Konfigurace voleb dekodéru se provádí následovně:
config direktiva [: hodnota]
Preprocesory
Preprocesory předzpracovávají přijaté pakety před aplikováním pravidel Snortu. Nastavování
preprocesoru je druhá nejvýznamnější část konfiguračního souboru. Tato část poskytuje
základní informaci o přidávání nebo odstranění preprocesorů Snortu.
Příkazy pro konfiguraci preprocesoru:
preprocessor <preprocesor_jmeno>[: <konfiguracni_volby>]
První část řádku je klíčové slovo preprocessor, následované jménem preprocesoru. Jestliže
preprocesor může přijímat nějaké volby nebo argumenty, můžete je uvést po dvojtečce za
koncem jména preprocesoru. Toto však již není povinné.
Preprocesory jsou už v standardní konfiguraci vhodně nakonfigurované.
Výstupní moduly
Vstupní moduly pracují s výstupem z pravidel Snortu. Pokud chceme zaznamenávat výstup do
databáze, logu či je posílat na určitý port, musíme zavést příslušný modul. Například chceme-li
zaznamenávat výstrahy do MySQL databáze, přidáme do konfiguračního souboru tento řádek:
output database: alert, mysql, user=snort
password=tajneheslo dbname=snort host=localhost
Vysvětlení uvedených parametrů:
● „output database:“ - zaznamenávání do databáze
● „alert“ - zaznamenávat výstrahy
● „mysql“ - výstup do databáze mysql
● „user=snort“ - do databáze má přístup uživatel „snort“
● „password=tajneheslo“ - heslo uživatele je „tajneheslo“
● „dbname=snort“ - jméno databáze je „snort“
● „host=localhost“ - hostname (nebo IP) serveru, na kterém běží MySQL
Obecný formát specifikace výstupního modulu má tento tvar:
output <output_module_name>[: <configuration_options>]
Pravidla
Předkonfigurovaná pravidla jsou rozdělena do jednotlivých souborů, podle zaměření. Pokud
chceme určitá pravidla vložit/odstranit, stačí odkomentovat/zakomentovat/přidat řádek s
příslušným souborem.
V případě, že chceme přidat do konfiguračního souboru soubor s dalšími pravidly, učiníme tak
příkazem
include mojepravidla.rules
Ukázkový soubor snort.conf:
###### Definice proměnných, které mají platnost i pro soubory s pravidly
# definice proměnné s vnitřní sítí
var HOME_NET 192.168.1.0/24
# definice proměnné s vnější sítí
var EXTERNAL_NET any
# definice proměnné s IP adresou počítače, kde běží http server
var HTTP_SERVERS 192.168.1.2
# definice proměnné s IP adresou počítače, kde běží DNS server
var DNS_SERVERS 192.168.1.2
# proměnná s relativní cestou k adresáři s pravidly
var RULE_PATH ../rules/
###### nastavení preprocesoru
# S klíčovým slovem frag2 nastavíme časový a paměťový limit potřebný pro
# paketovou defragmentaci. Pokud neuvedeme jinak, použijí se implicitní
# hodnoty - 4 MB (paměťový limit) a 60 sekund (časový limit). Jestliže se v
# uvedeném časovém limitu nepodaří paketová kompletace, dojde k zahození
# nasbíraných fragmentů.
preprocessor frag2
# preprocesor stream4 bude odhalovat neviditelné portscany a generovat pro ně
# výstrahy
preprocessor stream4: detect_scans
# skládání TCP streamů ze segmentů nesoucích části signatur
preprocessor stream4_reassemble
# aktivace preprocesoru bo, který detekuje zneužití zadních vrátek
# argument -nobrute nastavuje preprocesor tak, že se nebude využívat k detekci
# hrubé síly
preprocessor bo: -nobrute
# tento preprocesor detekuje UDP nebo TCP SYN pakety jdoucí na čtyři různé
# porty za dobu kratší tří sekund
preprocessor portscan: $HOME_NET 4 3 portscan.log
# preprocesor k detekci arp útoku
preprocessor arpspoof
###### výstupní moduly
# záznam paketů v binárním tcpdump formátu
output log_tcpdump: snort.log
# záznam výstrah do databáze
# output database: - zaznamenávání do databáze
# alert - zaznamenávat výstrahy
# mysql - výstup do databáze mysql
# user=snort - do databáze má přístup uživatel „snort“
# password=tajneheslo - heslo uživatele je „tajneheslo“
# dbname=snort - jméno databáze je „snort“
# host=localhost - hostname (nebo IP) serveru, na kterém běží MySQL
output database: alert, mysql, user=snort password=tajneheslo dbname=snort
host=localhost
# záznam výstrah do xml souboru
output xml: alert, file=/var/log/snortxml
###### Pravidla
# každý řádek přidá soubor s pravidly
# $RULE_PATH je proměnná s relativní cestou k pravidlům, definovaná na
# začátku konfiguračního souboru
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/smtp.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/tftp.rules
include $RULE_PATH/web-cgi.rules
include $RULE_PATH/web-coldfusion.rules
include $RULE_PATH/web-iis.rules
include $RULE_PATH/web-frontpage.rules
include $RULE_PATH/web-misc.rules
include $RULE_PATH/web-attacks.rules
include $RULE_PATH/sql.rules
include $RULE_PATH/x11.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/myrules.rules
Praktická ukázka z tvorby pravidel
Pro ukázku jsem opsal jedno z pravidel ze souboru /etc/snort/rules/icmp.rules
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP
Large ICMP Packet"; dsize: >800; reference:arachnids,246;
classtype:bad-unknown; sid:499; rev:3;)
Tímto pravidlem jsme schopni poznat icmp echo request paket, který bude mít podezřele
velkou datovou část. Jednotlivé aplikace sice vytvářejí tyto pakety o různých délkách a s nestejným
obsahem, délka s obsahem větším než 128 bytů je však podezřelá. Klíčovým slovem alert říkáme,
že naše pravidlo vygeneruje zvolenou metodou výstrahu a paket zaznamená. Slovo ICMP
specifikuje protokol, nad kterým má být prováděna analýza. $EXTERNAL_NET specifikuje
zdrojovou adresu a $HOME_NET adresu cílovou (jde o proměnné, které se definují v
konfiguračním souboru snort.conf). V tomto případě nám obě „any“ určují, že nezáleží na
zdrojovém a cílovém portu. V závorce je popsáno vlastní pravidlo, jednotlivé hodnoty jsou od sebe
odděleny středníkem a jsou ve formátu název_pole: hodnota; Co jednotlivá slova znamenají, jsem
již vysvětlil.
Nyní si pravidlo otestujeme tak, že zadáme na některém počítači z vnější sítě příkaz ping:
ping 192.168.1.2 -c 1 -s 1000
Použité volby příkazu ping:
● „-c 1“ - příkaz ping se provede jedenkrát
● „-s 1000“ - velikost zaslaného paketu (1000 bytů)
V souboru /var/log/snort/alert se nám zaznamenala tato výstraha:
[**] [1:499:4] ICMP Large ICMP Packet [**]
[Classification: Potentially Bad Traffic] [Priority: 2]
05/21-20:48:16.659920 10.154.210.79 -> 192.168.1.2
ICMP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:1228 DF
Type:8 Code:0 ID:25920 Seq:1 ECHO
[Xref => http://www.whitehats.com/info/IDS246]
Druhou malou ukázkou je zachycení odeslané emailové zprávy s určitým obsahem. Jelikož
spousta útoků obsahuje statický text, není těžké takový útok odhalit. Ukázkové pravidlo bude
generovat výstrahu s prioritou 3 a zprávou „Zachycení mailu“, pokud bude detekován paket s
následujícími podmínkami (paket musí):
● Obsahovat řetězec „vas@email.com“ (nocase = nezáleží na velikosti písmen),
● přicházet z libovolného počítače a libovolného portu,
● směřovat na libovolný počítač a port s číslem 25 (služba SMTP).
Definice pravidla:
alert tcp any any -> any 25 (msg: "Zachyceni mailu";
content: "vas@email.com"; priority: 3; nocase;)
Výstraha:
[**] [1:0:0] Zachyceni mailu [**]
[Priority: 3]
05/21-23:00:59.607038 10.154.210.79:60298 -> 192.168.1.2:25
TCP TTL:64 TOS:0x0 ID:54497 IpLen:20 DgmLen:850 DF
***AP*** Seq: 0x4DE99F49 Ack: 0x83CFBF47 Win: 0x16D0 TcpLen: 20
Generování útoku
V poslední části mého textu si ukážeme tři nástroje, pomocí kterých si otestujeme IDS Snort. Je
dobré vědět, jestli dokáže Snort opravdu zachytit útoky a zda-li dokáže na ně správně reagovat
(výstraha, zápis do logu, zahození..).
IDSwakeup:
Idswakeup je nástroj k otestování NIDS. Jde o shellový skript, který k vyvolání
falešných útoků používá nástroje hping2 (vyžadován) a iwu (který je součásti tohoto balíčku).
Nástroj v sobě zahrnuje mnoho simulací útoku a před spuštěním nepotřebuje žádnou
konfiguraci.
Instalace:
● (debian, ubuntu) instalace – apt-get install idswakeup
● pro stažení zdrojových kódů idswakeup můžete použít tento odkaz:
http://www.hsc.fr/ressources/outils/idswakeup/download/
● pro stažení zdrojových kódů hping2 můžete použít tento odkaz:
http://www.hping.org/hping2.0.0-rc1.tar.gz
Spuštění:
● idswakeup <zdroj.adr> <cil.adr> [pocetopakovani] [ttl]
Ukázka práce:
● Z útočníkova počítače (10.154.210.79) spustíme skript pomocí příkazu
idswakeup, uvedeme ještě adresu počítače „cíl“ (192.168.1.2), počet opakování
skriptu (1) a dobu života (10).
● „idswakeup 10.154.210.79 192.168.1.2 1 10“.
První dvě vygenerované výstrahy (v programu Snort):
[**] [116:1:1] (snort_decoder) WARNING: Not IPv4 datagram! [**]
06/19-01:21:36.005166
[**] [1:1142:5] WEB-MISC /.... access [**]
[Classification: Attempted Information Leak] [Priority: 2]
06/19-01:21:36.102435 10.154.210.79:2204 -> 192.168.1.2:80
TCP TTL:10 TOS:0x0 ID:92 IpLen:20 DgmLen:89
***AP*** Seq: 0x81B75BC Ack: 0x724EE835 Win: 0x200 TcpLen: 20
Nessus:
využít i pro otestování výstrah Snortu, který má za úkol varovat před takovou „nekalou“
činností. Nessus se skládá ze dvou částí. Tou první je démon nessusd, který realizuje všechny
bezpečnostní testy, druhou je pak X11 rozhraní, pomocí kterého se Nessus konfiguruje,
spouští se scan a také slouží k prohlížení výsledků. Výhoda takového oddělení je např.
taková, že můžeme Nessus spouštět z počítače, který chceme otestovat, přičemž nessusd bude
nainstalován jinde(nessusd poběží na jiném počítači).
Instalace:
● (Debian, Ubuntu) apt-get install nessus nessusd
● při instalaci budete dotázáni na potřebné údaje pro certifikát (platnost CA certifikátu,
platnost serverového certifikátu, stát, území, místo, organizace), který nessusd použije
při SSL komunikaci.
Spuštění:
● nejprve je třeba spustit nessusd příkazem se stejným názvem
sudo nessusd
● nyní spustíme program s X11 rozhraním (v případě úplně prvního spuštění si program
vyžádá registraci uživatele)
sudo nessus
Ukázka práce:
přihlášení k nessusd(program nessus)
cílový počítač pro otestování
Výběr pluginů pro otestování (v mém případě webové servery)
První dvě vygenerované výstrahy (v programu Snort):
[**] [1:1242:10] WEB-IIS ISAPI .ida access [**]
[Classification: access to a potentially vulnerable web application] [Priority: 2]
06/19-00:41:13.897561 10.154.210.79:39708 -> 192.168.1.2:80
TCP TTL:64 TOS:0x0 ID:39023 IpLen:20 DgmLen:313 DF
***AP*** Seq: 0xD25A9747 Ack: 0xFCC8E7EF Win: 0x16D0 TcpLen: 20
[Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=2000-0071][Xref =>
http://www.securityfocus.com/bid/1065][Xref =>
http://www.whitehats.com/info/IDS552]
[**] [1:971:9] WEB-IIS ISAPI .printer access [**]
[Classification: access to a potentially vulnerable web application] [Priority: 2]
06/19-00:41:13.911618 10.154.210.79:39712 -> 192.168.1.2:80
TCP TTL:64 TOS:0x0 ID:64013 IpLen:20 DgmLen:322 DF
***AP*** Seq: 0xD206F53E Ack: 0xFC54D43A Win: 0x16D0 TcpLen: 20
[Xref => http://cgi.nessus.org/plugins/dump.php3?id=10661][Xref =>
http://cve.mitre.org/cgi-bin/cvename.cgi?name=2001-0241][Xref =>
http://www.securityfocus.com/bid/2674][Xref =>
http://www.whitehats.com/info/IDS533]
...
Sneeze:
Sneeze je generátor falešných útoků, speciálně napsaný pro Snort. Jedná se o perlovský
skript, který čte soubory s pravidly, analyzuje tyto soubory a generuje pakety, které budou
vyhovovat daným pravidlům. Tento skript byl testovaný se Snortem 1.8 a jeho pravidly.
Vývoj tohoto generátoru se na čas zastavil, nicméně to vypadá, že se opět na něm začalo
pracovat.
Instalace:
● wget http://snort.sourceforge.net/sneeze-1.0.tar
● (nutno: libnet-rawip-perl - Perl interface to lowlevel TCP/IP)
apt-get install libnet-rawip-perl
● archiv stačí rozbalit
Spuštění:
● ./sneeze.pl -d 192.168.1.2 -f /etc/snort/rules/exploit.rules
● direktiva „-d“ nám určuje cílový stroj a „-f“ specifikuje soubor s pravidly
Ostatní nástroje:
Perfmon-graph:
Perfmonitor-graph (nebo také pmgraph) je jednoduchý perlovský skript, který generuje
HTML stránky, s grafem výstupních hodnot Snortu (kolik bylo vygenerováno výstrah
za danou časovou periodu, kolik a kdy Snort zahodil paketů, zatížení procesoru atd.), k
tomu využívá RRDTool. Současná verze pracuje s perfmonitor preprocesorem, který je
již součástí Snortu verze 2.4.0, 2.4.1 a 2.4.21, ale ne ve starších verzích.