SNORT – Network Intrusion Detection System
Vandaag gaan we het hebben over SNORT. SNORT is een NIDS ofwel een Network Intrusion Detection System. In de basis is SNORT uiteraard gewoon een packet sniffer maar wat SNORT zo krachtig maakt is de rule-set die helemaal op maat te maken is. De rule-set is een “set van regels” waarop SNORT moet alarmeren. Ik gebruik SNORT meestal voor het monitoren van specifieke vulnerabilities en aanvallen. De laatste vulnerability waar SNORT enorm bij geholpen heeft was de Citrix CVE-2019-19781 waarbij SNORT kon alarmeren op specifiek verkeer welke herleidbaar was aan directory traversal activiteit op de Cisco Netscaler. Vandaag gaan we kijken hoe we SNORT op Windows installeren en hoe we SNORT regels kunnen instellen en gebruiken.
SNORT, die met het schattige varkentje is verkrijgbaar in een aantal varianten. Momenteel is SNORT een open-source product in ontwikkeling bij de Cisco Talos Intelligence Group. SNORT is echter door Cisco overgekocht want SNORT is origineel ontwikkeld door Sourcefire. SNORT is beschikbaar voor zowel Linux, Mac als Windows. De applicatie is volledig gratis maar de rulesets zijn verkrijgbaar op subscription basis. Uiteraard is er een gratis subscription welke al toegang geeft tot een grote ruleset. Voor 29,99 USD per jaar schaf je echter een “Personal” subscription aan welke voor “thuisgebruik” gebruikt mag worden. Personal subscribers beschikken tot 30 dagen eerder over nieuwe rules in tegenstelling tot de “gratis” subscribers. Wil je de nieuwste rulesets ook ontvangen maar ben je een bedrijf dan moet je de “Business” variant afnemen van 399 USD per jaar. Als betalende subscriber heb je ook de mogelijkheid om false/positives te uploaden waardoor de kwaliteit van SNORT steeds verbeterd wordt.
SNORT kan worden ingezet als packet sniffer en analyser of als full-blown NIDS. SNORT kan o.a. gebruikt worden t.b.v. protocolanalyse, content matching en attack detection zoals bufferoverflows, stealth-portscans, CGI-aanvallen, SMB-sondes, OS-fingerprinting en nog veel meer.
Laten we eens gaan kijken hoe je SNORT kunt installeren op een Windows omgeving.
SNORT Windows Installatie
De eerste stap van elke installatie is het verkrijgen van de Software. De SNORT software download je simpelweg via “https://www.snort.org/downloads“. Na het downloaden start je de installatie.

We installeren SNORT in de default directory.

Nu is het tijd om de SNORT default rulesets te downloaden. Mocht je het nog niet gedaan hebben registreer je dan eerst als user zodat je ook de ruleset voor registered users kunt downloaden van “https://www.snort.org/downloads/#rule-downloads“.

Als je NMap of Wireshark geïnstalleerd hebt dan beschikt je PC al over de WinPcap software. Zo niet, download en installeer dan na de installatie van SNORT de WinPcap software.

Vervolgens kopiëren we de inhoud van de ruleset naar de SNORT root directory. We overschrijven hierbij alle bestaande bestanden.

Nu is het zaak om de config file aan te passen. De config file is namelijk gestoeld op een Linux filesystem. Aangezien we op Windows zitten is er wel het e.e.a. aan te passen. Goed om te weten is dat de SNORT config file uit de volgende 6 secties bestaat:
- 1. Variabele Definities. In dit eerste gedeelte definieer je de variabele waardes die in de hele config file gebruikt worden zoals b.v. je subnet.
- 2. Configuratie Parameters. Deze parameters worden gebruikt om SNORT te laten werken zoals jij dat vereist. Sommige opties zijn ook via de SNORT CLI te gebruiken.
- 3. Preprocessor configuratie. Preprocessors worden gebruikt om bepaalde acties uit te voeren voordat een pakket wordt verwerkt door de main snort engine.
- 4. Output Module Configuratie. Deze configuratie bepaald hoe SNORT output wordt weggeschreven.
- 5. New Action Types. Als de standaard actietypen niet afdoende zijn dan kun je hier aangepaste actietypen definiëren.
- 6. Rule Config & Include Files. Hoewel je regels kunt toevoegen aan het configuratiebestand “snort.conf” is het echter best-practice om voor regels afzonderlijke bestanden te maken. Deze bestanden worden vervolgens opgenomen in het SNORT configuratiebestand met het sleutelwoord “include”.
Laten we eens wat changes gaan maken.

De eerste variabele die we aanpassen is de HOME_NET variabele. Deze variabele stel je in om je privé subnet af te kaderen. Vervolgens definiëren we ook de EXTERNAL_NET variabele waarbij we zeggen dat dit alles is behalve het HOME_NET netwerk (!$HOME_NET). Wil je meerdere subnetten definiëren dan zetten we deze tussen brackets: [10.10.4.0/24,10.10.5.0/24]:

Vervolgens uncommenten we de volgende regels en veranderen we de paden naar de juiste Windows paden:

Dat doen we hier ook:

En ook voor de dynamic preprocessor en dynamic engine:

Omdat we in dit geval SNORT als IDS / Sniffer gebruiken kunnen we de volgende preprocessor opties uitschakelen:

Op Windows schakelen we de volgende regel uit omdat deze niet compiled in het Windows package zit en fouten retourneert als SNORT gestart wordt:

De volgende preprocessor optie willen we wel graag gebruiken:

Nu wordt het tijd om onze whitelist en blacklist te configureren. In de config file verwijzen we naar de juiste bestanden en we zorgen dat deze bestanden aangemaakt worden:

De local rules laten we functioneel maar alle overige extra rules zetten we uit (voor nu):

De decoder en preprocessor rules wordt hier geactiveerd:

De basis SNOR configuratie is nu helemaal klaar. Nu kunnen we SNORT gaan testen. Allereerst is het zaak om uit te vogelen welke NIC we moeten gebruiken om SNORT op te laten scannen. Om met SNORT te werken moet je altijd in de SNORT BIN directory zijn. Voordat je een commando uitvoert ga je hier naartoe via:
cd c:\Snort\bin |
Om de beschikbare netwerk adapters te zien gebruik je het volgende commando:
snort -W |

In ons geval willen we adapter 3 gebruiken. Voordat we SNORT gaan starten willen we eerst de configuratiefile valideren. Dit doen we met onderstaande commando:
snort -i 3 -c c:\Snort\etc\snort.conf -T |

SNORT kunnen we op interface 3 starten met onderstaande commando:
snort -i 3 -c c:\Snort\etc\snort.conf -A console |
In dit commando definiëren we de interface (3) en verwijzen we SNORT naar het configuratiebestand zodat SNORT de juiste variabelen en rulesets kan gebruiken. Tenslotte kiezen we voor optie “-A”, de “alert mode”. Deze stellen we in op “Console”. De output wordt dus naar de console gestuurd. Dit ziet er als volgt uit:

Om SNORT te stoppen gebruiken we simpelweg de toetscombinatie “CTRL+C”.
Nu we SNORT geïnstalleerd en geconfigureerd hebben zijn we klaar om beter te kijken naar de CLI commando’s en de SNORT rules.
SNORT CLI Commands
Om SNORT beter te begrijpen is het zinvol om eerst de CLI mogelijkheden te bekijken. De CLI commando’s geven een goede indicatie van de kracht van SNORT. We hebben gezien hoe we de SNORT configuratie testen en hoe we SNORT starten. Nu gaan we een aantal andere interessante opties bekijken.
In de basis is SNORT een sniffer. Om simpelweg alle headers van alle pakketten te zien die langst de NIC komen gebruiken we de “-v” flag:
snort –v –i 3 |
Om ook werkelijke de payloads / data te zien voeg je de “-d” optie toe
snort –vd -i 3 |
Om de data van de link layer headers ook te bekijken voeg je de “-e” optie toe:
snort –vde –i 3 OF snort –dev –i 3 OF snort -v -d –e –i 3 |
Het is fijn om al die pakketjes te zien maar de kans is klein dat je voldoende tijd hebt om hier analyse op uit te voeren. Dit is waarom we de pakketjes willen loggen en opslaan. Om ervoor te zorgen dat SNORT weet wat zijn eigen home netwerk is en pakketten dus relatief “juist gestapeld” worden voegen we ook die informatie toe met de “-h” flag. Snort zal nu de pakketten loggen in directories welke de naam dragen van het IP adres van de verzendende partij:
snort -v -d –e –i 3 -l c:\snort\logs -h 192.168.1.0/24 |
Het kan echter lastig zijn om veel verschillende pakketten te analyseren. In dat geval kun je beter pakketten loggen in een enkel bestand. In dat geval gebruiken we de “binary” mode om te loggen in een binary logfile net zoals TCPDump dit doet. Omdat nu de volledige pakketten gelogd worden is het niet meer nodig om de “-dev” flags toe te voegen. Ook is het “home network” hier overbodig.
snort -i 3 -l c:\snort\logs -b |
Binary logs kunnen uitgelezen worden door andere tools zoals TCPDump en Wireshark. Ook SNORT kan pakketten inlezen met de read flag. Dit doe je als volgt:
snort -dv -r c:\snort\logs\packet.log |
Je kunt ook het BPF filter toepassen om speciale pakketten uit te lezen. Om alleen ICMP verkeer te zien gebruik je:
snort -dvr -r c:\snort\logs\packet.log icmp |
Nu ben je op het punt waarop de NIDS functie van SNORT een stuk duidelijker wordt. In plaats van het loggen van alle pakketten zorgt de NIDS functie ervoor dat alleen specifieke pakketten welke gedefinieerd zijn binnen de IDS regels worden opgenomen. Zoals we al eerder hebben gedaan activeren we de NIDS mode door de “snort.conf” file te definiëren met de -c flag. In NIDS mode kun je eveneens kiezen voor een alerting (-A) optie. Hierin hebben we de keuze uit:
- full – Dit is de default mode, dus wordt ook gebruikt als je niets specificeert. Deze mode logt het volledige pakket.
- fast – Deze mode logt alleen de timestamp, datum, de alert melding en de source + destination IP’s.
- unsock – Deze mode verstuurd de pakketten door naar een andere UNIX socket alwaar een ander programma deze kan oppakken en verwerken.
- CONSOLE = Schrijf de output naar het scherm en niet naar een logbestand.
- none – Zet de alerting mode uit.
Door het toevoegen van de –b flag kunnen we de pakketten eveneens weer in binary mode loggen (mijn default optie). Het mooie is dat alerts ook doorgestuurd kunnen worden naar andere workstations. Bijvoorbeeld:
- -M = Windows workstation to send alert to
- -s = Send tot syslog
snort -c snort.conf -b -M %WORKSTATION(S)% |
Er zijn uiteraard nog veel meer mogelijkheden. Bekijk deze via het “snort -help” commando.
SNORT Rules
Nu je een goed idee hebt van de SNORT basis gaan we dieper in de SNORT rules duiken. Vanaf nu gebruiken we dus alleen de NIDS functie als we SNORT aanroepen. In de basis heeft een SNORT regel de volgende opbouw:
Rule Header:
- Regel actie – Wat moet er gebeuren als een pakket aan de regel voldoet. Kies hier voor “alert” om een alert te genereren of voor log om het alert weg te schrijven in een logbestand.
- IP Protocol
- Source IP
- Source poort
- Traffic flow
- Destination IP
- Destination poort
Rule opties (tussen haakjes):
- msg = Het bericht dat bij de alert moet komen.
- content = Zoek in het geretourneerde pakket naar deze specifieke content
- sid = Snort rule ID. Gebruik een uniek ID boven de 1000000. Alle regels t/m 1000000 zijn gereserveerd voor SNORT.
- rev = Revisienummer. Gebruik de “rev” optie om gemakkelijker beheer op je regels uit te voeren.
- classtype = Dit definieert de regel binnen een specifieke SNORT categorie. Dit is makkelijk om regels te sorteren en classificeren.
Zoals we al gezien hebben kun je regels wegschrijven in het “rules.local” bestand. Het voordeel van de NIDS functie is dat alle gedefinieerde variabelen uit de snort.conf file gewoon gebruikt kunnen worden in de SNORT regels.
Neem een kijkje naar de volgende regel:
alert icmp any any -> $HOME_NET any (msg:”ICMP test”; sid:1000001; rev:1; classtype:icmp-event;) |
Deze regel kun je als volgt lezen:
Er wordt een alert gegenereerd wanneer er een ICMP pakket arriveert welke verstuurd is vanuit een willekeurig IP adres over een willekeurige poort en ontvangen wordt binnen het gedefinieerde “home network” op een willekeurige poort. Als de alert gegenereerd wordt dan wordt deze gegenereerd met een ID van 1000001, revisie 1 en als classificatie “icmp-event”. Het bericht dat bij de alert vermeld wordt is “ICMP test”.
Om een FTP attempt alert te ontvangen welke afkomstig is van een willekeurig IP adres zou je de volgende regel kunnen maken. Deze volgt dezelfde stappen en opties:
alert tcp any any -> $HOME_NET 21 (msg:”FTP connection attempt”; sid:1000002; rev:1;) |
Wanneer men via FTP probeert in te loggen op een eigen FTP server zal deze FTP server het volgende bericht retourneren als de inlog onjuist is: “Login or password incorrect”. Met deze informatie kunnen we een SNORT regel maken die alleen een alert genereert als er een pakket uitgestuurd wordt met deze content. Hiervoor gebruiken we de “content” toevoeging:
alert tcp $HOME_NET 21 -> any any (msg:”FTP Failed Login Attempt”; content:”Login or password incorrect”; sid:1000002; rev:1;) |
Laten we het eens hebben over backslashes “\”. Backslashes komen op 2 manieren van pas binnen SNORT. Allereerst om speciale karakters te escapen. Zo kunnen we b.v. backslashes in een pad gewoon gebruiken door deze te escapen. B.v.:
alert tcp any any -> $HOME_NET any (msg:”XBURX Trojan dropper”; content:”c:\\temp\\xburx.exe”; sid:1000003; rev:1;) |
In SNORT bestaat een regel normaal uit een single-line. De backslash maakt het ook mogelijk om een multi-line SNORT regel te maken. Zo kun je de rule-options op een separate regel plaatsen voor betere leesbaarheid:
alert tcp any any -> $HOME_NET any \ (msg:”XBURX Trojan dropper”; content:”c:\\temp\\xburx.exe”; sid:1000003; rev:1;) |
Naast de “content” kunnen we nog een aantal andere zaken toevoegen aan de rule-options. Denk aan:
- ”flow” – De flow flag wordt gebruikt in combinatie met TCP-stream flow. Met de flow toevoeging kunnen regels worden getriggerd die alleen van toepassing zijn op bepaalde richtingen van de verkeersstroom.
- ”reference” – De “reference” flag is een ander vrij invulveld welke bedoeld is om referenties naar andere bronnen te noteren zoals b.v. een bepaalde CVE.
- ”classtype” – Met de classtype flag wordt aangegeven wat het effect van een succesvolle aanval is.
- ”pcre” – De PCRE toevoeging is een belangrijke toevoeging omdat nu regels geschreven kunnen worden middels Perl regex parameters en dus meer complexiteit kunnen bevatten. PCRE is een toevoeging of vervanging van de “content” flag.
- ”bytes_test” – Door deze flag mee te geven kan een bepaalde binaire waarde worden getest tegen een specifiek aantal bytes. Als de test slaagt zal de regel worden geactiveerd.
Dan is er nog een toevoeging aan de “content” flag. Deze toevoeging zorgt ervoor dat je niet door de hele payload hoeft te zoeken maar slechts in een beperkt deel. Dit bevordert de snelheid. Om dit te doen gebruik je een bepaalde offset (distance). Dit betekent na hoeveel bits v.a. het begin van de payload het zoeken naar de opgegeven content begint. Vervolgens kun je ook een bepaalde diepte (within) opgeven. Hier geef je op hoeveel bits doorzocht moeten worden nadat het zoeken begint.
Een regel met een geavanceerde rule-options set zou eruit kunnen zien als onderstaande voorbeeld. Deze SNORT regel is speciaal gemaakt om de CVE-2019-19781 directory traversal POST commando’s te ondervangen die tegen een Citrix Netscaler kunnen worden uitgevoerd om deze te exploiten. Uiteraard zijn de up-to-date Netscalers hier niet meer vatbaar voor maar op het moment dat er nog geen patch was tegen deze publiekelijke exploit was deze regel essentieel in de bestrijding. Zoals je ziet kun je de regel laten matchen op meerdere “content” waardes.
alert tcp any any -> any any / (sid: 1019781; msg: "SERVER-WEBAPP Citrix ADC NSC_USER directory traversal attempt"; / content: "NSC_USER:"; fast_pattern; content: "NSC_USER:"; http_header; content: "/../"; http_header; / content: "POST"; http_method; content: "NSC_NONCE:" ; http_header; content: ".pl"; http_uri; / content: "/vpns/"; http_uri; reference:cve,2019-19781; classtype: web-application-attack) |
Naast het maken van je eigen regels zijn er ook publieke regels op de markt. Weet je nog dat we in het begin, in de snort.conf file heel veel regels hebben uitgequote en alleen onze eigen custom_rules hebben laten staan? Al deze regels verwijzen naar andere “rule” files waar al custom rules in gedefinieerd zijn. Deze regels zijn te vinden in de “c:\snort\rules” folder. Wanneer je custom rules download kun je deze op dezelfde manier activeren. Plaats ze in de “rules” folder en verwijs ernaar in het “snort.conf” bestand door de volgende regel toe te voegen:
include $RULE_PATH/my-custom-ruleset.rules |
Conclusie
Zoals je in deze post hebt gezien is SNORT een veelzijdige tool die meer kan dan simpelweg “alarmeren”. De NIDS functie is prima, zeker wanneer je als betalende gebruiker altijd over de nieuwste rules beschikt. Voor mij zit de kracht van SNORT echter in het feit dat ik hem kan laten triggeren op een specifieke regel. Heel vaak wil ik een specifieke actie binnen het netwerk zien en ontdekken en daar is SNORT fantastisch voor. Daarnaast is het een prima packet sniffer dus als hij toch geïnstalleerd is 🙂 SNORT is een van die varkentjes die je moet knuffelen tot het krulstaartje recht is geworden!
Zoals altijd sluit ik af met de vraag om je waardering voor deze post te uiten in een leuke share op je eigen website of social media kanaal. Een thumbs-up of een leuk bericht wordt natuurlijk ook heel erg gewaardeerd! Positieve feedback zorgt voor meer posts in de toekomst 🙂 Heel erg bedankt!