ADMIN

2022

10

2022-09-29T12:00:00

Datensicherheit

SCHWERPUNKT

090

Tool

Sicherheit

Snort

Eindringlinge mit Snort 3 aufspüren

Die Fährte aufnehmen

von Thorsten Scherf

Veröffentlicht in Ausgabe 10/2022 - SCHWERPUNKT

Snort ist ein Intrusion Prevention System, um Auffälligkeiten im Netzwerkverkehr zu identifizieren und Gegenmaßnahmen einzuleiten. Das Open-Source-Tool erfreut sich seit Jahren großer Beliebtheit und kommt mittlerweile auch in vielen IDS/IPS-Appliances zum Einsatz. Unser Workshop zeigt, wie Sie das Tool konfigurieren und welche Neuerungen das aktuelle Release 3 mitbringt.

Anders als reine Intrusion Detection Systeme (IDS), die lediglich eine Protokollierung des Netzwerkverkehrs durchführen, verhindert ein Intrusion Prevention System (IPS) die Weiterleitung von Datenpaketen im Rahmen eines Angriffs und schützt somit aktiv vor Einbrüchen und Attacken auf schützenswerte Systeme. Hierfür muss das IPS natürlich Zugriff auf den kompletten Datenverkehr erhalten, der über einen Router oder Switch läuft. Eine IPS-Software befindet sich somit entweder direkt auf den Routern oder liest den Datenverkehr über den Monitoring-Port eines Switches mit. Hierfür kommt entweder eine dedizierte Hardware-Appliance, wie beispielsweise "Secure IPS" von Cisco [1], oder eine Software auf einem regulären Computersystem zum Einsatz, die den kompletten Netzwerkverkehr mitlesen kann. In diesem Workshop beleuchten wir das softwarebasierte Snort [2].
Erkennen von Angriffsmustern
Ein netzwerkbasiertes IDS/IPS versucht in der Regel, Angriffe und Einbruchsversuche anhand bestimmter Muster zu erkennen. Diese sind meist in umfangreichen Regelwerken oder Datenbanken hinterlegt. Da viele Angriffe heutzutage auf der Applikationsebene stattfinden, muss ein IDS/IPS also das Applikationsprotokoll verstehen. Als einfaches Beispiel kann hier die URL-Kodierung dienen: Da der Angriff auch über mehrere Datenpakete verteilt laufen kann, muss das System in der Lage sein, diese Pakete in der richtigen Reihenfolge wieder zusammenzusetzen und eine Analyse auf dem kompletten Datenstrom durchzuführen.
Eine Anomalieerkennung schlägt immer dann Alarm, wenn ein auffälliges Verhalten im Netzwerk beobachtet wird. Dies kann der Fall sein, wenn als Teil von einem Portscan sehr viele Pakete von der gleichen IP-Adresse an unterschiedliche Ports gesendet werden. Der Detektor sollte dies auch dann erkennen, wenn die Pakete zeitversetzt versendet werden. Um den immensen Datenmengen, die heutzutage über Netzwerke fließen, gerecht zu werden, muss ein IDS/IPS natürlich auch über ein ausgeklügeltes Thread-Modell verfügen, um auch jedes einzelne Datenpaket inspizieren zu können.
Anders als reine Intrusion Detection Systeme (IDS), die lediglich eine Protokollierung des Netzwerkverkehrs durchführen, verhindert ein Intrusion Prevention System (IPS) die Weiterleitung von Datenpaketen im Rahmen eines Angriffs und schützt somit aktiv vor Einbrüchen und Attacken auf schützenswerte Systeme. Hierfür muss das IPS natürlich Zugriff auf den kompletten Datenverkehr erhalten, der über einen Router oder Switch läuft. Eine IPS-Software befindet sich somit entweder direkt auf den Routern oder liest den Datenverkehr über den Monitoring-Port eines Switches mit. Hierfür kommt entweder eine dedizierte Hardware-Appliance, wie beispielsweise "Secure IPS" von Cisco [1], oder eine Software auf einem regulären Computersystem zum Einsatz, die den kompletten Netzwerkverkehr mitlesen kann. In diesem Workshop beleuchten wir das softwarebasierte Snort [2].
Erkennen von Angriffsmustern
Ein netzwerkbasiertes IDS/IPS versucht in der Regel, Angriffe und Einbruchsversuche anhand bestimmter Muster zu erkennen. Diese sind meist in umfangreichen Regelwerken oder Datenbanken hinterlegt. Da viele Angriffe heutzutage auf der Applikationsebene stattfinden, muss ein IDS/IPS also das Applikationsprotokoll verstehen. Als einfaches Beispiel kann hier die URL-Kodierung dienen: Da der Angriff auch über mehrere Datenpakete verteilt laufen kann, muss das System in der Lage sein, diese Pakete in der richtigen Reihenfolge wieder zusammenzusetzen und eine Analyse auf dem kompletten Datenstrom durchzuführen.
Eine Anomalieerkennung schlägt immer dann Alarm, wenn ein auffälliges Verhalten im Netzwerk beobachtet wird. Dies kann der Fall sein, wenn als Teil von einem Portscan sehr viele Pakete von der gleichen IP-Adresse an unterschiedliche Ports gesendet werden. Der Detektor sollte dies auch dann erkennen, wenn die Pakete zeitversetzt versendet werden. Um den immensen Datenmengen, die heutzutage über Netzwerke fließen, gerecht zu werden, muss ein IDS/IPS natürlich auch über ein ausgeklügeltes Thread-Modell verfügen, um auch jedes einzelne Datenpaket inspizieren zu können.
Schließlich ist sicherzustellen, dass die Meldungen, die das IDP/IPS generiert, abrufbar sind. Im einfachsten Fall handelt es sich hierbei um Logdateien, wünschenswert jedoch wären die Integration in ein Monitoringtool und eine Visualisierung der Daten.
Die Anfänge von Snort
Die erste Snort-Version kam bereits 1998 auf den Markt. Als federführender Entwickler war damals Martin Roesch zuständig, der die Software für Unix- und Linux-Systeme für jedermann frei verfügbar unter der GPL-Lizenz angeboten hat. Mit Sourcefire gründete Martin Roesch schließlich eine Firma mit Fokus auf den Bereich Intrusion Detection und Prevention. Diese veröffentlichte dann auch eine kommerzielle Variante der Snort-Software. Im Jahr 2007 kaufte Sourcefire dann den Anbieter des bekannten Antiviren-Programms ClamAV [3], um sein Portfolio auszuweiten. Im Gegenzug jedoch wurde Sourcefire nur wenige Jahre später (2013) von Cisco übernommen.
Ebenso wie für ClamAV stellt Cisco immer noch eine Open-Source-Variante für Snort zur Verfügung [4,5]. Die zu Cisco gehörende Talos-Gruppe [6], die primär für das Thema Cyber Threat Intelligence (CTI) zuständig ist, bietet allerdings kostenpflichtige Regelwerke für Snort an. Anders als die "Community Rules" verspricht Cisco, dass sogenannte "Subscriber Rules" ausschließlich von Cisco Talos entwickelt, getestet und verifiziert sind und somit mutmaßlich einen höheren Qualitätsstandard aufweisen als die reinen Community-Regeln. Und natürlich setzt Cisco die Snort-Software auch auf den eigenen Secure-IPS-Appliances ein.
Drei Modi zur Auswahl
Snort stellt drei unterschiedliche Modi zur Verfügung. Der Sniffer-Modus ermöglicht die Echtzeitüberwachung von Datenpaketen im Netzwerk. Dies können Sie mit Tools wie tcpdump oder Wireshark vergleichen. Des weiteren bietet Snort einen Logging-Modus. Dieser sorgt dafür, dass Sie die einzelnen Datenpakete nicht nur angezeigt bekommen, sondern diese auch gespeichert werden. Und schließlich dient der NIDS-Modus (Network Intrusion Detection System) dafür, aktive Angriffe zu erkennen und Gegenmaßnahmen einzuleiten. Wie Sie vielleicht schon vermuten, ist der NIDS-Modus sehr komplex und bringt eine Vielzahl von Konfigurationsmöglichkeiten mit.
Die eigentliche Snort-Engine kümmert sich allerdings nicht um die Inspektion der einzelnen Datenpakete. Hierfür stehen unterschiedliche Plug-ins zur Verfügung, die sich auf bestimmte Bestandteile eines Datenpakets konzentrieren. Für das Zusammensetzen mehrerer Datenpakete und deren Analyse kommen je nach eingesetzter Version sogenannte Präprozessoren oder Inspektoren zum Einsatz. Somit gelingt eine Analyse auch bei fragmentierten Datenpaketen.
Das modulare Konzept von Snort erlaubt ferner für das Logging und Alerting, auf unterschiedliche Plug-ins zurückzugreifen. Hierdurch ist letztendlich auch die Entwicklung von unterschiedlichen Interfaces zur Visualisierung und Weiterverarbeitung der Snort-Meldungen möglich. Als Beispiel soll an dieser Stelle das Monitoringtool Splunk dienen. Da Snort die Meldungen bei Bedarf im JSON-Format zur Verfügung stellt, lassen sich diese in das von Splunk verwendete Common Information Model (CIM) umwandeln und schließlich innerhalb von Splunk darstellen.
Neues in Snort 3
Derzeit existieren zwei Hauptversionen von Snort. Snort 2 wird mittlerweile als Legacy bezeichnet, erhält jedoch noch vollständigen Support und auch neue Funktionen finden regelmäßig Einzug in diese Release-Reihe. Die aktuelle Version 2.9.20 wurde im Mai 2022 veröffentlicht. Mit Snort 3 kam Ende 2020 eine neue Versionsreihe heraus, die eine große Menge an neuen Features anbietet und auch im Bereich Performance die alten Versionen weit hinter sich lässt. Dies liegt vor allem auch daran, dass die neue Version komplett neu in C++, statt wie bisher in C, implementiert wurde. Durch diesen Rewrite der Software konnten die Entwickler nun auch endlich viele alte Zöpfe abschneiden.
So kann Snort nun Pakete in mehreren Threads unabhängig voneinander bearbeiten. Auch das Pattern Matching mittels PCRE-Analyse (Perl Compatible Regular Expressions) funktioniert nun wesentlich performanter als bisher, was wohl primär am Einsatz der Hyperscan-Bibliothek von Intel liegt. Da Snort nun auch Realtime Network Awareness (RNA) unterstützt, erkennt die Software Applikationsprotokolle komplett selbstständig, sodass Regeln für bestimmte Protokolle nicht mehr zwingend mit einem fixen Port verbunden werden müssen.
Generell ist die komplette Architektur der neuen Version modular aufgebaut, sodass Sie die gewünschten Funktionen mit Hilfe von Plug-ins und Modulen je nach Bedarf aktivieren oder deaktivieren können und ebenfalls eine granulierte Konfiguration der gewünschten Funktionen vornehmen können. Die aktuelle Version 3.1.32.0 [7] kam im Juni 2022 heraus. Wer jetzt neu mit Snort beginnen möchte, dem empfehlen wir, direkt mit Snort 3 loszulegen.
Installation von Snort
Aktuell bieten die wenigsten Linux-Distributionen fertige Snort-3-Pakete zur einfachen Installation aus den Repositories der Distribution an. Von daher ist aktuell in den allermeisten Fällen die Installation aus dem Quellcode heraus notwendig. Damit dies funktioniert, ist eine Vielzahl von Abhängigkeiten zu erfüllen. Auf der Snort-Webseite gibt es einige Anleitungen [8] für die Installation auf Cent­OS Stream, OpenSuSE, Oracle Linux und FreeBSD. Diese stellen jedoch auch eine gute Grundlage für die Installation auf anderen Plattformen dar.
Hat die Installation soweit geklappt, geht es an die Konfiguration der Software. Wer schon Snort 2 kennt, dem werden sicherlich die neuen Konfigurationsdateien auffallen und auch die Syntax, die in diesen Dateien zum Einsatz kommt. Die Entwickler setzen von nun an komplett auf die imperative Skriptsprache Lua [9], was die Lesbarkeit der Dateien doch enorm steigert. Aber natürlich kommt diese Änderung auch mit einer gewissen Einarbeitungszeit daher, zumal auch keine Abwärtskompatibilität mit älteren Versionen vorhanden ist. Haben Sie also bereits eine Snort-2-Installation und möchten nun auf Version 3 aktualisieren, ist hierfür auch die Konfigurationsdatei "snort.conf" in Lua umzuwandeln. Dazu existiert das Werkzeug "snort2lua", das Sie wie folgt aufrufen, um die Umwandlung der Konfigurationsdatei in das Lua-Format durchzuführen:
snort2lua -c snort.conf -o snort.lua
Sollten dabei Fehler auftreten, werden diese in der Datei "snort.rej" protokolliert. Sie können die Probleme dann inspizieren und in der Konfigurationsdatei beheben. Grundsätzlich gilt, dass Sie nach der Umwandlung der Datei einen Syntax-Check ausführen sollten. Hierfür rufen Sie snort2lua einfach mit der Option "-T" auf:
snort -c snort.lua -T
Praktisch ist, dass Sie mit snort2lua auch direkt Ihre Snort-Regeln in ein neues Format umwandeln können:
snort2lua -c snort2.rules -r snort3.rules
Auch wenn die Syntax der Snort-2-Regeln als eine Art Industriestandard für IDS/IPS-Regeln gilt, sind diese nicht wirklich leicht zu lesen. Listing 1 zeigt ein Beispiel für zwei Regeln auf Basis der bisher verwendeten Syntax. In Listing 2 sehen Sie dann die Regel nach der Umwandlung in das von Snort 3 verwendete Format. Administratoren einer Cisco-Secure-IPS-Appliance können die Verwaltung der Regeln, inklusive der Umwandlung in das neue Format, übrigens auch bequem aus der Webkonsole der Appliance heraus ausführen, ohne dafür auf die Kommandozeile wechseln zu müssen.
Listing 2: Snort-3-Regeln
alert file (       msg:"MALWARE-OTHER Win.Ransomware.Agent payload download attempt";       file_data;       content:"secret_encryption_key",fast_pattern,nocase;      classtype:trojan-activity; sid:3; )
Listing 2: Snort-3-Regeln
alert file (       msg:"MALWARE-OTHER Win.Ransomware.Agent payload download attempt";       file_data;       content:"secret_encryption_key",fast_pattern,nocase;      classtype:trojan-activity; sid:3; )
Unterschiedliche Regelwerke
Grundsätzlich bietet Snort zwei unterschiedliche Arten von Regelwerken an. Die von der Community entwickelten Regeln, die allesamt unter der GPLv2-Lizenz veröffentlicht werden, stehen kostenfrei zum Download zur Verfügung. Seit Juni 2022 werden diese allerdings nicht mehr täglich, sondern nur noch Dienstags und Donnerstags aktualisiert. Wer eine kostenpflichtige Subskription erwirbt, erhält Zugriff auf die sogenannten Subscriber-Regeln, die von Cisco Talos entwickelt, getestet und verifiziert werden.
Je nach Subskription liegen die Kosten hierfür zwischen 29,99 US-Dollar (Personal) und 399 Dollar (Business) pro Jahr. Bei der Business-Variante fallen die Kosten pro Snort-Sensor an. Dafür erhalten Sie dann allerdings Zugriff auf die Regeln, sobald diese von Talos freigegeben wurden.
Wer das Geld sparen, aber trotzdem vom hohen Qualitätsstandard der Talos-Regeln profitieren möchte, kann auf der Snort-Webseite einen sogenannten "Oinkcode" erzeugen – ein Anspielung auf das Snort-Logo. Anschließend ist ein Download der Regeln für registrierte Benutzer möglich. Es handelt sich dabei um die gleichen, die auch zahlende Kunden erhalten, allerdings werden diese mit einer Verzögerung von 30 Tagen freigeschaltet.
Da Zeit im IDS/IPS-Umfeld immer eine kritische Komponente ist, stellt diese Zeitverzögerung einen immensen Nachteil dar. Dies gilt gerade auch dann, wenn es darum geht, Zero-Day-Attacken zu erkennen und abzuwehren – also Angriffe, bei denen das Vorgehen zwar bekannt ist, wofür allerdings noch keine Updates der Hersteller zur Verfügung gestellt wurden, um die entsprechende Schwachstelle zu schließen.
Der Download der Regeln für registrierte Benutzer mithilfe des individuellen Oinkcodes ist ganz einfach über wget oder curl möglich:
wget https://www.snort.org/rules/<Datei>?oinkcode=<Oinkcode>
Die jeweils aktuellen Regeldateien finden Sie auf der Snort-Webseite [10]. Haben Sie sich mit Ihrem Account auf der Seite angemeldet, sehen Sie dort direkt die kompletten Download-Links inklusive Ihres Oinkcodes aufgeführt. Alternativ können Sie den Download der Regeln auch automatisieren. Mit Pulled Pork [11] steht hierfür ein Skript zur Verfügung, das Sie leicht mittels cron nach dem Release neuer Regeln starten können. In der Konfigurationsdatei des Skripts tragen Sie dann nur noch Ihren Oinkcode ein und der Download der jeweils aktuellen Regeln erfolgt von nun an automatisch.
Regeln für Snort hinterlegen
Snort sucht nach den Regeln in einem Pfad, den Sie in der neuen Konfigurationsdatei "snort_defaults.lua" eintragen:
RULE_PATH = '/usr/local/snort/rules/'
BUILTIN_RULE_PATH = '/usr/local/snort/builtin_rules/'
In der Datei "snort.lua" lassen sich die Regeln dann in der Konfiguration für das IPS-Modul einbinden:
 ips =
{
           mode = tap,
          enable_builtin_rules = true,
           variables = default_variables,
           include = RULE_PATH .. "/snort.rules",
           include = BUILTIN_RULE_PATH .. "/builtins.rules",
}
Die Datei "snort_defaults.lua" verwenden Sie in Snort 3 auch für die Definition von anderen Default-Variablen, die in früheren Versionen immer in der Standardkonfigurationsdatei "snort.conf" gepflegt wurden. Lediglich die Einstellungen für "HOME_NET" und "EXTERNAL_NET" tragen Sie immer noch in "snort.lua" ein, alle weiteren Defaults liest Snort mithilfe einer include-Anweisung aus der Datei "snorts_defaults.lua" ein.
Netzwerkinterface konfigurieren
Bevor Sie nun erste praktische Tests mit Snort durchführen, sollten Sie sicherstellen, dass das Werkzeug auch sämtliche Datenpakete aus Ihrem Netzwerksegment sieht. Hierfür aktivieren Sie den Promiscuous-Modus auf dem gewünschten Interface mit Hilfe des ip-Tools:
ip link set dev ens3 promisc on
Der folgende Aufruf bestätigt nun, dass der Modus aktiv ist:
ip a s
 
2: ens3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
[...]
Des Weiteren bietet es sich an, das Off-loading von Datenpaketen an das Interface zu deaktivieren, da es ansonsten durch die Veränderung des Datenstreams zu ungewollten Nebeneffekten kommen kann. Die Einstellungen für das Interface nehmen Sie mittels ethtool vor:
ethtool -K ens3 gro off
 
ethtool -L ens3 bro off
Hierbei handelt es sich jedoch um temporäre Änderungen. Damit die Änderungen auch einen Neustart überleben, tragen Sie diese in der Konfigurationsdatei für Ihre Netzwerkkarte ein oder sorgen dafür, dass die Befehle bei jedem Neustart des Systems erneut ausgeführt werden.
Module und Plug-ins
In Snort 3 stellen Plug-ins und Module eine weitere wichtige Neuerung der Software dar. Snort verwendet Plug-ins nun an vielen unterschiedlichen Stellen im Software-Stack. So existieren beispielsweise unterschiedliche Erweiterungen für die Dekodierung und Normalisierung von Datenpaketen, für die unterschiedlichen Inspektoren (früher auch Präprozessoren) und das Logging. Eine vollständige Liste sämtlicher Plug-ins mit einer kurzen Beschreibung erhalten Sie mit dem folgenden Befehl:
snort --help-plugins
Plug-ins können Sie entweder dynamisch beim Aufruf von Snort aktivieren oder statisch in der Konfigurationsdatei "snort.lua" hinterlegen. Listing 3 zeigt die zur Verfügung stehenden Plug-ins für das Logging. Möchten Sie nun beispielsweise sämtliche Logmeldungen im JSON-Format abspeichern, verwenden Sie hierfür einfach das Plug-in "alert_json". In der Datei "snort. conf" erzeugen Sie hierfür die folgende LUA-Tabelle:
alert_json =
{
      file = true
}
Listing 3: Plug-ins für das Logging
# bin/snort --list-plugins|grep logger logger::alert_csv v0 static logger::alert_fast v0 static logger::alert_full v0 static logger::alert_json v0 static logger::alert_syslog v0 static logger::alert_talos v0 static logger::alert_unixsock v0 static logger::log_codecs v0 static logger::log_hext v0 static logger::log_pcap v0 static logger::unified2 v0 static
Zu Testzwecken können Sie beim Starten auch einen alternativen Logordner mit angeben. Diesen müssen Sie allerdings zuerst anlegen, da Snort ansonsten direkt wieder mit einem Fehler beendet wird. Im Anschluss starten Sie Snort dann im NIDS-Modus auf dem gewünschten Interface mit
snort -c /etc/snort/snort.lua -i ens3 -l logs/
 Snort speichert sämtliche Alerts nun im JSON-Format:
file logs/alert_json.txt
logs/alert_json.txt: JSON data
Möchten Sie die Konfiguration stattdessen lieber dynamisch auf der Kommandozeile verändern, so können Sie hierfür auf die Option "--lua" zurückgreifen:
snort -c /etc/snort/snort.lua -l logs/ -i ens3 --lua 'alert_json = { file = true }'
Ganz ähnlich sieht es auch mit den Snort-3-Modulen aus. Eine komplette Übersicht erhalten Sie mit
snort --help-modules
Möchten Sie sich die Hilfe zu einem Modul anzeigen lassen, rufen Sie Snort einfach mit der Option "--help-module", gefolgt vom Modulnamen auf:
snort --help-module reject
In der Hilfe bekommen Sie auch jeweils die Konfigurationsoptionen zu den einzelnen Modulen angezeigt. Diese können Sie dann entweder wieder in der Konfigurationsdatei hinterlegen oder dynamisch beim Aufruf von Snort mit angeben. Hier ein Beispiel für das reject-Modul:
snort -c /etc/snort/snort.lua -l logs/ -i ens3 --lua 'reject = { reset = "both", control = "all" }'
Fazit
Snort 3 ist eine konsequente Weiterentwicklung von früheren Versionen. Durch den Wechsel auf C++, den kompletten Umbau der Architektur und den Einsatz von Modulen und Plug-ins hat sich die Performance aktueller Releases deutlich verbessert. Auch der Einsatz von LUA als Beschreibungssprache für die Konfigurationsdateien und die Möglichkeit einer sehr fein granulierten Konfiguration sämtlicher Module und Plug-ins machen den Umgang mit dem IDS sehr angenehm.
Hervorzuheben ist aber auch, dass die neue Version eine gewisse Einarbeitung erfordert, da bisher kaum ein Linux-Distributor fertige Pakete von Snort 3 anbietet und somit die Installation in den meisten Fällen aus dem Quellcode heraus erfolgen muss. Wer schließlich nach einem alternativen quelloffenen IDS/IPS sucht, um unabhängig von Cicso zu sein, könnte einen Blick auf das ebenfalls beliebte Suricata [12] werfen.
(dr)
Link-Codes
[2] Snort IPS: https://www.snort.org/
[4] Cisco Talos GitHub Repositories: https://github.com/Cisco-Talos/
[8] Snort-3-Installationsanleitungen: https://www.snort.org/documents/
[10] Snort-Splunk-Interface: https://splunkbase.splunk.com/app/4633/
[12] Suricata: https://suricata.io/