Beispielhack:
Hack #86 Schreiben Sie Ihre eigenen Snort-Regeln
Passen Sie Snort an Ihre eigenen Anforderungen schnell und einfach an, indem Sie seine flexible Regel-Engine und -Sprache benutzen.
Eines der besten Features von Snort ist seine Regel-Engine und -Sprache. Die Regel-Engine von Snort stellt eine umfassende Sprache zur Verfügung, die es Ihnen ermöglicht, Ihre eigenen Regeln zu schreiben und Snort so zu erweitern, dass es den Anforderungen Ihres eigenen Netzwerks gerecht wird.
Eine Snort-Regel kann in zwei Hauptbereiche aufgeteilt werden, den Regel-Header und Optionen für die Regel. Der Regel-Header enthält die Aktion, die durchgeführt werden soll, das Protokoll, auf das die Regel anzuwenden ist, sowie die Quell- und Ziel-Adressen und die Ports. Die Regel-Optionen ermöglichen Ihnen, eine beschreibende Meldung zu erstellen, die mit der Regel in Verbindung steht, sowie eine Vielzahl an anderen Paket-Attributen zu überprüfen, indem Sie Gebrauch von der umfassenden Plugin-Bibliothek von Snort machen.
Hier ist die allgemeine Form einer Snort-Regel:
Aktion Protokoll Quell-IP Quell-Port Richtung Ziel-IP Ziel-Port (Optionen)
Wenn ein Paket hereinkommt, werden seine Quell- und Ziel-IP-Adressen sowie die Ports mit den Regeln im Regelsatz verglichen. Wenn irgendwelche von ihnen auf das Paket angewandt werden können, werden die Optionen mit dem Paket verglichen. Wenn all diese Vergleiche eine Übereinstimmung zurückgeben, wird die angegebene Aktion ausgeführt.
Snort stellt mehrere eingebaute Aktionen zur Verfügung, die Sie benutzen können, wenn Sie Ihre Regeln zusammenbauen. Um ein Paket, das auf eine Regel zutrifft, einfach nur mitzuprotokollieren, verwenden Sie die Aktion log. Die Aktion alert generiert eine Alarmmeldung unter Verwendung der Methode, die in Ihrer Konfigurationsdatei oder auf der Kommandozeile angegeben wurde, zusätzlich zur Protokollierung des Pakets. Ein nettes Feature ist, dass Sie sehr allgemeine Regeln haben und dann Ausnahmen dazu erstellen können, indem Sie eine Regel schreiben, die die Aktion pass verwendet. Dies funktioniert insbesondere dann gut, wenn Sie die Regeln einsetzen, die mit Snort herausgegeben werden, aber häufig falsche Positive erhalten. Wenn dies der Fall ist und es kein Sicherheitsrisiko darstellt, diese zu ignorieren, können Sie hierfür einfach eine pass-Regel schreiben.
Die letzten beiden eingebauten Regel-Aktionen werden zusammen eingesetzt, um den Regelsatz von Snort dynamisch zur Laufzeit zu bearbeiten. Es sind die Aktionen activate und dynamic. Regeln, die die Aktion dynamic einsetzen, sind in etwa so wie eine log-Regel, mit der Ausnahme, dass sie nur dann berücksichtigt werden, wenn sie von einer activate-Regel aktiviert wurden. Um dies zu bewerkstelligen, erzwingt Snort die Verwendung der Regel-Optionen activates und activated_by hintereinander, um zu wissen, welche dynamic-Regeln aktiviert werden sollen, sobald eine activate-Regel ausgelöst wurde. Des Weiteren werden dynamic-Regeln benötigt, um eine count-Option für Snort anzugeben, damit eingeschränkt wird, wie viele Pakete die Regel aufzeichnen soll.
Wenn Sie zum Beispiel die Aufzeichnung von Paketen starten möchten, sobald ein Exploit für einen SSH-Daemon auf 192.168.1.21 bemerkt wurde, könnten Sie ein paar Regeln wie die folgenden einsetzen:
activate tcp any any -> 192.168.1.21 22 (content:"/bin/sh"; activates:1; \
msg:"Possible SSH buffer overflow"; )
dynamic tcp any any -> 192.168.1.21 22 (activated_by:1; count:100;)
Diese beiden Regeln sind nicht absolut narrensicher, aber wenn jemand einen Exploit mit Shell-Code gegen einen SSH-Daemon fahren würde, würde er ziemlich sicher die Zeichenkette /bin/sh im Klartext verschicken, um eine Shell auf dem System zu starten, das angegriffen wird. Zusätzlich würden, da SSH verschlüsselt ist, unter normalen Umständen Zeichenketten wie diese nicht an den Daemon geschickt werden. Sobald die erste Regel ausgelöst wurde, wird sie die zweite aktivieren, die wiederum 100 Pakete aufzeichnen wird und dann stoppt. Das ist nützlich, da Sie eventuell dazu in die Lage versetzt werden, den Eindringling dabei zu ertappen, wie er während dieser ersten paar Pakete ein Rootkit herunterlädt oder installiert, und Sie das kompromittierte System viel schneller analysieren können.
Sie können auch benutzerdefinierte Regel-Aktionen definieren, zusätzlich zu denen, die Snort bereits eingebaut hat. Dies wird mit dem Schlüsselwort ruletype gemacht:
ruletype redalert
{
type alert
output alert_syslog: LOG_AUTH LOG_ALERT
output database: log, mysql, user=snort dbname=snort host=localhost
}
Diese Regel-Aktion sagt Snort, dass es sich wie eine alert-Regel-Aktion verhält, aber gibt auch an, dass die Alarmmeldungen an den syslog-Daemon geschickt werden sollten, während die Pakete auf eine Datenbank mitprotokolliert werden. Bei der Definition einer angepassten Aktion können Sie alle Ausgabe-Plugins von Snort benutzen, als würden Sie diese als Ihre primäre Ausgabe-Methode konfigurieren.
Die Detection-Engine von Snort unterstützt mehrere Protokolle. Das Feld Protokoll wird dazu benutzt, um anzugeben, auf welches Protokoll Ihre Regel angewandt wird. Gültige Werte für dieses Feld sind ip, icmp, tcp und udp.
Die nächsten Felder in einer Snort-Regel werden dazu benutzt, um die Quell- und Ziel-IP-Adressen sowie Ports des Pakets anzugeben, sowie die Richtung, in die das Paket reist. Snort kann eine einzige IP-Adresse oder eine Liste von Adressen annehmen. Wenn Sie eine Liste von IP-Adressen angeben, sollten Sie jede davon mit einem Komma abtrennen und die Liste in eckige Klammern setzen, so wie hier:
[192.168.1.1,192.168.1.45,10.1.1.24]
Passen Sie dabei jedoch auf, dass Sie kein Whitespace benutzen. Sie können auch Bereiche von IP-Adressen angeben, indem Sie die CIDR-Notation verwenden, oder auch CIDR-Bereiche in Listen einbinden. Snort ermöglicht es Ihnen auch, den logischen NICHT-Operator ! auf eine IP-Adresse oder einen CIDR-Bereich anzuwenden, um anzugeben, dass die Regel für alle Adressen oder Adressbereiche gelten soll außer diesen.
Wie bei IP-Adressen kann Snort einzelne Ports sowie Bereiche annehmen. Um einen Bereich anzugeben, verwenden Sie einen Doppelpunkt, um die untere Grenze von der oberen Grenze abzutrennen. Wenn Sie zum Beispiel alle Ports von 1 bis 1024 angeben möchten, würden Sie das folgendermaßen machen:
1:1024
Sie können auch den NICHT-Operator auf einen Port anwenden und Sie können einen Bereich an Ports ohne eine untere oder obere Grenze angeben.
Wenn Sie zum Beispiel nur Ports untersuchen möchten, die größer als 1024 sind, würden Sie das auf diese Weise machen:
1024:
Ähnlich könnten Sie Ports kleiner als 1024 folgendermaßen angeben:
:1024
Wenn die IP-Adresse oder der Port keine Rolle spielen, können Sie einfach any angeben.
Im Weiteren wird das Feld Richtung dazu benutzt, Snort zu sagen, welche IP-Adresse und welcher Port die Quelle und welches Paar das Ziel ist. In früheren Versionen von Snort konnten Sie entweder -> oder <- verwenden, um die Richtung anzugeben. Der Operator <- wurde jedoch entfernt, da Sie durch einfaches Vertauschen der IP-Adressen und Portnummern den einen Operator mit dem anderen gleichsetzen können. Snort besitzt jedoch noch einen anderen Richtungsoperator zusätzlich zu ->. Die Angabe von <> als Richtung sagt Snort, dass Sie möchten, dass die Regel bidirektional angewandt wird. Dies ist insbesondere dann nützlich, wenn Sie Protokollierungsregeln oder dynamische Regeln verwenden, da Sie beide Seiten des TCP-Datenstroms protokollieren können statt nur eine Richtung.
Der nächste Teil der Regel enthält die Optionen. Dieser Teil lässt Sie viele weitere Attribute angeben, gegen die geprüft werden soll. Jede Option ist über ein Snort-Plugin implementiert. Wenn eine Regel ausgelöst wird, die eine Option angibt, wird Snort durch das Plugin laufen, das zu der Option gehört, um die Prüfung gegen das Paket auszuführen. Snort besitzt über 40 Plugins - zu viele, um sie in diesem Hack im Detail zu behandeln. Hier sind einige der nützlichsten.
Die nützlichste Option von allen ist msg. Sie ermöglicht Ihnen die Angabe einer benutzerdefinierten Nachricht, die in der Alarmmeldung mitprotokolliert wird, wenn ein Paket entdeckt wird, das auf die Regel passt. Ohne diese Option wären die meisten Alarmmeldungen auf den ersten Blick nicht sehr sinnvoll. Diese Option nimmt als Argument eine Zeichenkette entgegen, die in Anführungszeichen eingeschlossen ist.
Folgendes legt zum Beispiel eine logische Nachricht fest, wann immer Snort irgendwelchen Datenverkehr bemerkt, der von 192.168.1.35 verschickt wird:
alert tcp 192.168.1.35 any -> any any (msg:"Traffic from 192.168.1.35";)
Stellen Sie sicher, dass Ihre Zeichenkette keine Anführungszeichen enthält, die mit einem Escape-Zeichen geschützt sind. Der Parser von Snort ist ein sehr einfacher und unterstützt das Escaping von Zeichen nicht.
Eine weitere nützliche Option ist content, die es Ihnen ermöglicht, ein Paket nach einer Folge von Zeichen oder hexadezimalen Werten abzusuchen. Wenn Sie nach einer Zeichenkette suchen, können Sie diese einfach in Anführungszeichen setzen. Des Weiteren können Sie ein nocase; am Ende all Ihrer Optionen anfügen, wenn Sie eine Suche durchführen möchten, bei der die Groß- und Kleinschreibung nicht berücksichtigt werden soll. Wenn Sie jedoch nach einer Folge von hexadezimalen Zahlen suchen, müssen Sie diese mit |-Zeichen umgeben.
Diese Regel wird ausgelöst, wenn die Zahl 0x90 gefunden wird:
alert tcp any any -> any any (msg:"Possible exploit"; content:"|90|";)
Diese Zahl ist die hexadezimale Entsprechung der NOP-Anweisung auf der x86-Architektur und wird häufig in Exploit-Code angetroffen, da mit ihr Pufferüberlauf-Exploits einfacher geschrieben werden können.
Die Optionen offset und depth können zusammen mit der Option content eingesetzt werden, um den durchsuchten Abschnitt der Nutzdaten auf einen bestimmten Bereich von Bytes einzuschränken.
Wenn Sie die Inhaltsübereinstimmungen für NOP-Anweisungen auf den Datenabschnitt zwischen den Bytes 40 und 75 eines Pakets einschränken möchten, könnten Sie das vorige Beispiel so abändern, dass es folgendermaßen aussieht:
alert tcp any any -> any any (msg:"Possible exploit"; content:"|90|"; \
offset:40; depth:75;)
Sie können auch gegen Pakete prüfen, die die angegebene Folge nicht enthalten, indem Sie ein ! voranstellen. Des Weiteren können viele Shell-Code-Nutzdaten ziemlich groß sein im Vergleich zur normalen Datenmenge, die in einem Paket befördert wird, das an einen bestimmten Dienst geschickt wird. Sie können die Größe der Nutzdatenlast eines Pakets prüfen, indem Sie die Option dsize einsetzen. Diese Option nimmt eine Zahl als Argument entgegen. Des Weiteren können Sie eine Obergrenze angeben, indem Sie den Operator < verwenden, oder Sie können eine Untergrenze wählen, indem Sie den Operator > einsetzen. Ober- und Untergrenzen können mit <> angegeben werden.
Zum Beispiel:
alert tcp any any -> any any (msg:"Possible exploit"; content:"|90|"; \
offset:40; depth:75; dsize: >6000;)
Dies ändert die vorherige Regel so ab, dass sie nur zutrifft, wenn die Größe der Datennutzlast größer als 6000 Byte ist, zusätzlich zu den anderen Optionskriterien.
Um die TCP-Flags eines Pakets zu prüfen, stellt Snort die Option flags zur Verfügung. Diese Option ist insbesondere für das Erkennen von Port-Scans nützlich, die Gebrauch von verschiedenen ungültigen Flag-Kombinationen machen.
Diese Regel zum Beispiel erkennt, wenn die Flags SYN und FIN zur gleichen Zeit gesetzt sind:
alert any any -> any any (flags: SF,12; msg: "Possible SYN FIN scan";)
Gültige Flags sind S für SYN, F für FIN, R für RST, P für PSH, A für ACK und U für URG. Des Weiteren können Sie mit Snort die Werte der beiden reservierten Flag-Bits überprüfen. Sie können diese angeben, indem Sie entweder 1 oder 2 einsetzen. Sie können auch auf Pakete prüfen, bei denen kein Flag gesetzt ist, indem Sie 0 verwenden. Es gibt auch noch weitere Operatoren, die die Option flags akzeptiert. Sie können den Flags entweder +, * oder ! voranstellen, um zu prüfen, ob alle Flags plus beliebige andere übereinstimmen, irgendeines der Flags oder keines der Flags, die gesetzt sind; in dieser Reihenfolge.
Eines der besten Features von Snort ist, dass es viele Plugins zur Verfügung stellt, die im Optionenfeld einer Regel eingesetzt werden können. Die Optionen, die hier behandelt wurden, sollten Ihnen zu einem guten Start verhelfen. Wenn Sie jedoch komplexere Regeln schreiben möchten, sollten Sie die ausgezeichnete Regel-Dokumentation von Snort zu Rate ziehen, die eine vollständige Beschreibung sowie Beispiele für jede Regel-Option von Snort enthält. Das Benutzerhandbuch von Snort steht unter http://www.snort.org/docs/writing_rules/ zur Verfügung.
Zurück zu Netzwerksicherheits Hacks
O'Reilly Home |
O'Reilly Partnerbuchhandlungen |
Bestellinformationen
Kontakt |
Über O'Reilly |
Datenschutz

© 2004, O'Reilly Verlag GmbH & Co.KG
webmaster@oreilly.de
|