Home » Allgemein » Snort aktuell halten

Snort aktuell halten

Im Internet gibt es jede Menge Gefahren: das Russian Business Network wird von Tag zu Tag größer, es gibt jede Menge 0-Day-Exploits für Browser-Plugins oder Brute-Force-Attacken auf SSH- oder FTP-Server.
Vor solchen Zugriffen schützt man sein LAN am besten mit einer Intrusion Detection Software wie Snort oder am besten gleich proaktiv in Verbindung mit dem Intrusion Prevention System Snortsam um die bösen Buben auszusperren. Der Vollständigkeit halber sei erwähnt, dass Snort in der Lage ist, den Traffic des Bundestrojaners aufzuspüren (aber nur anhand der IP der beiden Command-and-Control-Server).

Intrusion Detection Systeme (IDS) analysieren den ein- und ausgehenden Netzwerkverkehr, um so Malware oder Angriffe zu erkennen. Ich verwende Clear OS als Server im Inter- und Intranet, aber eben auch als Gateway zwischen meinem LAN und dem Internet.
Mit Clear OS wird Snort in der Version 2.8.4 ausgeliefert. Snort analysiert den Netzwerkverkehr anhand von Regeln (und kann deswegen bei einer breitbandigen Internetverbindung einige Last auf dem Gateway erzeugen). Um aktuelle Bedrohungen zu erkennen müssen diese Regeln regelmäßig erweitert oder auch aktualisiert werden. Bei der Clearfoundation (dem Hersteller von Clear OS) kann man Regel-Updates gegen einen Obolus abonnieren oder mittels eines Skript auch umsonst aktuell halten.
Dieses hier vorgestellte Skript sollte (gegeben falls durch anpassen der Pfade) auf jedem Linux-System laufen.

Das Skript

Ich bin im Clear OS-Forum auf einen Beitrag von Nick Howitt aufmerksam geworden, der ein Skript zum Aktualisieren von Snort-Regeln geschrieben hat.
Das Skript lädt dazu die aktuellen Regeln von Emerging Threads (eine OpenSource-Community für IDS-Regeln), herunter.

Ich habe ein paar kleine Änderungen an dem Skript vorgenommen, um auch Block-Rules von Emerging Threats herunter zu laden. Normale, Standard-Regeln lösen lediglich einen Alarm aus. Block-Rules hingegen werden von Snort (dem IDS) an Snortsam (dem Intrusion Prevention “PlugIn”) weiter gereicht und Snortsam unterbindet jeglichen Verkehr zu dieser Adresse im Internet für einen bestimmten Zeitraum; sprich der “Angreifer” hat erst mal keinen Zugriff mehr auf das System.
Dank des genialen Skripts von Nick Howitt kann man Regeln selber mit einem Block versehen, sprich: man kann neben den bereits erwähnten Block-Rules selber die Regeln festlegen, bei denen Snortsam die Adresse des “Angreifers” blocken soll (dazu später mehr).

Ich schreibe Angreifer im Übrigen bewusst in Klammern, denn es kommt recht häufig vor, dass das Auslösen einer Regel nur blinder Alarm ist (das liegt in der Natur des Traffics in einem Netzwerk). Von dem her sollte man sich gut überlegen, bei welchen Regeln die externe IP geblockt werden soll.
Am besten lässt man Snort erst mal nur mit den Standard-Regeln, die nicht gleich zu einem Block führen laufen und analysiert welche Aktivitäten z.B. im LAN vor sich gingen als die Regel anschlug (Block-Rules von Emerging Threats sind hier außen vor, diese können immer aktiv sein).
So löst mein Mediacenter jedes Mal beim Einschalten eine Regel in Snort aus, die ausgehenden Trojaner-Traffic aufspüren soll. Dabei aktualisiert mein Mediacenter bloß Künsterbilder meiner MP3-Sammlung oder lädt Infos zu meiner Filmsammlung aus dem Internet.

Installation und Konfiguration

Das Skript als root herunter laden und mittels
chmod 700 updateSnort
für root ausführbar machen. Um das Skript an die eigenen Bedürfnisse anzupassen muss man sich als erstes überlegen, welche Bedrohungen man mit Snort aufspüren möchte.
Dazu lohnt es sich einen Überblick über die normalen Regeln und die Block-Rulesets zu machen (wer eine andere Snort-Version als 2.8.4 einsetzt muss sich die Regeln zur entsprechenden Version ansehen und auch in Zeile 56 des Skript die Variable ET_RULES_URL anpassen).

Wer alle Emerging Threats-Regeln herunter laden möchte kann den Kommentar in Zeile 103 entfernen und die Zeilen 105 bis 134 löschen (dies ist aber nicht sehr sinnvoll, da das IDS dann bei allen Möglichkeiten anschlägt).

Die Block-Rules von Emerging Threads werden in den Zeilen 137 bis 141 herunter geladen, auch hier kann nach eigenem Belieben angepasst werden.

Das Skript lädt alle Dateien in den oben angegeben Blöcken herunter und führt sie mit den bereits auf dem System vorhandenen Dateien zur combined.rules zusammen und sortiert diese nach der Versionsnummer der Regel (damit immer die neueste Version einer Regel verwendet wird).
Aus diesem Grund empfehle ich alle includes der lokalen Rule-Files in der /etc/snort.conf auszukommentieren!
Stattdessen wird in der /etc/snort.conf die Zeile
include $RULE_PATH/combined.rules
hinzugefügt (dies muss auf jeden Fall gemacht werden, damit Snort immer mit den aktuellsten Regeln aus diesem Skript arbeitet!). Lokale Rulesets werden in dem Skript einfach über die Zeilen 167 bis 216 eingebunden (dazu einfach den Kommentar entfernen oder die Zeile auskommentieren).

In zwei der Rulessets, die mit Clear OS ausgeliefert werden befindet sich ein Fehler. Wenn die Dateien malware-user-agents.rules oder malware-user-agents.rules eingebunden werden, müssen die Dateien zuerst gefixt werden:

malware-user-agents.rules (Zeile 899 und 900 durch folgendes ersetzen):
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"ET MALWARE 2020search/PowerSearch Toolbar Adware/Spyware - GET"; flow:established,to_server; content:"GET "; depth:4; uricontent:"IpAddr="; nocase; uricontent:"&OS="; nocase; uricontent:"&RegistryChanged="; nocase; uricontent:"&RegistryUpdate="; nocase; uricontent:"&NewInstallation="; nocase; uricontent:"&utilMissing="; nocase; uricontent:"&Basedir="; nocase; uricontent:"&BundleID="; nocase; uricontent:"&InitInstalled="; nocase; uricontent:"&Interval="; nocase; uricontent:"&LastInitRun="; nocase; uricontent:"&LastInitVer="; nocase; uricontent:"&LastSrngRun="; nocase; uricontent:"&LastUtilRun="; nocase; uricontent:"&SrngInstalled="; nocase; uricontent:"&SrngVer="; nocase; uricontent:"&UtilInstalled="; nocase; uricontent:"&UtilVer="; nocase; uricontent:"&PCID"; nocase; classtype:trojan-activity; reference:url,vil.nai.com/vil/content/v_103738.htm; reference:url,www.sunbeltsecurity.com/ThreatDisplay.aspx?tid=13811&cs=1437A28B7A90C4C502B683CE6DE23C4E; reference:url,www.symantec.com/security_response/writeup.jsp?docid=2004-111918-0210-99; reference:url,doc.emergingthreats.net/2009807; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/MALWARE/MALWARE_2020search; sid:2009807; rev:2;)


virus.rules (Zeile 91 und 92 durch folgendes ersetzen):
#alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:"ET VIRUS SHELLCODE Shikata Ga Nai polymorphic payload"; classtype:shellcode-detect; dsize: >26; content: "|d9 74 24 f4|"; pcre: "/[\x29\x2b\x31\x33]\xc9/sm"; pcre: "/[\xd9-\xdb\xdd].{1,11}\xd9\x74\x24\xf4.{0,10}[\x58\x5a\x5b\x5d-\x5f]/sm"; pcre: "/([\x29\x2b\x31\x33\xb8\xba\xbb\xbe\xbf\xd9-\xdb\xdd][^\x00\xff][^\x00\xff][^\x00][^\x00\xff][^\x00][^\x00\xff][^\x00\xff][^\x00][^\x00][^\x00][^\x00\xff][^\x00\xff][^\x00\xff][^\x00][^\x00][\x31\x83][\x42\x43\x46\x47\x50\x53\x56-\x58\x5a\x5e\x5f\x70\x72\x73\x77\x78\x7a\x7b\x7e\xc0\xc2\xc3\xc6\xc7\xe8\xea\xeb\xee\xef][\x04\x0e\x10\x12\x13\x15\x17\xfc][\x03\x31\x83][\x42\x43\x46\x47\x50\x53\x56-\x58\x5a\x5e\x5f\x70\x72\x73\x77\x78\x7a\x7b\x7e\xc0\xc2\xc3\xc6\xc7\xe8\xea\xeb\xee\xef][\x04\x0a\x0c\x0e-\x13\x15\x17\xfc][\x03\x83]..[^\x1d\xe2][^\x0a\xf5])|([\x29\x2b\x31\x33\xb8\xba\xbb\xbd-\xbf\xd9-\xdb\xdd][^\x00][^\x00][^\x00][^\x00][^\x00][^\x00][^\x00][^\x00][\x24\xb1\xd9-\xdb\xdd][^\x00][\x58\x5a\x5b\x5d-\x5f\xb8\xbaxbb\xbd-\xbf\xd9][^\x00][^\x00][^\x00][^\x00][\x31\x83][\x42\x43\x45-\x47\x50\x53\x55-\x58\x5a\x5d-\x5f\x68\x6a\x6b\x6e-\x70\x72\x73\x75\x77\x78\x7a\x7b\x7d\x7e\xc0\xc2\xc3\xc5-\xc7\xe8\xea\xeb\xed-\xef][\x04\x0e\x12\x17\xfc][\x03\x31\x83][\x42\x43\x45-\x47\x50\x53\x55-\x58\x5a\x5d-\x5f\x68\x6a\x6b\x6e-\x70\x72\x73\x75\x77\x78\x7a\x7b\x7d\x7e\xc0\xc2\xc3\xc5-\xc7\xe8\xea\xeb\xed-\xef][\x04\x0a\x0e\x12\x13\x17\xfc][\x03\x83]..[^\xe2][^\xf5])/sm"; reference:url,toorcon.org/2006/conference.html?id=29; reference:url,doc.emergingthreats.net/2003118; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/VIRUS/VIRUS_Polymorphic_Experimental; sid:2003118; rev:3;)

Sollte der Befehl service in der verwendeten Linux-Distribution nicht zur Verfügung stehen, muss die Zeile 264 in
/etc/rc.d/init.d/snort restart
(oder ähnliches) geändert werden.

Nun kann man das Skript das erst Mal (als root) laufen lassen. Dabei sollte nach ein paar Minuten (je nach Internet-Anbindung) folgendes zu sehen sein:

snort beenden: [ OK ]
snort starten: [ OK ]


Wenn die Aktualisierung regelmäßig erfolgen soll kann das Skript als cron-Job eingeplant werden.

Feintuning

Jede Snort-Regel hat eine Beschreibung, die um einiges aussagekräftiger als die reine Regelnummer ist. Diese Beschreibungen werden neben der Regelnummer in der Datei /etc/snort/sid-msg.map aufgelistet.
So liest z.B. das Clear OS Webfrontend diese Datei aus, um im Intrusion Prevention Report darüber zu informieren, warum eine IP geblockt wurde:

Zum Erzeugen der sid-msg.map-Datei kann das Skript create-sidmap.pl von Oinkmaster verwendet werden (der Rest von Oinkmaster wird nicht benötigt). Zum Erzeugen der sid-msg.map-Datei den Kommentar in Zeile 267 entfernen und den Pfad zu create-sidmap.pl anpassen.

Um, wie oben bereits erwähnt, “normale” Regeln dahingehend zu ändern, dass sie zur einer Blockierung der “Angreifer”-IP führen muss man in /etc/snort die Datei snortsam.rules anlegen und dort folgende Einträge machen:
sid:[Regelnummer]; rev:-1; fwsam: [src/dst], [Dauer des Blocks];

Beispiel:
sid:12345678; rev:-1; fwsam: src, 1 day;
sid:87654321; rev:-1; fwsam: dst, 30 days;

führt dazu, dass wenn die Regel 12345678 ausgelöst wird die Quell-IP für einen Tag und wenn die Regel 87654321 anschlägt die Ziel-IP für 30 Tage gesperrt werden.

Nun viel Spaß mit dem Skript!

Hier gibt’s das Skript als Download.

Und hier den Quellcode (aufgrund der Formatierung empfehle ich den Download):

#!/bin/bash

# The purpose of this script is to download any Emerging Threat files you want and combine
# them with any existing ClearOS snort rules you want. It removes any rules with duplicate
# sid's leaving the one with a higher revision number. It also copies snortsam rules from any
# rule revision and adds them into later rule revisions. As a by-product of this, it enables
# you to add snortsam rules to the ET rules in a permanent way
#
# In order to use the script, you need to add a line "include $RULE_PATH/combined.rules" to
# /etc/snort.conf and disable any includes there where you are combining the files in this
# script
#
# Set EXIT_ON_FAILED_DOWNLOAD to 1 if you want the script to exit if you have a failed
# download. This has the advantage that if the download of the emerging-all.rules fails you
# do not get left with a rule set just made up of the ClearOS rules. Instead the old combined
# rule set remains intact. Setting it to 0 may be useful if you are downloading many small
# rule files and you do not want the script to abort if one file in unavailable

# script variables
SNORT_HOME=/etc/snort/
RULES_DOWNLOAD_DIR=/etc/snort/ET-downloads/
EXIT_ON_FAILED_DOWNLOAD=1

# This function
# - removes leading spaces, comments and blank lines and trailing spaces and tabs
# - picks out the sid and revision number for each rule then it sticks the rule number,
# revision number source file name and line number line number and if there is a snortsam
# rule and puts them in front of the rule
# - It then output appends to rule to the temporary file

function indexrules {
RULEFILE=$1
sed '/^$/d; s/^[ \t]*//; /^#/d; s/[ \t]*$//' $1 | awk -v FILE=$RULEFILE '{
test = match($0, /sid:[[:blank:][:digit:]]*;/)
sid = substr($0 , RSTART+4, RLENGTH-5)
gsub(/ */, "", sid)

rev = match($0, /rev:[-[:blank:][:digit:]]*;/)
if (rev > 0)
rev = substr($0 , RSTART+4, RLENGTH-5)
gsub(/ */, "", rev)

samrule = /fwsam:/
newtext = sid " " rev " " FILE " " NR " " samrule " " $0
print newtext }' >> $RULES_DOWNLOAD_DIR"indexed.tmp"
}

# This function
# - deletes the old rule file you are about to download
# - downloads the new file
# - calls the above function to build the temp file

function getrules {
ET_RULES_URL="http://rules.emergingthreats.net/open/snort-2.8.4/rules/"
cd $RULES_DOWNLOAD_DIR
rm -f $1
wget -q $ET_RULES_URL$1
if [ ! -e $1 ]; then
echo "$1 not downloaded"
DOWNLOAD_FAIL=1
else
indexrules $1
fi
}

function getblockrules {
ET_RULES_URL="http://rules.emergingthreats.net/blockrules/"
cd $RULES_DOWNLOAD_DIR
rm -f $1
wget -q $ET_RULES_URL$1
if [ ! -e $1 ]; then
echo "$1 not downloaded"
DOWNLOAD_FAIL=1
else
indexrules $1
fi
}

# Create the download directory if it does not exist

if [ -d $SNORT_HOME ]; then
cd $SNORT_HOME
if [ ! -d $RULES_DOWNLOAD_DIR ]; then
mkdir $RULES_DOWNLOAD_DIR
fi
fi

# Clear the temp file

rm -f $RULES_DOWNLOAD_DIR"indexed.tmp"

DOWNLOAD_FAIL=0

# Download the rules from Emerging Threats
# Note that you can download some or all of the individual rule sets of you want instead.
# To do that change ET_RULES_URL to http://rules.emergingthreats.net/open/snort-2.8.4/rules/
# in the getrules function then repeat the line below as many times as you want changing the
# file name you want to download

#commented for not downloading all ET rules
#getrules emerging-all.rules

getrules emerging-activex.rules
getrules emerging-attack_response.rules
getrules emerging-ciarmy.rules
getrules emerging-current_events.rules
getrules emerging-dns.rules
getrules emerging-dos.rules
getrules emerging-exploit.rules
getrules emerging-ftp.rules
getrules emerging-icmp.rules
getrules emerging-icmp_info.rules
getrules emerging-imap.rules
getrules emerging-malware.rules
getrules emerging-misc.rules
getrules emerging-mobile_malware.rules
getrules emerging-policy.rules
getrules emerging-pop3.rules
getrules emerging-rpc.rules
getrules emerging-scan.rules
getrules emerging-smtp.rules
getrules emerging-snmp.rules
getrules emerging-sql.rules
getrules emerging-telnet.rules
getrules emerging-tftp.rules
getrules emerging-trojan.rules
getrules emerging-user_agents.rules
getrules emerging-virus.rules
getrules emerging-web_client.rules
getrules emerging-web_server.rules
getrules emerging-web_specific_apps.rules
getrules emerging-worm.rules

#download BLOCK rules from ET
getblockrules emerging-botcc-BLOCK.rules
getblockrules emerging-compromised-BLOCK.rules
getblockrules emerging-dshield-BLOCK.rules
getblockrules emerging-rbn-BLOCK.rules
getblockrules emerging-rbn-malvertisers-BLOCK.rules

if [ $DOWNLOAD_FAIL -eq 1 ]; then
if [ $EXIT_ON_FAILED_DOWNLOAD -eq 1 ]; then
echo "Exiting"
exit
else
echo "Continuing"
fi
fi

# Append all the current rules to the temp file
# The list below is all the files in ClearOS 5.2 except local.rules
# I have also indicated which are the ones enabled in /etc/snort.conf by default
# I have not included local.rules as they are never downloaded from ET and if you add a local
# rule manually you would have to remember to run this script before the changes took effect
# instead of simply doing a service snort restart
###############################################################
# #
# IMPORTANT #
# #
# Any rules enabled below MUST be disabled in /etc/snort.conf #
# #
###############################################################

cd $SNORT_HOME
indexrules attack-responses.rules # rule set used by default
indexrules backdoor.rules # rule set used by default
indexrules bad-traffic.rules # rule set used by default
#indexrules chat.rules
indexrules ddos.rules # rule set used by default
#indexrules deleted.rules
indexrules dns.rules # rule set used by default
indexrules dos.rules # rule set used by default
#indexrules experimental.rules
indexrules exploit.rules
indexrules finger.rules # rule set used by default
indexrules ftp.rules # rule set used by default
#indexrules icmp-info.rules
indexrules icmp.rules # rule set used by default
indexrules imap.rules # rule set used by default
#indexrules info.rules
indexrules malware-user-agents.rules
indexrules misc.rules # rule set used by default
#indexrules multimedia.rules
indexrules mysql.rules # rule set used by default
#indexrules netbios.rules
indexrules nntp.rules # rule set used by default
indexrules oracle.rules # rule set used by default
#indexrules other-ids.rules
#indexrules p2p.rules
#indexrules policy.rules
indexrules pop2.rules # rule set used by default
indexrules pop3.rules # rule set used by default
#indexrules porn.rules
indexrules rpc.rules # rule set used by default
indexrules rservices.rules # rule set used by default
indexrules scan.rules # rule set used by default
#indexrules shellcode.rules
indexrules smtp.rules
indexrules snmp.rules # rule set used by default
indexrules sql-injection.rules
indexrules sql.rules # rule set used by default
indexrules telnet.rules # rule set used by default
indexrules tftp.rules # rule set used by default
indexrules virus.rules
indexrules web-attacks.rules # rule set used by default
indexrules web-cgi.rules # rule set used by default
indexrules web-client.rules # rule set used by default
indexrules web-coldfusion.rules # rule set used by default
indexrules web-frontpage.rules # rule set used by default
indexrules web-iis.rules # rule set used by default
indexrules web-misc.rules # rule set used by default
indexrules web-php.rules # rule set used by default
#indexrules x11.rules # rule set used by default
indexrules snortsam.rules # magic rule set for injecting snortsam rules

cd $RULES_DOWNLOAD_DIR

# This next bit:
# - sorts by sid (asc), rev (asc), snortsam_rule_indicator (desc) then
# - pipes into an awk which checks if the rule has a snortsam_rule_indicator and reads the
# snortsam rule if it does and inserts it into all occurrences of the same rule number then
# - sorts by sid and revision in descending order then
# - pipes it into awk which prints the first line of any sid only unless the revision is < 0
# (therefore the one with the highest revision but not a manually added snortsam rule then
# - pipes it into sort which sorts by the original file name and original line number so the
# lines from any file go back to the original order they were in then
# - pipes it into awk again which strips out the sid, revision number, original file name,
# original line number and snortsam rule indicator fields which were added earlier to
# facilitate all the file sorting
# - the result is output to a file called combined.rules

sort -n -k 1,2 -k 5,5r indexed.tmp | \
awk '{
if ($5 == 1)
{
temp = match($0, /fwsam:[^;]*;/)
fwsamrule = " " substr($0, RSTART, RLENGTH) ")"
}
else
{
if ($1 == lastrulenum)
{
if (fwsamrule != "")
sub(/)$/, fwsamrule )
}
else
fwsamrule = ""
}

lastrulenum = $1
print $0 }' | \
sort -nr -k 1,2 | \
awk '{ if ($1 != lastrule && $2 >= 0) { print $0 } lastrule = $1 }' | \
sort -k 3,3 -k 4,4n | \
awk '{ sub(/^.*\.rules [[:digit:]]* [[:digit:]]* /, ""); print $0 }' > $SNORT_HOME"combined.rules"

# Remove the temp file

rm -f $RULES_DOWNLOAD_DIR"indexed.tmp"

# restart snort
/sbin/service snort restart

#create sid-msg.map
#/root/tools/create-sidmap.pl /etc/snort > /etc/snort/sid-msg.map 2>/dev/null

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© by Kosebamse
ThumbSniper-Plugin by Thomas Schulte