Donnerstag, 24. Mai 2012


Artikel

Juli 2005 | Artikel

Freunde in der Not

(Link zum Artikel: http://www.entwickler.de/php//000738)

Netzwerkverkehr mit Snort und Ethereal analysieren

Text: von Thomas Kaufmann
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Die Situation da draußen hat sich verändert. Und diese Feststellung gilt nicht mehr ausschließlich für die Windows-Welt, denn auch Linux-Anwender werden zunehmend mit Fragen der Netzwerksicherheit konfrontiert. Mit Snort [1] und Ethereal [2] stehen zwei mächtige Lösungen für die Netzwerkanalyse und die Einbruchserkennung bereit. Der Artikel wird beide Tools vorstellen, die Einsatzgebiete umreißen und die grundsätzliche Handhabung erläutern.

Allgemein gesagt können Sie mit Snort und Ethereal ein Netzwerk überwachen und dasselbe vor Angriffen schützen. Allerdings sollte man nicht den Fehler machen, diese Programme unmittelbar miteinander zu vergleichen: Es gibt einige Gemeinsamkeiten (Netzwerkanalyse), aber auch Unterschiede (Intrusion Detection). Vielmehr ergänzen sie sich hervorragend.
Beide Werkzeuge arbeiten nah am Kabel (Stichwort Promiscuous-Mode), sind plattform-unabhängig (Linux, Mac, Windows etc.), werden für Privatanwender kostenlos angeboten und sind außerordentlich leistungsfähig. Und noch eine Gemeinsamkeit gibt es: Binäre Pakete werden in ein lesbares Format konvertiert.
Grundsätzlich ist festzuhalten: Innerhalb kurzer Zeit haben sich diese Werkzeuge quasi vom Geheimtipp zu Profi-Tools gemausert; die Entwicklung von Snort und Ethereal begann Ende der neunziger Jahre. Snort und Ethereal dienen unter anderem zur Fehlersuche (inklusive Performance-Analyse). Außerdem lassen sich defekte NICs aufspüren und gekaperte Maschinen entdecken. Beide Werkzeuge sind zudem ideal für Schulungszwecke.
Die Unterschiede: Ethereal, ein GUI-basiertes Tool, wird oft als Super-tcpdump bezeichnet. Das heißt, Sie können Traffic im bereits erwähnten Promiscuous-Mode aufzeichnen und für die spätere Analyse dauerhaft speichern (in Capture-Dateien). Snort bietet aber ein breiteres Spektrum an Möglichkeiten: Sie können es wie tcpdump [3] und Ethereal einsetzen, aber viele Anwender schätzen Snort vor allem in seiner Eigenschaft als NIDS (Network Intrusion Detection System). Snort ist ein Kommandozeilen-Tool, kann aber bei Bedarf mit einem webbasierten Interface nachgerüstet werden.

Snort: Die Grundlagen
Bevor Sie das Snort-Archiv von der Website abholen, stöbern Sie zuerst in Ihrer Distribution. Das Tool gehört in der Regel zum Lieferumfang der meisten Distributionen. Falls Sie Snort jedoch selbst installieren wollen (oder müssen), gehen Sie folgendermaßen vor:
  1. tar xvzf snort-2.3.0.tar.gz

Wechseln Sie anschließend in den neuen Verzeichnis-Baum und rufen Sie configure auf (diese Aktion darf im Normalfall mit make kombiniert werden): ./configure && make

Aufgepasst: Sie benötigen für Snort (und Ethereal) die freie Bibliothek libpcap [3]. Bringen Sie in Erfahrung, ob dieselbe installiert ist:
  1. [ich@localhost]$ locate libpcap
  2. /usr/lib/libpcap.a
  3. /usr/lib/libpcap.so
  4. ...

Für Snort gibt es übrigens eine interessante Option: Das Tool ist dann in der Lage, einem Host zu antworten, der ein Event verursacht hat. Falls Sie dieses Feature brauchen, müssen Sie dies ./configure mitteilen:
  1. ./configure -enable-flexresp

Beachten Sie, dass für dieses spezielle Verhalten die Bibliothek Libnet Packet Injection [4] installiert sein muss. Um die Snort-Installation abzuschließen, rufen Sie make install auf. Schauen Sie danach in das doc-Verzeichnis der Installation. Dort befindet sich das ausgezeichnete Tutorial (snort_manual.pdf). Mit man snort erhalten Sie einen Überblick über die verfügbaren Optionen.
Wie funktioniert Snort? Das Programm prüft Traffic auf verdächtige Byte-Muster (die bekannten Angriffsmustern ähneln). Diese Vorgehensweise nennt man auch Signatur-basierte Einbruchserkennung. Es existiert eine weitere Möglichkeit der Analyse, nämlich Anomalien aus der Paket-Statistik zu filtern. Dieses Vorgehen wird wiederum Anomalie-basierte Einbruchserkennung genannt (Snort kann durch zusätzliche Komponenten dahingehend erweitert werden). Bemerkt Snort verdächtige Aktivitäten (ungewöhnliche Byte-Muster, Portscans, etc.), wird standardmäßig ein Alert (alert=wachsam, aufmerksam) generiert. Snort eignet sich für folgende Anwendungsgebiete:

Protokoll-Analyse
Content Matching: betrifft für Paket-Inhalte
  • die Entdeckung von Buffer Overflows,
  • die Entdeckung von Stealth-Port-Scans (Stichwort nmap-Scans) und
  • die Entdeckung von OS Fingerprinting.
Und Snort kann in drei verschiedenen Modi betreiben werden:
  • als Sniffer (wie tcpdump und Ethereal),
  • als NIDS (zur Einbruchserkennung) oder
  • als Packet Logger (zum Debugging von Netzwerkfehlern etc.).
Natürlich erlaubt Snort die dauerhafte Speicherung des Traffic. Das ist praktisch für die spätere Analyse (dieses Verhalten wird über Kommandozeilenargumente eingestellt). Sie können die mitgeschnittenen Daten entweder im Binär-Format bzw. im ASCII-Format speichern. Es ist sogar möglich, Daten in MySQL, PostgreSQL oder Oracle zu speichern.
Im Einsatz
Um Snort im Sniffer-Mode (packet dump mode) zu starten, verwenden Sie folgenden Befehl:
  1. [root@localhost snort]# snort -devi eth0

Zur Erläuterung: -v (verbose) sorgt dafür, dass nur die Paket-Header für IP, TCP, UDP und ICMP angezeigt werden. Mit -e werden überdies die MAC-Adressen ausgegeben, mit -d die Daten und mit -i bestimmen Sie das Interface. Ein Beispiel: Auf Rechner 192.168.1.100 wird ein Portscanner gegen Rechner 192.168.1.101 eingesetzt. Hier die Ausgabe von Snort (mit den Schaltern aus dem obigen Beispiel):
  1. 04/12-20:58:34.596334 ARP who-has 192.168.1.101 tell 192.168.1.100
  2. 04/12-20:58:34.596435 ARP reply 192.168.1.101 is-at 0:11:61:F6:F:55
  3. 04/12-20:58:34.596819 0:E:95:3A:6F:23 -> 0:11:61:F6:F:55 type:0x800 len:0x4A
  4. 192.168.1.100:49621 -> 192.168.1.101:1 TCP TTL:64 TOS:0x0 ID:20102 IpLen:20 DgmLen:60 DF
  5. ******S* Seq: 0x1B2282EA Ack: 0x0 Win: 0xFFFF TcpLen: 40
  6. TCP Options (6) => MSS: 1460 NOP WS: 0 NOP NOP TS: 1531113929 0

Zuerst registriert Snort den Broadcast (die ersten beiden Zeilen). Damit wird die MAC-Adresse des Zielrechners ermittelt (diesen Vorgang erledigt das Address Resolution Protocol, kurz ARP genannt). Anschließend sehen Sie das erste von Snort abgefangene Paket (mit MAC-Adresse). Zudem enthält die Ausgabe Datum und Uhrzeit sowie die Source- und die Destination-IP (die Richtung des Datenflusses wird durch den Pfeil symbolisiert). Der nächste Schritt demonstriert die dauerhafte Speicherung der Daten (es handelt sich hier um den packet logger mode):
  1. ./snort -devi eth0 -l ./log

Der Schalter -l setzt allerdings voraus, dass ein Unterverzeichnis namens ./log bereits existiert. Sonst liefert Snort eine Fehlermeldung. Die Pakete (Header und Daten) werden von nun an in das Unterverzeichnis log geschrieben und die Dateinamen werden automatisch aus der Source-IP erzeugt. Handelt es sich um mehrere Rechner, werden die Dateinamen hierarchisch gelistet. Falls Sie die Daten für die spätere Analyse speichern möchten, verwenden Sie besser den Binary-Mode (sehr kompakt):
  1. ./snort -l ./log -b

Zum Auslesen der Daten verwenden Sie -r:
  1. ./snort -dv -r sample.log

Tipp: Sie können sample.log mit jedem Sniffer auslesen, der das tcpdump-Format unterstützt (tcpdump, Ethereal, snoop etc.). Überdies dürfen Sie auch BPF (BSD Packet Filter) verwenden:
  1. ./snort -dvr sample.log arp

Für das obige Portscan-Beispiel hieße das, dass Sie nur ARP-REQUEST beziehungsweise ARP-REPLY sehen. Für viele Anwender ist Snort als NIDS interessant:
  1. ./snort -dev -l ./log -c snort.conf

Es ist Folgendes zu beachten, wenn Sie Snort als NIDS nutzen: Es wird nicht mehr jedes Paket, im Unterschied zum Binary-Mode, analysiert. Vielmehr sorgen die Regeln in snort.conf für eine gezielte Analyse des Traffics. Wie funktioniert das? Die in snort.conf enthaltenen Regeln werden auf die eingehenden Pakete angewendet. Dabei wird nach verdächtigen Mustern gesucht. Liegt eine Übereinstimmung (Muster und Regel) vor, kann Snort auf verschiedene Arten reagieren (Alerts auslösen, mitloggen oder ein Paket ignorieren etc.). Lassen Sie -l weg, schickt Snort die Ausgabe übrigens an var/log/snort. Im NIDS-Mode ist Vorsicht geboten, da dieser Mode erheblichen Overhead produziert. Zum Beispiel wird Snort durch die Verwendung von -v ausgebremst. Auch -e sollte man besser weggelassen. Der neue Aufruf: ./snort -d -l ./log -c snort.conf

Alerts wurden schon mehrfach erwähnt: Tritt ein verdächtiges Ereignis auf, erzeugt Snort standardmäßig einen Alarm, eben die Alerts. Der Inhalt einer typischen Alert-Datei sieht so aus:
  1. [**] [122:1:0] (portscan) TCP Portscan [**]
  2. 03/17-22:27:06.815124 192.168.1.100 -> 192.168.1.101
  3. PROTO255 TTL:0 TOS:0xC0 ID:32560 IpLen:20 DgmLen:174

Die Nummer 122 (am Anfang, in den eckigen Klammern) heißt im Snort-Jargon Generator ID (GID). Über die GID identifizieren Sie das Modul, welches den Alarm ausgelöst hat. Im Unterverzeichnis etc/generators des Snort-Baumes finden Sie dazu Angaben. Die Datei gen-msg.map enthält eine Übersicht: 122 || 1 || portscan: TCP Portscan
Die zweite Nummer (die 1 nach dem ersten Doppelpunkt) nennt sich Snort ID (SID). Auch dazu findet sich ein Eintrag in der gleichen Datei: 1 || 1 || snort general alert
Sie dürfen für Snort neue Regeln erstellen. Zur Erstellung eigener Filter steht eine einfache Syntax zur Verfügung. Snort-Regeln besitzen einen Regel-Header und Regel-Optionen. Im Header befinden sich die Angaben für die Aktionen (zum Beispiel Alert), zum Protokoll, zur Source- und Destination-IP, zu den Ports sowie zur Netzmaske. Der zweite Teil beinhaltet die Optionen. Ein Beispiel:
  1. alert tcp any any -> 192.168.1.101 111 (content:"|00 01 86 a5|"; msg:"mountd access";)

Der Text bis zur öffnenden Klammer ist der Header, dahinter finden Sie die Optionen (die Schlüsselworte content und msg). Im Beispiel wird ein Alert festgelegt, falls ein Request (das erste Schlüsselwort any steht für alle IPs, das zweite any für alle Ports) an Port 111 kommt. Das Schlüsselwort content spezifiziert den kritischen Teil des Pakets, msg enthält eine beschreibende Textnachricht. Abschließend ein Beispiel für eine Regel:
  1. ruletype verdacht
  2. {
  3. type log
  4. output log_tcpdump: verdacht.log
  5. }

Diese Regel loggt im tcpdump-Stil und kann so aktiviert werden (in snort.conf):
  1. verdacht tcp any any -> 192.168.1.101 6667 (msg:"internal ircd!";)

Im Unterverzeichnis rules des Snort-Baumes finden Sie weitere Beispiele für Regeln.
Ethereal: Die Grundlagen
Ethereal unterstützt derzeit 658 Dissektoren (das sind die Protokoll-Dekodierer) und liest Pakete von Ethernet, Token-Ring, FDDI, Serial PPP/SLIP, 802.11 und WLAN. Das Programm kann Netzwerkverkehr entweder direkt aufzeichnen oder Daten aus einer Capture-Datei (eine Aufzeichnung des Traffics) auslesen. Ethereal setzt unter Linux auf libpcap auf und ist in der Lage, die empfangenen Daten in ASCII, EBCDIC, als Hexdump sowie als C-Array anzeigen. Genau wie Snort belauscht Ethereal den Netzwerkverkehr im Promiscuous-Mode, das heißt, dass auch Pakete empfangen werden, die nicht für den eigenen Rechner bestimmt sind. Ethereal schaltet dazu eine NIC (Network Interface Card) selbstständig in den Promiscuous-Mode. Ob Ihre NIC in diesem Mode arbeitet, bringen Sie mit /sbin/ifconfig -a | grep -n PROMISC in Erfahrung. Oft hilft auch dieser Befehl weiter: dmsg | grep -n eth0
Zur Installation: Die meisten modernen Distributionen haben Ethereal schon an Bord. Testen Sie es mit locate ethereal. Falls das Programm wirklich nicht installiert ist, besorgen Sie sich das Archiv aus dem Netz und folgen der Installationsanleitung. Üblicherweise entpacken Sie den Tarball mit: tar xvzf ethereal-verXXX.tar.gz

Danach bauen Sie das Programm mit:
  1. ./configure
  2. make
  3. #su:
  4. Password:
  5. *******
  6. make install

Rufen Sie Ethereal nun testweise auf (wahrscheinlich als User root):
  1. [root@localhost ]# /usr/local/bin/ethereal &
Spielregeln
Sie agieren mit Ethereal stets auf zwei verschiedenen Ebenen: Entweder arbeiten Sie direkt mit libpcap auf der Kommandozeile (Stichwort tethereal, dazu gleich mehr) oder Sie nutzen das Eingabefeld in der GUI (Display-Filter). Paketinhalte werden von Ethereal in sehr übersichtlicher Form dargestellt: Wenn Sie ein Paket auswählen, zeigt Ethereal in den anderen Fensterteilen weitere Details (geordnet nach dem OSI-Modell). Die Filter-Syntax besteht aus einfachen Komponenten wie Feldname, Operator sowie einem gewünschten Wert. Einige Beispiele:
  1. ip.dst eq hamlet
  2. ip.src == 192.168.1.101

Interessant ist die Handhabung für Classless Inter Domain Routing (CIDR):
  1. ip.addr == 192.168.1.1/24

Sie können CIDR auf Hostnamen anwenden:
  1. ip.addr eq macbeth/24

Zeichenketten werden in Anführungszeichen gesetzt:
  1. http.request.method == "HEAD" .

Auch diese Variante, die Slicing-Technik, ist erlaubt:
  1. http.content_type[0:4] == "text"

Diese Zeile liefert die Zeichenkette text aus text/html zurück.
Nun ein Beispiel für Display-Filter (in der GUI). Starten Sie Ethereal und gehen Sie in das Menü Capture->Start (mit STRG+K erreichen Sie gleichen Effekt). Tragen Sie in das Feld Capture Filter das Protokoll icmp ein (anschließend mit OK bestätigen). Ethereal berücksichtigt jetzt nur dieses Protokoll. Falls Sie beispielsweise nur an ECHO-REQUESTs (ein anderer Rechner pingt Ihre Maschine an) interessiert sind, genügt diese Syntax im Eingabefeld (mit Enter abschließen): icmp[0]==8
Zudem lassen sich benutzerdefinierte Regeln in Form so genannter Coloring Rules anlegen. Es handelt sich um die farbliche Hervorhebung der Treffer. Über View->Coloring Rules gelangen Sie in das entsprechende Dialogfeld. Dort geben Sie einen Filternamen und die Farbregeln ein. Man kann jeweils eine Farbangabe für die Schrift und für den Hintergrund bestimmen. Ein Beispiel für einen Filter namens SYN-FLAG ist tcp.flags.syn==1. Alle Treffer für den Filter SYN-FLAG werden in der GUI nun farbig gekennzeichnet.
Der Werkzeugkasten
Wenn Sie Netzwerkverkehr mitschneiden, fallen schnell große Datenmengen an. Im Normalfall ist aber nicht jedes Paket interessant. Aus diesem Grund enthält Ethereal eine Kommandozeilenversion namens tethereal, die sich gut für die ad-hoc-Analyse und für Testzwecke eignet. Wird tethereal außerdem zusammen mit zlib übersetzt, können sogar komprimierte Dateien (mit gzip) automatisch entpackt und gelesen werden. Tethereal nutzt im Übrigen die gleiche Filter-Syntax wie tcpdump. Ein Beispiel für die Verwendung (für den Befehl ping):
  1. [root@localhost ]# /usr/sbin/tethereal icmp
  2. ...
  3. Capturing on eth0
  4. ...
  5. 203.921442 192.168.1.100 -> 192.168.1.101 ICMP Echo (ping) request
  6. 203.921556 192.168.1.101 -> 192.168.1.100 ICMP Echo (ping) reply
  7. 0.000000 192.168.1.100 -> 192.168.1.101 ICMP Echo (ping) request
  8. 0.000114 192.168.1.101 -> 192.168.1.100 ICMP Echo (ping) reply

Der Filter icmp legt fest, dass nur Nachrichten dieses Protokolls berücksichtigt werden (der ARP-REQUEST wird also nicht angezeigt). Es gehören aber noch weitere nützliche Kommandozeilen-Programme zum Lieferumfang von Ethereal: editcap, mergecap und text2pcap. Mit diesen Hilfsprogrammen können Sie dann Capture-Dateien editieren (zum Beispiel Einträge daraus entfernen) oder auch Daten (aus mehreren Dateien) zusammenführen. Die Dokumentation liefert weiterführende Informationen.
Fazit
Snort und Ethereal sind mächtige Werkzeuge, die Ihnen nützliche Informationen über die Vorgänge im Netzwerk liefern. Beide Programme setzen auf libpcap auf und sind in der Lage, den Netzwerkverkehr im Promiscuous-Mode zu verfolgen. Überdies sind beide Tools gut dokumentiert und werden aktiv weiterentwickelt. Während Ethereal die Treffer von Haus aus in einer gut durchdachten GUI darstellt, kann Snort mit einer webbasierten Oberfläche erweitert werden (Stichworte Barnyard, ACID, etc.). An Ethereal beeindruckt besonders die große Zahl verfügbarer Dissektoren (die Protokoll-Dekodierer) und es werden in Zukunft weitere Dissektoren dazukommen. Das große Plus von Snort ist, dass Sie im Bedarfsfall neue Filterregeln hinzufügen können und Ihre Umgebung somit an sich ständig ändernde Gegebenheiten anpassen.
Links
  • [1] Snort-Homepage: www.snort.org
  • [2] Ethereal im Netz: www.ethereal.com
  • [3] Der Klassiker tcpdump und die freie Bibliothek libpcap: www.tcpdump.org
  • [4] Die Libnet-Packet-Injection-Bibliothek: www.packetfactory.net/projects/libnet/
  • [5] Angela D. Orebaugh/Simon Biles/Jacob Babbin: Snort Cookbook. O'Reilly-Verlag, 2005
  • [6] Ralf Spenneberg: Intrusion Detection und Prevention mit Snort 2 & Co. Addison Wesley, 2004
  • [7] Angela Orebaugh: Ethereal Packet Sniffing. Syngress, 2004
  • [8] W. Richard Stevens: TCP/IP Illustrated, Volume 1. Addison Wesley, 2003, 22. Auflage
  • [9] W. Richard Stevens: Programmierung von Unix-Netzwerken. Carl Hanser Verlag, 2000

Kommentare