Alle Phasen des Network Security Monitoring erklärt: Erfassung, Erkennung und Analyse Chris Sanders/Jason Smith Hacking mit Security Onion Sicherheit im Netzwerk überwachen: Daten erfassen und sammeln, analysieren und Angriffe rechtzeitig erkennen • Network Security Monitoring im Detail verstehen und selbst durchführen • Linux-Distribution für Netzwerksicherheitsanalysen: Security Onion installieren und nutzen • Open-Source-Tools im Praxiseinsatz: Bro, Daemonlogger, Dumpcap, Justniffer, Honeyd, Httpry, Netsniff-NG, Sguil, SiLK, Snorby Snort, Squert, Suricata, TShark, Wireshark und mehr Chris Sanders/Jason Smith Hacking mit Security Onion Chris Sanders/Jason Smith Hacking mit Security Onion Sicherheit im Netzwerk überwachen: Daten erfassen und sammeln, analysieren und Angriffe rechtzeitig erkennen • Network Security Monitoring im Detail verstehen und selbst durchführen • Linux-Distribution für Netzwerksicherheitsanalysen: Security Onion installieren und nutzen • Open-Source-Tools im Praxiseinsatz: Bro, Daemonlogger, Dumpcap, Justniffer, Honeyd, Httpry, Netsniff-NG, Sguil, SiLK, Snorby Snort, Squert, Suricata, TShark, Wireshark und mehr Bibliografische Information der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte Daten sind im Internet über http://dnb.ddb.de abrufbar. Alle Angaben in diesem Buch wurden vom Autor mit größter Sorgfalt erarbeitet bzw. zusammengestellt und unter Einschaltung wirksamer Kontrollmaßnahmen reproduziert. Trotzdem sind Fehler nicht ganz auszuschließen. Der Verlag und der Autor sehen sich deshalb gezwungen, darauf hinzuweisen, dass sie weder eine Garantie noch die juristische Verantwortung oder irgendeine Haftung für Folgen, die auf fehlerhafte Angaben zurückgehen, übernehmen können. Für die Mitteilung etwaiger Fehler sind Verlag und Autor jederzeit dankbar. Internetadressen oder Versionsnummern stellen den bei Redaktionsschluss verfügbaren Informationsstand dar. Verlag und Autor übernehmen keinerlei Verantwortung oder Haftung für Veränderungen, die sich aus nicht von ihnen zu vertretenden Umständen ergeben. Evtl. beigefügte oder zum Download angebotene Dateien und Informationen dienen ausschließlich der nicht gewerblichen Nutzung. Eine gewerbliche Nutzung ist nur mit Zustimmung des Lizenzinhabers möglich. This edition of Applied Network Security Monitoring by Chris Sanders and Jason Smith is published by arrangement with ELSEVIER INC., a Delaware corporation having its principal place of business at 360 Park Avenue South, New York, NY 10010, USA ISBN der englischen Originalausgabe: 978-0124172081 © 2016 Franzis Verlag GmbH, 85540 Haar bei München Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Das Erstellen und Verbreiten von Kopien auf Papier, auf Datenträgern oder im Internet, insbesondere als PDF, ist nur mit ausdrücklicher Genehmigung des Verlags gestattet und wird widrigenfalls strafrechtlich verfolgt. Die meisten Produktbezeichnungen von Hard- und Software sowie Firmennamen und Firmenlogos, die in diesem Werk genannt werden, sind in der Regel gleichzeitig auch eingetragene Warenzeichen und sollten als solche betrachtet werden. Der Verlag folgt bei den Produktbezeichnungen im Wesentlichen den Schreibweisen der Hersteller. Autor: Chris Sanders und Jason Smith Programmleitung: Dr. Markus Stäuble Satz: G&U Language & Publishing Services GmbH, Flensburg ISBN 978-3-645-20496-5 Dieses Buch ist ein Produkt der Stärke, die ich durch Liebe gewonnen habe. Ich widme es Gott, meiner Frau Ellen und allen, die mich weiterhin lieben und unterstützen. »Aber die auf den HERRN harren, kriegen neue Kraft, dass sie auffahren mit Flügeln wie Adler, dass sie laufen und nicht matt werden, dass sie wandeln und nicht müde werden.« Jesaja 40:31 (Luther) 7 Inhaltsverzeichnis Danksagung........................................................................................19 Die Autoren.........................................................................................21 Geleitwort.......................................................................................... 25 Vorwort.............................................................................................. 27 Zielpublikum.......................................................................................................28 Voraussetzungen................................................................................................29 Der Aufbau dieses Buches..................................................................................30 Hinweis zu IP-Adressen......................................................................................32 Begleitwebsite....................................................................................................33 Unterstützung für wohltätige Organisationen.....................................................33 Rural Technology Fund........................................................................................33 Hackers for Charity.............................................................................................33 Kiva ......................................................................................................................................34 Hope for the Warriors®...............................................................................................34 Autism Speaks....................................................................................................34 Kontakt...............................................................................................................35 1. Network Security Monitoring in der Praxis................................... 37 1.1 Kernbegriffe des Network Security Monitoring........................................39 1.1.1 Schützenswerte Güter.............................................................................39 1.1.2 Angreifer.................................................................................................39 1.1.3 Schwachstelle.........................................................................................40 1.1.4 Exploit.....................................................................................................40 1.1.5 Risiko......................................................................................................40 8 Inhaltsverzeichnis 1.1.6 Anomalie.................................................................................................40 1.1.7 Zwischenfall............................................................................................ 41 1.2 Intrusion Detection................................................................................. 41 1.3 Network Security Monitoring..................................................................42 1.4 Schwachstellen- und bedrohungsorientierte Verteidigung im Vergleich...45 1.5 Der NSM-Zyklus: Erfassung, Erkennung und Analyse..............................46 1.5.1 Erfassung................................................................................................47 1.5.2 Erkennung..............................................................................................47 1.5.3 Analyse...................................................................................................48 1.6 Kritik an NSM..........................................................................................48 1.7 Die Analytiker.........................................................................................49 1.7.1 Wichtige Fähigkeiten...............................................................................50 1.7.2 Einteilung von Analytikern......................................................................52 1.7.3 Messen des Erfolgs.................................................................................53 1.8 Security Onion........................................................................................57 1.8.1 Installation..............................................................................................57 1.8.2 Security Onion aktualisieren...................................................................59 1.8.3 NSM-Dienste einrichten..........................................................................59 1.8.4 Security Onion testen.............................................................................60 1.9 Zusammenfassung..................................................................................62 Teil 1: Erfassung 63 2. Die Datenerfassung planen.......................................................... 65 2.1 Applied Collection Framework (ACF).......................................................66 2.1.1 Bedrohungen identifizieren.....................................................................67 2.1.2 Das Risiko quantifizieren........................................................................69 2.1.3 Datenquellen identifizieren.....................................................................70 2.1.4 Die Erfassung eingrenzen.......................................................................70 Inhaltsverzeichnis 9 2.2 Fallstudie: Onlinehändler........................................................................73 2.2.1 Bedrohungen der Organisation identifizieren.........................................74 2.2.2 Das Risiko quantifizieren........................................................................75 2.2.3 Datenquellen identifizieren.....................................................................77 2.2.4 Die Erfassung eingrenzen....................................................................... 81 2.3 Zusammenfassung..................................................................................83 3. Sensoren...................................................................................... 85 3.1 NSM-Datentypen....................................................................................86 3.1.1 Paketdaten (FPC)....................................................................................86 3.1.2 Sitzungsdaten.........................................................................................86 3.1.3 Statistische Daten...................................................................................87 3.1.4 Paketstringdaten (PSTR).........................................................................87 3.1.5 Protokolldaten........................................................................................87 3.1.6 Alarmdaten.............................................................................................87 3.2 Sensortypen...........................................................................................89 3.2.1 Nur Erfassung.........................................................................................89 3.2.2 Halbzyklus..............................................................................................89 3.2.3 Vollzyklus................................................................................................89 3.3 Sensorhardware......................................................................................90 3.3.1 CPU......................................................................................................... 91 3.3.2 Arbeitsspeicher.......................................................................................92 3.3.3 Festplattenplatz......................................................................................93 3.3.4 Netzwerkschnittstellen...........................................................................96 3.3.5 Lastenausgleich: Anforderungen für Socketpuffer..................................98 3.3.6 SPAN-Ports und Netzwerk-Taps im Vergleich...........................................99 3.4 Das Betriebssystem des Sensors.......................................................... 104 10 Inhaltsverzeichnis 3.5 Platzierung von Sensoren..................................................................... 104 3.5.1 Die richtigen Ressourcen nutzen........................................................... 105 3.5.2 Ein- und Austrittspunkte....................................................................... 105 3.5.3 Sichtbarkeit interner IP-Adressen......................................................... 107 3.5.4 Nähe zu kritischen Elementen................................................................110 3.5.5 Sichtfelddiagramme der Sensoren aufstellen........................................ 111 3.6 Den Sensor absichern............................................................................113 3.6.1 Betriebssystem- und Softwareaktualisierungen....................................114 3.6.2 Das Betriebssystem absichern...............................................................114 3.6.3 Eingeschränkter Internetzugriff..............................................................115 3.6.4 Minimale Softwareinstallation...............................................................115 3.6.5 VLAN-Segmentierung.............................................................................115 3.6.6 Host-IDS................................................................................................116 3.6.7 Zwei-Faktor-Authentifizierung................................................................116 3.6.8 Netzwerk-IDS.........................................................................................116 3.7 Zusammenfassung.................................................................................117 4. Sitzungsdaten............................................................................. 119 4.1 Flussdatensätze.................................................................................... 120 4.1.1 NetFlow................................................................................................. 124 4.1.2 IPFIX..................................................................................................... 125 4.1.3 Andere Flusstypen................................................................................ 125 4.2 Sitzungsdaten erfassen........................................................................ 126 4.2.1 Hardwareseitige Generierung............................................................... 126 4.2.2 Softwareseitige Generierung................................................................ 127 4.3 Flussdaten mit SiLK erfassen und analysieren...................................... 128 4.3.1 Das Packsystem von SiLK...................................................................... 129 4.3.2 Flusstypen in SiLK................................................................................. 130 4.3.3 Die Analysesuite von SiLK......................................................................131 Inhaltsverzeichnis 11 4.3.4 SiLK in Security Onion installieren........................................................ 132 4.3.5 Flussdaten mit Rwfilter filtern............................................................... 132 4.3.6 Verketten von Analysetools................................................................... 134 4.3.7 Zusätzliche Werkzeuge und Dokumentation......................................... 138 4.4 Flussdaten mit Argus erfassen und analysieren.................................... 138 4.4.1 Architektur............................................................................................ 139 4.4.2 Merkmale.............................................................................................. 139 4.4.3 Grundlegender Datenabruf................................................................... 140 4.4.4 Weitere Informationen über Argus........................................................ 142 4.5 Überlegungen zur Speicherung von Sitzungsdaten............................... 142 4.6 Zusammenfassung................................................................................ 144 5. FPC-Daten....................................................................................145 5.1 Dumpcap.............................................................................................. 147 5.2 Daemonlogger...................................................................................... 149 5.3 Netsniff-NG........................................................................................... 150 5.4 Das passende FPC-Erfassungswerkzeug auswählen............................. 152 5.5 Die FPC-Datenerfassung planen............................................................ 153 5.5.1 Speicherplatz........................................................................................ 153 5.5.2 Den Durchsatz an der Sensorschnittstelle mit Netsniff-NG und Ifpps berechnen.................................................................................... 155 5.5.3 Den Durchsatz an der Sensorschnittstelle mithilfe von Sitzungsdaten berechnen..................................................................... 156 5.6 Den Speicherbedarf für FPC-Daten senken........................................... 159 5.6.1 Dienste ausschließen............................................................................ 159 5.6.2 Kommunikation zwischen bestimmten Hosts ausschließen...................161 5.7 Die Aufbewahrung der FPC-Daten verwalten......................................... 163 5.7.1 Aufbewahrung nach Zeit....................................................................... 164 5.7.2 Aufbewahrung nach Umfang................................................................. 164 5.8 Zusammenfassung................................................................................ 169 12 Inhaltsverzeichnis 6. Paketstringdaten......................................................................... 171 6.1 Was sind Paketstringdaten?.................................................................. 172 6.2 PSTR-Datenerfassung........................................................................... 174 6.2.1 PSTR-Daten manuell generieren........................................................... 176 6.2.2 URLsnarf............................................................................................... 177 6.2.3 Httpry.................................................................................................... 178 6.2.4 Justniffer................................................................................................181 6.3 PSTR-Daten anzeigen............................................................................ 186 6.3.1 Logstash............................................................................................... 186 6.3.2 Rohtextzerlegung mit BASH-Tools......................................................... 195 6.4 Teil 2: Zusammenfassung................................................................................ 198 Erkennung 199 7. Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen...................................................................................201 7.1 Erkennungsmechanismen..................................................................... 201 7.2 Einbruchsindikatoren und Signaturen...................................................203 7.2.1 Host- und Netzwerkindikatoren............................................................204 7.2.2 Statische Indikatoren............................................................................205 7.2.3 Variable Indikatoren..............................................................................208 7.2.4 Evolution von Indikatoren und Signaturen............................................ 210 7.2.5 Signaturen optimieren.......................................................................... 212 7.2.6 Entscheidende Kontextinformationen für Indikatoren und Signaturen... 214 7.3 Indikatoren und Signaturen verwalten.................................................. 216 7.3.1 Einfache Verwaltung von Indikatoren und Signaturen mit CSV-Dateien... 217 7.3.2 Masterliste der Indikatoren und Signaturen.......................................... 218 7.3.3 Revisionstabelle für Indikatoren und Signaturen.................................. 221 Inhaltsverzeichnis 13 7.4 Frameworks für Indikatoren und Signaturen.........................................223 7.4.1 OpenIOC...............................................................................................223 7.4.2 STIX......................................................................................................226 7.5 Zusammenfassung................................................................................228 8. Reputationsgestützte Erkennung............................................... 229 8.1 Öffentliche Reputationslisten...............................................................230 8.1.1 Gängige öffentliche Reputationslisten.................................................. 231 8.1.2 Häufig auftretende Probleme bei der Verwendung öffentlicher Reputationslisten..................................................................................236 8.2 Automatisieren der reputationsgestützten Erkennung..........................239 8.2.1 Manuelles Abrufen und Erkennen mit BASH-Skripten...........................239 8.2.2 Collective Intelligence Framework (CIF).................................................245 8.2.3 Reputationsgestützte IP-Adressenerkennung mit Snort.......................249 8.2.4 Reputationsgestützte IP-Adressenerkennung mit Suricata................... 251 8.2.5 Reputationserkennung mit Bro.............................................................254 8.3 Zusammenfassung................................................................................258 9. Signaturgestützte Erkennung mit Snort und Suricata.................261 9.1 Snort.....................................................................................................262 9.1.1 Die Architektur von Snort......................................................................263 9.2 Suricata................................................................................................265 9.2.1 Die Architektur von Suricata.................................................................266 9.3 IDS-Engines in Security Onion austauschen.........................................268 9.4 Snort und Suricata initialisieren............................................................269 9.5 Snort und Suricata konfigurieren..........................................................272 9.5.1 Variablen...............................................................................................273 9.5.2 Regelsätze definieren...........................................................................277 9.5.3 Alarmausgabe.......................................................................................284 14 Inhaltsverzeichnis 9.5.4 Snort-Präprozessoren...........................................................................287 9.5.5 Zusätzliche Befehlszeilenargumente für den NIDS-Modus....................288 9.6 IDS-Regeln............................................................................................290 9.6.1 Aufbau von Regeln................................................................................290 9.6.2 Optimierung von Regeln.......................................................................308 9.7 Snort- und Suricata-Alarme anzeigen................................................... 316 9.7.1 Snorby.................................................................................................. 317 9.7.2 Sguil..................................................................................................... 318 9.8 Zusammenfassung................................................................................ 318 10. Bro...............................................................................................319 10.1 Grundprinzipien von Bro.......................................................................320 10.2 # ausführen..........................................................................................322 10.3 Bro-Protokolle.......................................................................................322 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen...................................327 10.4.1 Dateien extrahieren..............................................................................328 10.4.2 Selektive Dateiextraktion......................................................................330 10.4.3 Dateien aus laufendem Netzwerkverkehr entnehmen...........................332 10.4.4 Bro-Code verpacken..............................................................................335 10.4.5 Konfigurationsoptionen hinzufügen......................................................335 10.4.6 Darknet-Überwachung mit Bro..............................................................338 10.4.7 Das Darknet-Skript erweitern................................................................346 10.4.8 Die Standardverarbeitung von Benachrichtigungen aufheben..............346 10.4.9 Benachrichtigungen unterbinden, E-Mails senden und Alarme auslösen – auf die einfache Weise............................................ 351 10.4.10 Den Bro-Protokollen neue Felder hinzufügen........................................352 10.5 Zuammenfassung.................................................................................356 Inhaltsverzeichnis 15 11. Anomaliegestützte Erkennung anhand von statistischen Daten.................................................................... 357 11.1 Kommunikationsintensive Hosts mit SiLK finden..................................358 11.2 Diensterkennung mit SiLK.....................................................................362 11.3 Weitere Erkennungsmöglichkeiten mithilfe von Statistiken..................368 11.4 Statistiken mit Gnuplot grafisch darstellen........................................... 371 11.5 Statistiken mit Google Charts grafisch darstellen.................................375 11.6 Statistiken mit Afterglow grafisch darstellen.........................................380 11.7 Zusammenfassung................................................................................386 12. Frühwarn-Honeypots zur Erkennung.......................................... 387 12.1 Frühwarn-Honeypots............................................................................388 12.2 Arten von Honeypots............................................................................389 12.3 Architektur von Frühwarn-Honeypots....................................................390 12.3.1 Phase 1: Die zu simulierenden Geräte und Dienste bestimmen............. 391 12.3.2 Phase 2: Die Platzierung der Honeypots bestimmen............................. 391 12.3.3 Phase 3: Alarmierung und Protokollierung entwickeln..........................393 12.4 Honeypotplattformen...........................................................................394 12.4.1 Honeyd.................................................................................................395 12.4.2 Der SSH-Honeypot Kippo......................................................................399 12.4.3 Tom’s Honeypot....................................................................................404 12.4.4 Honeydocs............................................................................................407 12.5 Zusammenfassung................................................................................ 410 16 Inhaltsverzeichnis Teil 3: Analyse 411 13. Paketanalyse...............................................................................413 13.1 Gestatten: das Paket!............................................................................ 414 13.2 Paketmathematik.................................................................................. 416 13.2.1 Hexdarstellung von Bytes..................................................................... 416 13.2.2 Hexwerte ins Binär- und Dezimalformat umwandeln............................. 418 13.2.3 Bytes zählen......................................................................................... 419 13.3 Pakete zerlegen....................................................................................422 13.4 Tcpdump für die NSM-Analyse..............................................................428 13.5 Tshark für die Paketanalyse..................................................................432 13.6 Wireshark für die NSM-Analyse.............................................................437 13.6.1 Pakete erfassen....................................................................................437 13.6.2 Das Format der Zeitanzeige ändern.......................................................439 13.6.3 Übersicht über die Paketerfassung.......................................................440 13.6.4 Protokollhierarchie............................................................................... 441 13.6.5 Endpunkte und Konversationen............................................................442 13.6.6 Streams verfolgen.................................................................................443 13.6.7 E/A-Diagramm......................................................................................444 13.6.8 Objekte exportieren..............................................................................446 13.6.9 Benutzerdefinierte Spalten hinzufügen................................................447 13.6.10 Zerlegungsoptionen für Protokolle einrichten.......................................449 13.6.11 Erfassungs- und Anzeigefilter...............................................................450 13.7 Paketfilter............................................................................................. 451 13.7.1 Berkeley-Paketfilter (BPF)..................................................................... 451 13.7.2 Anzeigefilter von Wireshark..................................................................456 13.8 Zusammenfassung................................................................................ 461 Inhaltsverzeichnis 17 14. Aufklärung über Freund und Feind............................................. 463 14.1 Der Aufklärungszyklus für NSM............................................................463 14.1.1 Definition der Anforderungen...............................................................464 14.1.2 Planung.................................................................................................465 14.1.3 Erfassung..............................................................................................466 14.1.4 Verarbeitung.........................................................................................466 14.1.5 Analyse.................................................................................................467 14.1.6 Weitergabe...........................................................................................467 14.2 Aufklärung über eigene Elemente.........................................................467 14.2.1 Anamnese und physische Untersuchung von Netzwerkelementen.......468 14.2.2 Ein Bestandsmodell des Netzwerks aufstellen......................................469 14.2.3 PRADS (Passive Real-Time Asset Detection System).............................473 14.3 Aufklärung über Bedrohungen..............................................................480 14.3.1 Recherche über gegnerische Hosts.......................................................482 14.3.2 Recherche über schädliche Dateien......................................................492 14.4 Zusammenfassung................................................................................500 15. Der Analysevorgang....................................................................501 15.1 Analysemethoden.................................................................................502 15.1.1 Relationale Untersuchung.....................................................................502 15.1.2 Differenzielle Diagnose.........................................................................509 15.1.3 Umsetzen der Analysemethoden.......................................................... 517 15.2 Empfohlene Vorgehensweisen für die Analyse...................................... 518 15.2.1 Bei Paketen können Sie sich auf nichts verlassen................................. 518 15.2.2 Machen Sie sich klar, wie die Daten abstrahiert werden....................... 518 15.2.3 Vier Augen sehen mehr als zwei............................................................ 519 15.2.4 Laden Sie einen Angreifer niemals zum Tanz ein................................... 519 15.2.5 Pakete sind von Natur aus gut..............................................................520 18 Inhaltsverzeichnis 15.2.6 Wireshark macht so wenig einen Analytiker wie ein Teleskop einen Astronomen.................................................................................520 15.2.7 Klassifizierung hilft............................................................................... 521 15.2.8 Die Zehnerregel.....................................................................................522 15.2.9 Wenn Sie Hufe klappern hören, halten Sie nach Pferden Ausschau – nicht nach Zebras..................................................523 15.3 Morbidität und Mortalität von Zwischenfällen......................................523 15.3.1 M&M in der Medizin..............................................................................524 15.3.2 M&M in der Informationssicherheit......................................................524 15.4 Zusammenfassung................................................................................530 A. Steuerskripte für Security Onion.................................................531 A.1 Befehle auf oberster Ebene................................................................... 531 A.2 Befehle zur Serversteuerung................................................................532 A.3 Befehle zur Sensorsteuerung................................................................535 B. Wichtige Dateien und Verzeichnisse von Security Onion............ 539 B.1 Anwendungsverzeichnisse und Konfigurationsdateien.........................539 B.2 Verzeichnisse für Sensordaten.............................................................. 541 C. Paketheader............................................................................... 543 D. Umrechnungstabelle Dezimalzahlen/Hex/ASCII......................................................... 549 Stichwortverzeichnis........................................................................551 19 Danksagung In 2. Korinther 12, 9 heißt es: »Und er hat zu mir gesagt: Lass dir an meiner Gnade genügen; denn meine Kraft ist in den Schwachen mächtig. Darum will ich mich am allerliebsten rühmen meiner Schwachheit, auf dass die Kraft Christi bei mir wohne.« Dass ich in der Lage war, dieses Buch zu schreiben, legt Zeugnis davon ab, dass Gottes Kraft in den Schwachen mächtig ist. Es war das schwierigste Projekt, das ich jemals in Angriff genommen habe, und es war mein Glaube an Gott, der mich durchhalten ließ. Seine Hilfe hat dieses Buch und alle meine anderen Projekte möglich gemacht. Ich hoffe sehr, dass mein Werk Zeugnis von seiner großartigen Macht ablegen kann. Dieses Buch war nur dank der direkten und indirekten Beiträge vieler Menschen möglich. Ich möchte diese Gelegenheit nutzen, ihnen zu danken. Ellen, du bist meine Liebe, meine Stütze, meine Stärke und mein größter Fan. Nichts von alldem wäre ohne dich möglich gewesen. Ich möchte dir dafür danken, dass du den Stress, die Verzweiflung, die hektischen Stunden und den allgemeinen Wahnsinn ertragen hast, die mit dem Schreiben eines Buches verbunden sind. Ich möchte dir für die Hilfe danken, das Buch Korrektur zu lesen. Da konntest du endlich deinen Abschluss in Anglistik nutzen. Ich liebe dich und bin so stolz, dein Mann zu sein. Mama und Papa, wegen eures Einflusses bin ich der Mensch geworden, der ich bin. Alles, was ich tue, ist und bleibt eine Ehrung eures Charakters und eurer Liebe. Ich liebe dich, Papa. Ruhe in Frieden, Mama. Familie Sanders, wir sind zwar nicht viele, aber unsere gegenseitige Liebe ist enorm und für mich so wichtig. Auch wenn wir weit voneinander entfernt leben, weiß ich, dass ihr mich liebt und mich unterstützt, und dafür danke ich euch. Familie Perkins, es war wirklich erstaunlich, wie ihr mich in eurem Leben willkommen geheißen habt, und ich fühle mich gesegnet, dass ich eure Liebe und Unterstützung genieße. Jason Smith, du bist buchstäblich der klügste Mensch, dem ich je begegnet bin. Du bist nicht nur ein großartiger Mitarbeiter und Co-Autor, sondern hast dich auch als großartiger Freund erweisen. Ich scheue mich nicht zu sagen, dass du für mich wie ein Bruder bist. Ich bin ewig dankbar für alles. David Bianco und Liam Randall, ich kann euch nicht genug für eure Beiträge zu diesem Buch danken. Ich schätze sie weit mehr, als ihr euch vorstellen könnt. 20 Danksagung Was meine (ehemaligen und jetzigen) Mitarbeiter betrifft, war ich immer der Überzeugung, dass man selbst zu einer besseren Person wird, wenn man sich mit guten Menschen umgibt. Ich habe das Glück, mit den hervorragenden Menschen zusammenzuarbeiten, die zu den Besten und Brillantesten in der Branche gehören. Mein besonderer Dank gilt Jimmy, Jay, Suzanne, Teresa, John, Tom, Don, Rad, Larry, Jaime, James, Bob und Alec von der InGuardians-Familie. Ich möchte auch meine besondere Anerkennung für Mike Poor ausdrücken, der das Geleitwort zu diesem Buch geschrieben hat und zu meinen Paketninja-Idolen gehört. Den Mitarbeitern bei Syngress möchte ich dafür danken, dass sie mir die Gelegenheit geboten haben, dieses Buch zu schreiben und meinen Traum wahr werden zu lassen. Der technische Inhalt und die Richtung, die dieses Buches genommen hat, sind das Produkt von mehr Personen, als ich hier nennen kann, aber ich werde es wenigstens versuchen. Neben den bereits genannten möchte ich auch den folgenden Personen für ihre Beiträge danken, sei es die Begutachtung eines Kapitels oder die Besprechung einer Idee. Ohne euch wäre dies nicht möglich gewesen: Alexi Valencia, Ryan Clark, Joe Kadar, Stephen Reese, Tara Wink, Doug Burks, Richard Bejtlich, George Jones, Richard Friedberg, Geoffrey Sanders, Emily Sarneso, Mark Thomas, Daniel Ruef, der Rest des CERT-NetSA-Teams, Joel Esler, das Bro-Team, Mila Parkour, Dustin Weber und Daniel Borkmann. Chris Sanders 21 Die Autoren Chris Sanders (Hauptautor) Chris Sanders ist Berater, Autor und Forscher auf dem Gebiet der Informationssicherheit. Ursprünglich stammt er aus Mayfield in Kentucky, das 30 Meilen südwestlich einer Kleinstadt namens Possum Trot liegt, 40 Meilen südöstlich der Gehöftansammlung Monkey's Eyebrow und knapp nördlich einer Kurve, die allen Ernstes den Namen Podunk trägt. Chris ist leitender Sicherheitsanalytiker bei InGuardins. Er hat umfassende Erfahrung in der Unterstützung von Behörden und militärischen Dienststellen sowie mehrerer Fortune500-Unternehmen. In mehreren Positionen beim US-Verteidigungsministerium hat Chris erheblich dabei geholfen, die Rolle des CNDSP-Modells (Computer Network Defense Service Provider) zu fördern und verschiedene NSM- und Aufklärungswerkzeuge zu erstellen, die zurzeit zur Verteidigung der Nation eingesetzt werden. Chris hat mehrere Bücher und Artikel geschrieben, darunter den internationalen Bestseller Practical Packet Analysis von No Starch Press, der zurzeit seine zweite Auflage erlebt. Außerdem ist er mit mehreren Branchenzertifizierungen ausgezeichnet worden, darunter SANS GSE und CISSP. Im Jahr 2008 hat Chris den Rural Technology Fund gegründet. Dabei handelt es sich um eine nicht kommerzielle Organisation nach Artikel 501(c)(3), die Studenten aus länd­lichen Gegenden Stipendien auf dem Gebiet der Computertechnologie verleiht. Die ­Organisation fördert durch verschiedene Programme auch die technologische Entwicklung in ländlichen Gegenden. Sie hat bereits Tausende von Dollar an Stipendien und Unterstützung für Studenten aus dem ländlichen Raum bereitgestellt. Wenn Chris nicht gerade bis zu den Knien in Paketen steckt, besucht er die Spiele der Basketballmannschaft Wildcats der University of Kentucky, betätigt sich als Grillmeister und Hobby-Drohnenkonstrukteur und verbringt viel Zeit am Strand. Zurzeit lebt er mit seiner Frau Ellen in Charleston, South Carolina. Chris unterhält Blogs auf http://www.appliednsm.com und http://www.chrissanders.org. Auf Twitter finden Sie ihn als @chrissanders88. 22 Die Autoren Jason Smith (Co-Autor) Jason Smith arbeitet tagsüber als Intrusion-Detection-Analytiker und betätigt sich in seiner Freizeit als Schrottingenieur. Er stammt ursprünglich aus Bowling Green in Kentucky und hat seine Karriere mit Data Mining in umfangreichen Datenmengen und der FiniteElement-Methode als aufstrebender Physiker begonnen. Durch schieren Zufall brachte ihn sein Faible für Data Mining zu Informationssicherheit und Network Security Monitoring, wo er der Faszination der Datenbearbeitung und Automatisierung erlag. Jason blickt auf eine lange Tätigkeit zurück, bei der er Staats- und Bundesbehörden beim Schutz ihres Perimeternetzwerks geholfen hat. Zurzeit arbeitet er als Sicherheitsingenieur bei Mandiant. Im Rahmen seiner Entwicklungsarbeit hat er mehrere Open-Source-Projekte aufgebaut, die zu den empfohlenen Werkzeugen für das DISA-CNDSP-Programm gehören. Seine Wochenenden verbringt er regelmäßig in der Garage, um dort alles mögliche zu bauen, von Arcade-Spielautomaten bis zu Monoposto-Rennwagen. Zu seinen anderen Hobbys gehören Hausautomatisierungstechnik, Schusswaffen, Monopoly, Gitarrespielen und Essen. Jason liebt das ländliche Amerika, ist ein passionierter Autofahrer und wird von einem rücksichtslosen Lernwillen angetrieben. Zurzeit wohnt er in Frankfort, Kentucky. Sein Blog finden Sie auf http://www.appliednsm.com, und er twittert als @automayt. David J. Bianco (Mitwirkender) Bevor er Leiter des Hunt Teams bei Mandiant wurde, hat David fünf Jahre damit verbracht, ein aufklärungsgestütztes Erkennungs- und Reaktionsprogramm für ein Fortune-5-Unternehmen aufzubauen. Dabei hat er die Erkennungsstrategien für ein Netzwerk aus fast 600 NSM-Sensoren in mehr als 160 Ländern festgelegt und die Krisenreaktion auf die schwersten Zwischenfälle geleitet hat, die es in dem Unternehmen gegeben hat, hauptsächlich gezielte Angriffe. Als Blogger, Redner und Autor ist er in der Gemeinschaft der Sicherheitsexperten aktiv. Sie können David häufig zu Hause antreffen, wo er Doctor Who schaut, einen seiner vier Dudelsäcke spielt oder einfach mit seinen Kindern herumalbert. Er liebt lange Spaziergänge fast überall, nur nicht am Strand. David führt ein Blog auf http://detect-respond.blogspot.com und ist als @DavidJBianco auf Twitter unterwegs. Die Autoren 23 Liam Randall (Mitwirkender) Liam Randall geschäftsführender Teilhaber bei der Broala LLC in San Francisco, der Beratungsgruppe von Bro Core Teams. Er stammt ursprünglich aus Louisville in Kentucky, wo er als Systemadministrator arbeitete, während er bei der Xavier University seinen Bachelor in Informatik machte. Seine erste Arbeit auf dem Gebiet der Sicherung bestand darin, Gerätetreiber und XFS-Software für Geldautomaten zu schreiben. Zurzeit ist er als Berater für hochvolumige Sicherheitslösungen für Fortune 50, Research and Education Networks, verschiedene Teile der Streitkräfte und andere Organisationen tätig, die sehr auf Sicherheit achten müssen. Er ist als Redner beim Shmoocon, beim Darbycon und eim MIRcon aufgetreten und gibt regelmäßig Bro-Kurse bei Veranstaltungen zum Thema Sicherheit. Liam ist Ehemann und Vater und verbringt seine Wochenenden damit, Wein und Käse zu machen, im Garten zu arbeiten und technische Spielereien zu reparieren. Als Liebhaber von Freiluftaktivitäten nehmen seine Frau und er an Triatholons teil, schwimmen lange Strecken und genießen die örtliche Gemeinschaft. Liam führt ein Blog auf http://liamrandall.com und ist twittert als @Hectaman. 25 Geleitwort Eine Infrastruktur für Network Security Monitoring aufzubauen und zu betreiben ist ein anspruchsvolles Unterfangen. Chris Sanders und sein Autorenteam haben ein Grundgerüst für NSM geschaffen und geben dem Leser einen formalen Plan an die Hand, um Network Security Monitoring in die Praxis umzusetzen. Mittlere und große Organisationen stöhnen unter der Menge der Daten, die sie erfassen. Bei mehr als 100 Millionen Ereignissen in einigen Fällen ist es unverzichtbar, eine Überwachungsinfrastruktur und standardisierte Verfahren zur Hand zu haben, die sich an diese Größenordnung anpassen lassen. Wer suchet, der findet, heißt es, aber auch der Umkehrschluss ist wahr. Ohne Analyse hat es keinen Sinn, Daten zu erfassen, und manchmal nicht einmal, sich um eine Erkennung zu bemühen. Dieses Buch gibt Ihnen die Schlüssel für die einzelnen Schritte des NSMZyklus an die Hand: Erfassung, Erkennung und Analyse. In den 1930er Jahren kämpften viele Piloten aus der zivilen Luftfahrt darum, ihre Fähigkeiten für die Verteidigung des Landes einsetzen zu dürfen. Heute ist es wieder an der Zeit, dass Zivilisten eine aktivere Rolle in der Landesverteidigung übernehmen. Machen Sie sich nichts vor: Wir werden angegriffen. Produzierendes Gewerbe, Chemie, Öl und Gas, Energie und viele kritische Sektoren unserer Gesellschaft leiden unter einer Serie koordinierter und systematischer Angriffe. Während die Theoretiker über die Möglichkeiten zukünftiger kybernetischer Kriegführung philosophieren, stecken die Praktiker an der Front schon bis zum Hals darin. Ich rufe nicht zu den Waffen, sondern zur Analyse. Haben Sie einen Zwischenfall auf Root-Ebene erlebt? Dann müssen Sie Ihre Protokolle analysieren. Die meisten Netzwerkangriffe hinterlassen Spuren, und es ist Aufgabe der Systemadministratoren, die Protokolle auf Spuren von Einbrüchen zu untersuchen. Allerdings muss auch der Betreiber die Protokolle überprüfen, um die Systemleistung zu verbessern und um eine Analyse für Geschäftszwecke durchzuführen. Schon die Steigerung der Leistung kann den Ertrag steigern, ganz zu schweigen davon, was sich mit einer geschäftlichen Analyse erreichen lässt. Wir bei InGuardians werden zu Hilfe gerufen, wenn es darum geht, auf umfangreiche Einbrüchen zu reagieren. Die meisten Organisationen protokollieren die relevanten Daten von wichtigen Netzwerkgeräten, Proxys, Firewalls, Systemen und Anwendungen. Diese Daten werden längere Zeit gespeichert, ohne dass das direkt zum geschäftlichen Ertrag beiträgt. In vielen Fällen können wir allein durch die Analyse der Protokolle gegenwärtige und frühere Einbrüche erkennen. 26 Geleitwort Wenn Sie das nächste Mal an Ihrer Konsole sitzen, untersuchen Sie einige Protokolle. Vielleicht denken Sie jetzt: »Ich weiß nicht, wonach ich suchen soll.« Fangen Sie mit dem an, was Sie wissen, was Sie verstehen und was Ihnen gleichgültig ist, und verwerfen Sie es. Alles andere ist von Interesse. Semper vigilans, Mike Poor 27 Vorwort Ich liebe es, Schurken zu fangen. Schon als Kind wollte ich das tun, auf welche Weise auch immer. Ob ich mir das nächstbeste Handtuch als Superheldencape umlegte oder ob ich mit meinen Freunden Räuber und Gendarm spielte, ich genoss die Aufregung, Bösewichter aller Arten der Gerechtigkeit zu übergeben. So sehr ich mich auch bemühte, es gelang mir niemals, meine Wut so zu steigern, dass ich mich in ein riesiges, grünes Monster verwandelte, und von wie vielen Spinnen ich auch gebissen wurde, entwickelte ich doch nie die Fähigkeit, Spinnweben aus meinen Handgelenken zu verschießen. Ich erkannte auch ziemlich schnell, das ich nicht aus dem Holz war, aus dem Gesetzeshüter geschnitzt sind. Als mir all dies bewusst wurde und ich auch erkannte, dass ich nicht reich genug war, um mir eine Reihe extravaganter technischer Spielereien zu bauen und in einem Fledermauskostüm durch die Nacht zu schwirren, wandte ich mein Interesse Computern zu. Mehrere Jahre später hatte ich eine Position erreicht, in der ich meinem Kindheitstraum nachgehen konnte, Schurken zu fangen, wenn auch nicht auf die Weise, die ich mir ursprünglich vorgestellt hatte. Ich fange Schurken durch angewandtes Network Security Monitoring (NSM). Das ist, worum es in diesem Buch geht. Der Grundsatz von NSM lautet, dass jegliche Vorbeugung irgendwann versagen wird. Wie viel Zeit Sie auch immer darin investieren, Ihr Netzwerk abzusichern, die Schurken werden eines Tages die Oberhand gewinnen. Wenn das geschieht, müssen Sie sowohl technisch als auch organisatorisch so aufgestellt sein, dass Sie die Gegenwart eines Eindringlings erkennen und darauf reagieren können. Sie müssen in der Lage sein, einen Zwischenfall zu deklarieren und die Angreifer aus Ihrem Netzwerk zu vertreiben, bevor sie erheblichen Schaden anrichten können. »Aber wie kann ich schädliche Dinge erkennen?« Der Erkenntnisweg des NSM beginnt gewöhnlich mit dieser Frage. Wissenschaftliche Erkenntnisse entwickeln sich weiter. Noch bis in die 1980er glaubten Mediziner, dass Milch eine Behandlungsform für Magengeschwüre sei. Mit der Zeit fanden Wissenschaftler jedoch heraus, dass Magengeschwüre von dem Bakterium Helicobacter pyroli hervorgerufen werden und dass Milchprodukte ihr Wachstum sogar fördern können.1 Angebliche Fakten ändern sich, und obwohl wir gern glauben wollen, dass die meisten Naturwissenschaften exakte Wissenschaften sind, ist das nicht der Fall. Jegliches wissenschaftliches Wissen beruht auf begründeten Vermutungen, für die die zum jeweiligen Zeitpunkt bestmögli1 Jay, C. (3. November 2008). »Why it’s called the practice of medicine«. Abgerufen von http://www.wellsphere.com/chronic-pain-article/why-it-s-called-the-practice-of-medicine/466361 28 Vorwort chen Daten herangezogen wurden. Wenn im Laufe der Zeit mehr Daten verfügbar werden, können sich Antworten auf alte Fragen ändern und vermeintliche Tatsachen neu definiert werden. Das gilt sowohl für die Medizin als auch für NSM. Als ich mit der Anwendung von NSM begann, gab es leider noch nicht viele Quellen zu diesem Thema. Ehrlich gesagt, gibt es bis heute nicht viele. Abgesehen von gelegentlichen Blogs von Pionieren der Branche und wenigen ausgewählten Büchern scheinen diejenigen, die etwas darüber lernen wollen, sich selbst überlassen zu sein. Verstehen Sie mich nicht falsch: Es gibt massenhaft Bücher über TCP/IP, Paketanalyse und die verschiedenen Intrusion-Detection-Systeme. Das sind zwar alles wichtige Facetten des NSM, aber diese Bücher beschreiben nicht das Prinzip des Network Security Monitoring im Ganzen, ebenso wenig wie Sie aus einem Buch über Schraubenschlüssel herauszufinden lernen, warum ein Auto nicht anspringt. Dieses Buch ist der Anwendung des NSM gewidmet. Es gibt nicht einfach einen Überblick über die Werkzeuge oder die einzelnen Aspekte des NSM, sondern es beschreibt den Vorgang und zeigt, wie diese Werkzeuge und Aspekte in der Praxis helfen. Zielpublikum Letzten Endes ist dieses Buch als Leitfaden dafür gedacht, wie man ein praktizierender NSM-Analytiker werden kann. Zu meinen Aufgaben in meiner Arbeitsstelle gehört auch die Ausbildung neuer Analytiker. Dieses Buch ist nicht nur als Fachbuch für die Öffentlichkeit gedacht, sondern auch als Lehrbuch für eine solche Ausbildung. Daher bestand mein Ziel darin, dass Sie dieses Buch von vorn bis hinten lesen können, um ein grundlegendes Verständnis der Kernprinzipien zu gewinnen. Wenn Sie bereits als Analytiker tätig sind, hoffe ich, dass Ihnen dieses Buch eine Grundlage bietet, Ihre Analysetechniken zu erweitern, sodass Sie noch wirkungsvoller arbeiten können, als Sie es jetzt schon tun. Ich habe mit mehreren guten Analytikern gearbeitet, die zu großartigen Analytikern werden konnten, weil sie in der Lage waren, ihre Effektivität durch einige der hier vorgestellten Techniken und Informationen zu steigern. Die wirkungsvolle Ausübung von NSM erfordert eine gewisse Gewandtheit im Umgang mit den verschiedenen Tools. Daher werden in diesem Buch auch einige dieser Werkzeuge besprochen, z. B. das IDS Snort oder die Analysesuite SiLK, allerdings vom Standpunkt der Analytiker aus. Diejenigen, die mit der Installation und Wartung solcher Programme befasst sind, werden feststellen, dass ich dieses Thema nur streife. Stattdessen gebe ich bei Gelegenheit andere Quellen an, in denen die entsprechenden Informationen zu finden sind. Außerdem konzentriere ich mich in diesem Buch auf kostenlose und Open-Source-Tools. Damit will ich nicht nur denen entgegenkommen, die nicht das Budget für kommerzielle Analysewerkzeuge wie NetWitness oder Arcsight haben, sondern auch die Vorteile der Verwendung von Open-Source-Tools vorführen, die von Analytikern entworfen wurden und mehr Einblicke darin geben, wie diese mit den Daten umgehen. Vorwort 29 Voraussetzungen Die erfolgreichsten NSM-Analytiker sind diejenigen, die bereits Erfahrungen in anderen Gebieten der Informationstechnologie gesammelt haben, bevor sie beginnen, auf dem Feld der Sicherheit zu arbeiten. Das liegt daran, dass sie sich dadurch schon einige Fähigkeiten angeeignet haben, die für Analytiker wichtig sind, z. B. ein Verständnis von Systemen oder der Verwaltung von Netzwerken. Als Ersatz für solche Erfahrung habe ich eine kurze Liste von Büchern aufgestellt, die ich sehr gern gelesen habe und die meiner Meinung nach Einsichten in einige wichtige Fertigkeiten für Analytiker geben. Ich habe mich bemüht, dieses Buch so zu schreiben, dass nicht allzu viel Vorwissen erforderlich ist, aber empfehle Ihnen trotzdem, einige der folgenden Bücher als Ergänzung zu dem Stoff in diesem Buch zu lesen. •• TCP/IP Illustrated, Vol. 1, Second Edition: The Protocols von Kevin Fall und Dr. Richard Stevens (Addison-Wesley 2011) Grundkenntnisse in TCP/IP gehören zu den unverzichtbaren Voraussetzungen, um NSM wirkungsvoll betreiben zu können. Dieses klassische Lehrbuch von Dr. Richard Stevens wurde von Kevil Fall um die neuesten Protokolle, Standards und empfohlenen Vorgehensweisen sowie um IPv6, Sicherheitsfibeln für die einzelnen Protokolle usw. ergänzt. •• The Tao of Network Security Monitoring von Richard Bejtlich (Addison-Wesley, 2004). Richard Bejtlich hat viele der Grundprinzipien von NSM festgelegt, weshalb ich das vorgenannte Werk und seinen Blog in diesem Buch häufig zitieren werden. Sein Buch ist zwar fast zehn Jahre alt, aber ein Großteil des Stoffes ist im Rahmen des NSM nach wie vor gültig. •• Practical Packet Analysis von Chris Sanders (No Starch Press, 2010) Ich bin nicht über schamlose Eigenwerbung erhaben! Während das Buch von Dr. Stevens ein gründliches Nachschlagewerk zu TCP/IP darstellt, geht Practical Packet Analysis die Paketanalyse aus praktischer Sicht an, wobei Wireshark als Werkzeug der Wahl verwendet wird. Hier geht es darum, Pakete zu untersuchen, und wenn Sie sich Pakete noch nie zuvor genauer angesehen habe, empfehle ich es Ihnen als Grundlehrbuch. •• Counter Hack Reloaded von Ed Skoudis und Tom Liston (Prentice Hall, 2006) Dieses Buch ist eines der besten allgemeinen Sicherheitsbücher, die Sie kriegen können. Es behandelt Aspekte von praktisch allem, und ich kann es jedem ganz unabhängig von seiner Erfahrung nur empfehlen. Wenn Sie noch nie auf dem Gebiet der Sicherheit gearbeitet haben, ist Counter Hack Reloaded Pflichtlektüre für Sie. 30 Vorwort Der Aufbau dieses Buches Dieses Buch ist in die drei Hauptteile Erfassung, Erkennung und Analyse für die drei Kerngebiete des NSM gegliedert. In den einzelnen Kapiteln gehe ich auf die Werkzeuge, Techniken und Prozeduren des entsprechenden Gebiets ein. Als einfacher Junge vom Land aus Kentucky habe ich mich bemüht, in möglichst einfacher Sprache ohne viele Ausschmückungen zu schreiben. Ich habe auch versucht, kompliziertere Vorgänge nach Möglichkeit in eine Folge nachvollziehbarer Schritte zu zerlegen. Wie bei jedem Buch, in dem es um allgemeine Prinzipien geht, werden auch hier nicht sämtliche möglichen Situationen und Grenzfälle abgedeckt. Letzten Endes besteht dieses Buch aus Theorien, die auf den Forschungsarbeiten, Erfahrungen und Meinungen der Autoren beruhen. Wenn ich daher etwas als bewährte oder empfohlene Vorgehensweise bezeichne, kann es durchaus sein, dass Ihre eigenen Forschungen, Erfahrungen und Meinungen Sie zu anderen Schlussfolgerungen führen. Das sollte Sie nicht beunruhigen, denn schließlich ist NSM angewandte Wissenschaft. Kapitel 1: Network Security Monitoring in der Praxis Das erste Kapitel erklärt, was Netword Security Monitoring ist und welche Bedeutung es für die Sicherheit in der modernen Welt spielt. Hierin lernen Sie viele Kernbegriffe und Voraussetzungen kennen, die in diesem Buch verwendet werden. Teil 1: Erfassung Kapitel 2: Die Datenerfassung planen Das erste Kapitel im Teil über die Erfassung gibt eine Einführung in die Datenerfassung und einen Überblick über ihre Wichtigkeit. Hier wird auch das Applied Collection Framework eingeführt, das dazu dient, anhand einer Risikobewertung Entscheidungen darüber zu treffen, welche Daten erfasst werden sollen. Kapitel 3: Sensoren In diesem Kapitel wird die entscheidende Hardware für das NSM vorgestellt: die Sensoren. Als Erstes erhalten Sie hier einen kurzen Überblick über die verschiedenen NSM-Datentypen und die Arten von NSM-Sensoren. Dies führt uns zu wichtigen Überlegungen für den Erwerb und die Bereitstellung der Sensoren. Am Ende besprechen wir die Platzierung der NSM-Sensoren im Netzwerk. Sie erfahren auch, wie Sie Sichtfelddiagramme für die Analytiker aufstellen. Kapitel 4: Sitzungsdaten In diesem Kapitel geht es um die Wichtigkeit von Sitzungsdaten. Außerdem erhalten Sie eine ausführliche Beschreibung der SiLK-Suite zur Erfassung von NetFlow-Daten. Außerdem sehen wir uns kurz die Argus-Suite zur Erfassung und Untersuchung von Sitzungsdaten an. Kapitel 5: FPC-Daten Am Anfang dieses Kapitels steht ein Überblick über FPC-Daten. Mit Netsniff-NG, Daemonlogger und Dumpcap lernen Sie verschiedene Tools kennen, um PCAP-Daten Vorwort 31 zu erfassen. Anschließend wird erörtert, wie Sie die Speicherung und Pflege von FPCDaten planen und wie Sie die Menge der zu speichernden Daten einschränken können. Kapitel 6: Paketstringdaten Dieses Kapitel gibt eine Einführung in PSTR-Daten (Paketstring) und ihren WErt für die NSM-Analyse. Wir sehen uns verschiedene Methoden an, um mit Werkzeugen wie Httpry und Justniffer PSTR-Daten zu generieren. Außerdem sehen wir uns die Werkzeuge Logstash und Kibana zur Zerlegung und Anzeige dieser Daten an. Teil 2: Erkennung Kapitel 7: Erkennungsmechanismen, Einbruchsindikatoren und Signaturen In diesem Kapitel geht es um die Beziehung zwischen Erkennungsmechanismen und Einbruchsindikatoren. Wir sehen uns an, wie Indikatoren logisch gegliedert und wie sie zur Einbeziehung in ein NSM-Programm effizient verwaltet werden können. Dazu gehören ein System zur Klassifizierung von Indikatoren sowie Messgrößen, um die Genauigkeit der Indikatoren, die in verschiedenen Erkennungsmechanismen bereitgestellt wurden, zu berechnen und zu verfolgen. Außerdem sehen wir uns die beiden Formate OpenIOC und STIX für Einbruchsindikatoren an. Kapitel 8: Reputationsgestützte Erkennung Der erste Typ von Erkennung, den wir in diesem Teil besprechen, ist die reputationsgestützte. Dabei sehen wir uns das Grundprinzip sowie verschiedene Quellen an, mit deren Hilfe Sie herausfinden können, welche Reputation ein Gerät genießt. Sie werden auch erfahren, wie Sie diesen Vorgang mit einfachen BASH-Skripten, mit Snort, Suricata, CIF und Bro automatisieren können. Kapitel 9: Signaturgestützte Erkennung mit Snort und Suricata Die signaturgestützte Erkennung ist die herkömmliche Vorgehensweise. Dieses Kapitel gibt eine Einführung darin und beschreibt die Verwendung der Intrusion-DetectionSysteme Snort und Suricata einschließlich einer ausführlichen Erklärung, wie Sie für diese beiden Plattformen IDS-Signaturen anlegen. Kapitel 10: Bro Dieses Kapitel beschreibt Bro, eine weit verbreitete anomaliegestützte Erkennungslösung. Wir sehen uns die Architektur und die Sprache von Bro sowie mehrere praktische Fälle an, die die Leistungsfähigkeit von Bro als IDS und als Protokollierungs-Engine veranschaulichen. Kapitel 11: Anomaliegestützte Erkennung anhand von statistischen Daten In diesem Kapitel besprechen wir die Verwendung von Statistiken, um Anomlien im Netzwerk zu erkennen. Dabei konzentrieren wir uns auf verschiedene NetFlow-Tools wie Rwstats und Rwcount. Außerdem sehen wir uns an, wie Sie Statistiken mithilfe von Gnuplot und der API von Google Charts grafisch darstellen können. Das Kapitel enthält auch mehrere praktische Beispiele für Statistiken, die sich aus NSM-Daten generieren lassen. 32 Vorwort Kapitel 12: Frühwarn-Honeypots zur Erkennung Honeypots wurden ursprünglich nur zu Forschungszwecken verwendet, doch Frühwarn-Honeypots können auch als wirkungsvolles Erkennungswerkzeug dienen. Dieses Kapitel gibt einen Überblick über die verschiedenen Arten von Honeypots und zeigt, wie Sie sie in einer NSM-Umgebung einsetzen können. Außerdem sehen wir uns mit Honeyd, Kippo und Tom’s Honeypot einige beliebte Honeypot-Anwendungen an, die sich für diesen Zweck eignen. Auch Honeydocs werden kurz angesprochen. Teil 3: Analyse Kapitel 13: Paketanalyse Die wichtigste Fähigkeit eines NSM-Analytikers besteht darin, Paketdaten zu deuten und zu entziffern. Um das wirkungsvoll tun zu können, sind Grundkenntnisse über den Aufbau von Paketen erforderlich. Diese vermittelt Ihnen dieses Kapitel und stellt Byte für Byte die Felder vor, aus denen ein Paket besteht. Zur Veranschaulichung verwenden wir Tcpdump und Wireshark. Des Weiteren beschäftigen wir uns mit Paketfiltertechniken mithilfe von Berkeley-Paketfiltern und Wireshark-Anzeigefiltern. Kapitel 14: Aufklärung über Freund und Feind Die Fähigkeit, Informationen über eigene und über gegnerische Systeme einzuholen, kann bei einer Untersuchung den Ausschlag geben. Am Anfang dieses Kapitels steht eine Einführung in den klassischen Aufklärungszyklus und seine Bedeutung für NSM. Danach sehen wir uns Methoden an, um Informationen über eigene Systeme zu gewinnen, z. B. über Netzwerkscans oder mithilfe von PRADS-Daten. Danach geht es um die verschiedenen Arten der Aufklärung über Bedrohungen und einige der grundlegenden Möglichkeiten der taktischen Aufklärung über gegnerische Hosts. Kapitel 15: Der Analysevorgang Im letzten Kapitel geht es um den Analysevorgang als Ganzes. Wir beginnen mit einer Besprechung von zwei Analysemethoden, der relationalen Untersuchung und der differenziellen Diagnose, und geben Beispiele für beide Vorgehensweisen an. Danach geht es darum, wie Sie mithilfe von Morbiditäts- und Mortalitätsbesprechungen Erkenntnisse aus Zwischenfällen ziehen können. Den Abschluss bildet eine Aufstellung von bewährten Vorgehensweisen für die Analyse. Hinweis zu IP-Adressen In den Beispielen in diesem Buch werden IP-Adressen angegeben, sowohl im Text und in den Listings als auch in den Screenshots. Sofern nicht anderes angegeben, wurden diese Adressen zufällig bestimmt. Jegliche Übereinstimmung mit tatsächlichen öffentlichen IPAdressen ist rein zufällig und steht in keinerlei Zusammenhang mit dem Datenverkehr der Organisationen, denen diese Adressen gehören. Vorwort 33 Begleitwebsite Für einige der Dinge, die wir gern noch in dieses Buch aufgenommen hätten, konnten wir leider keinen Platz mehr finden. Daher haben wir eine Begleitwebsite angelegt, auf der Sie weitere Überlegungen zu den verschiedenen NSM-Themen, Beispielcode und Tipps und Tricks finden. Diese Website finden Sie unter der Adresse http://www.appliednsm.com. Während der Produktion dieses Buches haben wir die Website nicht sehr oft aktualisiert, aber wir haben vor, nach der Veröffentlichung regelmäßig Beiträge zu dem Blog zu leisten. Auch Errata (zur englischen Originalausgabe dieses Buchs) werden Sie dort finden. Unterstützung für wohltätige Organisationen Wir sind sehr stolz darauf, dass wir unsere Autorenhonorare aus diesem Buch zu 100 % den folgenden fünf Wohltätigkeitsorganisationen spenden. Rural Technology Fund Schüler aus ländlichen Gebieten, selbst diejenigen mit hervorragenden Abschlüssen, haben weniger Gelegenheit, sich mit Technologie beschäftigen, als ihre Kommilitonen aus den Städten und Vorstädten. 2008 hat Chris Sanders den Rural Technology Fund gegründet, der versucht, die digitale Lücke zu verkleinern, die zwischen ländlichen Gemeinden und Städten klafft. Das wird durch ein Stipendiatsprogramm, Gemeindearbeit und die allgemeine Förderung und Befürwortung von Technologie in ländlichen Gegenden angefast. Unsere Stipendien sind für Schüler da, die in ländlichen Gemeinden leben, sich für Informatik interessieren und eine Ausbildung auf diesem Gebiet anstreben. Ein Teil der Tantiemen aus diesem Buch wird für diese Stipendien und für die Bereitstellung von Raspberry-PiComputern in Landschulen aufgewendet. Weitere Informationen: http://www.ruraltechnfund.org Hackers for Charity HFC wurde von Johnny Long gegründet und beschäftigt freiwillige Hacker (es werden keine Fragen gestellt), um ihre Fähigkeiten in kurzen »Mikroprojekten« zu nutzen, mit denen Wohltätigkeitsorganisationen geholfen werden soll, die sich keine traditionellen technischen Ressourcen leisten können. Daneben ist HFC auch in Uganda präsent, um Hilfsorganisationen zu unterstützen, die sich für die ärmsten Menschen der Welt einsetzen. Die Gruppe bietet kostenlose Computerkurse, technische Unterstützung, Netzwerkdienste usw. an. Sie hat bereits viele örtliche Schulen mit Computern und Schulungssoftware unterstützt. Über 34 Vorwort ihr Lebensmittelprogramm hat die HFC auch Nahrung für ostafrikanische Kinder bereitgestellt. Weitere Informationen: http://www.hackersforcharity.org Kiva Kiva ist die erste Online-Darlehensorganisation, die es ermöglicht, direkt Geld an Menschen in Entwicklungsländern zu spenden. Die Vermittlung übernehmen dabei ortsansässige Institutionen. Kiva stellt die einzelnen Personen, die ein Darlehen anfordern, mit ihrer Geschichte vor, sodass die Spender wissen, mit wem sie es zu tun haben. Einfach gesagt, ermöglicht Kiva Darlehen, die Leben ändern helfen. Gelder aus dem Verkauf dieses Buches gehen ebenfalls in diese Darlehen ein. Weitere Informationen: http://www.kiva.org Hope for the Warriors® Der Zweck von Hope for the Warriors® besteht darin, die Lebensqualität von 9/11-Veteranen, ihrer Familien und der Hinterbliebenen derjenigen zu heben, die in der Erfüllung ihrer Pflicht ums Leben gekommen sind oder dabei schwere körperliche oder seelische Schäden davongetragen haben. Hope for the Warriors® will das Selbstwertgefühl heben, die familiären Bande wiederherstellen und den Mitgliedern der öffentlichen Dienste und des Militärs sowie ihren Familien Hoffnung geben. Weitere Informationen: http://www.hopeforthewarriors.org Autism Speaks Autismus ist eine sehr vielschichtige Störung, die sich in verschiedenen Graden durch Schwierigkeiten in sozialen Beziehungen und der Kommunikation sowie in repetitivem Verhalten zeigt. Die US-Gesundheitsbehörde schätzt, das 1 von 88 amerikanischen Kindern eine Form von Autismus aufweist. Die Organisation Autism Speaks setzt sich für die Zukunft all derer ein, die mit einer der Störungen aus dem breiten Spektrum des Autismus zu kämpfen haben. Dazu finanziert sie biomedizinische Forschungen über die Ursachen, die Verhinderung, die Behandlung und Heilung vom Autismus. Außerdem bietet sie eine Interessenvertretung und Unterstützung für Familien mit autistischen Mitgliedern. Weitere Informationen: http://autismspeaks.org Vorwort 35 Kontakt Meine mitwirkenden Autoren und ich haben viel Zeit und Mühe in dieses Werk investiert, weshalb wir daran interessiert sind, von den Menschen zu hören, die es gelesen haben und ihre Gedanken darüber mitteilen möchten. Sie können all Ihre Fragen, Kommentare, Beschimpfungen und Heiratsanträge direkt an die folgenden Adressen senden: Chris Sanders, Hauptautor E-Mail: chris@chrissanders.org Blog: http://www.chrissanders.org; http://www.appliednsm.com Twitter: @chrissanders88 Jason Smith, Co-Autor E-Mail: jason.smith.webmail@gmail.com Blog: http://www.appliednsm.com Twitter: @automayt David J. Bianco, mitwirkender Autor und Fachgutachter E-Mail: davidjbianco@gmail.com Blog: http://detect-respond.blogspot.com/; http://www.appliednsm.com Twitter: @davidjbianco Liam Randall, fachlicher Mitarbeiter E-Mail: liam@bro.org Blog: http://liamrandall.com; http://www.appliednsm.com Twitter: @liamrandall 1 Network Security Monitoring in der Praxis Wenn ich mir den derzeitigen Zustand der Sicherheit von Systemen anschaue, die mit dem Internet verbunden sind, fühle ich mich an den Wilden Westen erinnert. Für die Amerikaner der damaligen Zeit war der Westen eine brachliegende Ressource, ein unermessliches unentdecktes Land, in dem zahllose Gelegenheiten warteten. Als immer mehr Menschen in den Westen zogen, entstanden kleine Gemeinden, und sowohl Einzelpersonen als auch Familien konnten zu Wohlstand gelangen. Mit dem Wohlstand und dem Erfolg kam aber auch unvermeidlich das Verbrechen. Die Städte lagen weit verstreut, aber es gab keine übergreifende Durchsetzung von Recht und Ordnung. Das ermöglichte es Banden von Desperados, von Stadt zu Stadt zu ziehen und dort zu rauben und die örtlichen Ressourcen zu plündern. Wenn es nicht gerade dem örtlichen Sheriff gelang, sie zu erschießen, wurden diese Kriminellen aufgrund der mangelnden Koordination und Kommunikation zwischen den Vertretern des Gesetzes in den einzelnen Städten nur selten gefasst. In unserer heutigen Zeit sind wir mit einer ähnlichen Situation konfrontiert. Das Internet stellt ebenso ein brachliegendes Land voller Gelegenheiten dar, in dem man mit einem Domänennamen und etwas Knochenfett den amerikanischen Traum verwirklichen kann. Ebenso wie der Westen hat jedoch auch das Internet seine Banden von Desperados. Statt mit Bankräubern und Entführern haben wir es heute mit Botnetbetreibern und Browser- 38 1 Network Security Monitoring in der Praxis hijackern zu tun. Außerdem haben wir ebenfalls mit dem Problem zu kämpfen, dass die Durchsetzung von Recht und Ordnung örtlich beschränkt ist. Wir sehen einer weltweiten Bedrohung entgegen, doch jedes Land – und in manchen Fällen sogar einzelne Bundesstaaten – wendet seine eigenen, nicht miteinander zu vereinbarenden Gesetze an. Das Problem im Westen bestand darin, dass die Kriminellen organisiert waren, die Ordnungshüter dagegen nicht. Während der letzten zehn Jahre hat es auf dem Gebiet der Computersicherheit zwar erhebliche Verbesserungen gegeben, doch die Verteidiger sind immer noch dabei, den Vorsprung der Gruppen aufzuholen, die weltweite kriminelle Netzwerke betreiben. Leider lässt sich dieses Problem nicht über Nacht lösen; falls überhaupt. Diese Tatsache erlegt die Verantwortung dafür, die Computernetzwerke und die darin enthaltenen Daten vor Kriminellen zu verteidigen, den Einzelpersonen an der Front auf. Die wirksamste Möglichkeit dazu besteht meiner Ansicht nach in der Anwendung von Network Security Monitoring (»Netzwerksicherheitsüberwachung«) oder kurz NSM. Bei dieser Methode handelt es sich um die Erfassung und Analyse von Netzwerksicherheitsdaten. Die Informationssicherheit wird traditionell in viele verschiedene Teilgebiete aufgeteilt, aber ich persönlich bevorzuge die Kategorien, die das US-Verteidigungsministerium in seiner Anweisung 8500.21 für die Verteidigung von Computernetzwerken aufgestellt hat: Schützen. Der Schwerpunkt dieses Gebiets liegt darauf, Systeme gegen Ausnutzung und Eindringen abzusichern. Zu den typischen Aufgaben in diesem Bereich gehören Schwachstelleneinschätzung, Risikobewertung, Vorgehen gegen Malware, Schulung des Gefahrenbewusstseins der Benutzer und andere allgemeine Maßnahmen zur Informationssicherheit. Erkennen. Hier geht es darum, laufende und frühere Sicherheitsverletzungen zu erkennen. Dazu gehören die Sicherheitsüberwachung des Netzwerks, das Aufspüren von Angriffen und das Ausgeben von Warnungen. Reagieren. Der dritte Bereich betrifft die Reaktion auf das Auftreten einer Sicherheitsverletzung. Diese umfasst die Eindämmung des Zwischenfalls, Netzwerk- und Hostforensik, Malwareanalyse und Berichterstattung über den Zwischenfall. Erhalten. Im letzten Bereich geht es um die Menschen, Prozesse und Technologien im Zusammenhang mit der Verteidigung von Computernetzwerken. Hierzu zählen Verträge, Stellenbesetzung, Schulung, Entwicklung und Umsetzung von Technologien und Verwaltung von unterstützenden Systemen. Wie Sie sich wahrscheinlich schon gedacht haben, geht es in diesem Buch hauptsächlich um die Erkennung. Eine korrekt durchgeführte Netzwerksicherheitsüberwachung kann sich jedoch positiv auf alle Gebiete der Verteidigung von Computernetzwerken auswirken. 1 Anweisung 8500.2 des US-Verteidigungsministeriums, Umsetzung der Informationssicherheit (6. Februar 2003) – http://www.dtic.mil/whs/directives/corres/pdf/850002p.pdf 1.1 Kernbegriffe des Network Security Monitoring 39 1.1 Kernbegriffe des Network Security Monitoring Bevor wir in die Tiefe gehen, müssen wir zunächst verschiedene Begriffe klären, die in diesem Buch ausgiebig verwendet werden. Da es sich bei Network Security Monitoring und Netzwerksicherheit um relativ neue Zweige handelt, ist es bei vielen dieser Begriffe schwierig, allgemein gültige und präzise Definitionen zu finden. Ich habe mich an der Dokumentation des US-Verteidigungsministeriums, der Literatur zur CISSP-Zertifizierung und anderen Texten zum Network Security Monitoring orientiert. Die Definitionen habe ich größtenteils umformuliert. 1.1.1 Schützenswerte Güter Schützenswerte Güter sind alles in Ihrer Organisation, was für diese einen Wert hat. Das können Wertgegenstände wie Computer, Server und Netzwerkgeräte sein, aber auch Daten, Menschen, Prozesse, geistiges Eigentum und der Ruf der Organisation. In diesem Buch beschäftige ich mich meistens mit den schützenswerten Gütern im Bereich Ihres vertrauenswürdigen Netzwerks. Das kann auch Netzwerke außerhalb Ihres eigenen einschließen, die Sie als vertrauenswürdig einschätzen (z. B. von befreundeten Staaten, Tochtergesellschaften oder Partnern in der Lieferantenkette). 1.1.2 Angreifer Ein Angreifer ist eine Partei mit den Fähigkeiten und der Absicht, Schwachstellen in einem Wert auszunutzen. Dabei sehen sich Einzelpersonen ganz anderen Angreifern ausgesetzt als große Unternehmen, und Kleinstaaten ganz anderen als Supermächten. Angreifer lassen sich grob in zwei Kategorien einteilen, nämlich strukturierte und nicht strukturierte. Strukturierte Angreifer nutzen formale Taktiken und Vorgehensweisen, und haben klar definierte Ziele. Dazu gehören unter anderem kriminelle Organisationen, Hacktivisten, Spionagedienste und das Militär. Gewöhnlich handelt es sich um Gruppen, wobei es jedoch durchaus vorkommen kann, dass Einzelpersonen als strukturierte Angreifer auftreten. Ein strukturierter Angreifer verfolgt fast immer ein bestimmtes Ziel, das aus ganz bestimmten Gründen ausgewählt wurde. Unstrukturierten Angreifern mangelt es an der Motivation, den Fähigkeiten, den strategischen Kenntnissen oder der Erfahrung strukturierter Angreifer. Die typischen Vertreter dieser Kategorie sind Einzelpersonen und kleine, nur locker organisierte Gruppen. Die Ziele werden meistens nur aufgrund der Gelegenheiten ausgewählt, also weil sie leicht angreifbar erscheinen. Unabhängig von ihrem Umfang oder ihrer Natur haben alle Angriffe eines gemeinsam: Sie wollen etwas von Ihnen stehlen. Das kann Geld sein, aber auch geistiges Eigentum, Ihr Ruf oder auch einfach nur Ihre Zeit. 40 1 Network Security Monitoring in der Praxis 1.1.3 Schwachstelle Eine Schwachstelle ist ein Mangel in einer Software, einer Hardware oder einem Verfahren, der einem Angreifer die Möglichkeit gibt, nicht autorisierten Zugang zu einem Wert im Netzwerk zu erhalten. Das kann beispielsweise nicht ordnungsgemäß geschriebener Code sein, der eine Ausnutzung durch einen Pufferüberlauf ermöglicht, ein aktiver Netzwerkport in einem öffentlichen Bereich, der Zugriff auf ein Netzwerk bietet, oder ein schlecht konstruiertes Authentifizierungssystem, in dem ein Angreifer den Nachnamen seines Opfers erraten kann. Denken Sie daran, dass auch Menschen Schwachstellen darstellen können. 1.1.4 Exploit Ein Exploit ist die Methode, mit der eine Schwachstelle ausgenutzt wird. Bei einer Softwareschwachstelle kann es sich um Exploitcode mit einer Schadroutine handeln, durch die der Angreifer über das Netzwerk Aktionen auf dem Zielsystem ausführen kann, z. B. das Öffnen einer Befehlsshell. Wenn eine Webanwendung eine Schwachstelle bei der Verarbeitung von Ein- und Ausgaben aufweist, können Angreifer dies mithilfe von SQL-Injektion ausnutzen. Wenn sich ein Angreifer Zutritt zu einem Bürogebäude verschafft, indem er hinter einem legitimen Mitarbeiter durch die Tür schlüpft, nachdem dieser sie mit seiner ID-Karte geöffnet hat, kann man das auch als eine Art Exploit betrachten. 1.1.5 Risiko Risikomanagement ist ein sehr weites Feld, weshalb es auch mehrere verschiedene Definitionen von »Risiko« gibt. Die treffendste Definition im Zusammenhang mit Network Security Monitoring besagt, dass es sich beim Risiko um das Maß für die Wahrscheinlichkeit handelt, mit der ein Angreifer eine Schwachstelle ausnutzen wird. Die meisten Manager bevorzugen zwar eine quantifizierbare Größe, doch meistens ist die Quantifizierung von Risiken vergebliche Liebesmüh, da es sehr schwer ist, den Stellenwert von Netzwerken und Daten zu bestimmen. Ich werde zwar häufig über Maßnahmen sprechen, die das Risiko für einen bestimmten Wert erhöhen oder verringern, aber nur so weit auf Berechnungen zur Quantifizierung von Risiken eingehen, wie nötig ist, um eine Strategie zur Erfassung von Risiken aufzustellen. 1.1.6 Anomalie Eine Anomalie ist ein beobachtetes Geschehen in einem System oder Netzwerk, das außerhalb des Üblichen liegt. Erkennungswerkzeuge wie Intrusion-Detection-Systeme oder Anwendungen zur Protokolluntersuchung lösen bei Anomalien Alarm aus. Anomalien können Systemabstürze, nicht wohlgeformte Pakete, unübliche Kontakte mit unbekann- 1.2 Intrusion Detection 41 ten Hostcomputern oder große Datenmengen sein, die in einem kurzen Zeitraum übertragen werden. 1.1.7 Zwischenfall Wenn ein Ereignis untersucht wird, kann es als Teil eines Zwischenfalls klassifiziert werden. Ein Zwischenfall ist eine Verletzung der Computersicherheitsrichtlinien, der Richtlinien zur akzeptablen Benutzung oder der Standardsicherheitspraktiken oder eine unmittelbar bevorstehende Verletzung dieser Art. Einfacher gesagt: Ein Zwischenfall bedeutet, dass in Ihrem Netzwerk etwas Schlimmes passiert ist oder gerade passiert. Das kann die Übernahme eines Computers auf Root-Ebene, die Installation von Malware, ein Denialof-service-Angriff oder die Ausführung von Schadcode aus einer Phishing-E-Mail sein. Bei Zwischenfällen treten ein oder mehrere Ereignisse auf, aber die meisten Ereignisse stehen nicht in direktem Zusammenhang zu einem Zwischenfall. 1.2 Intrusion Detection Bevor der Begriff »Network Security Monitoring« geprägt wurde, wurde das Gebiet »Erkennen« einfach als »Intrusion Detection« beschrieben, also als das »Aufspüren von Eindringlingen«. Obwohl inzwischen schon seit zehn Jahren von Network Security Monitoring die Rede ist, werden diese beiden Begriffe häufig noch synonym verwendet. In Wirklichkeit aber sind sie nicht gleichbedeutend; Intrusion Detection ist nur ein Teil des modernen Network Security Monitoring. Als das Gebiet des »Erkennens« noch ganz nach dem alten Modell der Intrusion Detection geformt war, wies es folgende Merkmale auf: Schwachstellenorientierte Verteidigung. In dem am weitesten verbreiteten Bedrohungsmodell nutzen Angreifer, die in ein Netzwerk einbrechen, eine Schwachstelle in der Software aus. Da dieses Modell so einfach und klar umrissen ist, bauten die ersten Intrusion-Detection-Programme darauf auf: Sie dienten dazu, die Ausnutzung solcher Schwachstellen zu erkennen. Bevorzugung der Erkennung gegenüber der Erfassung. Der Schwerpunkt in diesem Gebiet lag auf der Erkennung. Es wurde zwar auch eine Datenerfassung durchgeführt, allerdings war sie häufig ungerichtet, und die Erfassungsstrategien waren nicht an den Zielen der Erkennung ausgerichtet. Diese planlose Datenerfassung zeigte sich in Haltungen wie: »Lieber zu viele Daten als zu wenige!« und: »Erstmal alles erfassen, sortieren kann man es später.« Größtenteils signaturgestützt. Die Ausnutzung einer Softwareschwachstelle ist oftmals eine ziemlich gleichbleibende Vorgehensweise, die sich sehr leicht in eine Signatur für ein IDS umsetzen lässt. Daher waren herkömmliche Intrusion-Detection-Systeme darauf angewiesen, dass die Schwachstellen bekannt waren und Signaturen für die entsprechenden Exploits entwickelt wurden. 42 1 Network Security Monitoring in der Praxis Versuche zur Automatisierung der Analyse. Das stark vereinfachende, auf Schwachstellen gestützte Modell zum Erkennen von Eindringversuchen führte zu der Vorstellung, dass man dem von einem IDS hervorgerufenen Alarm mit guter Wahrscheinlichkeit vertrauen konnte. Daher verließ man sich kaum auf menschliche Analytiker, sondern versuchte, die Analyse nach der Erkennung so weit wie möglich zu automatisieren. Die herkömmliche Intrusion Detection war zu ihrer Zeit mäßig erfolgreich, doch bei der jetzigen Sicherheitslage ist sie nicht mehr wirkungsvoll. Der Hauptgrund dafür ist das Versagen der hauptsächlich auf Schwachstellen ausgerichteten Verteidigung. Eine der besseren Erklärungen dafür gibt Bejtlich2. Stellen Sie sich vor, dass in mehrere Häuser in einem Stadtviertel eingebrochen wird. Die Polizei könnte darauf reagieren, indem sie die Häuser in der Nachbarschaft mit Stacheldrahtzäunen umgibt oder dort Stahltüren und Fensterriegel einbauen lässt. Auch dies stellt eine an den Schwachstellen orientierte Vorgehensweise dar. Es ist aber kaum verwunderlich, dass man nie von solchen Maßnahmen der Strafverfolgungsbehörden hört. Der Grund dafür ist, dass entschlossene Verbrecher, die gezielt dieses Viertel aufs Korn genommen haben, einfach nach anderen Schwachstellen in den Häusern suchen werden, die sie ausnutzen können. 1.3 Network Security Monitoring Network Security Monitoring hat vor allem dank des Militärs Fortschritte gemacht, das nun einmal von Natur aus zu den größten Vorreitern einer verteidigungsbereiten Haltung zählt. Angesichts der ausgiebigen Nutzung von Informationstechnologie durch das Militär, der Bedeutung militärischer Operationen und der hohen Vertraulichkeit der Daten in diesem Rahmen ist das auch kein Wunder. Die IO-Doktrin3 (Information Operations) der Vereinigten Staaten besagt, dass die IOFähigkeiten eines Befehlshabers für folgende Ziele genutzt werden sollten: •• Zerstören: Ein System oder ein Objekt so beschädigen, dass es keine Funktion mehr ausführen und ohne komplette Neuerstellung nicht wieder in einen nutzbaren Zustand zurückgeführt werden kann. •• Stören: Den Informationsfluss unterbinden oder unterbrechen. •• Schwächen: Die Effektivität oder Effizienz von feindlichen Führungs-, Lage- und Kommunikationssystemen sowie Maßnahmen zur Informationsgewinnung herabsetzen. IO kann auch die Moral einer Einheit senken, den Wert eines Ziels verringern oder die Güte der Entscheidungen und Aktionen des Gegners verschlechtern. •• Verweigern: Den Gegner daran hindern, auf wichtige Informationen, Systeme und Dienste zuzugreifen und sie zu nutzen. 2 Bejtlich, Richard, TaoSecurity-Blog, »Real Security is Threat Centric« (November 2009), http://taosecurity. blogspot.com/2009/11/real-security-is-threat-centric.html 3 Veröffentlichung 3-13 des US-Verteidigungsministeriums, »Information Operations« (13. Februar 2006), http://www.carlisle.army.mil/DIME/documents/jp3_13.pdf 1.3 Network Security Monitoring 43 •• Täuschen: Personen etwas glauben lassen, was nicht wahr ist. Die gegnerischen Entscheidungsträger durch Manipulation ihrer Wahrnehmung in die Irre führen. •• Ausnutzen: Zugriff auf gegnerische Führungs- und Lagesysteme erlangen, um Informationen zu sammeln oder um falsche oder irreführende Informationen unterzuschieben. •• Beeinflussen: Andere dazu bringen, sich auf eine Weise zu verhalten, die für befreundete Kräfte günstig ist. •• Schützen: Schutzmaßnahmen gegen Spionage und das Abgreifen geheimer Informationen und Ausrüstungsteile treffen. •• Erkennen: Frühere und laufende Einbrüche in Informationssysteme entdecken oder wahrnehmen. •• Wiederherstellen: Informationen und Informationssysteme in den ursprünglichen Zustand zurückversetzen. •• Reagieren: Auf die IO-Angriffe oder Einbrüche des Gegners oder anderer schnell reagieren. Viele dieser Ziele stehen miteinander in Verbindung. Der Großteil des Network Security Monitoring betrifft das Erkennen, um besser reagieren zu können. Gelegentlich kann das auch Elemente anderer Gebiete einschließen. Bei der Erörterung von Honeypots werden wir uns auch mit Täuschung und Schwächung beschäftigen. Das Erkennungselement dieser IO-Doktrin steht auch in Übereinstimmung mit der Definition für Angriffswahrnehmung und Warnung (Attack Sense and Warning, AS&W) des US-Verteidigungsministeriums.4 Demnach ist AS&W die Erkennung, Korrelation, Identifizierung und Charakterisierung eines breiten Spektrums beabsichtigter unautorisierter Tätigkeiten wie Einbrüche in Computer oder Angriffe darauf, in Verbindung mit der Benachrichtigung der Befehlshaber und Entscheidungsträger, sodass eine geeignete Reaktion entwickelt werden kann. Zu AS&W gehören auch die Erfassung und Weiterleitung von Aufklärungsdaten im Zusammenhang mit Angriffen und Einbrüchen, eingeschränkte Empfehlungen für unmittelbare Reaktionen und eingeschränkte Beurteilungen der möglichen Auswirkungen. Network Security Monitoring wird als das neue Modell für das Gebiet des Erkennens angesehen. Seine Eigenschaften weichen erheblich von denen der klassischen Intrusion Detection ab: Prävention schlägt irgendwann unvermeidlich fehl. Eine der bittersten Realitäten für Verteidiger besteht darin, dass sie irgendwann verlieren werden. Wie stark die Schutzeinrichtungen auch sind und welche vorbeugenden Maßnahmen auch immer unternommen wurden, schließlich wird ein motivierter Angreifer doch eine Möglichkeit zum Eindringen finden. Nicht nur in der Informationssicherheit gilt, dass die Verteidiger immer mit den Angreifern Schritt halten müssen. Wenn der Verteidiger stärkere Bunker baut, so baut der Angreifer stärkere Bomben. Trägt der Verteidiger beschusshemmende Westen, beginnt der 4 Direktive O-8530.1 des US-Verteidigungsministeriums, »Computer Network Defense (CND)« (8. Januar 2001), http://www.doncio.navy.mil/uploads/0623IYM47223.pdf 44 1 Network Security Monitoring in der Praxis Angreifer, panzerbrechende Munition zu verwenden. Wenn Verteidiger professionelle Firewalls für Unternehmen einsetzen und ihre Server stets auf dem neuesten Stand halten, sollten sie daher nicht überrascht sein, dass die Angreifer mithilfe von Social-EngineeringAngriffen Fuß im Netzwerk zu fassen versuchen oder Zero-Day-Exploits einsetzen, um Root-Zugriff auf den gepatchten Server zu bekommen. Erst wenn Sie akzeptieren, dass Ihre Sicherheitsvorkehrungen irgendwann überwunden werden, können Sie Ihre Haltung ändern, sodass Sie sich nicht mehr allein auf Prävention verlassen, sondern sich auch mit Erkennung und Reagieren beschäftigen. Wenn der große Einbruch geschieht, ist Ihre Organisation dann vorbereitet, um wirkungsvoll reagieren und das Leck stopfen zu können. Zielgerichtete Datenerfassung. Früher wurden Daten aus allen verfügbaren Quellen erfasst und an einem zentralen Ort abgelegt. Die Verwaltung von Installationen nach diesem Muster war jedoch äußerst teuer und bot darüber hinaus keinen echten Wert, da die wirklich brauchbaren Arten von Daten nicht zur Verfügung standen und sich die Erfassungswerkzeuge nicht an die Größenordnung der Daten anpassen ließen, mit denen sie zu arbeiten gezwungen waren. So wie ein Gramm Prävention ein Pfund Sanierung aufwiegt, so wiegt ein Gramm Datenerfassung ein Pfund Erkennung auf. Wenn Sie den gleichen Grad an Erkennung mit weniger Daten erreichen können, dann sparen Sie dadurch CPU-Zyklen und arbeiten viel effizienter. Außerdem können Sie den menschlichen Analytikern dann nur die Daten geben, die sie auch tatsächlich brauchen, sodass sie ihre Entscheidungen schneller treffen können. Das kann den Unterschied zwischen einem kleinen Einbruch und einem umfassenden Datenleck ausmachen. Zyklische Prozesse. Intrusion Detection alter Schule war ein linearer Prozess. Dabei erhielten Sie eine Alarmmeldung, bestätigten sie und reagierten nach Bedarf. Damit waren sie fertig. Diese lineare Vorgehensweise ist jedoch nicht nur naiv, sondern auch unverantwortlich. Jeden einzelnen Zwischenfall einzeln zu betrachten, als liefe er im luftleeren Raum auf, hilft nicht, das Netzwerk zu verteidigen. Manche Angriffe dauern zwar wirklich nur wenige Sekunden, doch erfahrene Angreifer gehen oft langsam und methodisch vor. Manchmal benötigen sie Monate, um ihre Ziele zu erreichen. Um von dieser Einzelbetrachtung wegzukommen, ist es erforderlich, die Erkennung von Einbrüchen und die Reaktion darauf als zyklischen Prozess zu behandeln. Das bedeutet, dass die Datenerfassung in die Erkennung eingeht, die Erkennung in die Analyse und die Analyse wiederum in die Erfassung. Dadurch kann der Verteidiger mit der Zeit Kenntnisse aufbauen, um das Netzwerk besser zu verteidigen. Bedrohungsorientierte Verteidigung. Alle Merkmale, die ich bis jetzt aufgezählt habe, führen uns zum Prinzip der an den Bedrohungen oder den Angreifern orientierten Verteidigung. Bei der schwachstellenorientierten Vorgehensweise liegt der Schwerpunkt auf dem »Wie«, hier aber auf dem »Wer« und »Warum«. Insbesondere müssen Sie sich fragen, wer daran interessiert sein mag, Ihr Netzwerk anzugreifen, und was die Angreifer damit gewinnen können. 1.4 Schwachstellen- und bedrohungsorientierte Verteidigung im Vergleich 45 Eine bedrohungsorientierte Verteidigung lässt sich viel schwerer durchführen als die frühere Vorgehensweise, denn dazu sind erstens ausführliche Einsichten in Ihr Netzwerk und zweitens die Möglichkeit erforderlich, Informationen über die Absichten und Fähigkeiten der Angreifer zu erfassen und zu analysieren. Ersteres lässt sich mit entsprechendem Zeiteinsatz von jeder Organisation mit Leichtigkeit erreichen, doch die zweite Voraussetzung ist in allen Organisationen außer staatlichen Stellen nur sehr schwer zu erfüllen. Unmöglich ist es aber sicherlich nicht. Denken Sie noch einmal an unser Beispiel von Einbrüchen in einem Stadtviertel zurück. Statt einer schwachstellenorientierten Vorgehensweise, bei der zusätzliche Schutzmechanismen wie Stacheldraht und Stahltüren aufgefahren werden, konzentriert sich die Polizei bei einem an den Angreifern orientierten Ansatz darauf, die Häuser, in die eingebrochen wurde, genau zu untersuchen, um nach Ähnlichkeiten oder Gemeinsamkeiten der verschiedenen Einbrüche zu suchen und die wahrscheinlichen Ziele der Einbrecher herauszufinden. Anhand dieser Informationen kann die Polizei dann ein Profil der Kriminellen erstellen. Damit wiederum ist es möglich, in der Verbrecherkartei nach Personen zu suchen, die ähnliche Taktiken angewandt haben. Zusammen mit anderen Fahndungsmaßnahmen kann diese Art von Analyse dazu führen, dass die Täter gefasst werden, was weitere Einbrüche verhindert. Das ist im Grunde genommen die Vorgehensweise der bedrohungsorientierten Verteidigung und des Network Security Monitoring. 1.4 Schwachstellen- und bedrohungsorientierte Verteidigung im Vergleich Stellen Sie sich einmal vor, das Tor beim Eishockey würde nicht von einem Torwart verteidigt, sondern von einer Backsteinmauer geschützt. Das mag zu Anfang nach einer idealen Lösung aussehen. Die schwachstellenorientierte Denkschule bevorzugt die Steinmauer. Sie erscheint zunächst undurchdringlich, da sie den Großteil des Tors abdeckt und die angreifende Mannschaft nur zum Ziel gelangen kann, wenn sie die Mauer durchbricht. Mit der Zeit jedoch durchschlagen vereinzelte Schüsse die Mauer. Ganze Steine können aus dem Verbund herausbrechen. Natürlich könnte man diese Steine wieder ersetzen, aber während man an der einen Stelle einen Stein einfügt, kann sich an einer anderen Stelle schon wieder ein Stein lösen. Bedrohungsorientierte Personen dagegen bevorzugen die Verteidigung durch einen Torwart. Es ist dabei natürlich wichtig, dass der Torwart alle Schüsse abfängt. Wenn jedoch gelegentlich ein Puck durchgeht, kann er erkennen, dass er beispielsweise tief an seiner rechten Seite hereingekommen ist. Wenn er es wieder mit demselben Stürmer zu tun bekommt, wird er sein besonderes Augenmerk auf diese Stelle richten, sodass es weniger wahrscheinlich ist, dass der Gegner ein weiteres Tor erzielt. Der große Unterschied besteht darin, dass die Steinmauer ihre Taktik nie ändert und nicht dazulernen kann. Ein Torwart dagegen macht sich nach und nach mit den Gewohnheiten 46 1 Network Security Monitoring in der Praxis der einzelnen Stürmer vertraut. Dadurch kann er lernen, sich anpassen und immer erfolgreicher werden. Sowohl bei der schwachstellen- als auch bei der bedrohungsorientierten Verteidigung besteht das Ziel darin, das Netzwerk zu schützen, doch auf unterschiedliche Weise. Eine Übersicht über diese Unterschiede finden Sie in Tabelle 1.1. Tabelle 1.1: Schwachstellen- und bedrohungsorientierte Verteidigung Schwachstellenorientiert Bedrohungsorientiert Stützt sich auf Prävention Akzeptiert, dass Prävention irgendwann versagen wird Schwerpunkt auf Erkennung Schwerpunkt auf Datenerfassung Sieht alle Bedrohungen gleich an Geht davon aus, dass Angreifer unterschiedliche Werkzeuge, Taktiken und Verfahrensweisen einsetzen Analysiert jeden Angriff für sich allein Kombiniert die aus den verschiedenen Angriffen gewonnenen Erkenntnisse Verlässt sich sehr stark auf die signatur­ gestützte Erkennung Nutzt Daten aus allen Quellen Bis dahin unbekannte Bedrohungen können nur sehr schwer erkannt werden Gegnerische Aktivitäten auch jenseits der bekannten Signaturen können gut erkannt werden Linearer Prozess Zyklischer Prozess 1.5 Der NSM-Zyklus: Erfassung, Erkennung und Analyse Der Zyklus des Network Security Monitoring besteht aus drei deutlich voneinander unterscheidbaren Phasen: Erfassung, Erkennung und Analyse (siehe Abb. 1.1). Dieses Buch ist in drei Teile gegliedert, die sich jeweils einer dieser Phasen widmen. Abbildung 1.1: Der NSM-Zyklus 1.5 Der NSM-Zyklus: Erfassung, Erkennung und Analyse 47 1.5.1 Erfassung Am Anfang des NMS-Zyklus steht der wichtigste Schritt: die Erfassung. Sie erfolgt mit einer Kombination aus Hardware und Software, um Daten für die NSM-Erkennung und -Analyse zu generieren, zu gliedern und zu speichern. Die Datenerfassung ist der wichtigste Teil des Zyklus, da sie bestimmt, wie gut eine Organisation die Erkennung und Analyse durchführen kann. Es gibt verschiedene Arten von NMS-Daten und verschiedene Vorgehensweisen, um sie zu erfassen. Zu den gebräuchlichsten Kategorien gehören Inhaltsdaten, Sitzungsdaten, statistische Daten, Paketstringdaten und Alarmdaten. Je nach den Bedürfnissen der Organisation, der Netzwerkarchitektur und den verfügbaren Ressourcen können diese Daten entweder hauptsächlich für die Erkennung oder ausschließlich für die Analyse oder für beide Zwecke genutzt werden. Aufgrund des erforderlichen starken Personaleinsatzes gehört die Erfassung am Anfang zu den arbeitsintensivsten Elementen des NSM-Zyklus. Für eine wirkungsvolle Erfassung sind gemeinsame Anstrengungen der Organisationsführung, des Informationssicherheitsteams und der Netzwerk- und Systemadministratoren erforderlich. Die Datenerfassung schließt unter anderem folgende Aufgaben ein: •• •• •• •• •• •• •• Festlegen, wo das größte Risiko in der Organisation liegt Bedrohungen der Ziele der Organisation identifizieren Relevante Datenquellen identifizieren Die Auswahl der zu erfassenden Datenquellen verfeinern SPAN-Ports zur Erfassung von Paketdaten einrichten SAN-Speicher für die Aufbewahrung von Protokollen bereitstellen Hardware und Software für die Datenerfassung einrichten 1.5.2 Erkennung Bei der Erkennung werden die erfassten Daten untersucht und bei unerwarteten Ereignissen und Daten Alarme ausgelöst. Das geschieht gewöhnlich mithilfe einer Erkennungsmethode, die sich auf Signaturen, Anomalien oder Statistiken stützt. Als Ergebnis werden Alarmdaten generiert. Die Erkennung wird meistens durch entsprechende Software durchgeführt. Zu den am häufigsten verwendeten Softwarepaketen für diesen Zweck gehören die Netzwerk-Intrusion-Detection Systeme (NIDS) Snort IDS und Bro IDS und die Host-Intrusion-DetectionSysteme (HIDS) OSSEC, AIDE und McAfee HIPS. Einige Anwendungen zur Verwaltung von Sicherheitsinformationen und -ereignissen (Security Information and Event Management, SIEM) nutzen sowohl Netzwerk- als auch Hostdaten für eine Erkennung auf der Grundlage korrelierter Ereignisse. 48 1 Network Security Monitoring in der Praxis Zwar erfolgt die Erkennung zum Großteil durch Software, doch manchmal wird sie auch durch eine manuelle Analyse der Datenquellen durchgeführt. Das gilt insbesondere bei der retrospektiven Analyse. 1.5.3 Analyse Die Analyse ist die letzte Phase des NSM-Zyklus. Hier deuten und untersuchen Menschen die Alarmdaten. Dazu ist es oft nötig, zusätzliche Untersuchungsdaten aus anderen Quellen zu erfassen und die Art des vorliegenden Alarms sowie alle möglicherweise gefährlichen Hosts über öffentliche Informationsquellen zu recherchieren (Open Source Intelligence, OSINT). Es gibt eine Vielzahl von Vorgehensweisen für die Analyse. Sie kann beispielsweise folgende Aufgaben einschließen: •• •• •• •• Paketanalyse Netzwerkforensik Hostforensik Malwareanalyse Die Analyse ist der zeitraubendste Teil des NSM-Zyklus. Zu diesem Zeitpunkt kann das Ereignis bereits als Zwischenfall klassifiziert sein, sodass die Reaktionsmaßnahmen beginnen können. Der NSM-Zyklus wird dadurch geschlossen, dass die Erfahrungswerte aus der Erkennungs- und Analysephase in die Erfassungsstrategie der Organisation einfließen. 1.6 Kritik an NSM Wie jeder Wechsel zu einem neuen Modell wurde auch die Einführung von NSM und bedrohungsorientierter Sicherheit von einem gerüttelt Maß an Kritik begleitet. Das Hauptproblem der NSM besteht darin, das sie selbst noch nicht ausgereift und darüber hinaus Teil der ebenfalls noch nicht ausgereiften Informationstechnologie ist. Es hat zwar Bemühungen gegeben, die verschiedenen Terminologien und Protokolle zu standardisieren, aber es gibt immer noch einen großen Unterschied zwischen dem geschriebenen Wort und der Umsetzung in der Praxis. Das zeigt sich in den Betriebssystemen, in den Anwendungen, die darauf laufen, und in den Protokollen, über die sie miteinander kommunizieren. Es kann vorkommen, dass drei Personen, die sich über Informationssicherheit unterhalten, drei verschiedene Terminologien nutzen. Das behindert die Schulung sehr stark. Einer der Gründe dafür, dass die Weiterbildung von Ärzten so erfolgreich verläuft, ist die Tatsache, dass alle vor Beginn ihres praktischen Jahrs über das gleiche Grundwissen 1.7 Die Analytiker 49 verfügen (zumindest theoretisch), von welcher Schule sie auch immer kommen. Aufgrund der Standardisierung der Weiterbildungsprogramme und Prüfungen wird von allen Kandidaten das gleiche Kompetenzniveau erwartet, damit sie ihre Approbation erhalten. Das ganze System beruht darauf, dass man sich über die geforderten theoretischen Kenntnisse, praktischen Fertigkeiten und sonstigen Voraussetzungen einig geworden ist. Der NSM jedoch fehlt eine solche Standardisierung, weshalb die Fachleute in diesem Gebiet oft verschiedene Sprachen sprechen. Die Medizin hat einige tausend Jahre Vorsprung vor der NSM. Daher sind wir gezwungen, in der NSM große Schritte nach vorn zu tun, aber es ist nicht zu erwarten, dass das Problem in absehbarer Zeit überwunden wird. Ein weiteres Problem der NSM besteht in dem Umfang der Fähigkeiten, die für eine wirkungsvolle Ausübung erforderlich sind. Einfach gesagt, gibt es nicht genug Leute mit der nötigen Erfahrung und den Kenntnissen, um den Bedarf zu befriedigen. Es ist erstaunlich, dass es in unserer krisengebeutelten Wirtschaft, in der viele Menschen Schwierigkeiten haben, einen Job zu finden, so viele offene Stellen für Personen mit NSM- oder ähnlichen Fähigkeiten gibt. Für NSM kann es zwar auch Posten für Einsteiger geben, aber dabei ist es erforderlich, dass die Vorgesetzten über genügend Erfahrung verfügen, um die Neulinge anzuleiten. Es ist aber schwer, die Mitarbeiter auf den mittleren und höheren Ebenen zu halten, da sie häufig zu besser bezahlten Posten in der Beratung oder im Management wechseln. Ein letztes großes Problem für die Ausweitung von NSM sind die Kosten, die damit verbunden sind, ein NSM-Programm aufzustellen und zu erhalten. Die hohen Einstiegskosten werden zwar oft mit der Hardware zur Erfassung und Untersuchung der Daten in Verbindung gebracht, doch den Großteil bilden gewöhnlich die Personalkosten für die Analyse und die Kosten zur Unterstützung der NSM-Infrastruktur, die die Analytiker nutzen. Dieses Problem verschlimmert sich noch bei Organisationen, die ein Network Security Monitoring rund um die Uhr benötigen. Ein weiterer Kostenfaktor kommt bei Organisationen hinzu, die eine kommerzielle SIEM-Software benötigen. Solche Pakete sind zwar nicht in jedem Fall notwendig, können aber für einige Organisationen ein Muss sein, und die Preise dafür liegen im sechs- bis siebenstelligen Bereich. 1.7 Die Analytiker Das wichtigste Merkmal eines NSM-Programms ist der Mensch, der die Analyse durchführt. Der Analytiker interpretiert Alarmdaten, analysiert und untersucht sie im Zusammenhang mit verwandten Daten und ermittelt, ob es sich bei dem Ereignis um einen Fehlalarm handelt oder ob eine weitergehende Untersuchung erforderlich ist. Je nach Größe und Struktur der Organisation können die Analytiker auch an der Reaktion auf Zwischenfälle beteiligt sein oder andere Aufgaben wie Hostforensik oder Malwareanalyse durchführen. 50 1 Network Security Monitoring in der Praxis Die Analytiker sind die entscheidenden Mitglieder einer Organisation. Sie sind es, die erfasste Pakete nach einem einzigen verdächtigen Bit durchforsten. Von ihnen wird erwartet, dass sie sich mit den neuesten Werkzeugen, Taktiken und Verfahren auskennen, die von Angreifern eingesetzt werden. Die Sicherheit Ihres Netzwerks hängt von der Fähigkeit Ihrer Analytiker ab, ihre Aufgaben ordnungsgemäß zu erfüllen. 1.7.1 Wichtige Fähigkeiten Es gibt eine Reihe wichtiger Fähigkeiten, die Analytiker mitbringen sollten. Sie setzen sich aus einem allgemeinen Grundwissen zusammen, über das alle Analytiker verfügen sollten, und aus Kenntnissen über einzelne Spezialgebiete. Im Idealfall sollten sich Analytiker in zwei oder drei solcher Gebiete auskennen, aber in der Praxis verlange ich nur Kenntnisse in einem solchen Gebiet. Grundlegende Fähigkeiten •• •• •• •• •• •• •• •• •• •• •• •• Bedrohungsorientierte Sicherheit, NSM und der NSM-Zyklus TCP/IP Gebräuchliche Protokolle der Anwendungsschicht Paketanalyse Windows-Architektur Linux-Architektur Grundlegende Datenanalyse (BASH, Grep, SED, AWK usw.) Nutzung von Intrusion-Detection-Systemen (Snort, Suricata usw.) Anzeichen von Einbrüchen und Feineinstellung von IDS-Signaturen Informationsbeschaffung aus öffentlichen Quellen Grundlegende Methoden der analytischen Diagnose Grundlegende Malware-Analyse Spezialisierung Es gibt unter anderem folgende Spezialgebiete für Analytiker: Offensivtaktiken. Der Schwerpunkt dieses Gebiets liegt auf Penetrationstests und Sicherheitsbewertungen. Analytiker mit diesem Spezialgebiet versuchen, Zugriff zu erhalten und das Netzwerk auf die gleiche Weise anzugreifen, wie ein Gegner es tun würde. Solche Versuche sind entscheidend, um Schwächen in der Arbeit anderer Analytiker zu finden. Außerdem können Analytiker, die sich mit Offensivtechniken auskennen, Aktivitäten von Angreifern bei der NSM-Analyse besser erkennen. Nützliche Fähigkeiten und Kenntnisse für dieses Fachgebiet sind Aufklärung im Netzwerk, Ausnutzen von Software und Diensten, Hintertüren, Nutzung von Malware und Techniken zum Abrufen von Daten. 1.7 Die Analytiker 51 Defensivtaktiken. Defensivtaktiker sind Meister der Erkennung und Analyse. Zu diesem Fachgebiet gehört es im Allgemeinen, neue Entwicklungstools und Analysemethoden zu konzipieren. Von Analytikern mit dieser Spezialisierung wird auch erwartet, dass sie sich stets über neue Werkzeuge und Forschungsergebnisse im Zusammenhang mit dem Schutz von Netzwerken auf dem Laufenden halten und diese Werkzeuge auf Eignung für das NSM-Programm der Organisation prüfen. Nützliche Fähigkeiten und Kenntnisse für dieses Fachgebiet sind ausführliche Kenntnisse in Netzwerkkommunikation, Funktionsweise und Mechanismen von Intrusion-Detection-Systemen, IDS-Signaturen und statistischer Erkennung. Programmierung. Code zu schreiben ist eine nützliche Fähigkeit für praktisch alle Teil­ gebiete der Informationstechnologie, insbesondere für Informationssicherheit und NSM. Analytiker, die in Programmierung bewandert sind, können eigene Erkennungsund Analyselösungen für ihr NSM-Team entwickeln. Außerdem sind sie oft sehr gut darin, auch große Datenmengen zu analysieren. Personen, die sich auf Programmierung für die Zwecke des Network Security Monitoring spezialisieren, sollten sehr gute Kenntnisse der BASH-Umgebung von Linux mitbringen und sich auch mit Interpretersprachen wie Python oder Perl, Websprachen wie PHP oder Java und schließlich auch kompilierten Sprachen wie C oder C++ vertraut machen. Systemadministration. Die Systemadministration ist zwar eine allgemeine Fähigkeit für sich, aber es ist auch möglich, sich auf Systemadministration im Zusammenhang mit NSM zu spezialisieren. Analytiker, die das tun, sind sehr stark am Erfassungsprozess beteiligt, indem sie etwa IDS konfigurieren und Daten verschieben, sodass sie von verschiedenen Erkennungsprogrammen ordnungsgemäß erfasst werden können. Sie können auch Sensoren verbessern oder eine Datenerfassung über gutartige Hosts entwickeln. Ausführliche Kenntnisse in Windows und Linux sowie der Daten- und Protokollerfassung sind Voraussetzung für dieses Fachgebiet. Malwareanalyse. Bei der NSM werden häufig auch Proben bekannter und vermutlicher Malware erfasst. Jeder Analytiker sollte in der Lage sein, Malware in einer Sandbox auf Indikatoren zu untersuchen. Sollte eine Organisation aber jemals für sie maßgeschneiderte Malware finden, ist es von großem Vorteil, über eine Person zu verfügen, die auch eine ausgefeiltere Malwareanalyse durchführen kann. Dazu sind Kenntnisse sowohl in dynamischer als auch in statischer Analyse erforderlich. Hostforensik. Spezialisten in Hostforensik können Informationen aus Angriffen ermitteln, indem sie eine forensische Analyse des Hosts durchführen. Anhand dieser Informationen kann dann der Erfassungsprozess in der Organisation verbessert werden. Die entsprechenden Kenntnisse können auch genutzt werden, um neue Erkennungsmechanismen auf Hostebene zu bewerten und umzusetzen und neue Einbruchsindikatoren auf der Grundlage von Artefakten auf dem Host zu entwickeln. Nützliche Fähigkeiten für dieses Fachgebiet sind Festplatten-, Dateisystem- und Arbeitsspeicherforensik sowie die Aufstellung des zeitlichen Verlaufs von Zwischenfällen. 52 1 Network Security Monitoring in der Praxis 1.7.2 Einteilung von Analytikern In den meisten Organisationen werden Analytiker gewöhnlich nach ihrer Erfahrung in Jahren klassifiziert. Ich bevorzuge allerdings eine präzisere Einteilung nach drei Fähigkeitsgraden. Das ist nicht nur für die Einstellung und Disponierung nützlich, sondern setzt Analytikern auch sinnvolle Karriereziele. Das Modell mag nicht unbedingt zu jeder Organisation passen, aber es bildet immerhin einen guten Ausgangspunkt. Analytiker der ersten Ebene (L1) Auf Ebene L1 befinden sich die Einsteiger. Sie verfügen über gute Kenntnisse der zuvor aufgeführten grundlegenden Fähigkeiten, haben sich aber noch nicht spezialisiert. Die meiste Zeit bringen sie damit zu, IDS-Alarme zu untersuchen und Analysen der Befunde durchzuführen. Am wichtigsten für die Karriere von L1-Analytikern ist es, Erfahrungen zu sammeln. Je mehr Protokolle, Pakete und Ereignisse sie zu Gesicht bekommen, umso besser können sie mit dem nächsten Ereignis umgehen, mit dem sie konfrontiert werden. Das lässt sich mit der Karriere eines Chirurgen vergleichen, der mit jeder durchgeführten Operation besser wird. In den meisten Organisationen fällt die Mehrheit der Analytiker in die L1-Gruppe. Analytiker der zweiten Ebene (L2) L2-Analytiker beherrschen einen Großteil der Grundfähigkeiten. Sie sind auf mindestens einem Gebiet spezialisiert und verbringen schon einen Teil ihrer Zeit außerhalb der üblichen Ereignisuntersuchungen, um ihre Fähigkeiten in dem gewählten Bereich zu schulen. L2-Analytiker fungieren als Mentoren für L1-Analytiker. Außerdem legen sie die empfohlenen Vorgehensweisen für das NSM-Programm ihrer Organisation fest. Sie helfen dabei, den Erkennungsprozess zu verbessern, indem sie Signaturen aufgrund von anderen Netzwerkereignissen und Recherchen in öffentlich zugänglichen Quellen entwickeln. L2-Analytiker eignen sich auch die Fähigkeit an, unterschiedliche Datenquellen manuell zu durchsuchen, um mögliche Ereignisse zu finden, anstatt sich nur auf automatische Erkennungswerkzeuge zu verlassen. Analytiker der dritten Ebene (L3) Auf Ebene L3 befinden sich die erfahrensten Analytiker einer Organisation. Sie sind in allen Grundfähigkeiten und auf mindestens einem Spezialgebiet firm. Innerhalb der Organisation übernehmen sie die Rolle der Vordenker. Anstatt Ereignisse zu untersuchen, verbringen sie ihre Zeit hauptsächlich damit, andere Analytiker zu fördern, Schulungsmaßnahmen zu entwickeln und durchzuführen und bei komplizierten Untersuchungen beratend zur Seite zu stehen. L3-Analytiker sind außerdem die Hauptverantwortlichen dafür, die Fähigkeiten der Organisation zur Erfassung und Erkennung zu entwickeln und zu verbessern. Dazu kann es gehören, neue Werkzeuge zu konzipieren oder zu entwickeln und vorhandene Werkzeuge zu bewerten. 1.7 Die Analytiker 53 1.7.3 Messen des Erfolgs In den meisten Organisationen wird die Messung des Erfolgs oder Misserfolgs eines NSM-Programms nicht richtig gehandhabt. Findet tatsächlich ein Einbruch statt, hält die Geschäftsführung das oft für ein entscheidendes Versagen des Sicherheitsteams. Bei der schwachstellenorientierten Vorgehensweise, in der man sich voll und ganz auf Prävention verlässt, mag dies das angebrachte Denkmuster sein. Wenn eine Organisation jedoch akzeptiert, dass Prävention eines Tages zwangsläufig fehlschlägt, dann rechnet sie auch mit Einbrüchen. Organisationen, in denen diese Denkweise vorherrscht, hängen die E ­ ffektivität ihres NSM-Programms nicht daran auf, ob ein Einbruch stattfindet oder nicht, sondern daran, wie wirkungsvoll dieser Vorfall erkannt, analysiert und an die nächste Ebene übergeben wurde. Das NSM ist bei einem Einbruch für alles von der Erkennung bis zur Übergabe verantwortlich, wobei das Ziel darin besteht, den Reaktionskräften so schnell wie möglich angemessene Informationen zu liefern, sobald festgestellt worden ist, dass tatsächlich ein Zwischenfall vorliegt. In kleineren Organisationen kann das NSMTeam auch mit dem Reaktionsteam identisch sein, aber die Rollen sind logisch getrennt. Die Frage, die die Organisationsführung dem NSM-Team stellen sollte, lautet nicht: »Wie konnte das passieren?«, sondern: »Wie schnell konnten Sie den Zwischenfall erkennen? Wie schnell konnten Sie ihn an das Reaktionsteam weiterleiten? Wie können wir unsere NSM-Vorgänge anpassen, um das nächste Mal besser vorbereitet zu sein?« Die meisten Leser dieses Buches werden Analytiker sein, keine Mitglieder der Geschäftsführung, aber ich habe diesen Abschnitt dennoch eingefügt, damit Sie seinen Inhalt der Geschäftsführung nahebringen können. Vielleicht sind Sie auch eines Tages selbst in einer Position, um diesen Sinneswandel durchzusetzen. Das wichtigste Element eines NSM-Programms sind die Analytiker, die schließlich die genannten Fragen beantworten müssen. Ich hatte das Vorrecht, mit den Sicherheitsteams von Organisationen aller Größenordnungen zusammenzuarbeiten und zu beobachten. Dabei habe ich einige sehr gute, aber auch einige sehr schlechte Programme kennengelernt. Es gibt viele verschiedene Möglichkeiten, ein großartiges NSM-Team aufzustellen, aber alle Organisationen, die es nicht geschafft haben, durch NSM wirkungsvoll für Sicherheit zu sorgen, hatten eines gemeinsam: Sie hatten nicht erkannt, dass die Analytiker die wichtigste Rolle bei dieser Mission spielen. Anstatt in die Analytiker zu investieren und ihnen angemessene Befugnisse zu geben, investierten diese Organisation in teure Softwarepakete und unnötige Automatisierung. Wenn dann nach zwei Jahren ein massiver Einbruch geschieht, fragen sich die Entscheidungsträger, warum ihre für einen siebenstelligen Preis eingekaufte SIEM-Lösung den Angriff nicht festgestellt hat, als er sechs Monate zuvor begann. Es kommt aber noch schlimmer: Solche Organisationen sind beim Personal knauserig, sodass das ganze Team schließlich aus Anfängern ohne die erforderliche Erfahrung und den Hintergrund für die vorliegenden Aufgaben besteht. Es ist ganz natürlich, dass es in einem Team auch Einsteiger gibt, aber ohne Anleitung durch erfahrene Kollegen haben sie keine Gelegenheit, ihre Fähigkeiten zu verbessern. Es sind auch meistens dieselben Organisationen, die sich weigern, ausreichend Zeit und Geld für die Weiterbildung bereitzustellen. 54 1 Network Security Monitoring in der Praxis Erfolgreiche NSM-Teams weisen die folgenden Gemeinsamkeiten auf: Eine Kultur des Lernens schaffen Für den Erfolg des NSM sind Einfallsreichtum und Innovation unverzichtbar, die wiederum auf Motivation und Ausbildung fußen. Es ist eine Sache, die Weiterbildung durch regelmäßige Schulungsmaßnahmen zu fördern, aber eine ganz andere, eine Arbeitskultur zu schaffen, die das Lernen zur Grundlage hat. Das bedeutet nicht nur, Weiterbildung zuzulassen, sondern sie zu erleichtern, dazu zu ermutigen und sie zu belohnen. Um eine solche Kultur aufbauen zu können, müssen viele Hindernisse überwunden werden, die sich in einer typischen Arbeitsumgebung stellen. In einem traditionellen Unternehmen würde es schon starkes Stirnrunzeln hervorrufen, wenn in einem Büro mehrere Angestellte Bücher lesen oder an persönlichen technischen Projekten arbeiten, die nichts mit der Untersuchung von Ereignissen oder Paketen zu tun haben. Für einen Großteil des Personals ist es einfach undenkbar, seine Schreibtische zu verlassen, um an einer Tafel über die Feinheiten von Zeitreisen zu diskutieren. In Wirklichkeit aber sollten all solche Dinge willkommen geheißen werden, da sie die Moral verbessern und die Freude an der Arbeit steigern. Sie führen dazu, dass die Analytiker nach Feierabend mit einem guten Gefühl nach Hause gehen, sodass sie sich darauf freuen, am nächsten Tag mit neuen Ideen und neuer Motivation wiederzukommen. Auch wenn manche Anhänger der alten Schule eine solche Arbeitsumgebung niemals akzeptieren werden, hat sie sich doch als erfolgreich erwiesen. Google ist ein Beispiel für eine Organisation, die eine erfolgreiche Kultur des Lernens aufgebaut hat, und ein Großteil des Erfolgs von Google ist unmittelbar darauf zurückzuführen. Was eine Kultur des Lernens bedeutet, lässt sich sehr einfach zusammenfassen: Bei jeder Tätigkeit, die ein Analytiker durchführt, sollte er immer entweder lehren oder lernen. Ohne Ausnahme. Teamwork fördern Auch wenn es sich wie ein Klischee anhören mag: Die Dynamik eines Teams fördert den gemeinsamen Erfolg statt den einzelner Personen. Das bedeutet, dass das Zusammenwachsen des Teams ein Muss ist. Der erste Schritt, um eine gute Bindung im Team zu erreichen, beginnt damit, die richtigen Leute anzustellen. Die Fähigkeiten einer Person sind wichtig, aber genauso wichtig ist es, wie sie mit den bereits vorhandenen Teammitgliedern zusammenarbeiten können. Ich habe schon mehrmals gesehen, dass ein einziger Querulant das ganze Team in Mitleidenschaft zog. Eines Tages wird es zu einem schlimmen Vorfall kommen, der von allen Beteiligten einen hohen Zeiteinsatz verlangt. Analytiker, die einander vertrauen und gern Zeit miteinander zu verbringen, können viel besser dafür sorgen, dass der Zwischenfall ordnungsgemäß gehandhabt wird. Darüber hinaus fördert ein Team mit einer guten Bindung auch die Kultur des Lernens. 1.7 Die Analytiker 55 Möglichkeiten für berufliches Vorwärtskommen bieten Eine der größten Ängste von Vorgesetzten besteht darin, dass ihre Leute irgendwann über eine so gute Weiterbildung und Zertifizierung verfügen, dass sie die Organisation verlassen, um sich nach lukrativeren Stellen umzusehen. Dies kann tatsächlich geschehen, aber das sollte die Organisation trotzdem nicht daran hindern, Gelegenheiten zum beruflichen Vorwärtskommen zu bieten. Bei Gesprächen mit NSM-Analytikern, die ihren Arbeitgeber gewechselt haben, zeigte sich, dass der Grund dafür selten etwas so einfaches wie ein höheres Gehalt war. Die meisten gaben an, dass sie gingen, weil sie in der Organisation nicht genügend Gelegenheiten zum Vorwärtskommen hatten. Im Allgemeinen scheuen Menschen Veränderungen. Ein Wechsel des Arbeitsplatzes, insbesondere wenn dazu ein Umzug erforderlich ist, stellt einen so großen Schritt dar, dass die meisten Menschen ihn lieber vermeiden. Das bedeutet, dass Sie Ihre Mitarbeiter besser halten können, wenn Sie ihnen Gelegenheiten für professionelle Zertifizierungen, Beförderungen oder einen Wechsel in eine Managementrolle bieten. Schon allein die Tatsache, dass der Weg für diese Art des beruflichen Vorwärtskommens klar festgelegt wird, kann einen großen Unterschied ausmachen. Ein Klassifizierungssystem wie das nach den Ebenen L1, L2 und L3 bietet daher auch in diesem Sinne einen Vorteil für die Organisation. Superstars fördern Das Gebiet der Informationssicherheit ist berüchtigt dafür, dass es darin viele Personen mit einem unglaublich aufgeblähten Ego gibt. Bescheidenheit mag durchaus eine Zier sein, aber man kann die Persönlichkeit eines Menschen nun einmal nicht ändern, weshalb man lieber sein Bestes geben sollte, um mit ihm zusammenzuarbeiten. Wenn es in Ihrer Organisation eine Person mit einem überdimensionierten Ego gibt, dann machen sie aus ihr einen Superstar. Menschen mit übermäßigem Selbstvertrauen gieren gewöhnlich nach großen Erfolgen. Daher können Sie sie fördern, indem sie ihnen solche Erfolge bescheren. Stellen Sie ihnen dazu große Herausforderungen, bieten Sie ihnen Gelegenheiten zum Lernen und übertragen Sie ihnen Verantwortung. Echte Superstars sind selten, weshalb manche der vermeintlichen Stars versagen, wenn es ans Eingemachte geht. Wenn das geschieht, trägt die Konfrontation mit der Wirklichkeit oft dazu bei, das aufgeblähte Ego schrumpfen zu lassen. Hat die Person aber tatsächlich Erfolg, so haben Sie einen echten Superstar gefunden. Wenn es in Ihrer Organisation einen Superstar gibt, wollen die anderen ebenso erfolgreich sein. Die Größe der Stars bringt andere dazu, über das hinauszugehen, was sie sich zugetraut haben. Davon profitieren alle. Solange ein Superstar sich nicht unhöflich, rüpelhaft, überheblich oder auf andere Weise negativ gegenüber seinen Kollegen verhält, ist er ein Plus. Der Unterschied zwischen Allen Iverson und Kobe Bryant besteht darin, dass Iverson ein großartiger Spieler ist, Bryant aber alle anderen in seiner Umgebung dazu bringt, großartig zu spielen. Aus diesem Grund haben Iversons 76er niemals eine Meisterschaft gewonnen, Bryants Lakers dagegen fünf. Sorgen Sie dafür, dass Ihr Superstar ein Kobe Bryant ist. 56 1 Network Security Monitoring in der Praxis Erfolg belohnen Positive Rückmeldung kann die Moral enorm steigern. Wenn ein Analytiker etwas gefunden hat, was niemand sonst aufgefallen ist, dann sollten es alle wissen. Wenn ein Analytiker nach Feierabend noch fünf Stunden an seinem Arbeitsplatz bleibt, um einem Zwischenfall auf die Spur zu kommen, dann sollten Sie ihn wissen lassen, dass Sie sein Engagement schätzen. Was für Belohnungen Sie geben, spielt keine so große Rolle, solange es sich nur um etwas wirklich Wünschenswertes handelt. Aus Fehlern lernen Analysearbeit kann schnell ziemlich langweilig werden, insbesondere in kleinen Umgebungen, in denen nicht so viele Ereignisse oder Angriffe auftreten. Das führt dazu, dass die Analytiker im Ernstfall leicht etwas übersehen. Anstatt die Gruppe dafür zu bestrafen, sollten Sie dies als eine weitere Gelegenheit zum Lernen betrachten. Bericht von der Front Eine meiner Lieblingsmethoden, das Lernen aus Fehlern zu fördern, stammt aus der Medizin. Wenn ein Patient stirbt, obwohl sein Tod medizinisch hätte verhindert werden können, treffen sich der behandelnde Arzt und ein Team weiterer Ärzte zu einer sogenannten M&M-Besprechung (Morbidity and Mortality)5. Dabei berichtet der behandelnde Arzt, wie für den Patienten gesorgt wurde, woraufhin die anderen Ärzte konstruktive Fragen stellen und alternative Schritte vorbringen, die man hätte durchführen können. Solche Besprechungen sind gefürchtet, aber wenn sie gut moderiert und mit einer positiven Haltung durchgeführt werden, können sie große Änderungen bewirken, wenn ähnliche Situationen erneut auftreten. Dieses Vorgehen besprechen wir im Analyseteil dieses Buches noch ausführlicher. Führung als Dienst ausüben In den erfolgreichsten Organisationen, mit denen ich zusammenarbeiten durfte, wurde die Führung als dienende Funktion verstanden (»Servant Leadership«). Dieses Führungsprinzip gibt es schon eine ganze Weile, aber darauf aufmerksam gemacht wurde ich als Basketballfan an der University of Kentucky vom britischen Basketballtrainer John Calipari.5 Die Führung als Dienst basiert nicht auf einem Titel oder übertragender Autorität. Führungspersonen erzielen ihre Erfolge vielmehr dadurch, dass sie die Bedürfnisse ihrer Mitarbeiter in den Vordergrund stellen. Diese demütige Haltung führt dazu, dass Sie danach Ausschau halten, wie Sie anderen bei der Erfüllung ihrer Aufgaben helfen können, sodass 5 Campbell, W.B., »Surgical Morbidity and Mortality Meetings« (1988), http://www.ncbi.nlm.nih.gov/pmc/ articles/PMC2498614/?tool=pmcentrez 1.8 Security Onion 57 die gesamte Organisation davon profitiert. Das kann zu einer Organisation führen, die nicht auf einen starken Führer fixiert ist, sondern in der eine Gruppe von Führern mit unterschiedlichen Stärken und Schwächen harmonisch zusammenwirkt, um ein gemeinsames Ziel zu erreichen. Das mag ein bisschen nach Wolkenkuckucksheim klingen, doch mit der richtigen Geisteshaltung und mit dem Engagement aller Beteiligen kann eine solche Umgebung Wirklichkeit werden. 1.8 Security Onion Im weiteren Verlauf dieses Buches werden wir über die Theorie hinausgehen und uns mehrere praktische Beispiele ansehen. Zur Vereinheitlichung verwende ich für alle Beispiele Security Onion, eine Linux-Distribution für Intrusion Detection und Network Security Monitoring. Security Onion wird von Doug Burks und einer Handvoll weiterer Beteiligten hergestellt und gehört zu meinen Lieblingsinstrumenten zum Lehren und Lernen. Dank der einfachen Einrichtung können Sie eine komplette NSM-Suite zum Erfassen, Erkennen und Analysieren in weniger als einer Viertelstunde bereitstellen. ­Security Onion ist jedoch nicht nur ein Weiterbildungswerkzeug. In verschiedenen kleineren Organisationen habe ich diese Distribution schon im Produktionseinsatz gesehen. Ich selbst benutze sie für mein Büro zu Hause und mein Heimnetzwerk. 1.8.1 Installation Wenn Sie die Beispiele in diesem Buch nachvollziehen wollen, müssen Sie Security Onion herunterladen und installieren. Mehrere der besprochenen Werkzeuge sind darin bereits vorinstalliert, z. B. Sort, Bro und Argus. Wenn Sie noch einen alten Computer und einige zusätzliche Netzwerkkarten haben, können Sie sie in Ihrem Netzwerk installieren, um echten Datenverkehr zu untersuchen. Zum Durcharbeiten dieses Buches reicht es jedoch, Security Onion in einer virtuellen Maschine zu installieren. VMWare Player und VirtualBox sind dafür hervorragend geeignet. Nachdem Sie die Virtualisierungssoftware heruntergeladen haben, müssen Sie die ISODatei für Security Onion herunterladen. Die neueste Version finden Sie unter einem Link auf http://ssecurityonion.blogspot.com/. Diese Seite nennt auch eine große Menge hilfreicher Quellen zur Installation und Konfiguration der verschiedenen Elemente von Security Onion. Gehen Sie nach Abschluss des Downloads wie folgt vor: 1. Erstellen Sie eine neue virtuelle Maschine. Sehen Sie dabei mindestens 1 GB RAM für jede überwachte Netzwerkschnittstelle und mindestens 2 GB insgesamt vor. Vergewissern Sie sich außerdem, dass die Netzwerkschnittstellen mit der virtuellen Maschine verbunden sind. 2. Stellen Sie die heruntergeladene ISO-Datei als virtuelles CD/DVD-Laufwerk in Ihrer Virtualisierungssoftware bereit. 58 1 Network Security Monitoring in der Praxis Starten Sie die VM. Wenn Ihr Betriebssystem läuft, wählen Sie das Symbol Install SecurityOnion auf dem Desktop, um mit der Installation des neuen Betriebssystems auf der virtuellen Festplatte zu beginnen. Folgen Sie den Anweisungen des XUbuntu-Installers. Während der Installation werden Sie um eine Reihe von Angaben gebeten, z. B. nach der gewünschten Festplattenpartitionierung, Ihrer Zeitzone, Ihrem Internetanschluss, dem Namen des Systems sowie einem Benutzernamen und einem Passwort für Ihr Benutzerkonto (siehe Abb. 1.2). Sie können die meisten dieser Optionen nach Belieben einrichten. Wählen Sie aber nicht die Option, Ihren Benutzerordner zu verschlüsseln, und aktivieren Sie nicht die automatischen Updates. Diese Optionen sind standardmäßig deaktiviert. Nach Abschluss der XUbuntuInstallation werden Sie aufgefordert, das System neu zu starten. Abbildung 1.2: Benutzerangaben während der Installation von Security Onion Damit ist die Installation des Betriebssystems abgeschlossen. 1.8 Security Onion 59 1.8.2 Security Onion aktualisieren Nachdem Sie die Installation abgeschlossen und die virtuelle Maschine neu gestartet haben, müssen Sie als Nächstes Security Onion auf den neuesten Stand bringen. Auch wenn Sie die ISO-Datei gerade erst heruntergeladen haben, kann es sein, dass es Aktualisierungen für einzelne SO-Pakete gibt. Um die Aktualisierung auszulösen, geben Sie an der Befehlszeile Folgendes ein: sudo apt-get update && sudo apt-get dist-upgrade Je nachdem, wie viele Aktualisierungen seit der letzten ISO-Datei freigegeben wurden, kann der Vorgang eine Weile dauern. Wenn er abgeschlossen ist, ist Ihre Installation von Security Onion auf dem neuesten Stand. 1.8.3 NSM-Dienste einrichten Um die NSM-Dienste nutzen zu können, müssen Sie einen automatischen Einrichtungsvorgang ausführen. Melden Sie sich bei Security Onion an und gehen Sie dann folgendermaßen vor: 1. Starten Sie den Einrichtungsvorgang, indem Sie auf dem Desktop auf das Symbol Setup klicken. 2. Nachdem Sie Ihr Passwort eingegeben haben, werden Sie gefragt, ob Sie etc/network/ interfaces konfigurieren möchten. Wählen Sie Yes. Bei mehreren Netzwerkschnittstellen werden Sie aufgefordert, eine davon als Verwaltungsschnittstelle auszuwählen, also als diejenige, über die Sie auf das System zugreifen; bei nur einer einzigen Schnittstelle wird automatisch diese als Verwaltungsschnittstelle eingerichtet. Fahren Sie fort, indem Sie die Option Static IP Address wählen und die IP-Adresse, die Subnetzmaske, das Standardgateway, die Adresse des DNS-Servers und den lokalen Domänennamen eingeben. Nachdem Sie diese Angaben bestätigt haben, wird das System neu gestartet. Bericht von der Front Auch wenn Sie es gewohnt sind, Ihre Netzwerkschnittstellen manuell einzurichten, ist es äußerst ratsam, diesen Schritt von SO ausführen zu lassen. Das Betriebssystem führt dabei mehrere Optimierungen durch, damit Ihre Überwachungsschnittstellen korrekt eingerichtet werden, um alle möglichen Arten von Netzwerkdatenverkehr zu erfassen. 3. Starten Sie den Einrichtungsvorgang erneut, indem Sie abermals auf das Symbol Setup auf dem Desktop klicken. 4. Überspringen Sie die Netzwerkkonfiguration, da Sie sie bereits erledigt haben. 60 1 Network Security Monitoring in der Praxis 5. Wählen Sie Quick Setup. (Sie können natürlich auch Advanced Setup wählen, aber für unsere Zwecke reicht die Schnelleinrichtung. Die erweiterten Optionen können Sie sich gern auf eigene Faust ansehen.) 6. Wenn Sie über mehrere Schnittstellen verfügen, werden Sie dazu aufgefordert, die gewünschten Überwachungsschnittstellen auszuwählen. 7. Geben Sie einen Benutzernamen und ein Passwort für die verschiedenen NSMDienste an. 8. Wenn Sie zur Aktivierung von ELSA aufgefordert werden, wählen Sie Yes. 9. Am Ende werden Sie dazu aufgefordert, die Konfiguration des Sensors zu bestätigen (siehe Abb. 1.3). Klicken Sie auf Yes, proceed with the changes!, um Security Onion aufzufordern, die Änderungen zu übernehmen. Abbildung 1.3: Bestätigen der Konfiguration Nach Abschluss der Einrichtung teilt Ihnen Security Onion die Speicherorte verschiedener wichtiger Protokoll- und Konfigurationsdateien mit. Wenn Sie bei der Einrichtung Probleme haben oder feststellen, dass einer der Dienste nicht richtig gestartet wurde, können Sie sich das Einrichtungsprotokoll unter /var/log/nsm/sosetup.log ansehen. Sofern nicht anders angegeben, wird im weiteren Verlauf dieses Buches vorausgesetzt, dass Sie die Schnelleinrichtung von Security Onion abgeschlossen haben. 1.8.4 Security Onion testen Die schnellste Möglichkeit, sich zu vergewissern, dass die NSM-Dienste in Security Onion laufen, besteht darin, Snort einen Alarm generieren zu lassen. Dazu sollten Sie zunächst den von Snort verwendeten Regelsatz mithilfe des Befehls sudo rule-update 1.8 Security Onion 61 aktualisieren. Dadurch werden mithilfe des Dienstprogramms PulledPork die neuesten Regeln von Emerging Threats heruntergeladen, eine neue SID-Zuordnung erstellt (um den Regelnamen eindeutige Bezeichner zuzuordnen) und Snort neu gestartet, damit die neuen Regeln in Kraft treten. In Abb. 1.4 sehen Sie einen Teil der Ausgabe dieses Befehls. Abbildung 1.4: Ausgabe bei einer Regelaktualisierung Um die NSM-Dienste zu testen, starten Sie Snorby, indem Sie auf das zugehörige Symbol auf dem Desktop klicken. Sie werden dazu aufgefordert, sich mit der während der Einrichtung angegebenen E-Mail-Adresse und dem zugehörigen Passwort anzumelden. Klicken Sie danach auf die Registerkarte Events am oberen Bildschirmrand. Sehr wahrscheinlich ist das Fenster zu diesem Zeitpunkt leer. Um eine Snort-Warnung auszulösen, öffnen Sie im Browserfenster eine neue Registerkarte und rufen dort http://www.testmyids.com auf. Wenn Sie jetzt wieder zur Snorby-Registerkarte wechseln und die Seite Events aktualisieren, sollten Sie einen Alarm mit der Ereignissignatur GPL ATTACK_RESPONSE id check returned root sehen (siehe Abb. 1.5). Wenn das der Fall ist, haben Sie die NSM-Umgebung von Security Onion erfolgreich eingerichtet. Sie können den Alarm gern genauer untersuchen, 62 1 Network Security Monitoring in der Praxis indem Sie darauf klicken und sich die Ausgabe in Snorby ansehen. In späteren Kapiteln werden uns noch genauer mit Snorby beschäftigen. Abbildung 1.5: Der Snort-Testalarm in Snorby Diese Alarmmeldung sollte ziemlich schnell erscheinen. Wenn Sie sie nach einigen Minuten immer noch nicht sehen, funktioniert etwas nicht richtig. Informieren Sie sich auf der Website zu Security Onion über die Fehlerbehebung. Wenn Sie das Problem dadurch nicht lösen können, schauen Sie in die Mailingliste von Security Onion oder im zugehörigen IRC-Kanal #securityonion auf Freenode. Die beschriebenen Vorgänge sind bis Security 12.04 gültig, der aktuellen Version während der Abfassung dieses Buches. Sollte sich der Vorgang geändert haben, schlagen Sie im SOWiki unter https://code.google.com/p/security-onion/w/list nach. Wir werden im Verlauf dieses Buches noch häufiger auf Security Onion eingehen. Wenn Sie noch mehr darüber erfahren wollen, ist das SO-Wiki die beste Informationsquelle. 1.9 Zusammenfassung In diesem Kapitel haben Sie Network Security Monitoring, bedrohungsorientierte Sicherheit und verwandte Prinzipien kennengelernt. Wir haben uns auch Security Onion angesehen und ausführlich beschrieben, wie Sie eine NSM-Umgebung in wenigen Minuten installieren und einrichten. Für Neulinge in Sachen NSM ist es von entscheidender Bedeutung, die in diesem Kapitel vorgestellten Prinzipien genau zu verstehen, da sie die Grundlage für die Anwendung von NSM bilden. Der Rest dieses Buches ist in drei Teile gegliedert, die sich jeweils mit den einzelnen Elementen des NSM-Zyklus beschäftigen: Erfassung, Erkennung und Analyse. Teil 1 Erfassung 2 Die Datenerfassung planen Die Erfassung wird mit einer Kombination aus Hardware und Software durchgeführt, die Daten für die NSM-Erkennung und -Analyse generieren und sammeln. Analytiker mögen vielleicht denken, dass dieser Abschnitt keine große Bedeutung für sie hat. Das ist allerdings ein Irrtum. Es gibt viele verschiedene Möglichkeiten, erfolgreiche Analytiker zu beschreiben (ich bevorzuge den Begriff »Paket-Ninja«), aber letzten Endes muss ein Analytiker Herr und Meister über die Daten sein, d. h., er muss wissen, welche Daten zur Verfügung stehen, woher sie kommen, wie sie erfasst werden, warum sie erfasst werden und was man damit tun kann. Gute Analytiker können auch schlechte Daten nützlich einsetzen und mit guten Daten Hervorragendes leisten. Nur allzu oft kümmern sich Analytiker nicht um die Erfassung. Das führt gewöhnlich dazu, dass ein eigenes System oder eine andere Gruppe für die Erfassung zuständig ist oder ein einzelner Analytiker als »Erfassungsknecht« abgestellt wird. Für das NSM ist es jedoch nicht förderlich, wenn die Informationen über die Datenerfassung anderen Gruppen oder nur einzelnen Mitgliedern des NSM-Teams zur Verfügung stehen, denn dies führt dazu, dass die Analytiker die Daten, die sie analysieren, nicht vollständig verstehen. Die meisten Organisationen fallen in eine der folgenden drei Kategorien: •• Organisationen ohne NSM-Infrastruktur, die gerade erst am Anfang stehen, ihre Bedürfnisse für die Datenerfassung zu definieren. 66 2 Die Datenerfassung planen •• Organisationen, die bereits Intrusion Detection durchführen, sich die erfassten Daten aber nie genauer angesehen haben. •• Organisationen, die viel Zeit investiert haben, um eine Datenerfassungsstrategie aufzustellen, und die diese Strategie im Rahmen ihres NSM-Zyklus ständig weiterentwickeln. Dieser Abschnitt beschreibt die Datenerfassung von der Pike auf, sodass alle drei Arten von Organisationen davon profitieren können. 2.1 Applied Collection Framework (ACF) Abraham Lincoln sagte einmal: »Wenn ich sechs Stunden Zeit habe, um einen Baum zu fällen, nutze ich die ersten vier Stunden, um meine Axt zu schärfen.« Ich kann mir kein treffenderes Zitat vorstellen, um die Wichtigkeit der Datenerfassung zu beschreiben. Wie ich bereits gesagt habe, muss ein guter Analytiker Herr und Meister der Daten sein. Das lässt sich jedoch oft nur schwer erreichen, da viele Organisationen ihre Daten nicht richtig verstehen. Meistens gibt es keine strukturierte Vorgehensweise, um die Bedrohungen zu definieren, denen die Organisation ausgesetzt ist. Stattdessen werden einfach alle Daten erfasst, die gerade zur Verfügung stehen, und das Überwachungsprogramm wird um diese Daten herum aufgebaut. Ein solches Übermaß an Daten führt jedoch dazu, dass auf den Servern nicht genügend Speicherplatz zur längeren Aufbewahrung der Daten zur Verfügung steht, dass mehr Personal erforderlich ist, um alle Ereignisse und Fehlalarme zu durchforsten, und dass Erkennungs- und Analysewerkzeuge nicht mit der Menge der vorliegenden Daten fertig werden. Als Verteidiger unseres Netzwerks hassen wir Überraschungen. Gewöhnlich wird das Auftreten von Überraschungen als eine Funktion der Unsicherheit angesehen, aber es ist auch eine Funktion der Komplexität.1 Ein Übermaß an Daten zu sammeln, die nichts mit sinnvoll anzunehmenden Bedrohungen der Organisation zu tun haben, ist eine sichere Methode, um die Komplexität sehr schnell zu erhöhen. Eine große Rolle dabei, die Kompexität der Datenerfassung zu senken, spielt das Applied Collection Framework (ACF). Es handelt sich dabei um eine lockere Folge von Schritten, mit deren Hilfe eine Organisation entscheiden kann, auf welche Datenquellen sie sich bei der Erfassung konzentrieren sollte (siehe Abb. 2.1). Bedrohungen idenfizieren Risiko quanfizieren Datenquellen idenfizieren Erfassung eingrenzen Abbildung 2.1: Das Applied Collection Framework (ACF) 1 Bracken, P. (2008), Managing strategic surprise, Cambridge, MA: Cambridge University Press 2.1 Applied Collection Framework (ACF) 67 Das ACF schwebt nicht im luftleeren Raum. Um es erfolgreich anwenden zu können, ist von Anfang an eine Zusammenarbeit mit der Geschäftsleitung erforderlich. Das Sicherheitsteam und andere Beteiligte sind dafür zuständig, die aus den ersten Besprechungen gewonnenen Erkenntnisse in Maßnahmen umzusetzen. Das ACF besteht aus vier Phasen: die Bedrohungen der Organisation identifizieren, das Risiko quantifizieren, die relevanten Datenquellen herausfinden und die Erfassung auf die wirklich nützlichen Elemente einschränken. 2.1.1 Bedrohungen identifizieren Für eine bedrohungsorientierte Verteidigung ist es erforderlich, die Bedrohungen identifizieren zu können, denen Sie sich ausgesetzt sehen. Damit meine ich keine allgemeinen Bedrohungen wie Konkurrenzunternehmen, Script-Kiddies, Hacktivisten oder feindliche Nationen, sondern spezifische Bedrohungen der Ziele Ihrer Organisation. Beginnen Sie dabei immer mit der Frage: »Was ist der schlimmste Fall für das Überleben der Organisation?« Die Antwort muss von ganz oben kommen, weshalb die mit Informationssicherheit betrauten Personen mit der Geschäftsführung zusammenarbeiten müssen, wenn sie damit beginnen, die Erfordernisse zur Datenerfassung aufzustellen. Es ist hilfreich, die Bedrohungen danach einzuteilen, ob sie Vertraulichkeit, Integrität oder Verfügbarkeit gefährden. Betrachten Sie dazu folgende Beispiele: •• Ein produzierendes Unternehmen verlässt sich darauf, dass die Herstellung das ganze Jahr über rund um die Uhr läuft, um die Nachfrage nach den Produkten zu befriedigen. Wenn irgendetwas geschieht, was die Produktion unterbricht, ruft das erhebliche Kosten für die Organisation hervor. Daher kann eine Produktionsunterbrechung als größte Bedrohung der Organisation angesehen werden. Es handelt sich dabei um eine Gefährdung der Verfügbarkeit. •• Eine Anwaltskanzlei muss sich darauf verlassen können, dass Informationen vertraulich bleiben. Oftmals handhaben solche Firmen Informationen, deren Freiwerden andere Organisationen Millionen von Euro oder sogar das Leben von Menschen kosten könnte. Die Kommunikation zwischen Anwälten und ihren Mandanten ist von äußerster Wichtigkeit. Die Gefahr, dass Dritte diese Kommunikation abhören, kann die größte Bedrohung einer Kanzlei sein. Hierbei handelt es sich um eine Gefährdung der Vertraulichkeit. •• Für seinen Umsatz stützt sich ein Onlinehändler auf seine Website. Wenn sie auch nur für wenige Minuten nicht erreichbar ist, kann das zum Verlust vieler Verkäufe und damit hoher Erträge führen. Die größte Bedrohung für eine solche Organisation ist das Unvermögen, Verkaufe abzuschließen. Dies ist eine Gefährdung der Verfügbarkeit. •• Rohstoffhändler müssen während des Börsentages mit ausländischen Partnern Informationen austauschen können, um Handelsgeschäfte abschließen zu können, die Einkünfte generieren. Sind diese Informationen nicht korrekt, kann das aufgrund automatischer Handelsalgorithmen zu einem Welleneffekt und dadurch zu Verlus- 68 2 Die Datenerfassung planen ten in Millionenhöhe führen. Die größte Bedrohung für eine solche Organisation sind vorsätzliche oder versehentliche Fehler in den Daten, die in diese Algorithmen einfließen. Hierbei handelt es sich um eine Gefährdung der Datenintegrität. •• Ein Pharmaunternehmen konzentriert alle seine Anstrengungen auf die Entwicklung neuer Medikamente. Die Forschungsdaten stellen das dar, wofür die gesammelten Gelder der Investoren eingesetzt worden sind, und bilden eine wichtige Zukunftsinvestition für das Unternehmen. Sollte ein Konkurrent Zugriff auf diese Informationen erlangen, kann das die gesamte Organisation ruinieren. Der Diebstahl des geistigen Eigentums ist die größte Bedrohung, der sich dieses Unternehmen gegenübersieht. Dies ist eine Gefährdung der Vertraulichkeit. In der Praxis machen sich Organisationen jedoch gewöhnlich Sorgen über mehrere verschiedene Bedrohungen. In diesem Fall muss die Geschäftsführung die Bedrohungen nach Prioritäten ordnen, sodass sie entsprechend berücksichtigt werden können. Nachdem die Bedrohungen identifiziert worden sind, ist es Aufgabe der Mitarbeiter für Informationssicherheit, sich genauer mit den technischen Grundlagen dieser Bedrohungen zu befassen. Dazu müssen Sie die Infrastruktur des Netzwerks untersuchen und den wichtigsten Beteiligten an den entsprechenden Geschäftsprozessen die richtigen Fragen stellen. Das wollen wir uns genauer am Beispiel des Pharmaunternehmens aus dem letzten Aufzählungspunkt ansehen. Diese Firma hat sehr stark in ihr geistiges Eigentum investiert und sieht den Verlust dieses geistigen Eigentums als größte Bedrohung an. Daher sollten Sie folgende Fragen stellen: •• Welche Geräte generieren die Rohdaten der Forschungsarbeiten? Wie werden diese Daten über das Netzwerk übertragen? •• Auf welchen Geräten verarbeiten Mitarbeiter diese Rohdaten? •• Auf welchen Geräten werden die verarbeiteten Forschungsdaten gespeichert? •• Wer hat Zugriff auf die Rohdaten und die verarbeiteten Daten? •• Sind die Rohdaten oder die verarbeiteten Daten außerhalb des Netzwerks zugänglich? •• Welche Pfade ins interne Netzwerk stehen außerhalb zur Verfügung? •• Welchen Zugriff auf die Forschungsdaten haben vorübergehend Beschäftigte? Aufgrund der Antworten sollten Sie sich ein Bild davon machen können, welche Elemente im Netzwerk für den Schutz dieser sensiblen Daten besonders kritisch sind. Das Ziel besteht darin, systematisch zu ermitteln, mit welchen Methoden jemand in das Netzwerk eindringen und dadurch möglicherweise wichtige Informationen stehlen kann. Ein grobes Ergebnis kann etwa in einer Liste wie der folgenden bestehen: •• •• •• •• Einbruch in den Webserver Einbruch in den Datenbankserver Einbruch in den Dateiserver Abruf von Daten durch verärgerte Mitarbeiter 2.1 Applied Collection Framework (ACF) 69 2.1.2 Das Risiko quantifizieren Nachdem Sie eine Liste der möglichen technischen Bedrohungen aufgestellt haben, müssen Sie sie nach Prioritäten ordnen. Eine Möglichkeit dazu besteht darin, das jeweilige Risiko der einzelnen Bedrohungen zu berechnen. Das Risiko ist dabei das Produkt von Auswirkung und Wahrscheinlichkeit, als Gleichung geschrieben also: Risiko = Auswirkung x Wahrscheinlichkeit. Zur Bewertung der Auswirkung müssen Sie überlegen, wie stark eine Bedrohung, sollte sie tatsächlich eintreffen, die Organisation beeinträchtigen würde. Gemessen wird dies auf einer Skala von 1 bis 5, wobei 1 für geringe Auswirkungen und 5 für erhebliche Auswirkungen steht. Um die Stärke der Auswirkung zu bestimmen, können Sie Aspekte wie finanzielle Verluste, die Fähigkeit, verlorene Daten wiederherzustellen, und die erforderliche Zeit berücksichtigen, um zum normalen Betriebsauflauf zurückzukehren. Auch die Wahrscheinlichkeit dafür, dass die Bedrohung eintritt, wird auf einer Skala von 1 bis 5 gemessen. Auch hier steht eine 1 für eine geringe und eine 5 für eine hohe Wahrscheinlichkeit. Zur Bewertung können Sie überlegen, wie groß die Angriffsfläche eines Objekts ist, also wie stark es Bedrohungen ausgesetzt ist, wie vertraut jemand mit dem Netzwerk sein muss, um einen Angriff ausführen zu können, oder wie leicht jemand physischen Zugang zu einem Objekt erhalten kann. Im Lauf der Zeit wächst die Wahrscheinlichkeit dafür, dass eine Schwachstelle ausgenutzt wird. Wenn wir Wahrscheinlichkeiten aufstellen, so gelten sie für den aktuellen Zeitpunkt und müssen später einer neuen Prüfung unterzogen werden. Das Produkt aus Auswirkungen und Wahrscheinlichkeit gibt den Grad des Risikos an, dass die Bedrohung für die Sicherheit des Netzwerks und die Geschäftsziele der Organisation bildet. Gemessen wird dies auf einer Skala von 1 bis 25, die sich grob in drei Bereiche unterteilen lässt: •• 0–9: Geringes Risiko •• 10–16: Mittleres Risiko •• 17–25: Hohes Risiko Die Bewertung der technischen Risiken für das Pharmaunternehmen aus unserem Beispiel sehen Sie in Tabelle 2.1. Tabelle 2.1: Quantifizierung der Risiken für das Beispielunternehmen Bedrohung Auswirkung Wahrscheinlichkeit Risiko Einbruch in den Webserver 3 4 12 Einbruch in den Datenbankserver 5 3 15 Abruf von Daten durch verärgerte Mitarbeiter 5 4 20 Einbruch in den Dateiserver 5 4 20 70 2 Die Datenerfassung planen Auswirkung und Wahrscheinlichkeit sollen zwar eine Möglichkeit bieten, Bedrohungen zu quantifizieren, doch sind die Zahlen subjektiv. Daher ist es wichtig, dass diese Zahlen von einem Komitee ermittelt werden und dass die Bewertung aller erkannten Bedrohungen durch dieselbe Gruppe mit denselben Mitgliedern vorgenommen wird. Manche Organisationen nehmen zur Quantifizierung von Risiken die Hilfe von Dritten in Anspruch, aber ich habe noch nie erlebt, dass das im Zusammenhang mit Netzwerksicherheit jemals erfolgreich gewesen ist. 2.1.3 Datenquellen identifizieren In der nächsten Phase des ACF geht es darum, die wichtigsten Datenquellen zu ermitteln, die für die NSM-Erkennung und -Analyse von Wert sein können. Überlegen Sie, beginnend mit der Bedrohung, die das höchste Risiko zeigt, wo Sie Belege dafür finden können, dass die Bedrohung tatsächlich eintritt. In unserem Beispiel sehen wir uns also die Bedrohung durch einen Einbruch in den Da­ teiserver an. Bei der Definition dieser Bedrohung sollten Sie sich schon darüber informiert haben, welche Architektur dieser Server aufweist, wo er sich im Netzwerk befindet, wer Zugriff drauf hat und auf welchen Wegen Daten zu und von ihm übertragen werden können. Mithilfe dieser Angaben können Sie nun Datenquellen im Netzwerk und auf dem Host ausfindig machen. Am Ende steht dabei eine Liste wie die folgende: •• Im Netzwerk: • Dateiserver-VLAN – Paketerfassungsdaten • Dateiserver-VLAN – Sitzungsdaten • Dateiserver-VLAN – Datendurchsatzstatistiken • Dateiserver-VLAN – Alarmdaten des signaturgestützten NIDS • Dateiserver-VLAN – Alarmdaten des anomaliegestützten IDS • Vorgeschalteter Router – Protokolldaten der Firewall •• Auf dem Host: • Dateiserver – Daten aus dem Ereignisprotokoll des Betriebssystems • Dateiserver – Alarmdaten der Antivirussoftware • Dateiserver – Alarmdaten des HIDS Wie Sie sehen, ist diese Aufstellung noch sehr grob, aber das ist ganz in Ordnung so. An dieser Stelle beginnen wir erst damit, die brauchbaren Datenquellen zu identifizieren. Die Verfeinerung erfolgt im nächsten Schritt. 2.1.4 Die Erfassung eingrenzen Die letzte Phase des ACF besteht darin, die Auswahl der Datenquellen immer weiter zu verfeinern. Dies ist der technisch anspruchsvollste Schritt, und er erfordert, dass Sie sich 2.1 Applied Collection Framework (ACF) 71 jede einzelne Datenquelle ansehen, um ihren Wert zu bestimmen. Manche Datenquellen erfordern im Vergleich zu dem Wert, den sie bieten, einen unverhältnismäßig hohen Speicher-, Verarbeitungs- oder Verwaltungsaufwand, weshalb es sich nicht lohnt, sie zu erfassen. Letzen Endes muss Ihre Organisation eine Kosten/Nutzen-Analyse der Datenquellen durchführen, um zu bestimmen, ob der Wert, den sie bieten, die Kosten für die Implementierung und Pflege rechtfertigt. Zur Bestimmung der Kosten müssen Sie die Hardware- und Softwareressourcen und die Mitarbeiter berücksichtigen, die erforderlich sind, um die Daten zu generieren, zu verwalten und zu speichern. Um den Nutzen zu ermitteln, forschen Sie nach, wie viele dokumentierte Fälle es gibt, in denen die fragliche Datenquelle bei einer Untersuchung herangezogen oder schmerzlich vermisst worden ist. Im Rahmen dieses Vorgangs können Sie auch festlegen, welche Arten von PCAP-Daten Sie ausdrücklich erfassen wollen oder welche Ereignisse im Windows-Sicherheitsprotokoll von so großer Bedeutung sind, dass sie aufbewahrt werden müssen. Während dieses Vorgangs müssen Sie Fragen wie die folgenden stellen: •• Was können Sie in einem bestimmten Netzwerksegment aus dem PCAP-Datenverkehr herausfiltern? •• Welche Systemereignisprotokolle sind am wichtigsten? •• Müssen Sie sowohl die Aktionen der Firewall aufbewahren, die Verbindungen zulassen, als auch diejenigen, die Verbindungen verweigern? •• Sind die Protokolle zur WLAN-Authentifizierung und -Zuordnung von Wert? •• Sollen Sie Protokolle für den Zugriff auf Dateien, für ihre Erstellung und Änderung aufbewahren? •• Für welche Teile einer Webanwendung brauchen Sie wirklich Webprotokolle? Definieren Sie auch, wie viele Daten der einzelnen Typen wie lange aufbewahrt werden sollen. Das können Sie in Form eines Mindest- und eines Optimalwerts angeben. Der Mindestwert gibt dabei an, wie viele Daten unbedingt erforderlich sind, um eine Erkennung in nahezu Echtzeit durchzuführen, während der Optimalwert die bevorzugte Datenmenge für eine Erkennung im Nachhinein und für die Analyse nennt. Die grobe Liste aus der vorherigen Phase können wir nun wie folgt verfeinern: •• Im Netzwerk: • Paketerfassungsdaten ºº Alle Ports und Protokolle zum und vom Dateiserver ºº Der gesamte außerhalb des VLANs geleitete SMB-Datenverkehr • Sitzungsdaten ºº Alle Einträge für das VLAN • Datendurchsatzstatistiken ºº Langfristige Datendurchsatzstatistiken für den Dateiserver ºº Tägliche, wöchentliche und monatliche Durchschnittswerte 72 2 Die Datenerfassung planen • Alarmdaten des signaturgestützten NIDS ºº Alle Alarme für das Segment ºº Regeln für Windows-Systeme und das Protokoll SMB • Alarmdaten des anomaliegestützten IDS ºº Alarme über Veränderungen im Betriebssystem des Dateiservers ºº Alarme über ein plötzliches Übermaß oder einen hohen Durchsatz von Dateidownloads • Vorgeschalteter Router – Protokolldaten der Firewall ºº Verweigerung von eingehenden Verbindungen durch die Firewall •• Auf dem Host: • Daten aus dem Ereignisprotokoll des Betriebssystems – Windows-Sicherheitsprotokoll ºº Erfolgreiche Anmeldungen ºº Fehlgeschlagene Anmeldungen ºº Kontoerstellungen und -änderungen • Daten aus dem Ereignisprotokoll des Betriebssystems – Windows-Systemprotokoll ºº Änderungen von Berechtigungen im Dateisystem ºº Softwareinstallationen ºº Neustarts des Systems • Alarmdaten der Antivirussoftware ºº Festgestellte Ereignisse ºº Blockierte Ereignisse • Alarmdaten des HIDS ºº Alarme wegen kritischer Änderungen im Dateisystem ºº Alarme wegen übermäßiger Aufzählungen von Dateien ºº Alarme im Zusammenhang mit dem Anlegen und Ändern von Konten Anhand dieser Liste können Sie den zuständigen System- und Netzwerkteams genau erklären, welche Daten Sie brauchen. Nun muss auch noch die Infrastruktur entsprechend eingerichtet werden, um Ihre Bedürfnisse für die Datenerfassung zu erfüllen. Machen Sie sich aber zunächst nicht zu viele Gedanken über die Kosten für diese Infrastruktur; das ist eine Geschäftsentscheidung, die getroffen werden muss, nachdem Sie das ACF-Verfahren komplett abgearbeitet haben. Der Zweck dieser systematischen Vorgehensweise besteht darin, die zu erfassenden Daten zu ermitteln und zu bestimmen, wie wichtig sie sind. Wenn das Budget keine optimale Datenerfassung ermöglicht, sollten Sie zumindest eine Aufstellung zur Hand haben, die Ihnen sagt, worauf Sie am ehesten verzichten können. Grundlage dafür kann die zuvor beschriebene Kosten/Nutzen-Analyse sein. Wichtig ist hierbei, dass Sie Ihre Bedürfnisse für die Datenerfassung rechtfertigen, indem Sie sie direkt mit den Geschäftszielen und den Bedrohungen des Geschäftsbetriebs in Verbindung bringen. 2.2 Fallstudie: Onlinehändler 73 Wenn Sie noch nicht viel Erfahrung mit NSM haben, ist Ihnen oft nicht klar, wie viel Wert einzelne Datenquellen bieten. Im Laufe der Zeit werden Sie Erfahrungen darin sammeln. Bis es soweit ist, werden Sie in einigen Fällen erleben, dass Sie auf einige Ihrer Datenquellen verzichten können, während es sich in anderen als ratsam erweist, zusätzliche Daten zu erfassen. Die Dokumente, die Sie im Rahmen dieses Prozesses anlegen, sind niemals endgültig. Es ist wichtig zu verstehen, dass man bei der NSM-Datenerfassung niemals einen endgültigen Stand erreicht. Sie ist ein dynamischer Prozess. Mit wachsenden Erfahrungen in der Erkennung und Analyse und mit der Erweiterung Ihres Netzwerks müssen Sie Ihre Erfassungsstrategie immer wieder anpassen. Auf der Begleitwebsite zu diesem Buch finden Sie Vorlagen, die Ihnen dabei helfen, die ACF-Schritte durchzuführen. Nach dem ersten Durchgang sind diese Vorlagen auch eine hervorragende Ressource, mit deren Hilfe sich Ihre Analytiker mit den erfassten Daten vertraut machen können. 2.2 Fallstudie: Onlinehändler Sehen wir uns als Beispiel einen Onlinehändler an, der zum ersten Mal NSM einrichtet. Unser fiktives Unternehmen Purple Dog Inc. (PDI) verkauft über seine Website kunsthandwerkliche Produkte und Nippes von anderen Herstellern. Da es kein Ladengeschäft hat, hängen seine gesamten Einkünfte davon ab, dass es Verkäufe über die Website tätigen kann. Abb. 2.2 zeigt das Netzwerk von PDI. Wir haben es hier mit dem typischen Netzwerkdesign zu tun, bei dem sich öffentlich zugängliche Server in einer »entmilitarisierten Zone« (De-militarized Zone, DMZ) hinter einem Edge-Router stehen. Die Benutzercomputer und internen Netzwerkserver befinden sich in verschiedenen VLANs hinter einem Kernrouter. In diesem Netzwerkdiagramm sind keine Sensoren enthalten. Das liegt daran, dass wir die Erfassung erst einrichten müssen. 74 2 Die Datenerfassung planen Abbildung 2.2: Diagramm des Netzwerks von Purple Dog Inc. 2.2.1 Bedrohungen der Organisation identifizieren PDI stellt selbst keine Produkte her, sondern fungiert als Zwischenhändler für andere Produkte. Auf die Frage danach, wovor sie am meisten Angst hat, antworten die Geschäftsleitung wie folgt: Angst Nr. 1: »Vor dem Diebstahl der Kreditkarteninformationen unserer Kunden. Wir müssten dann hohe Strafen zahlen und unsere Kunden würden uns nicht mehr vertrauen, worunter das Geschäft leiden würde.« Angst Nr. 2: »Davor, dass unsere Website für längere Zeit unzugänglich wird. Ab einer gewissen Dauer kann das die Fortführung unserer Geschäfte gefährden.« Angst Nr. 3: »Davor, dass irgendjemand einen Bug findet, der es ihm erlaubt, auf unserer Website zu bestellen, ohne dafür zu zahlen. Das würde zu Verlusten an Einnahmen führen.« Diese Ängste wollen wir nun von den Formulierungen der Geschäftsführung in fassbare Bedrohungen übersetzen. 2.2 Fallstudie: Onlinehändler 75 Diebstahl von Kundendaten (Vertraulichkeit) Auf der E-Commerce-Site von PDI werden personenbezogene Kundendaten (Personally Identifiable Information, PII) erfasst und gespeichert, darunter auch Kreditkartenangaben. Die Datenbank, in der diese Informationen festgehalten werden, ist zwar nicht direkt vom Internet aus zugänglich, aber es ist denkbar, dass ein Angreifer durch eine Schwachstelle in der Webanwendung, die damit verbunden ist, auf diese Daten zugreift. Des Weiteren ist es möglich, dass ein Angreifer die Arbeitsstation eines Angestellten übernimmt, der Zugriff auf die Datenbank hat, z. B. eines Entwicklers, und darüber an die Informationen gelangt. Unterbrechung des E-Commerce-Dienstes (Verfügbarkeit) Ein Angreifer kann die E-Commerce-Website für Kunden unerreichbar machen. Das kann durch einen Denial-of-Service-Angriff geschehen, der die Server oder das Netzwerk überlastet. Es ist auch möglich, dass ein Angreifer ein von außen zugängliches Element des Netzwerks übernimmt und darüber eine Aktion ausführt, die die Dienste unzugänglich macht. Eine dritte Variante besteht darin, dass ein Angreifer in das interne Netzwerk einbricht und so in dem Netzwerksegment mit den E-Commerce-Servern Fuß fasst, sodass er von dort aus seine störenden Aktionen durchführen kann. Nicht bestimmungsgemäße Benutzung des E-Commerce-Dienstes (Integrität) Ein Angreifer kann die Webanwendung auf nicht bestimmungsgemäße Weise nutzen, z. B. um Produkte zu erwerben, ohne dafür zu bezahlen. Die wahrscheinlichste Möglichkeit dafür besteht darin, dass ein Angreifer von außen einen Bug in der E-Commerce-Webanwendung findet und ausnutzt. Es ist auch denkbar, dass ein Gegner einen internen Benutzercomputer übernimmt, der Zugriff auf die Back-End-Datenbank der E-Commerce-Site hat. 2.2.2 Das Risiko quantifizieren Anhand der Wahrscheinlichkeit für ihr Auftreten und ihre möglichen Auswirkungen können wir die Bedrohungen nun nach Prioritäten ordnen. Die Risikobewertung der im vorherigen Schritt identifizierten Bedrohungen finden Sie in Tabelle 2.2. 76 2 Die Datenerfassung planen Tabelle 2.2: Quantifizieren der Risiken für die Bedrohungen von PDI Bedrohung Auswirkung Wahrscheinlichkeit Risiko Diebstahl von Kundendaten über die Webanwendung 4 4 16 Diebstahl von Kundendaten über einen internen Benutzercomputer 4 2 8 Unterbrechung des E-CommerceDienstes durch DoS-Angriff 4 2 8 Unterbrechung des E-CommerceDienstes über ein extern zugängliches Netzwerkelement 5 3 15 Unterbrechung des E-CommerceDienstes über ein internes Netzwerk­ element 5 2 10 Nicht bestimmungsgemäße Benutzung des E-Commerce-Dienstes über die Webanwendung 2 4 8 Nicht bestimmungsgemäße Benutzung des E-Commerce-Dienstes über ein internes Netzwerkelement 2 1 2 Auswirkung Wahrscheinlichkeit Risiko Diebstahl von Kundendaten über die Webanwendung 4 4 16 Unterbrechung des E-CommerceDienstes über ein extern zugängliches Netzwerkelement 5 3 15 Unterbrechung des E-CommerceDienstes über ein internes Netzwerk­ element 5 2 10 Nicht bestimmungsgemäße Benutzung des E-Commerce-Dienstes über die Webanwendung 2 4 8 Unterbrechung des E-CommerceDienstes durch DoS-Angriff 4 2 8 Tabelle 2.3: Nach Priorität geordnete Bedrohungen von PDI Bedrohung 2.2 Fallstudie: Onlinehändler 77 Bedrohung Auswirkung Wahrscheinlichkeit Risiko Diebstahl von Kundendaten über einen internen Benutzercomputer 4 2 8 Nicht bestimmungsgemäße Benutzung des E-Commerce-Dienstes über ein internes Netzwerkelement 2 1 2 Laut dieser Tabelle ist die größte Bedrohung der Organisation der Diebstahl von Kundendaten über die Webanwendung. Am wenigsten besorgniserregend von allen aufgeführten Bedrohungen ist die nicht bestimmungsgemäße Verwendung der E-Commerce-Dienste mithilfe eines übernommenen internen Computers. Mithilfe dieser Erkenntnisse treffen wir unsere Entscheidungen im nächsten Schritt. 2.2.3 Datenquellen identifizieren Nachdem wir die Prioritäten aufgestellt haben, können wir bestimmen, welche Datenquellen für die NSM-Erkennung und -Analyse nützlich sind. Der Kürze halber sehen wir uns nur die Bedrohungen mit der höchsten Risikobewertung an. Diebstahl von Kundendaten über die Webanwendung Die größte Bedrohung der Organisation besteht darin, dass ein Angreifer Kundendaten stiehlt, nachdem er die Webanwendung übernommen hat. Die Angriffsfläche der Webanwendung ist sehr groß, allerdings kann darüber nur eine relativ kleine Angriffsfläche der Netzwerkelemente bloßgelegt werden. Es ist von entscheidender Bedeutung, dass wir Webservertransaktionen mit externen Benutzern erfassen und untersuchen, um unnormales Verhalten zu erkennen. Dazu können wir am Rand des Netzwerks einen Sensor platzieren, um Paketdaten, Sitzungsdaten und Paketstringdaten zu erfassen. Das ermöglicht uns auch, signatur- und anomaliegestützte NIDS einzusetzen. Wir können uns auch Einblick in die Aktionen des Webservers verschaffen, indem wir die Daten seiner Anwendungsprotokolle erfassen. Da die Webanwendung einen indirekten Benutzerzugriff auf die Back-End-Datenbank bietet, müssen wir auch die damit einhergehenden Transaktionen unbedingt untersuchen. Da sich der Datenbankserver im internen Netzwerk befindet, brauchen wir einen zweiten Sensor, der dort Einsicht nehmen kann. Auch dieser Sensor ermöglicht es uns, Paketdaten, Sitzungsdaten und Paketstringdaten zu erfassen sowie signatur- und anomaliegestützte NIDS einzusetzen. 78 2 Die Datenerfassung planen Der Datenbankserver führt wahrscheinlich eigene Anwendungsprotokolle, über die wir Einsichten in seine Aktionen gewinnen können. Das Ergebnis unserer Planungen ist daher eine Liste der folgenden Datenquellen: •• •• •• •• •• •• •• •• •• •• •• •• DMZ-Sensor: Paketdaten DMZ-Sensor: Sitzungsdaten DMZ-Sensor: Paketstringdaten DMZ-Sensor: Signaturgestütztes NDIS DMZ-Sensor: Anomaliegestütztes NDIS Interner Sensor: Paketdaten Interner Sensor: Sitzungsdaten Interner Sensor: Paketstringdaten Interner Sensor: Signaturgestütztes NDIS Interner Sensor: Anomaliegestütztes NDIS Anwendungsprotokolldaten des Webservers Anwendungsprotokolldaten des Datenbankservers Unterbrechung des E-Commerce-Dienstes über ein extern zugängliches Netzwerkelement Die nächste Bedrohung mit hohem Risiko besteht darin, dass ein extern zugänglicher Computer geknackt und darüber der E-Commerce-Dienst unterbrochen wird. Da es hierbei auch um einen Angriff auf die Webanwendung gehen kann, muss auch deren Angriffsfläche bei den folgenden Überlegungen berücksichtigt werden. Bei PDI gibt es nur zwei Arten von Netzwerkcomputern, die extern zugänglich sind, nämlich die E-Commerce-Webserver, auf denen die Ports 80 und 443 für Webdienste geöffnet sind, und die Mailserver des Unternehmens mit dem offenen Port 25 für SMTP. In der vorhandenen Netzwerkinfrastruktur stellen schon die Protokolle der Firewall eine äußerst nützliche Datenquelle für Untersuchungen dar. Aufgrund der Bedeutung der Web- und Mailserver bei dieser Art von Bedrohung ist unbedingt ein Sensor erforderlich, der den Netzwerkdatenverkehr an ihren Schnittstellen erfasst. Der DMZ-Sensor, den wir schon bei der vorherigen Bedrohung besprochen haben, ist ideal platziert, um unsere Bedürfnisse auch für diesen Fall abzudecken. Ein Einbruch in dieses System erfolgt wahrscheinlich über einen der von außen zugänglichen Dienste. Um solche Vorfälle angemessen erkennen und analysieren zu können, müssen die anwendungsspezifischen Protokolle erfasst werden, also die Web-, Datenbank- und Mailserverprotokolle. Die Sorge um einen Angriff auf Systemebene macht es nicht nur erforderlich, einen weiteren Typ von Server zu berücksichtigen, sondern vergrößert auch erheblich die Angriffsfläche. 2.2 Fallstudie: Onlinehändler 79 Damit ausreichend Daten für die Erkennung und Analyse von Ereignissen in diesem Zusammenhang bereitstehen, müssen wir auch Betriebssystem- und Sicherheitsprotokolle, die Protokolldaten von Antivirussoftware und die Alarmdaten von Host-IDS erfassen. Am Ende unserer Planung steht daher folgende Liste von Datenquellen: •• •• •• •• •• •• •• •• •• •• •• •• Protokolldaten der Edge-Firewall DMZ-Sensor: Paketdaten DMZ-Sensor: Sitzungsdaten DMZ-Sensor: Paketstringdaten DMZ-Sensor: Signaturgestütztes NDIS DMZ-Sensor: Anomaliegestütztes NDIS Anwendungsprotokolldaten des Webservers Anwendungsprotokolldaten des Datenbankservers Anwendungsprotokolldaten des Mailservers Betriebssystem- und Sicherheitsprotokolldaten des Web- und des Mailservers Antivirus-Alarmdaten des Web- und des Mailservers HIDS-Alarmdaten des Web- und des Mailservers Unterbrechung des E-Commerce-Dienstes über ein internes Netzwerkelement Die nächste Priorität hat ein Einbruch in einen internen Computer des Netzwerks, der zur einer Unterbrechung des E-Commerce-Dienstes genutzt wird. Da das Endziel eines solchen Angriffs nach wie vor die E-Commerce-Webserver sind, müssen wir deren Angriffsfläche nach wie vor berücksichtigen, was den Bedarf für einen DMZ-Sensor noch verstärkt. Die einzigen Computer, die vom internen Netzwerk aus Zugriff auf die DMZ haben, sind die Server in VLAN 200 und die Entwicklercomputer in VLAN 103. Auch hier müssen wir also einen Sensor im Kern des Netzwerks vorsehen, um Daten von diesen Geräten zu erfassen. Wenn ein Angreifer in einen Entwicklercomputer eindringt, kann er Zugriff auf die DMZ erlangen. Das bedeutet, dass wir die entsprechenden System- und Sicherheitsprotokolle sowie die HIDS- und Antivirus-Alarmdaten von dieser Arbeitsstation erfassen sollten. Des Weiteren interessieren wir uns dafür, was über die Verbindung vom internen zum DMZNetzwerk übertragen wird, weshalb sich auch eine Erfassung der Firewallprotokolle des Kernrouters lohnt. Angreifer, denen es gelingt, in einen Computer im internen Netzwerk einzudringen, werden höchstwahrscheinlich versuchen, ihren Halt in dem Netzwerk zu verstärken, indem sie die Active-Directory-Umgebung manipulieren. Daher ist es wichtig, auch die Protokolle des Domänencontrollers zu erfassen. Wenn der primäre Domänencontroller auch 80 2 Die Datenerfassung planen die DNS-Dienste des Unternehmens ausführt, sind diese Protokolle auch äußerst nützlich, um zu bestimmen, ob die Clients versuchen, möglicherweise gefährliche Hostnamen aufzunehmen. Das kann darauf hindeuten, dass ein Angreifer versucht, zusätzliche Werkzeuge herunterzuladen oder eine Steuerfunktion im Netzwerk auszuüben. Die Planung ergibt folgende Liste von Datenquellen: Im Netzwerk •• •• •• •• •• •• •• •• •• •• •• Protokolldaten der Edge-Firewall Protokolldaten der Kernfirewall DMZ-Sensor: Paketdaten DMZ-Sensor: Sitzungsdaten DMZ-Sensor: Signaturgestütztes NDIS DMZ-Sensor: Anomaliegestütztes NDIS Interner Sensor: Paketdaten Interner Sensor: Sitzungsdaten Interner Sensor: Paketstringdaten Interner Sensor: Signaturgestütztes NDIS Interner Sensor: Anomaliegestütztes NDIS Auf dem Host •• Anwendungsprotokolldaten des Web- und des Datenbankservers sowie des Domänencontrollers •• Betriebssystem- und Sicherheitsprotokolldaten des Webservers und der VLANs 200 und 103 •• Antivirus-Alarmdaten des Webservers und der VLANs 200 und 103 •• HIDS-Alarmdaten des Webservers und der VLANs 200 und 103 Die Liste der Datenquellen für die genannten Bedrohungen kann nicht alle möglichen Verteidigungssituationen abdecken, aber doch eine ziemliche Menge. Nachdem wir nun festgestellt haben, welche Datenquellen für die NSM-Erkennung und -Analyse nützlich sind, können wir das ursprüngliche Netzwerkdiagramm ändern. In der neuen Version sind auch der DMZ- und der interne Sensor enthalten. Außerdem sind die Bereiche markiert, die diese Sensoren abdecken (siehe Abb. 2.3). Im nächsten Kapitel werden wir uns eingehender mit der Platzierung von Sensoren beschäftigen. 2.2 Fallstudie: Onlinehändler 81 Abbildung 2.3: Erweitertes Netzwerkdiagramm mit Platzierung der Sensoren 2.2.4 Die Erfassung eingrenzen Der letzte Schritt des Vorgangs besteht darin, die genannten Datenquellen so zu verfeinern, dass nur noch die nützlichen Aspekte der Daten erfasst werden. Es gibt unbegrenzte Möglichkeiten, das zu erreichen. Unser Beispielunternehmen ist aufgrund einer Kosten/ Nutzen-Analyse zu dem Schluss gekommen, dass es sinnvoll ist, die folgende Teilmenge der Daten zu erfassen: Im Netzwerk •• Protokolldaten der Edge-Firewall • Verweigerung ausgehender Verbindungen •• Protokolldaten der Kernfirewall • Verweigerung/Zulassung eingehender Verbindungen • Verweigerung ausgehender Verbindungen 82 2 Die Datenerfassung planen •• DMZ-Sensor: Paketdaten • Eingehende Webports • Eingehende Mailports • Ausgehende Mailports •• DMZ-Sensor: Sitzungsdaten • Alle Einträge •• DMZ-Sensor: Signaturgestütztes NDIS • Regeln zu Angriffen auf die Webanwendung: SQL-Injektion, XSS usw. • Regeln zu Angriffen auf die Webserver • Regeln zu Angriffen auf die Mailserver •• DMZ-Sensor: Anomaliegestütztes NDIS • Regeln zu Anomalien in Web- und Mailinhalten •• Interner Sensor: Paketdaten • Pakete aus dem internen Netzwerk zu Webserver-IP-Adressen • Pakete aus dem internen Netzwerk zu Entwicklercomputern in VLAN 103 • Externe Pakete zu den Servern in VLAN 200 •• Interner Sensor: Sitzungsdaten • Alle Einträge •• Interner Sensor: Paketstringdaten • Pakete von Entwicklercomputern in VLAN 103 nach außen •• Interner Sensor: Signaturgestütztes NDIS • Regeln zu Angriffen auf die Datenbank • Regeln zu Verwaltungstätigkeiten und Angriffen auf dem Domänencontroller • Allgemeine Malwareregeln •• Interner Sensor: Anomaliegestütztes NDIS • Regeln zu Anomalien bei der Interaktion mit der Datenbank Auf dem Host •• Anwendungsprotokolldaten des Mail-, Web- und Datenbankservers sowie des Domänencontrollers • Mailserver: Anlegen und Verändern von Konten • Webserver: Transaktionen aus der Subdomäne für die Rechnungsverarbeitung • Webserver: Transaktionen aus der Subdomäne für die Administration • Datenbankserver: Anlegen und Verändern von Konten • Datenbankserver: Transaktionen zur Abrechnung • Datenbankserver: Administrative Transaktionen • Domänencontroller: Anlegen und Verändern von Konten • Domänencontroller: Anlegen und Verändern von Computern 2.3 Zusammenfassung 83 •• Betriebssystem- und Sicherheitsprotokolldaten des Mailservers, des Webservers und der VLANs 200 und103 • Anlegen und Verändern von Konten • Benachrichtigungen über installierte Software • Benachrichtigungen über Systemaktualisierungen • Benachrichtigungen über Neustarts des Systems •• Antivirus-Alarmdaten des Mailservers, des Webservers und der VLANs 200 und 103 • Alle Alarmdaten •• HIDS-Alarmdaten des Mailservers, des Webservers und der VLANs 200 und 103 • Alarme über Änderungen an kritischen Systemdateien • Alarme über das Anlegen und Ändern von Konten 2.3 Zusammenfassung In diesem Kapitel haben wir einige Prinzipien der Datenerfassung kennengelernt und uns eine systematische Vorgehensweise angesehen, anhand der wir entscheiden können, welche Arten von Daten erfasst werden sollten. Die vorgestellte Fallstudie bot einen allgemeinen Überblick über die Schritte, die eine Organisation unternimmt, um ihre Bedürfnisse für die Datenerfassung zu ermitteln. Die Umsetzung muss natürlich im jeweiligen konkreten Zusammenhang erfolgen. Der Rest dieses Buches hilft Ihnen bei den Entscheidungen, die Sie bei der Festlegung Ihrer Anforderungen an die Datenerfassung treffen müssen. 3 Sensoren Die wichtigste technische Komponente im NSM sind die Sensoren. Definitionsgemäß ist ein Sensor ein Gerät, dass eine physikalische Größe erkennt oder misst und meldet, anzeigt oder auf andere Weise darauf reagiert. Im Rahmen von NSM ist ein Sensor eine Kombination aus Hardware und Software, die zur Erfassung, Erkennung and Analyse verwendet wird. Im NSM-Zyklus kann ein Sensor die folgenden Aktionen ausführen: •• Erfassung • PCAP-Erfassung • NetFlow-Erfassung • Generieren von PSTR-Daten aus PCAP-Daten • Durchsatzdiagramme aus NetFlow-Daten erstellen •• Erkennung • Signaturgestützte Erkennung • Anomaliegestützte Erkennung • Reputationsgestützte Erkennung • Erkennung mithilfe von Honeypots • Erkennen der Verwendung bekanntermaßen schädlicher PKI-Anmeldeinformationen mithilfe eines benutzerdefinierten Tools • Erkennen von PDF-Dateien mit möglicherweise schädlichen Strings mithilfe eines benutzerdefinierten Tools 86 3 Sensoren •• Analyse • Bereitstellen von Werkzeugen für Paketanalytiker • Bereitstellen von Werkzeugen für die Untersuchung von Snort-Alarmen • Bereitstellen von Werkzeugen für NetFlow-Analytiker Nicht alle Sensoren erfüllen alle drei Aufgaben des NSM-Zyklus. Dennoch ist der Sensor der Motor der NSM-Architektur, weshalb es von entscheidender Bedeutung ist, sich gründlich zu überlegen, wie die Sensoren bereitgestellt und gepflegt werden. Wir haben bereits festgestellt, wie wichtig die Datenerfassung ist, und die Sensoren sind die Komponenten, die diese Datenerfassung ermöglichen. Es bringt überhaupt nichts, viel Zeit auf die Identifizierung der Bedrohungen aufzuwenden, wenn Sie dann die Sensoren ohne systematisches Vorgehen zusammenschustern. Es gibt vier wichtige architektonische Aspekte bei der Überlegung, wie Sie die Sensoren in Ihrem Netzwerk einsetzen wollen. Dabei handelt es sich um den Typ der Sensoren, die physische Architektur der verwendeten Hardware, die verwendete Betriebssystemplattform und die Platzierung der Sensoren im Netzwerk. Auch die auf den Sensoren installierten Tools, die die Erfassung, Erkennung und Analyse durchführen, sind von Bedeutung. Damit werden wir uns in nachfolgenden Kapiteln ausführlicher beschäftigen. 3.1 NSM-Datentypen Weiter hinten in diesem Buch folgen Kapitel, die sich ausschließlich den einzelnen NSMDatentypen widmen. Als Grundlage für unsere Architektur der Sensorarchitektur ist es jedoch notwendig, zunächst einmal einen knappen Überblick über die wichtigsten NSMDatentypen zu geben, die zur Erkennung und Analyse erfasst werden können. 3.1.1 Paketdaten (FPC) Mit FPC (Full Packet Capture, »vollständige Paketerfassung«) ist die komplette Erfassung sämtlicher Datenpakete gemeint, die zwischen zwei Endpunkten übertragen werden. Das häufigste FPC-Datenformat ist PCAP. FPC-Daten können aufgrund ihrer schieren Menge zwar überwältigend wirken, doch aufgrund ihres großen Detailreichtums sind sie äußerst wertvoll, um Kontext für die Analyse zu liefern. Andere Datentypen, etwa statistische oder Paketstringdaten, werden oft von FPC-Daten abgeleitet. 3.1.2 Sitzungsdaten Sitzungsdaten stellen die Gesamtheit der Kommunikation zwischen zwei Netzwerkgeräten dar. Sie werden auch als Konversation oder Fluss bezeichnet und gehören zu den flexibelsten und nützlichsten Formen von NSM-Daten. Zwar bieten sie nicht so viele Details 3.1 NSM-Datentypen 87 wie FPC-Daten, doch ihr geringer Umfang ermöglicht es, sie länger aufzubewahren, was für Analysen im Rückblick eine sehr wertvolle Eigenschaft ist. 3.1.3 Statistische Daten Statistische Daten gehen aus der Ordnung, Analyse, Deutung und Präsentation anderer Arten von Daten hervor. Das kann viele unterschiedliche Formen annehmen, etwa statistische Werte über Ausreißer von der Standardabweichung oder Datenpunkte, die positive oder negative zeitliche Beziehungen zwischen zwei Größen angeben. 3.1.4 Paketstringdaten (PSTR) PSTR- werden aus FPC-Daten abgeleitet und bilden eine Form von Daten, die zwischen FPC- und Sitzungsdaten angesiedelt sind. Dieses Datenformat besteht aus den Klartextstrings von ausgewählten Protokollheadern (z. B. HTTP-Headerdaten). Der Detailreichtum dieser Daten ist eher mit dem von FPC- als von Sitzungsdaten zu vergleichen, wobei der geringere Umfang diesen Typ jedoch leichter handhabbar macht und eine längere Aufbewahrung ermöglicht. 3.1.5 Protokolldaten Hierbei handelt es sich um die rohen Protokolldateien, die von Geräten, Systemen und Anwendungen erzeugt werden. Das kann die Webbproxy-, von Routerfirewall-, VPNAuthentifizierungs- und Windows-Sicherheitsprotokolle sowie SYSLOG-Daten einschließen. Umfang und Nützlichkeit dieser Daten schwanken je nach Quelle. 3.1.6 Alarmdaten Wenn ein Erkennungswerkzeug eine Anomalie in den Daten feststellt, die es untersuchen soll, erstellt es eine Benachrichtigung. Solche Benachrichtigungen werden als Alarmdaten bezeichnet. Gewöhnlich enthalten sie eine Beschreibung des Alarms und einen Zeiger auf die Daten, die anomal erscheinen. Alarmdaten haben gewöhnlich einen sehr geringen Umfang und enthalten lediglich Zeiger auf andere Daten. Die Analyse von NSM-Ereignissen basiert gewöhnlich auf der Generierung von Alarmdaten. Es ist sinnvoll, sich eine Vorstellung von der relativen Größe dieser Datentypen zueinander machen zu können. Den größten Umfang haben FPC-Daten, gefolgt von PSTR- und Sitzungsdaten. Protokoll-, Alarm- und statistische Daten sind im Vergleich zu den anderen Typen gewöhnlich sehr klein, ihr Umfang fällt aber je nach Art der erfassten Daten und der Quellen sehr unterschiedlich aus. 88 3 Sensoren FPC PSTR Sitzung Alarm-, Protokollund statistische Daten (variabel) Abbildung 3.1: Größenvergleich von NSM-Datentypen Eine Quantifizierung der Größenunterschiede ist oft hilfreich, insbesondere bei der Ermittlung des Speicherplatzbedarfs für die Sensoren. Je nach Netzwerkumgebung kann es dabei dramatische Unterschiede geben. In einem Netzwerk mit sehr vielen Benutzercomputern kann es beispielsweise viel mehr PSTR-Daten geben als in einem Netzwerksegment, das hauptsächlich von Servern eingenommen wird. Angesichts dessen haben wir Daten aus verschiedenen Arten von Netzwerken herangezogen, um einige grundlegende Statistiken über den Umfang der einzelnen Datentypen in einem gegebenen Zeitraum aufzustellen. Protokoll-, Alarm- und statistische Daten sind in der Tabelle nicht enthalten. Tabelle 3.1: Größenvergleich von NSM-Datentypen FPC PSTR Sitzung Multiplikator 100 % 4% 0,01 % Datenumfang (MB) 1024 40.96 0,1024 Achtung Die Zahlen in Tabelle 3.1 bieten zwar einen Anhaltspunkt für die relativen Datengrößen in den Beispielen dieses Kapitels, doch in der Praxis hängt die Beziehung zwischen PSTR-, Sitzungs- und FPC-Daten sehr stark davon ab, welche Arten von Netzwerkdaten Sie erfassen. Daher müssen Sie Stichproben des Netzwerkverkehrs heranziehen, um die genauen Verhältnisse in Ihrer Umgebung zu bestimmen. 3.2 Sensortypen 89 3.2 Sensortypen Je nach der Größe eines Netzwerks und den Bedrohungen, denen es ausgesetzt ist, können die Sensoren unterschiedliche Rollen im NSM-Zyklus einnehmen. 3.2.1 Nur Erfassung Ein reiner Erfassungssensor zeichnet lediglich erfasste Daten wie FPC- oder Sitzungsdaten auf der Festplatte auf. Manchmal generiert er aufgrund der erfassten Werte auch noch andere Daten (z. B. statistische und PSTR-Daten). Sensoren dieser Art werden in großen Organisationen eingesetzt, in denen die Erkennungswerkzeuge über das Netzwerk auf die erfassten Daten zugreifen, um sie zu verarbeiten. Auch die Analyse erfolgt unabhängig vom Sensor, wobei die relevanten Daten nach Bedarf von anderen Geräten abgerufen werden. Ein reiner Erfassungssensor ist ein sehr grundlegendes Gerät ohne zusätzliche Software. Die Analytiker sind nur selten in der Lage, direkt darauf zuzugreifen. 3.2.2 Halbzyklus Ein Halbzyklussensor führt alle Funktionen eines reinen Erfassungssensors und zusätzlich auch Erkennungsaufgaben durch. Beispielsweise zeichnet er nicht nur PCAP-Daten auf der Festplatte auf, sondern führt auch ein NIDS (z. B. Snort) aus, entweder in Echtzeit an der Netzwerkkarte oder nahezu in Echtzeit an den PCAP-Daten auf der Festplatte. Die Analyse dagegen erfolgt nicht auf dem Sensor selbst. Um sie durchzuführen, werden die Daten von einem anderen Gerät abgerufen. Das ist die am weitesten verbreitete Art von Sensor. Bei Bedarf greifen die Analytiker direkt auf den Sensor zu, um mit den verschiedenen Erkennungswerkzeugen zu arbeiten. 3.2.3 Vollzyklus Bei diesem letzten Typ erfolgen Erfassung, Erkennung und Analyse auf dem Sensor. Daher muss neben den Erfassungs- und Erkennungswerkzeugen auch eine komplette Analysesuite darauf installiert sein. Das kann auch Profile für verschiedene Analytiker, eine grafische Benutzeroberfläche oder die Installation einer NIDS-GUI wie Snorby einschließen. Wird ein Vollzyklussensor eingesetzt, so werden fast alle NSM-Aufgaben dort ausgeführt. Dieser Typ wird hauptsächlich in kleinen Organisationen verwendet, in denen nur ein einziger Sensor bereitgestellt wird oder in denen nur eingeschränkte Hardwareressourcen zur Verfügung stehen. In den meisten Fällen ist ein Halbzyklussensor die beste Wahl. Das liegt hauptsächlich daran, dass es viel einfacher ist, die Erkennungswerkzeuge auf dem System zu installieren, auf dem die Daten auch erfasst werden. Es ist auch viel sicherer, wenn die Analytiker für ihre Untersuchungen Kopien der Daten auf ihre dedizierten Analysecomputer übertragen, anstatt mit den Rohdaten selbst zu arbeiten, denn ansonsten besteht die Gefahr, dass bei 90 3 Sensoren einer falschen Behandlung der Daten wichtige Informationen verloren gehen. Analytiker müssen zwar mit den Sensoren arbeiten, aber sie sollten sie nicht als Desktop-Analyse­ umgebung nutzen, es sei denn, es gibt keine andere Möglichkeit. Die Sensoren sind ein sehr wertvolles Element des Netzwerks und müssen dementsprechend geschützt werden. Abbildung 3.2: Arten von Sensoren 3.3 Sensorhardware Nach Abschluss der Planung ist es an der Zeit, die Sensorhardware zu erwerben. Beachten Sie dabei, dass es sich bei einem Sensor um einen Server handelt, weshalb Sie für diesen Zweck Serverhardware bereitstellen sollten. Ich habe nur zu oft erlebt, dass Sensoren aus Ersatzteilen zusammengeschustert waren. Einmal habe ich sogar eine Arbeitsstation gesehen, die quer in ein Regal gelegt worden war und als Sensor diente! Solche Geräte mögen für eine Laborumgebung oder zum Testen geeignet sein, aber für ernsthaftes Network Security Monitoring müssen Sie in zuverlässigere Hardware investieren. 3.3 Sensorhardware 91 Um zu bestimmen, wie viel Hardware Sie brauchen, müssen Sie berücksichtigen, welche Art von Sensor Sie bereitstellen wollen, wie viele Daten er erfassen soll und wie lange diese Daten aufbewahrt werden müssen. Im Folgenden sehen wir uns die wichtigen Komponenten der Sensorhardware einzeln an. Um die Hardwareanforderungen zu bestimmen, ist es oft jedoch hilfreich, zunächst einmal einen vorläufigen Sensor einzurichten. Dabei kann es sich um einen anderen Server, aber auch um eine Arbeitsstation oder sogar einen Laptop handeln. Bevor Sie den vorläufigen Sensor installieren, müssen Sie sich über seine physische und logische Platzierung im Netzwerk im Klaren sein. Diese Platzierung bestimmt, welche Netzwerkverbindungen der Sensor überwacht. Darauf werden wir weiter hinten in diesem Kapitel noch ausführlicher eingehen. Leiten Sie dem vorläufigen Sensor über einen SPAN-Port oder einen Netzwerk-Tap Datenverkehr zu. Installieren Sie die Erfassungs-, Erkennungs- und Analysetools auf ihm, um die Leistungsanforderungen der einzelnen Programme zu bestimmen. Dabei muss der vorläufige Sensor nicht leistungsfähig genug sein, um all diese Werkzeuge gleichzeitig auszuführen. Aktivieren Sie immer nur eines auf einmal, um ihre Leistungsansprüche zu berechnen. Zählen Sie dann die Werte von allen Tools zusammen, um den Gesamtbedarf zu ermitteln. 3.3.1 CPU Welche CPU-Ressourcen Sie brauchen, hängt größtenteils davon ab, was für eine Art von Sensor Sie bereitstellen. Ein reiner Erfassungssensor braucht sehr hohe Prozessorleistung, da diese Aufgabe nicht sehr verarbeitungsintensiv ist. Am stärksten wird der Prozessor bei der Erkennung in Anspruch genommen, weshalb Sie bei einem Halb- oder Vollzyklussensor zusätzliche Prozessoren oder Kerne vorsehen müssen. Wenn Sie ein erhebliches Wachstum erwarten, kann ein Bladesystem die richtige Wahl sein, da Sie dort einfach weitere Einschübe hinzufügen können, um die CPU-Ressourcen zu steigern. Eine einfache Möglichkeit zur Planung der Sensorbereitstellung besteht darin, die Anzahl der Kerne für die einzelnen Tools zu bestimmen. Je nach der Bandbreite, die insgesamt überwacht werden muss, der Art des Datenverkehrs, der Regelsätze für signaturgestützte Erkennungsmechanismen wie Snort und Suricata und der Richtlinien für Werkzeuge wie Bro können die konkreten Anforderungen sehr stark schwanken. Einige Aspekte zur Leistungsbestimmung sowie Referenzwerte werden wir in den Abschnitten zu den einzelnen Werkzeugen besprechen. Nachdem Sie Ihren Testsensor bereitgestellt haben, können Sie seine CPU-Nutzung mit SNMP oder einem Unix-Programm wie top (siehe Abb. 3.3) oder htop untersuchen. 92 3 Sensoren Abbildung 3.3: Überwachen der CPU-Nutzung auf dem Sensor mit top 3.3.2 Arbeitsspeicher Für Erfassung und Erkennung ist im Allgemeinen weniger Arbeitsspeicher erforderlich als für die Analyse. Das liegt daran, dass oft verschiedene Analytiker mehrere Instanzen derselben Programme nacheinander ausführen. Ein Sensor sollte schon an sich über reichlich Arbeitsspeicher verfügen, aber bei einem Vollzyklussensor müssen Sie diese Menge noch 3.3 Sensorhardware 93 drastisch erhöhen. Da sich der Speicherbedarf nur schwer planen lässt, ist es am besten, Hardware mit zusätzlichen Steckplätzen für Arbeitsspeicher zu kaufen, um für künftiges Wachstum gewappnet zu sein. Wie bei der Bestimmung der CPU-Ressourcen können Sie auch hier Programme wie top oder htop einsetzen, um genau zu ermitteln, wie viel Arbeitsspeicher die einzelnen Tools nutzen (siehe Abb. 3.4). Das muss natürlich geschehen, während der Sensor Datenverkehr mit einem Durchsatz sieht, der mit der Produktionslast vergleichbar ist. Abbildung 3.4: Überwachen der Speichernutzung auf dem Sensor mit htop Arbeitsspeicher ist relativ billig, was von einigen modernen Netzwerküberwachungsprogrammen weidlich ausgenutzt wird. Stellen Sie für die Tools große Mengen an Arbeitsspeicher zur Verfügung, um auch bei hohen Datenlasten eine gute Leistung zu erzielen. 3.3.3 Festplattenplatz Einer der Bereiche, dessen Planung vielen Organisationen die größten Schwierigkeiten bereitet, ist der Speicherplatz auf der Festplatte. Das liegt hauptsächlich daran, dass so viele Faktoren ins Spiel kommen. Bei der Planung des Platzbedarfs müssen Sie die Platzierung des Sensors und die Art des Datenverkehrs und der generierten Daten berücksichtigen. 94 3 Sensoren Außerdem müssen Sie den künftigen Bedarf durch Wachstum des Netzwerks einkalkulieren. Angesichts all dieser zu beachtenden Aspekte ist es nicht überraschend, dass der erforderliche Festplattenplatz nach der Installation eines Sensors oft einer Überprüfung unterzogen werden muss. Die folgenden Schritte können Ihnen helfen, die Platzanforderungen für einen Sensor zu bestimmen. Sie müssen sie für jeden Sensor ausführen, den Sie bereitstellen wollen. Schritt 1: Den erfassten Datenverkehr berechnen Um mit der Berechnung des Festplattenplatzes zu beginnen, bestimmen Sie die Menge der NSM-Daten, die der vorläufige Server in bestimmten Zeiträumen erfasst. Ich versuche dabei, in mehreren Intervallen von jeweils mindestens 24 Stunden Daten zu erfassen, und zwar sowohl an Arbeitstagen als auch am Wochenende. Dadurch erhalten Sie eine gute Darstellung des Datenflusses sowohl zu Spitzen- als auch zu ruhigen Zeiten. Wenn Sie mehrere Datenreihen aufgenommen haben, können Sie daraus die durchschnittliche Datenmenge pro Stunde berechnen. Nehmen wir an, unser Sensor generiert in einem 24-Stunden-Intervall unter der Woche (Spitzenzeit) 300 GB PCAP-Daten und am Wochenende (ruhige Zeit) 25 GB. Um den Tagesdurchschnitt zu berechnen, multiplizieren wir die Datenmenge eines Arbeitstags mit der Anzahl der Arbeitstage (300 GB x 5 = 1500 GB) und die Datenmenge eines Tages am Wochenende mit der Anzahl der Tage eines Wochenendes (25 GB x 2 = 50 GB). Anschließend addieren wir die beiden Ergebnisse (1500 GB + 50 GB = 1550 GB) und bilden den Durchschnitt, indem wir die Summe durch die Anzahl der Wochentage teilen (1550 GB / 7 = 221,43 GB). Wenn wir das noch durch die Anzahl der Stunden eines Tages dividieren, erhalten wir die durchschnittliche Menge an PCAP-Daten pro Stunde (221,43 GB / 24 = 9,23 GB). Die Ergebnisse dieser Berechnungen für mehrere Datenformate können Sie anschließend wie in Tabelle 3.2 darstellen Tabelle 3.2: Vom Sensor erfasste Datenmengen Tagesmenge (Arbeitstag) Tagesmenge (Wochenende) Tagesdurchschnitt Stundendurchschnitt PCAP 300 GB 25 GB 221,43 GB 9,23 GB Sitzung 30,72 MB 2,56 MB 16,64 MB 0,69 MB PSTR 12 GB 102,4 MB 6,05 GB 258,1 MB 9,48 GB 3.3 Sensorhardware 95 Schritt 2: Eine sinnvolle Aufbewahrungszeit für die einzelnen Daten­ typen bestimmen Jede Organisation muss einen Mindest- und einen Optimalwert für die Aufbewahrungszeit von NSM-Daten festlegen. Der Mindestwert stellt das Minimum dar, um NSMDienste auf akzeptablem Niveau durchführen zu können. Der Optimalwert gibt ein sinnvolles Ziel für eine bestmögliche Netzwerksicherheitsüberwachung vor. Welche Zahlen Sie hier wählen, hängt davon ab, wie sensibel Ihr Geschäftsbetrieb ist und welches Budget für die Sensorhardware zur Verfügung steht. Wenden Sie diese Werte anschließend auf die zuvor bestimmten Datenmengen an, um zu sehen, wie viel Platz Sie benötigen. In Tabelle 3.3 haben wir die Datenmengen aus Tabelle 3.2 mit den kürzestmöglichen und den optimalen Aufbewahrungszeiten multipliziert. Tabelle 3.3: Erforderlicher Speicherplatz für die minimale und optimale Aufbewahrungszeit Tagesdurchschnitt Minimum Erforderlicher Platz für Minimum Optimum Erforderlicher Platz für Optimum PCAP 221,43 GB 1 Tag 221,43 GB 3 Tage 664,29 GB Sitzung 16,64 MB 90 Tage 1,46 GB 1 Jahr 5,93 GB PSTR 6,05 GB 90 Tage 544,50 GB 1 Jahr 2,16 TB 2,21 GB 2,81 TB Schritt 3: Modifikatoren für den Sensortyp hinzufügen In der Produktion sind das Betriebssystem des Sensors und die Tools meistens auf einer logischen Festplatte untergebracht und die erfassten Daten auf einer anderen. Um den Festplattenplatz zu berechnen, der insgesamt benötigt wird, müssen wir jedoch auch das Betriebssystem und die Tools berücksichtigen. Bis jetzt haben wir nur Berechnungen für reine Erfassungssensoren angestellt. Bei einem Halbzyklussensor müssen Sie jedoch noch 10 % auf die Anforderungen aufschlagen, um Platz für die Erkennungswerkzeuge und die von ihnen generierten Alarmdaten zu haben. Bei einem Vollzyklussensor ist sogar eine Aufstockung um 25 % für die Erkennungs- und Analysewerkzeuge und deren Daten erforderlich. Anschließend fügen Sie noch weitere 10 bis 25 % für die jeweiligen Anforderungen des Betriebssystems sowie Zuschläge für das erwartete Wachstum des Netzwerks hinzu. Denken Sie immer daran, dass es sich bei diesen Zahlen nur um generelle Richtwerte handelt, die je nach den Zielen der Organisationen und der Natur des vorliegenden Netzwerks stark schwanken können. In Tabelle 3.4 haben wir solche Modifikatoren auf unsere Beispieldaten angewendet. 96 3 Sensoren In Tabelle 3.4 habe ich es zwar nicht getan, aber ich empfehle Ihnen, bei diesen Berechnungen stets aufzurunden, um sich selbst genügend Manövrierraum zu verschaffen. Es ist einfacher, vor der Bereitstellung eines Sensors mehr Festplattenplatz zu planen, als ihn im Nachhinein aufzustocken. Berücksichtigen Sie bei der Planung auch immer die verschiedenen Techniken zur Minimierung des Platzanspruchs. Die beiden häufigsten Vorgehensweisen bestehen darin, die Aufbewahrungszeit für einzelne Datentypen zu ändern bzw. Daten in Verbindung mit bestimmten Hosts oder Protokollen von der Erfassung auszuschließen. Beispielsweise kann Ihre Organisation entscheiden, dass FPC-Daten nur zwölf Stunden lang aufbewahrt werden müssen, da schließlich die PSTR-Daten drei Monate lang erhalten bleiben. Bei der zweiten Vorgehensweise können Sie beispielsweise die Erfassung von FPC-Daten so einrichten, dass bestimmte umfangreiche Arten des Datenverkehrs, etwa nächtliche Backuproutinen oder verschlüsselter SSL/TLS-Datenverkehr, ignoriert werden. Beide Techniken haben ihre Vor- und Nachteile und sind die Konsequenz daraus, dass wir unsere Entscheidungen nun einmal nicht in einer idealen Welt treffen, sondern mit begrenzten Ressourcen arbeiten müssen. Um den Datenverkehr zu den Sensorprozessen zu filtern, können Sie für den Anfang ein Werkzeug wie BPF (Berkeley Packet Filter) verwenden. Mehr darüber erfahren Sie in Kapitel 13. Tabelle 3.4: Fertige Abschätzung des erforderlichen Festplattenplatzes Minimum Ideal PCAP 221,43 GB 664,29 GB Sitzung 1,46 GB 5,93 GB PSTR 544,50 GB 2,16 TB Zwischensumme 2,21 GB 2,81 TB + 10 % für Halbzyklussensor 226,3 MB 287,74 GB + 15 % für erwartetes Wachstum 339,46 MB 431,62 GB Gesamt 2,76 GB 3,51 TB 3.3.4 Netzwerkschnittstellen Die Netzwerkkarte ist wahrscheinlich die wichtigste Hardwarekomponente im Sensor, da sie für die Erfassung der Daten zuständig ist, die in den drei Phasen des NSM-Zyklus genutzt werden. Ein Sensor braucht immer mindestens zwei Netzwerkkarten. Eine dient dazu, für die Administration oder die Analyse auf den Server zuzugreifen, die andere ist für die Datenerfassung da. Bei der Administrationsschnittstelle kann es sich um ein Standardmodell handeln, da sie nicht anders genutzt wird als eine typische Netzwerkkarte in einem Server. Wie sehr die zweite Karte spezialisiert sein muss, hängt davon ab, wie viel Datenverkehr damit erfasst 3.3 Sensorhardware 97 werden soll. Mit handelsüblichen Qualitätskarten, z. B. von Intel oder Broadcom, und der richtigen Konfiguration eines Netzwerksocketpuffers mit Lastenausgleich, z. B. PF_Ring, lässt sich Datenverkehr bis zu 1 Gbit/s problemlos ohne Paketverlust erfassen. Wie viele Netzwerkkarten erforderlich sind, hängt von der Bandbreite der über die Verbindung gesendeten Daten und der Art der verwendeten Taps ab. Denken Sie daran, dass es in modernen Ethernetverbindungen zwei Kanäle gibt, nämlich einen Übertragungskanal (Transit, TX) und einen Empfangskanal (Receive, RX). Eine Standardnetzwerkkarte mit 1 Gbit/s kann insgesamt 2 Gbit/s transportieren, nämlich 1 Gbit/s in jede Richtung. Wenn die Netzwerkkarte weniger als 500 Mbit/s (in jeder Richtung) sieht, dann sind Sie mit einer einzigen 1-Gbit/s-Karte für die Überwachung relativ sicher. »Relativ«, weil eine solche Netzwerkkarte an einem Router oder Uplink mit 500 Mbit/s den Datenverkehr puffern kann, sodass Spitzenwerte über dem Durchsatz des Uplinks auftreten können. Mit erweiterten Taps können Sie solche Arten von Leistungsproblemen lindern. Im nächsten Abschnitt erfahren Sie mehr über Netzwerk-Taps. Um genau zu bestimmen, was für einen Durchsatz die Erfassungskarte haben muss, müssen Sie ermitteln, wie stark der zu erfassende Datenverkehr ist. Die einfachste Möglichkeit dazu besteht darin, eine Sammelüberwachung auf dem Router oder Switch einzurichten. Die wichtigsten Größen dabei sind: •• Datenverkehr von Spitze zu Spitze (gemessen in Mbit/s) •• Durchschnittliche Bandbreite (Durchsatz) pro Tag (gemessen in Mbit/s) Nehmen wir an, Sie möchten eine Schnittstelle von 1 Gbit/s überwachen. Der durchschnittliche Durchsatz beträgt 225 Mbit/s, wobei durchschnittlich 100 Mbit/s gesendet und 350 Mbit/s empfangen werden. Dabei können anhaltende Spitzen bis zu 450 Mbit/s auftreten. Die Netzwerkkarte, die Sie verwenden, muss nicht nur mit dem durchschnittlichen Volumen umgehen können, sondern auch mit den Spitzen. Achtung Datenverkehr verläuft in zwei Richtungen! Eine 1-Gbit/s-Verbindung hat einen maximalen Durchsatz von 2 Gbit/s, nämlich 1 Gbit/s TX und 1 Gbit/s RX. Ein weiterer wichtiger Faktor für die Planung eines Sensors ist die Zusammensetzung des Datenverkehrs an einem Link aus verschiedenen Netzwerkprotokollen. Sie kann von der Tageszeit abhängen (z. B. durch nächtliche Backuproutinen), von der Zeit im Jahreslauf (z. B. durch recherchierende Studenten) und von vielen anderen Variablen. Um zu ermitteln, welche Arten von Daten über eine Verbindung fließen, konfigurieren Sie den SPAN-Port oder Netzwerk-Tap, den Sie für den Sensor vorgesehen haben, und schließen Sie ihn an einen vorläufigen Sensor an, der über eine Netzwerkkarte mit hohem Durchsatz verfügt. Zur Analyse können Sie NetFlow-Daten erfassen und untersuchen oder PCAPDaten erfassen und offline in Analysewerkzeugen wiedergeben. 98 3 Sensoren Diese Messungen müssen über einen längeren Zeitraum durchgeführt werden, um Spitzenwerte und die zu erwartenden Arten des Datenverkehrs zu ermitteln. Das hilft Ihnen zu entscheiden, ob Sie eine Netzwerkkarte mit 100 Mbit/s, 1 Gbit/s, 10 Gbit/s oder einem noch höheren Durchsatz benötigen. Selbst bei geringem Durchsatz ist es wichtig, Hardware für den professionellen Einsatz zu kaufen, um Paketverluste zu vermeiden. Eine 1-Gbit/s-Netzwerkkarte für 30 € bei einem Elektronikdiscounter mag wie ein Schnäppchen erscheinen, aber wenn Sie versuchen, ein Schad-PDF aus einem Paketstream zu entnehmen und dabei feststellen müssen, dass Ihnen einige Segmente der Daten fehlen, dann werden Sie sich wünschen, etwas mehr Geld ausgegeben zu haben, um ein Qualitätsprodukt zu erwerben. Um Datenverkehr mit mehr als 1 Gbit/s zu erfassen oder um die Leistung der Sensorhardware zu optimieren, können Sie Hochleistungskarten verwenden. Die drei bekanntesten Hersteller solcher Karten sind, vom teuersten zum billigsten geordnet, Napatech, Endace und Myricom. Solche Karten bieten unterschiedliche Kombinationen von Hochleistungsfunktionen wie Kartenpuffer, Hardwarezeitstempel, erweiterte Treiber für Netzwerksockets, GBIC-Schnittstellenoptionen usw. Der Markt für Profi-Netzwerkkarten wandelt sich rasch. Zurzeit empfehlen wir Produkte von Myricom, da sie in Kombination mit dem proprietären Netzwerksocketpuffer derselben Firma einen erstaunlichen Wert und eine hohe Leistung bieten. Wenn Sie feststellen, dass sich Ihr Sensor dem Grenzwert von 10 Gbit/s nähert, sollten Sie seine Platzierung ändern oder eine Lastenausgleichslösung einsetzen. Die Menge der Daten, die in einem solchen Fall erfasst und auf die Festplatte geschrieben werden, kann auch Probleme bei der Festplatten-E/A hervorrufen. 3.3.5 Lastenausgleich: Anforderungen für Socketpuffer Wenn der Datenverkehr an der Netzwerkkarte angekommen ist, muss er sorgfältig auf die verschiedenen Prozesse und Anwendungsthreads auf dem Sensor verteilt werden. Der herkömmliche Netzwerksocketpuffer von Linux reicht für eine Hochleistungsanalyse des Datenverkehrs jedoch nicht aus. Hier kommt PF_Ring von Luca Deri ins Spiel. Allgemein besteht der Zweck von PF_Ring darin, die Leistung von Netzwerksockets durch verschiedene Techniken zu optimieren, etwa durch einen Zero-Copy-Ringpuffer. Dabei platziert die Netzwerkkarte den Datenverkehr direkt im Benutzerraum, anstatt ihn in den Kernelraum zu kopieren, was dem Betriebssystem einen teuren Kontextwechsel erspart. Dies macht die Datenerfassung schneller und wirtschaftlicher. Zur Veranschaulichung können Sie sich vorstellen, dass PF_Ring den Netzwerkdatenverkehr zur Lieferung an verschiedene Tools auffächert. Dabei gibt es zwei mögliche Modi: Die einzelnen Pakete können im Rundlaufverfahren zugeordnet werden, es ist aber auch möglich, den gesamten Datenfluss an einen einzigen Prozess oder Thread innerhalb des 3.3 Sensorhardware 99 Sensors zu leiten. Bei der aktuellen Implementierung von PF_Ring können Sie einen 5-Tupel-Hash aus dem Quellhost, dem Zielhost, dem Quellport, dem Zielport und dem Protokoll erstellen. Dieser Algorithmus sorgt dafür, dass alle Pakete für einen einzigen TCP-Fluss alle UDP/ICMP-Pseudoflüsse von einem bestimmten Prozess oder Thread gehandhabt werden. PF_Ring ist zwar nicht der einzige Puffer, den Sie zusammen mit den üblichen Erkennungswerkzeugen wie Bro, Snort und Suricata einsetzen können, aber er stellt die am weitesten verbreitete Option dar und wird von allen drei Tools unterstützt. Bei Hochleistungssensoren und für solche, die in Umgebungen mit mehr als 1 Gbit/s eingesetzt werden, können Sie erhebliche Leistungssteigerungen durch Netzwerksockets von Drittanbietern erzielen. Mit Unterstützung von Silicom bietet Ntop.org jetzt unter dem Namen PF_Ring + DNA Hochleistungs-Netzwerksockets für handelsübliche IntelNetzwerkkarten an. Die Lizenzen müssen jeweils pro Port erworben werden. Angesichts der beeindruckenden Ergebnisse bei Leistungstests ist PF_Ring + DNA eine Option, die Sie sich genauer ansehen sollten. Der Myricom-Treiber für die eigenen Netzwerkkarten von Myricom wird pro Karte lizenziert und scheint zurzeit den größten Wert für den Preis zu bieten. 3.3.6 SPAN-Ports und Netzwerk-Taps im Vergleich Die Geräte, mit denen Sie Pakete zum Sensor leiten, gehören zwar nicht zu dem physischen Sensorcomputer, werden aber als Bestandteil der Sensorarchitektur aufgefasst. Je nachdem, wo Sie einen Sensor im Netzwerk unterbringen, müssen Sie dazu entweder einen SPAN-Port oder einen Netzwerk-Tap verwenden. Die einfachste Möglichkeit bietet ein SPAN-Port, da er die vorhandene Hardware nutzt. SPAN-Ports sind eine Funktion von Switches für den professionellen Einsatz in Unternehmen, die es ihnen ermöglicht, einen oder mehrere physische Switch-ports auf einen anderen Port zu spiegeln. Dazu müssen Sie als Erstes die Ports ermitteln, deren Datenverkehr Sie zum Server leiten möchten. Dabei handelt es sich meistens um den Port, der den Switch mit einem vorausgehenden Router verbindet, es können aber auch mehrere Ports sein, an denen sich wichtige Netzwerkgeräte befinden. Je nach Modell des Switches können Sie über eine grafische Benutzeroberfläche oder eine Befehlszeile dafür sorgen, dass der ein- und ausgehende Datenverkehr an diesem Port auf einen anderen Port an dem Switch gespiegelt wird. Wenn Sie nun die Erfassungskarte des Sensors mit diesem zweiten Port verbinden, sehen Sie den Datenverkehr des gespiegelten Quellports. Das können Sie in Abb. 3.5 erkennen. Hier ist der Sensor so eingerichtet, dass er den gesamten Datenverkehr, der von einer Gruppe von Netzwerkgeräten zu einem Router verläuft, überwacht. Dazu wird der Port, an dem der Router angeschlossen ist, auf den Sensor gespiegelt. 100 3 Sensoren 24-Port-Switch Port 1 Port 2–23 Router Netzwerkgeräte Angeschlossen an Port 24 Gespiegelter Datenverkehr von Port 1 Sensor Abbildung 3.5: Paketerfassung mithilfe eines SPAN-Ports Weitere Informationen Die Portspiegelung ist eine übliche Funktion von Switches für den professionellen Einsatz in Unternehmen. Auf Switches für den Hausgebrauch ist sie jedoch nur selten zu finden. Miarec unterhält auf http://www.miarec.com/knowledge/ switches-port-mirroring eine großartige Liste von einfacheren Switches, die über diese Funktion verfügen. Die meisten Switches erlauben eine n:1-Konfiguration, was bedeutet, dass Sie mehrere Ports auf einen Port spiegeln können. Dabei müssen Sie jedoch die physischen Grenzen des Switches berücksichtigen. Wenn der Switch beispielsweise über 100-Mbit/s-Ports verfügt und Sie 15 davon auf den Erfassungsport spiegeln, wird Letzterer mit Datenverkehr überlastet, sodass Pakete verloren gehen. Liegt an einem Port für längere Zeit die Maximallast an, gehen manche Switches davon aus, dass ein Denial-of-Service-Angriff oder ein Broadcaststorm vorliegt, und schalten den betreffenden Port ab. Das ist natürlich das Schlimmste, was Ihnen passieren kann, denn dann erhalten die an diesen Port angeschlossenen Erkennungsprozesse keine Daten mehr. Eine andere Möglichkeit, Pakete zu Ihrem Sensor zu leiten, besteht darin, einen NetzwerkTap zu verwenden. Dabei handelt es sich um ein passives Hardwaregerät, das zwischen zwei Endpunkten sitzt und deren Datenverkehr an einen weiteren Port spiegelt. Stellen Sie sich beispielsweise einen Router und einen Switch vor, die über ein einziges Kabel verbunden sind. Wenn Sie einen Tap zwischenschalten, brauchen Sie noch mehr Kabel, nämlich eines vom Switch zum Tap und ein weiteres vom Tap zum Router. Dadurch kann der Datenverkehr weiterhin zwischen Router und Switch übertragen werden (siehe Abb. 3.6). 3.3 Sensorhardware 101 Tap Switch Router Sensor Abbildung 3.6: Verwendung eines Netzwerk-Taps zur Erfassung von Paketen Um den von dem Tap abgefangenen Datenverkehr zu überwachen, müssen Sie den Tap mit dem Sensor verbinden. Wie das geschieht, hängt vom Typ des Taps ab. Am häufigsten sind aggregierende Taps, die Sie über ein einziges Kabel mit der Erfassungskarte auf dem Sensor verbinden. Darüber können Sie den Datenverkehr zwischen Router und Switch in beiden Richtungen überwachen. Ein nicht aggregierender Tap dagegen hat zwei Überwachungsanschlüsse, nämlich jeweils einen für die beiden Richtungen des Datenflusses. Bei solchen Taps müssen Sie die beiden Überwachungsports an unterschiedliche Netzwerkkarten auf dem Sensor anschließen. Abb. 3.7 zeigt beide Arten von Taps. Aggregierender Tap Nicht aggregierender Typ Tap Router Bidirektionaler Datenverkehr Netzwerkkarte 1 Tap Switch Router Eingehender Datenverkehr Netzwerkkarte 1 Sensor Ausgehender Datenverkehr Switch Netzwerkkarte 2 Sensor Abbildung 3.7: Aggregierende und nicht aggregierende Taps Für Hochleistungsanwendungen bilden Taps gewöhnlich die bevorzugte Lösung. Es gibt sie in allen Formen und Größen und für sehr hohe Leistungsansprüche. Bei Taps bekommen Sie die Qualität, für die Sie bezahlen. Seien Sie daher nicht knauserig, wenn Sie einen Tap für die Überwachung einer kritischen Verbindung auswählen. 102 3 Sensoren Schnittstellen binden Bei der Verwendung eines nicht aggregierenden Taps brauchen Sie auf dem Sensor mindestens zwei Netzwerkschnittstellen für die Erfassung, die eine für den eingehenden und die andere für den ausgehenden Datenverkehr. Damit lassen sich die vorliegenden Aufgaben zwar erledigen, doch Erkennung und Analyse werden durch das Vorhandensein von zwei getrennten Datenströmen erschwert. Es gibt mehrere Möglichkeiten, diese Datenströme zu vereinen, und zwar sowohl Hardware- als auch durch Softwarelösungen. Ich bevorzuge eine Technik, die als Schnittstellenbindung bezeichnet wird. Dabei legen Sie eine virtuelle Netzwerkschnittstelle an, die die Datenströme mehrerer Schnittstellen zu einem einzigen kombiniert. Das erfolgt durch Software. Als Beispiel wollen wir zwei Schnittstellen in Security Onion binden. Wie Sie an der Ausgabe von Abb. 3.8 sehen, hat der Computer, auf dem meine Installation von Security Onion läuft, drei Netzwerkschnittstellen, wobei eth2 die Verwaltungsschnittstelle ist und eth0 und eth1 zur Datenerfassung dienen. Abbildung 3.8: Die Netzwerkschnittstellen eines Systems Nehmen wir an, dass eth0 und eth1 an einen nicht aggregierenden Tap angeschlossen sind und jeweils Datenverkehr in einer Richtung sehen. Ein Beispiel für die Datenströme, die an den beiden Schnittstellen abgefangen werden, sehen Sie in Abb. 3.9. Darin können Sie das Ergebnis einer ICMP-Echoanforderung und die Antwort auf einen Ping sehen. Im oberen Fenster wird der Datenverkehr an 4.2.2.1 gezeigt, im unteren der Datenverkehr von 4.2.2.1. 3.3 Sensorhardware 103 Abbildung 3.9: Unidirektionaler Datenverkehr an den beiden Schnittstellen Diese beiden Schnittstellen wollen wir nun zu einer einzigen vereinigen, um die Analyse zu vereinfachen. In Security Onion können Sie das mithilfe von bridge-utils tun, das mittlerweile mit zu dem Betriebssystem gehört. Mit den folgenden Befehlen können Sie eine temporäre Brücke einrichten: sudo sudo sudo sudo sudo ip addr flush dev eth0 ip addr flush dev eth1 brctl addbr br0 brctl addif br0 eth0 eth1 ip link set dev br0 up Dadurch wird die Schnittstelle br0 angelegt. Wenn Sie den Datenverkehr an dieser Schnittstelle abrufen, werden Sie feststellen, dass darin die Daten von eth0 und eth1 zusammengefasst sind. Dadurch müssen Sie nur noch mit einer einzigen virtuellen Schnittstelle arbeiten, über die Sie beide Kommunikationsrichtungen abrufen können (siehe Abb. 3.10). Wenn diese virtuelle Schnittstelle auch nach einem Neustart des Betriebssystems Bestand haben soll, müssen Sie einige Änderungen an Security Onion vornehmen. Dazu gehört es, den grafischen Netzwerkmanager auszuschalten und bridge-uitls in der Datei /etc/ network/interfaces zu konfigurieren. Mehr darüber erfahren Sie in folgenden Quellen: •• http://code.google.com/p/security-onion/wiki/NetworkConfiguration •• https://help.ubuntu.com/community/NetworkConnectionBridge 104 3 Sensoren Abbildung 3.10: Bidirektionaler Datenverkehr an der virtuellen Schnittstelle 3.4 Das Betriebssystem des Sensors Als Betriebssysteme für Sensoren werden meistens Varianten von Linux oder BSD verwendet. Die verschiedenen Distributionen haben alle ihre eigenen Vor- und Nachteile, und die Wahl ist zum größten Teil Geschmackssache. Da im US-Verteidigungsministerium Red Hat eingesetzt wird, bevorzugen Personen mit einem entsprechenden Hintergrund Distributionen auf der Grundlage von Red Hat, etwa CentOS oder Fedora. Viele NSM-Experten alter Schule dagegen greifen aufgrund des minimalistischen Aufbaus lieber zu FreeBSD oder OpenBSD. Es kommt nicht darauf an, irgendeine bestimmte Variante auszuwählen; wichtig ist nur, dass es sich um ein Betriebssystem auf *nix-Basis handelt. Dafür gibt es viele Gründe. Der offensichtlichste ist, dass die meisten Erfassungs-, Erkennungs- und Analysewerkzeuge eigens für diese Plattformen geschrieben wurden. 2013 war Linux am weitesten verbreitet, nachdem praktisch alle Hardwaresteller dazu übergingen, aktuelle Linux-Treiber für ihre Produkte bereitzustellen. 3.5 Platzierung von Sensoren Die wahrscheinlich wichtigste Entscheidung bei der Planung der NSM-Datenerfassung betrifft die physische Platzierung der Sensoren im Netzwerk. Sie bestimmt, welche Daten erfasst werden können, welche Erkennungsmöglichkeiten für diese Daten zur Verfügung stehen und in welchem Umfang eine Analyse möglich ist. Bei der Platzierung müssen Sie dafür sorgen, dass die Sensoren einen guten Einblick in die Datenquellen nehmen können, die Sie zuvor als wichtig für das Network Security Monitoring in Ihrer Organisation erkannt haben (anhand des in Kapitel 2 besprochenen Applied Collection Frameworks). 3.5 Platzierung von Sensoren 105 Es gibt keine Standardmethode, um den besten Platz für einen Sensor im Netzwerk herauszufinden. Die folgenden Tipps und empfehlenswerten Vorgehensweisen können Ihnen aber helfen, den üblichen Fallstricken zu entgehen. 3.5.1 Die richtigen Ressourcen nutzen Ebenso wie Sicherheitsmaßnahmen im Allgemeinen darf auch die Platzierung der Sensoren nicht losgelöst vom Rest der Organisation erfolgen. Die Platzierung an sich ist zwar Aufgabe des Sicherheitsteams, aber die Überlegung, wie das Gerät am besten in das Netzwerk integriert werden kann, fällt mehr in den Bereich der Netzwerktechnik, weshalb sich die Mitglieder des Sicherheitsteams schon recht früh bei der Planung der Platzierung an die Kollegen von der Netzwerktechnik wenden sollten. Schließlich kennt niemand das Netzwerk besser als die Leute, die es entworfen haben und täglich warten. Sie können dafür sorgen, dass die Ansprüche an die Platzierung realistisch und in der vorhandenen Netzwerktopologie auch erfüllbar sind. Es kann natürlich sein, dass die Aufgaben des Sicherheitsteams und der Netzwerktechniker von einer einzigen Person wahrgenommen werden – und diese Person können Sie selbst sein. Das macht es zumindest ziemlich einfach, einen Termin für eine Besprechung zu finden. Den besten Einblick in die Gesamtstruktur des Netzwerks oder einzelner Segmente bietet das Netzwerkdiagramm. Detaillierungsgrad und Gestaltung solcher Diagramme können sehr unterschiedlich sein, aber für die Platzierung sind sie unverzichtbar, da sie die Netzwerkarchitektur grafisch darstellen. Wenn es in Ihrer Organisation keine Netzwerkdiagramme gibt, ist das eine gute Gelegenheit, sie anzulegen. Schließlich sind sie nicht nur wichtig, um das Sichtfeld der Sensoren festzulegen, sondern helfen auch dabei, Sichtfelddiagramme für die Analytiker aufzustellen. Mehr über diese Diagramme erfahren Sie in einem der nachfolgenden Abschnitte. 3.5.2 Ein- und Austrittspunkte Im Idealfall und bei Vorhandensein der entsprechenden Ressourcen sollte ein Sensor an einem ausgeprägten Ein- oder Austrittspunkt in das oder aus dem Netzwerk platziert werden. Dies können Internet-Gateways, herkömmliche VPNs und Verbindungen zu Partnernetzwerken sein. In kleineren Netzwerken kann das bedeuten, den Sensor an einem Rand des Netzwerks bereitzustellen. In vielen großen Organisationen wird eine Hub-andSpoke-Architektur verwendet, bei dem der Datenverkehr von Satellitenbüros über VPN, MPLS oder direkte Verbindungen zur Durchsetzung der Netzwerküberwachungsrichtlinien in das Hauptbüro geleitet wird. Dabei ist eine breitere Verteilung der Sensoren auf die einzelnen Eintritts- und Austrittspunkte erforderlich. Das Diagramm in Abb. 3.11 zeigt eine Netzwerkarchitektur, wie Sie sie in großen Organisationen mit vielen Ein- und Austrittspunkten finden können. Beachten Sie, dass nicht alle Router in diesem Diagramm eine Netzwerkadressübersetzung (Network Address Translation, NAT) durchführen. 106 3 Sensoren In diesem Beispiel werden vier Sensoren bereitgestellt: •• •• •• •• Sensor A am Rand des Firmennetzwerks Sensor B am Rand des Forschungsnetzwerks Sensor C am Eintrittspunkt vom Netzwerk eines Partnerunternehmens Sensor D am Rand des drahtlosen Netzwerks Edge-Router Inline-Tap Internet (primär) Sensor A Router des Forschungsnetzwerks Switch Sensor D Inline-Tap Interner Router Inline-Tap Switch Inline-Tap Sensor C Sensor B Switch Drahtloser Zugriffspunkt Switch Benutzercomputer Drahtlos angeschlossene Benutzercomputer Netzwerk eines Partnerunternehmens Abbildung 3.11: Platzierung von Sensoren an Ein- und Austrittspunkten Abgesehen vom Diebstahl physischer Datenträger werden bei jeglichen negativen Aktivitäten in Ihrem Netzwerk immer Daten in das Netzwerk oder aus ihm heraus übertragen. Diese Daten können von Sensoren an den entsprechenden Ein- und Austrittspunkten erfasst werden. 3.5 Platzierung von Sensoren 107 3.5.3 Sichtbarkeit interner IP-Adressen Für die Erkennung und Analyse ist es entscheidend, bestimmen zu können, um welches interne Gerät es bei einem Alarm geht. Wenn ein Sensor auf der falschen Seite eines NATGeräts, z. B. eines Routers steht, kann diese wichtige Information von Ihnen ferngehalten werden. Das Diagramm in Abb. 3.12 zeigt zwei verschiedene Platzierungsvarianten. Das Netzwerk ist ziemlich einfach gehalten: Das Unternehmensnetzwerk befindet sich hinter einem internen Router, der eine DMZ zwischen sich selbst und dem Edge-Router ausbildet. Der Edge-Router schließlich ist mit dem Internet verbunden. Die IP-Adressen der Geräte hinter dem internen Router stammen aus dem Bereich 172.16.16.0/24. Im internen LAN hat der Router die IP-Adresse 172.16.16.1, im externen WAN 192.168.1.254. Dadurch entsteht eine DMZ zwischen dem internen Router und dem Edge-Router. Variante A: Externe Platzierung Tap Internet Externe Schnittstelle 192.168.1.254 Edge-Router Interne Schnittstelle 172.16.16.1 Interner Router Interne Hosts 172.16.16.0/24 Sensor Variante B: Interne Platzierung Externe Schnittstelle 192.168.1.254 Internet Edge-Router Interne Schnittstelle 172.16.16.1 Tap Interner Router Sensor Interne Hosts 172.16.16.0/24 Abbildung 3.12: Zwei mögliche Platzierungen eines Sensors in einem einfachen Netzwerk In Variante A steht der Sensor vor dem internen Router in der DMZ. Der Alarm aus Abb. 3.13 zeigt, was geschieht, wenn ein Computer in der Gruppe der internen Hosts einem Drive-by-Download zum Opfer fällt und eine schädliche PDF-Datei mit einem Link zum Exploitkit Phoenix herunterlädt. 108 3 Sensoren Abbildung 3.13: Ein Alarm bei der Platzierungsvariante A Dieser Alarm besagt, dass das Gerät mit der Adresse 192.168.1.254 versucht hat, eine PDFDatei vom Host 1.2.3.4 herunterzuladen und dass dieses PDF einen Link zum Exploitkit Phoenix enthält. Das Problem ist, dass es sich bei 192.168.1.254 um die externe IP-Adresse des internen Routers handelt, sodass wir nicht erkennen können, welcher der internen Hosts die Kommunikation eingeleitet hat. Ein Abruf von NetFlow-Daten liefert die Ergebnisse aus Abb. 3.14. Abbildung 3.14: NetFlow-Daten bei Variante A Bei dieser Sensorplatzierung sehen wir keine interne IP-Adresse aus dem Bereich 172.16.16.0/24, da der interne Router die IP-Adressen der Hosts innerhalb dieses Netzwerks durch NAT maskiert. Die von diesem Sensor erfassten Daten geben uns keinerlei Möglichkeit, den Alarm weiter zu untersuchen. Selbst wenn Sie noch andere Datenquellen zur Verfügung hätten, etwa die Protokolle von Antivirus- oder HIDS-Software, wüssten Sie nicht, wo Sie mit der Suche beginnen sollten. In Netzwerken mit Hunderten oder gar Tausenden von Hosts in einem Segment kann dies besonders kompliziert werden. 3.5 Platzierung von Sensoren 109 In Variante B befindet sich der Sensor hinter dem Router. Dieselbe schädliche Aktivität ruft wieder den gleichen Alarm hervor, doch wie Sie in Abb. 3.15 sehen, erhalten wir dabei jetzt andere Informationen. Abbildung 3.15: Ein Alarm bei der Platzierungsvariante B Wie im vorigen Beispiel wird die externe Adresse der Website angezeigt, auf der sich die Schaddatei befindet (1.2.3.4), aber statt der externen IP-Adresse des internen Routers können wir diesmal die interne IP-Adresse des Hosts erkennen, der auf Spuren einer Infektion untersucht werden sollte. Die NetFlow-Daten in Abb. 3.16 zeigen die gleichen Informationen. Abbildung 3.16: NetFlow-Daten bei Variante B Die erfassten Daten müssen für eine Analyse brauchbar sein. Dieses Beispiel gilt nicht nur für Sensoren in internen Netzwerksegmenten, sondern auch für Segmente, die nur einen Hop vom Internet entfernt sind. Achten Sie immer darauf, dass Sie die Sensoren auf der richtigen Seite von Routern unterbringen. 110 3 Sensoren 3.5.4 Nähe zu kritischen Elementen In der Einleitung zu diesem Buch haben wir schon festgestellt, dass es zu Problemen führen kann, wenn Sie versuchen, ein möglichst großes Netz auszuwerfen, um so viele Daten wie möglich zu gewinnen. Denken Sie bei der Platzierung der Sensoren daran. Wenn Sie sich die Zeit genommen haben, die entscheidenden Datenquellen angesichts der Bedrohungen ihrer Organisation zu ermitteln, dann sollten Sie dabei auch festgestellt haben, für welche Elemente ein Schutz besonders wichtig ist. Falls Sie nur eingeschränkte Ressourcen zur Verfügung haben und es sich nicht leisten können, eine Erfassung und Erkennung an sämtlichen Ein- und Austrittspunkten des Netzwerks vorzunehmen, können Sie die Sensoren logisch so nah wie möglich an den kritischen Elementen platzieren. Abb. 3.17 zeigt ein mittelgroßes Netzwerk. Bei der Planung der Datenerfassung stellt das Unternehmen fest, dass sich die Geräte, die besonders schützenswert sind, im Forschungsnetzwerk befinden, da sie das geistige Eigentum der Firma enthalten. In der Abbildung sehen Sie drei mögliche Sensorplatzierungen. Wenn wir unbegrenzt Geld, Zeit und Ressourcen zur Verfügung hätten, könnten wir alle Sensoren bereitstellen, um uns einen bestmöglichen Einblick in das Netzwerk zu verschaffen. Das aber ist leider nicht immer realistisch. Inline-Tap Internet Sensor A Edge-Router Grenzrouter NYC Grenzrouter ATL Switch Sensor B1 Inline-Tap Interner Router NYC Switch Inline-Tap Switch NYC ATL Benutzer allgemein Benutzer allgemein Switch NYC Sensor B2 Interner Router ATL Inline-Tap Sensor C Switch Netzwerkserver ATL Forschungsserver Abbildung 3.17: Ein mittelgroßes Netzwerk mit drei möglichen Sensorplatzierungen 3.5 Platzierung von Sensoren 111 Unser erster Gedanke mag sein, einen Sensor am Rand des Netzwerks zu platzieren (Sensor A). Wenn dies der einzige Sensor ist, den wir haben, dann ist er für die Erfassung und Erkennung im ganzen Unternehmen verantwortlich. Wie wir bereits gesehen haben, lässt sich diese Vorgehensweise nicht gut an unterschiedliche Größen von Netzwerken anpassen. Letzten Endes führt sie zu extrem hohen Hardwarekosten und kann eine gründliche Erfassung, Erkennung und Analyse unmöglich machen. Als Nächstes könnten wir überlegen, Sensoren an den Grenzen der jeweiligen physischen Standorte aufzustellen (B1 und B2). Die beiden Sensoren für die Standorte New York City (NYC) und Atlanta (ATL) haben dann jeweils nur noch die Hälfte der Arbeitslast von Server A zu tragen. Das bietet zwar einige Leistungsvorteile, allerdings müssen die beiden Sensoren immer noch eine große Menge unterschiedlicher Daten verarbeiten. Der Sensor in New York etwa braucht Erkennungssignaturen für Bedrohungen, die verschiedene Server im Serversegment, aber auch normale Benutzercomputer betreffen. Dadurch konzentrieren wir uns immer noch nicht auf die größte Bedrohung der Organisation. Damit kommen wir zu Sensor C, der so aufgestellt ist, dass er Einblick in das Forschungsnetzwerk in Atlanta hat. Dieses Segment umfasst die Computer von Benutzern, die in der Forschung arbeiten, und die Server, auf denen die Forschungsdaten gespeichert sind. Nach der Risikoanalyse, die wir für dieses Netzwerk durchgeführt haben, ist die größte Gefahr für die Organisation ein Einbruch in dieses Netzwerksegment. Daher sollte der erste Sensor hier aufgestellt werden. Dieser Teil des Netzwerks ist kleiner, sodass hierfür auch weniger leistungsfähige Hardware ausreicht. Außerdem brauchen die Erkennungsmechanismen nur Signaturen für die Technologien, die in diesem Netzwerk auch tatsächlich benutzt werden. In einer Situation wie dieser wäre es natürlich am besten, wenn Ressourcen bereitstünden, um mehr als einen Sensor aufzustellen. Das möglicherweise beste Preis-Leistungs-­Verhältnis bekommen Sie, wenn Sie Sensor A und C kombinieren. Der beste Ausgangspunkt ist in unserem Fall allerdings das Forschungsnetzwerk, da sich hier die Elemente befinden, deren Gefährdung die größte Bedrohung für das Unternehmen darstellt. 3.5.5 Sichtfelddiagramme der Sensoren aufstellen Die Analytiker müssen wissen, wo sich ein Sensor in Bezug zu den Elementen, die er schützen soll, sowie anderen vertrauenswürdigen und nicht vertrauenswürdigen Elementen befindet. Daher sind Netzwerkdiagramme äußerst wichtige Dokumente, die bei einer Untersuchung zur Orientierung herangezogen werden können. Die meisten Organisationen begnügen sich damit, in das vom Systemadministrator oder von der Abteilung für Netzwerktechnik aufgestellte Netzwerkdiagramm einzuzeichnen, wo sich der Sensor physisch oder logisch befindet. Das mag zwar durchaus einen gewissen Nutzen haben, ist aber nicht die beste Möglichkeit, diese Informationen einem NSMAnalytiker zu präsentieren. Solche Diagramme sind nicht auf die Bedürfnisse der Analytiker zugeschnitten, sondern liefern oft viel zu viele irrelevante Informationen für deren 112 3 Sensoren Zwecke und verschleiern die konkrete Architektur und deren Beziehung zu geschützten, vertrauenswürdigen und nicht vertrauenswürdigen Elementen. Einem NSM-Analytiker ein klassisches Netzwerkdiagramm in die Hand zu drücken ist vergleichbar damit, einem Koch die DNS-Sequenz einer Tomate zu präsentieren. Wenn der Koch wissen will, wie das Aroma einer Tomate zustande kommt, kann er diese Informationen darin finden, aber normalerweise braucht er ein Rezept, das ihm sagt, was er mit der Tomate machen soll. Bei der NSM-Analyse ist es zwar immer von Vorteil, ein ausführliches Netzwerkdiagramm zur Verfügung zu haben, aber in den meisten Fällen ist ein vereinfachtes Diagramm besser geeignet. Sensor-Sichtfelddiagramme sollen Analytikern die Möglichkeit geben, sich rasch einen Überblick darüber zu verschaffen, welche Elemente ein Sensor schützt und welche Elemente außen vor bleiben. Ein grundlegendes Sichtfelddiagramm muss mindestens folgende Bestandteile enthalten: •• Eine grobe logische Übersicht über das Netzwerk •• Alle Routinggeräte, Proxys und Gateways, die Einfluss auf den Verlauf des Datenverkehrs nehmen •• Die externen und internen IP-Adressen von Routinggeräten, Proxys und Gateways •• Arbeitsstationen, Server und andere Geräte. Sofern es sich nicht um besonders kritische Geräte handelt, sollten sie gruppenweise und nicht einzeln dargestellt werden. •• IP-Adressbereiche für die Gruppen der Arbeitsstationen, Server und sonstigen Geräte •• Sämtliche NSM-Sensoren sowie Markierungen (Kästen oder Flächen), die alle von dem jeweiligen Sensor geschützten Hosts einschließen, also gewöhnlich die Hosts, von denen der Sensor Daten erfasst. Bei Datenverkehr aus einem verschachtelten Teilnetzwerk wird zwar nur die IP-Adresse der externen Schnittstelle des zuständigen Routers angezeigt, allerdings wird dieser Datenverkehr immer noch von dem Sensor erfasst (sofern er nicht auf andere Weise ausgeschlossen wird). Sehen wir uns dazu noch einmal das Beispielnetzwerk aus Abb. 3.17 an. In Abb. 3.18 sehen Sie das gleiche Netzwerk, aber zusätzlich sind die Sichtfelder der einzelnen Sensoren und die anderen oben genannten Details angegeben. Die verschiedenen Zonen lassen sich am besten durch farbige Hinterlegungen kennzeichnen, aber da dieses Buch in Schwarzweiß gedruckt wird, verwende ich Kästen mit unterschiedlichen Arten von Umrisslinien. Hier überwacht jeder Sensor auch den Datenverkehr in den Teilnetzwerken, die in seinem eigenen Teilnetzwerk verschachtelt sind. Daher ist jede Zone auch wiederum in der Zone des nächsthöheren Netzwerks enthalten. 3.6 Den Sensor absichern 113 Inline-Tap 192..0.2.180 192.168.1.1 Sensor A Edge-Router Internet Grenzrouter NYC 192.168.1.2 Sensor B1 Grenzrouter ATL Switch 192.168.1.3 192.168.2.1 192.168.3.1 Inline-Tap Inline-Tap Switch Switch NYC ATL Benutzer allgemein Benutzer allgemein 192.168.3.2 192.168.2.2 Interner Router NYC 192.168.20.1 Switch NYC Sensor B2 Interner Router ATL 192.168.30.1 Inline-Tap Sensor C Switch Netzwerkserver ATL Forschungsserver Sensor A – 192.168.0.0/16 Sensor B1 – 192.168.2.0/24 Sensor B2 – 192.168.3.0/24 Sensor C – 192.168.30.0/24 Abbildung 3.18: Ein Sichtfelddiagramm Ich lasse solche Diagramme gern laminieren und auf die Schreibtische der Analytiker verteilen, sodass sie während einer Untersuchung schnell darin nachschlagen können. Sie dienen jedoch nicht nur als Orientierungshilfe, sondern können einem Analytiker auch Anhaltspunkte dafür bieten, welche zusätzliche Dokumentation sie für die Untersuchung noch finden oder anfordern müssen, z. B. ein ausführlicheres Diagramm eines bestimmten Netzwerksegments oder Informationen über einen bestimmten vertrauenswürdigen Host. 3.6 Den Sensor absichern Da es sich bei einem Sensor um ein sensibles Netzwerkgerät handelt, ist seine Sicherheit von größter Bedeutung. Ein Sensor, auf dem vollständige Paketdaten oder auch nur Paketstringdaten gespeichert sind, enthält äußerst sensible Netzwerkinformationen. Selbst für ungeübte Angreifer wäre es ein Leichtes, diese Informationen zu nutzen, um ganze Datei- 114 3 Sensoren en, Passwörter oder andere kritische Daten zu entnehmen. Mithilfe eines Sensors, auf dem Sitzungsdaten gespeichert sind, können Angreifer sogar Informationen gewinnen, die es ihnen erleichtern, ihren Einfluss in dem Netzwerk weiter auszudehnen. Um die Sicherheit der Sensoren zu gewährleisten, können Sie verschiedene Maßnahmen ergreifen. 3.6.1 Betriebssystem- und Softwareaktualisierungen Bei jedem System besteht die wichtigste Sicherheitsmaßnahme darin, dafür zu sorgen, dass die darauf laufende Software und das Betriebssystem stets auf dem neuesten Stand sind und über die neuesten Sicherheitspatches verfügen. Sensoren sollten zwar nicht vom Internet aus zugänglich sein, aber wenn jemand auf anderem Weg Zugang zu Ihrem Netzwerk erlangt und über eine seit Monaten nicht gepatchte Schwachstelle, die die Ausführung von Remotecode zulässt, in den Sensor eindringt, haben Sie verloren. Ich habe schon oft erlebt, dass Organisationen bei der Bereitstellung von Patches für die Software und das Betriebssystem von Sensoren sehr saumselig vorgingen, da diese Geräte keinen Internetzugriff hatten, was regelmäßige Aktualisierungen schwierig macht. Eine Lösung dafür besteht darin, innerhalb Ihres Netzwerks eine Art Updateserver einzurichten, sodass die regelmäßigen Aktualisierungen zeitnah erfolgen können. Das bedeutet zwar einen gewissen höheren Verwaltungsaufwand, allerdings wird dadurch das Risiko einer Gefährdung der Sensoren erheblich gesenkt. Es ist auch möglich, den Internetzugriff des Sensors mithilfe eines internen Webproxys auf die Domänen einzuschränken, die für die Software- und Systemaktualisierungen erreichbar sein müssen. Je nachdem, wo sich der Sensor in Ihrem Netzwerk befindet, kann dies jedoch schwer umzusetzen sein. 3.6.2 Das Betriebssystem absichern Sie müssen das Betriebssystem des Sensors nicht nur immer auf dem neuesten Stand halten, sondern es auch nach den Richtlinien für eine sichere Konfiguration einrichten, und zwar bevor Sie irgendwelche Sensorsoftware darauf installieren. Es gibt verschiedene solcher empfohlenen Richtlinien. Wenn Ihre Organisation formale Konformitätsanforderungen wie HIPAA, NERC CIP oder PCI erfüllen muss, dann sind bei Ihnen wahrscheinlich schon irgendwelche Standards für die sichere Betriebssystemkonfiguration in Kraft. Auch staatlichen und militärischen Stellen sind solche Richtlinien nicht fremd, da die Sicherheit von Betriebssystemen durch zahlreiche Zertifizierungs- und Akkreditierungsprozesse wie DIACAP oder DITSCAP erzwungen wird. Wenn Sie keine solchen formalen Normen erfüllen müssen, können Sie sich in verschiedenen öffentlich zugänglichen Dokumenten über empfehlenswerte Vorgehensweisen informieren. Besonders gefallen mir dabei die Benchmarks des Center for Internet Security (http://bench marks.cisecurity.org/) und die Security Guides for Operating Systems der NSA (http://www. nsa.gov/ia/mitigation_guidance/security_configuration_guides/operating_systems.shtml). 3.6 Den Sensor absichern 115 3.6.3 Eingeschränkter Internetzugriff Ein Sensor sollte keinen uneingeschränkten Internetzugriff haben, denn wenn sich ein Angreifer Zugriff auf dieses Gerät verschaffen kann, so fällt es ihm leicht, sensible Daten davon abzurufen. Normalerweise richte ich auf Sensoren gar keinen Internetzugriff ein. In Ausnahmefällen ist es auch möglich, mithilfe eines internen Webproxy einen eingeschränkten Zugriff ausschließlich auf unverzichtbare Domänen (z. B. für Software- und Systemaktualisierungen) bereitzustellen. Sensorprozesse sind oft so eingerichtet, dass sie regelmäßig IDS-Signaturen oder Reputationsdaten aus dem Internet beziehen müssen. Es wird auch immer üblicher, dass Sensoren auf Datenquellen für Recherchedienste zugreifen. Beispielsweise nutzt Bro in Echtzeit das Hash Registry von Team Cymru Malware und das SSL Observatory der International Computer Science Institutes. Sie müssen zwar dafür sorgen, dass Ihre Sensoren diese Daten empfangen, allerdings sollten Sie dazu vorzugsweise ein einziges internes System einrichten, das diese Aktualisierungen herunterlädt und an das sich die Sensoren wenden. 3.6.4 Minimale Softwareinstallation Ein Sensor ist ein zweckgebundenes Sondergerät. Aufgrund dieser Spezialisierung sollte nur die wirklich notwendige Software darauf installiert werden. Wir empfehlen, auf einem Sensor neben einer minimalen Betriebssysteminstallation nur die Software unterzubringen, die für die Erfassungs-, Erkennungs- und Analyseaufgaben auf dem entsprechenden Typ von Sensor erforderlich ist. Deaktivieren Sie auch nicht benötigte Dienste und entfernen Sie nicht benötigte Zuatzpakete, die zusammen mit dem Betriebssystem installiert wurden. Das steigert nicht nur die Leistung des Sensors, sondern reduziert auch seine Angriffsfläche auf ein Minimum. Der häufigste Fehler bei der Verschlankung einer Sensorinstallation besteht darin, zu vergessen, Compiler von dem Sensor zu entfernen. Häufig ist zur Installation von NSM-Tools ein Compiler erforderlich, aber Sie dürfen ihn auf gar keinen Fall auf dem System belassen. Wenn sich ein Angreifer Zugriff auf den Sensor verschaffen kann, dann stellt ein solcher Compiler für ihn ein praktisches Werkzeug dar, um den Rest des Netzwerks anzugreifen. Optimal ist es, die Sensortools auf einem anderen System zu kompilieren und dann auf den Sensor zu übertragen, anstatt die Kompilation auf dem Sensor selbst vorzunehmen. 3.6.5 VLAN-Segmentierung Sensoren müssen über mindestens zwei Netzwerkverbindungen verfügen, wobei die eine Schnittstelle zur Erfassung von Netzwerkdaten dient, während die andere zur Administration des Sensors da ist, was gewöhnlich über SSH geschieht. Die Erfassungsschnittstelle sollte keine IP-Adresse haben und nicht mit dem Netzwerk kommunizieren dürfen, aber die Administrationsschnittstelle muss logisch in dem Netzwerk auftauchen. Wenn Ihre 116 3 Sensoren Netzwerkumgebung die Segmentierung des Datenverkehrs mithilfe von virtuellen lokalen Netzwerken (Virtual Local Area Networks, VLANs) erlaubt, sollten Sie das nutzen und die Verwaltungsschnittstelle des Sensors in einem sicheren VLAN unterbringen, das nur für den Sensoradministrator zugänglich ist. 3.6.6 Host-IDS Die Installation eines HIDS (Host Intrusion Detection System) auf dem Sensor ist unverzichtbar. Solche Systeme nutzen verschiedene Methoden, um Veränderungen am Host zu erkennen, etwa die Überwachung der Systemprotokolle und eine Erkennung von Änderungen der Systemdateien. Es gibt verschiedene kommerzielle HIDS-Produkte, aber auch einige kostenlose Programme wie OSSSEC oder AIDE (Advanced Intrusion Detection Environment). HIDS-Software dient dazu, einen Einbruch auf dem System zu erkennen, auf dem sie installiert ist. Die Protokolle, die sie generiert, müssen Sie an einen anderen Server im Netzwerk senden, denn wenn Sie sie lokal speichern und nicht sofort untersuchen, könnte ein Angreifer sie löschen oder manipulieren, bevor Sie Einsicht darin nehmen. 3.6.7 Zwei-Faktor-Authentifizierung NSM-Sensoren sind lukrative Ziele für Angreifer. Die rohen und die verarbeiteten Netzwerkdaten, die darauf zu finden sind, können für eine Vielzahl von Angriffen genutzt werden. Daher ist es wichtig, einen sicheren Authentifizierungsvorgang für den Zugriff auf den Sensor zu verlangen. Bei einer reinen Passwortauthentifizierung besteht die Gefahr, dass ein Angreifer das Passwort aus einer anderen Quelle in Erfahrung bringt und sich damit Zugriff auf den Sensor verschafft. Daher sollten Sie für Sensoren zwei Formen der Authentifizierung vorsehen. 3.6.8 Netzwerk-IDS Die Administrationsoberfläche eines Sensors muss unbedingt als ein sehr wertvolles Netzwerkelement angesehen und als solches überwacht werden. Eine der besten Möglichkeiten besteht darin, sie mit demselben NIDS zu schützen wie den Rest des Netzwerks, wobei diese Software allerdings mit großer Wahrscheinlichkeit auf dem Sensor selbst läuft. Die einfache Lösung besteht darin, den Netzwerkdatenverkehr der Administrationsoberfläche auf die Überwachungsschnittstelle zu spiegeln. Obwohl sich das sehr einfach machen lässt, wird es oft übersehen. Eine der besten Maßnahmen, um sicherzustellen, dass der Sensor nicht mit unautorisierten Hosts kommuniziert, besteht darin, die Hosts festzulegen, mit denen eine Verbindung zulässig ist, und eine Snort-Regel aufzustellen, die jegliche Kommunikation mit anderen Geräten erkennt. Nehmen wir beispielsweise an, der Sensor an 192.168.1.5 darf nur mit der Administrator-Arbeitsstation an 192.168.1.50 und dem lokalen Aktualisierungsserver 3.7 Zusammenfassung 117 an 192.168.1.150 kommunizieren. In diesem Fall können Sie unerlaubte Verbindungen mit folgender Regel feststellen: alert ip ![192.168.1.50,192.168.1.150] any < > 192.168.1.50 any (msg: "Unauthorized Sensor Communication"; sid:5000000; rev:1;) 3.7 Zusammenfassung Um Sensoren mit der richtigen Kapazität einzurichten und an den richtigen Stellen zu platzieren, ist eine Menge Planung erforderlich. Wie über viele andere Themen könnte man darüber schon fast ein eigenes Buch schreiben. Dieses Kapitel sollte Ihnen einen Überblick über die wichtigsten Prinzipien geben. Darüber hinaus ist es empfehlenswert, sich mit Ihren Kollegen und anderen Organisationen auszutauschen, um sich anzusehen, wie sie ihre Sensoren im Rahmen ihrer eigenen Bedürfnisse und ihrer Netzwerkarchitektur aufgestellt haben. Dadurch können Sie solide Erfahrungswerte gewinnen, um das Wer, Was, Wann, Wo und Warum der NSM-Sensorplatzierung zu klären. 4 Sitzungsdaten Sitzungsdaten geben einen Überblick über die Kommunikation zwischen zwei Netzwerkgeräten. Sie werden auch als Konversation oder Fluss bezeichnet und gehören zu den vielseitigsten und nützlichsten Arten von NSM-Daten. Wenn wir die vollständigen Paketdaten (FPC) mit einer Aufzeichnung sämtlicher Telefongespräche vergleichen, die jemand an seinem Apparat führt, dann entsprechen die Sitzungsdaten der Gesprächsaufstellung auf der Telefonrechnung. Den Sitzungsdaten können Sie nicht entnehmen, um was es ging, aber sie sagen Ihnen, wer, wo und wann kommuniziert hat. Sitzungs- oder Flussdatensätze enthalten gewöhnlich das Protokoll, die IP-Adresse und den Port der Quelle, die IP-Adresse und den Port des Ziels, einen Zeitstempel, der Beginn und Ende der Kommunikation angibt, sowie die Menge der zwischen den beiden Geräten übertragenen Daten. Die verschiedenen Formen von Sitzungsdaten, die wir uns in diesem Kapitel ansehen, können noch andere Informationen enthalten, aber die genannten Felder sind in allen üblichen Implementierungen von Sitzungsdaten enthalten. Ein Beispiel solcher Flussdaten sehen Sie in Abb. 4.1. 120 4 Sitzungsdaten Abbildung 4.1: Beispiel für Flussdatensätze Sitzungsdaten bieten zwar nicht so viele Details wie FPC-Daten, weisen aber besondere Vorteile auf, die von erheblichem Wert für die NSM-Analyse sind. Wie wir im nächsten Kapitel sehen werden, besteht das größte Problem bei FPC-Daten darin, dass der schiere Umfang es den meisten Organisationen unmöglich macht, eine sinnvolle Menge davon aufzubewahren. Das wiederum schränkt die Möglichkeiten ein, sämtliche Arten von Datenverkehr zu erfassen oder eine rückblickende Analyse durchzuführen, die für eine laufende Untersuchung von Bedeutung wäre. Die Datenmenge ist der große Nachteil der FPC-Daten, aber eine Stärke der Sitzungsdaten: Da es sich bei ihnen nur um eine Sammlung von Berichten in Textform und Statistiken handelt, ist ihr Umfang äußerst gering. Daher lassen sich sehr leicht Flussdaten in großem Maßstab speichern. Die Aufbewahrungszeiten für FCP-Daten zählen gewöhnlich in Minuten oder Stunden, aber Sitzungsdaten können Monate oder gar Jahre lang gespeichert werden. Ich habe sogar Organisationen kennengelernt, die Sitzungsdaten niemals löschen. Ein weiterer Vorteil des geringeren Umfangs von Sitzungsdaten besteht darin, dass sie sich schneller durchforsten und analysieren lassen. Das erleichtert die Arbeit für Analytiker, die sich einen schnellen Überblick verschaffen wollen, und für Analysewerkzeuge, die Anomalien aufspüren oder Statistiken aufstellen sollen. Daher werden andere Datentypen, etwa die statistischen Daten, mit denen wir uns in Kapitel 11 beschäftigen werden, von Sitzungsdaten abgeleitet. In diesem Kapitel sehen wir uns an, wie Flüsse generiert werden und welche Methoden es für die Erfassung von Sitzungsdaten gibt. Außerdem stellen wir zwei weit verbreitete Analyseprodukte für Sitzungsdaten vor, nämlich SiLK und Argus. Bevor wir uns mit den Einzelheiten dieser Tools beschäftigen, müssen wir jedoch die Unterschiede zwischen den verschiedenen Arten von Flussdaten kennen. In diesem Buch geht es um die beiden am häufigsten verwendeten Typen, nämlich NetFlow- und IPFIX-Daten. 4.1 Flussdatensätze Ein Flussdatensatz ist ein zusammengefasster Paketbericht. Die Art der Zusammenfassung hängt davon ab, welches Tool verwendet wird, um die Daten zu generieren und zu untersuchen. 4.1 Flussdatensätze 121 Hinweis für Analytiker In diesem Buch beschäftigen wir uns hauptsächlich mit SiLK. Daher beschreibt dieser Abschnitt die Art und Weise, in der SiLK Daten zu Flussdatensätzen zusammenfasst. Ein Flussdatensatz wird anhand von fünf Attributen identifiziert, die das Standard-Pentupel bilden: die IP-Quelladresse, der Quellport, die IP-Zieladresse, der Zielport und das Transportprotokoll. Wenn ein Flussgenerator ein Paket untersucht, liest er diese Attribute, zeichnet sie auf und erstellt einen neuen Flussdatensatz aus den Daten des Pentupels und jeglicher anderer Felder, die bei dem vorliegenden Flusstyp (NetFlow 5, NetFlow 9, IPFIX usw.) definiert sind. Wenn ein neues Paket analysiert wird und dieselben Pentupel-Attributwerte enthält, dann werden die Daten an den bereits vorhandenen Flussdatensatz angehängt. Das geschieht so lange, wie Pakete mit übereinstimmenden Attributwerten eingehen. Es gibt drei Bedingungen, unter denen ein Flussdatensatz beendet werden kann (siehe Abb. 4.2): 1. Natürliche Zeitüberschreitung: Dies geschieht, wenn die Kommunikation wie im Protokoll spezifiziert auf natürliche Weise endet. Bei verbindungsorientierten Protokollen wird das Vorkommen solcher Beendigungen verfolgt. Dabei wird auf Dinge wie RSTPakete und FIN-Folgen in TCP geachtet. 2. Zeitüberschreitung im Leerlauf: Wenn innerhalb von 30 s nach dem letzten Paket keine weiteren Daten für einen Fluss mehr eingehen, wird der Flussdatensatz abgeschlossen. Treffen nach diesen 30 s weitere Pakete mit denselben Pentupel-Attributwerten ein, so wird ein neuer Flussdatensatz darüber angelegt. Die Frist ist einstellbar. 3. Zeitüberschreibung bei Aktivität: Wenn ein Fluss 30 Minuten lang geöffnet ist, wird der Flussdatensatz abgeschlossen und ein neuer für dieselben Pentupel-Attributwerte angelegt. Die Frist ist einstellbar. Abbildung 4.2: Beendigung von Flussdatensätzen bei Leerlauf und bei Aktivität Wenn Pakete mit neuen Pentupel-Attributwerten eingehen, wird ein neuer Flussdatensatz angelegt. Es können jederzeit viele verschiedene Flussdatensätze geöffnet sein. 122 4 Sitzungsdaten Ich veranschauliche das gern mit einem Mann am Fließband, der jedes an ihm vorbeilaufende Paket untersucht. Wenn er ein Paket mit einer neuen Zusammenstellung von Pentupel-Attributwerten sieht, schreibt er die Werte auf eine Dose, entnimmt dem Paket die Daten, die er braucht, steckt sie in die Dose und stellte diese zur Seite. Kommt auf dem Fließband ein Paket angefahren, dessen Werte denen auf der Dose entsprechen, steckt er dessen Daten ebenfalls in die bereitstehende Dose. Sobald eine der drei zuvor genannten Bedingungen für die Beendigung eines Flussdatensatzs eintrifft, verschließt er die Dose mit einem Deckel und schickt sie weiter. Wie Sie anhand dieser Beschreibung schon ahnen können, werden Flüsse in den meisten Fällen auf unidirektionale Weise generiert (einige Tools rufen auch bidirektionale Flüsse hervor, z. B. YAF). Daher werden bei der TCP-Kommunikation, beispielsweise zwischen 192.168.1.1 und 172.16.16.1, immer mindestens zwei Flussdatensätze erstellt, einer für den Datenverkehr von 192.168.1.1 zu 172.16.16.1 und der andere für die Gegenrichtung (siehe Tabelle 4.1). Tabelle 4.1: Zwei unidirektionale Flussdatensätze für eine einzige Kommunikationssequenz IP-Quell­ adresse IP-Ziel­ adresse Quellport Zielport Protokoll Pakete 192.168.1.1 172.16.16.1 3921 445 6 52 1331 FS PA Out 172.16.16.1 192.168.1.1 445 3921 6 1230 310931 FS PA In Bytes Flags Typ Um ein praxisnäheres Beispiel zu geben, stellen Sie sich eine Arbeitsstation (192.168.1.50) vor, die versucht, von einem Remoteserver (192.0.2.75) eine Webseite abzurufen. Die Kommunikationssequenz sehen Sie in Abb. 4.3. 4.1 Flussdatensätze 123 Abbildung 4.3: Ablauf der Kommunikation mit einem Webserver Bei dieser Kommunikation muss die Clientarbeitsstation (192.168.1.50) zunächst einen DNS-Server (4.2.2.1) außerhalb ihres lokalen Netzwerksegments abfragen. Nach dem Eingang der DNS-Antwort kann die Arbeitsstation mit dem Webserver kommunizieren. Tabelle 4.2 zeigt die Flussdatensätze für diese Kommunikation (aus der Sicht des Clients). Tabelle 4.2: Flussdatensätze bei der Webkommunikation IP-Quell­ adresse IP-Ziel­ adresse Quell- Zielport port Pro- PaBytes tokoll kete 192.168.1.50 4.2.2.1 9282 53 17 1 352 Out 4.2.2.1 192.168.1.50 53 9282 17 1 1332 In 192.168.1.50 192.0.2.75 20239 80 6 1829 12283 FS PA Outweb 192.0.2.75 192.168.1.50 80 20239 6 2923 309103 FS PA Inweb Flags Typ 124 4 Sitzungsdaten Eine gute Übung, um sich mit Flussdaten vertraut zu machen, besteht darin, Flussdatensätze und Paketdaten für dasselbe Zeitintervall zu vergleichen. Wenn Sie diese beiden Datentypen und ihre Darstellung für dieselbe Kommunikation nebeneinander betrachten, lernen Sie, wie Flussdaten abgeleitet werden. Als Nächstes sehen wir uns einige der wichtigsten Flussdaten an. 4.1.1 NetFlow NetFlow wurde 1990 von Cisco entwickelt, um den Routingvorgang auf den Netzwerkgeräten dieses Herstellers zu rationalisieren. Bei der ursprünglichen Version wurde ein Flussdatensatz erstellt, wenn der Router das erste Paket einer neuen Netzwerkkonversation erkannte. Anhand dieser Datensätze konnte eine Messgrundlage für Netzwerkkonversationen aufgestellt werden. Außerdem konnten die Router anhand dieser Daten mit anderen Geräten und Diensten im Netzwerk verglichen werden. Des Weiteren wurden die Datensätze dazu herangezogen, große Mengen von Datenverkehr zu erkennen und zusammenzufassen, was dabei half, viele Prozesse zu vereinfachen, z. B. Vergleiche mit Zugriffssteuerungslisten. Außerdem boten diese Datensätze den Vorteil, dass sie sich von Technikern viel leichter untersuchen ließen. In den letzten 23 Jahren wurde die ursprüngliche Spezifikation in neun Versionen sowie einigen davon abgeleiteten Arbeiten erweitert. Die einzelnen Versionen weichen stark voneinander ab und werden von unterschiedlichen Personen für unterschiedliche Aufgaben eingesetzt, von Infrastrukturunterstützung über Anwendungsentwicklung bis zur Sicherheit. NetFlow 5 und 9 Die beiden am häufigsten verwendeten NetFlow-Standards sind die Versionen 5 und 9. NetFlow 5 ist die am leichtesten zugängliche Lösung, da die meisten modernen Routinggeräte einen Export in diesem Format unterstützen. Flussdatensätze nach NetFlow 5 bieten die standardmäßigen Pentupel-Informationen sowie alle erforderlichen Statistiken, um die Zusammenfassung des Flusses für die betroffenen Pakete zu definieren. Anhand dieser Statistiken können Analyse-Engines die Untersuchung der Informationen rationalisieren. Im Gegensatz zu NetFlow 9 und IPFIX unterstützt NetFlow 5 das Protokoll IPv6 jedoch nicht, was es für manche Umgebungen unbrauchbar macht. NetFlow 9 beherrscht alles, was auch NetFlow 5 kann, und bietet darüber hinaus weitere Möglichkeiten. So verfügt es über ein neues Template, das eine detailreichere Protokollierung erlaubt. In NetFlow 5 gibt es 20 Datenfelder (wobei zwei nur zum Auffüllen dienen), in NetFlow 9 dagegen sind 104 Feldtypen definiert. Anhand des Templates kann die Ausgabe so gestaltet werden, dass sie die gewünschte Zusammenstellung von Datenfeldern enthält. Damit können auch diese neuen Feldtypen übertragen werden. Dadurch kann ein Administrator in NetFlow 9 ähnliche Datensätze wie in NetFlow 5 generieren, indem er einfach ein Template anpasst. Darüber hinaus bietet NetFlow 9 auch Unterstützung für IPv6. Mehr über die Unterschiede zwischen Version 5 und 9 erfahren Sie in der Dokumentation von Cisco. 4.1 Flussdatensätze 125 In seinem dreiteiligen Blog auf Plixer gibt Mike Patterson einen der besten und unterhaltsamsten Vergleiche zwischen NetFlow 5 und 9.1 Darin erklärt er, dass die spärliche Verwendung von NetFlow 9 hauptsächlich an dem mangelnden Bedarf für die erhöhte Nützlichkeit dieser Version liegt. Seiner Meinung nach ist NetFlow 5 mit einem einfachen Hamburger vergleichbar. Es erfüllt seinen Zweck, aber nicht mehr. Es gibt natürlich Situationen, in denen man nur seinen Hunger stillen will, und dafür reicht ein einfacher Hamburger aus. Er ist einfach zu bekommen, er ist billig, er besteht nur aus einem Minimum an Zutaten, aber er gibt Ihnen alles, was Sie gerade brauchen. NetFlow 9 dagegen ist ein Angus-Cheeseburger mit allen Extras. Die meisten Administratoren haben entweder nur minimale Anspruche an NetFlow-Daten und brauchen daher die Extras von NetFlow 9 nicht, oder sie haben nicht die Möglichkeit, auf die gleiche Weise mit den Daten von NetFlow 9 zu arbeiten, wie Sie es in NetFlow 5 getan haben. Beides trägt dazu bei, dass NetFlow 9 nicht weit verbreitet ist. 4.1.2 IPFIX IPFIX hat viele Gemeinsamkeiten mit NetFlow 9 und baut auf demselben Format auf. Es ist templategesteuert, datensatzorientiert und nutzt ein binäres Exportformat.2 Die kleinste Einheit der Datenübertragung in IPFIX ist die Nachricht. Sie enthält einen Header und eine oder mehrere Mengen, die Datensätze enthalten. Dabei kann sich um Templatemengen oder um Datenmengen handeln. Eine Datenmenge verweist auf das Template, das die Datensätze innerhalb der Datenmenge beschreibt. Was die Verbreitung angeht, ist IPFIX mit NetFlow 9 vergleichbar. Die Unterschiede sind funktional. Beispielsweise bietet IPFIX im Gegensatz zu NetFlow 9 Felder variabler Länge für den Export benutzerdefinierter Informationen. Es gibt eine ganze Reihe von Unterschieden zwischen diesen beiden Flusstechnologien, die sich aber alle in einem Wort zusammenfassen lassen: IPFIX ist »flexibel«. Es gibt sogar eine Erweiterung namens »Flexible NetFix«, mit der Sie NetFlow 9 große Ähnlichkeiten mit IPFIX geben können. Diese Version jedoch ist nicht Gegenstand dieses Buches. 4.1.3 Andere Flusstypen Es gibt noch andere Flusstechnologien, und es kann durchaus sein, dass sie in Ihrer Umgebung bereits eingesetzt werden. Ihre Zugänglichkeit und ihre Möglichkeiten zur Analyse können ihre Nutzung für NSM jedoch erschweren. Auf Juniper-Geräten kann Jflow zur Verfügung stehen, auf Citrix-Geräten AppFlow. Eine der gebräuchlicheren Alternativen zu NetFlow und IPFIX ist sFlow. Um die CPU-Belastung zu verringern, werden dabei jedoch nur repräsentative Stichproben der übertragenen Daten genommen. Hersteller beginnen sich immer mehr für verschiedene Varianten von sFlow zu interessieren, sodass sFlow inzwischen bei vielen verschiedenen Netzwerkgeräten und Hardwarelösungen im 1 http://www.plixer.com/blog/general/cisco-netflow-v5-vs-netflow-v9-which-most-satisfies-your-hunger-pangs/ 2 http://www.tik.ee.ethz.ch/file/de367bc6c7868d1dc76753ea917b5690/Inacio.pdf 126 4 Sitzungsdaten Lieferumfang enthalten ist. Diese anderen Flusstypen weisen durchaus jeweils ganz eigene Vorteile auf. Denken Sie aber daran, dass Sie nicht nur einen zugänglichen Flussgenerator brauchen, sondern auch eine Möglichkeit haben müssen, die Flussdaten zu erfassen und zu analysieren. Bei den Beschreibungen in diesem Buch werden wir nach Möglichkeit nicht auf konkrete Flusstypen eingehen. Wenn es um die Analyse von Flussdaten geht, konzentrieren wir uns auf das standardmäßige Pentupel, das in allen Arten von Flussdaten enthalten ist. 4.2 Sitzungsdaten erfassen Sitzungsdaten lassen sich auf verschiedene Weise erfassen. Unabhängig von der konkreten Methode brauchen Sie jedoch auf jeden Fall einen Flussgenerator und einen Kollektor. Der Flussgenerator ist die Hardware oder Software, die die Flussdatensätze erstellt. Das kann entweder durch die Analyse anderer Daten oder durch die Erfassung von Netzwerkdaten direkt an der Netzwerkschnittstelle geschehen. Bei einem Flusskollektor handelt es sich um Software, die Flussdatensätze von einem Generator empfängt und sie in einem abrufbaren Format speichert. Viele Organisationen, die FPC-Daten erfassen, generieren die Flussdatensätze durch eine Filterung dieser Daten. Das bedeutet aber, dass sie keine Flussdatensätze für Datenverkehr aufstellen können, der nicht erfasst wurde. Gehen außerdem während der FPC-Erfassung Pakete verloren, können Sie wertvolle Flussdaten verlieren. Die Filterung dient eigentlich dazu, den Festplattenplatz optimal auszunutzen, aber die mit dem Datenverkehr verbundenen Flussdatensätze müssen trotzdem aufbewahrt werden. Diese Methode zur Generierung von Flussdaten ist gewöhnlich nicht empfehlenswert. Die bevorzugte Methode besteht darin, auf die gleiche Weise wie FPC- und NIDS-Alarmdaten direkt an der Verbindung abzugreifen. Das kann entweder durch eine Software auf einem Server oder durch ein Netzwerkgerät wie einen Router geschehen. In diesem Kapitel verwende ich dafür die Begriffe software- bzw. hardwareseitige Generierung. 4.2.1 Hardwareseitige Generierung In vielen Situationen werden Sie feststellen, dass Sie bereits vorhandene Hardware nutzen können, um Flussdaten zu generieren. Sie müssen dann nur auf einem flussfähigen Router die Netzwerkadresse eines Kollektors angeben, und schon werden die Flussdatensätze von der Schnittstelle des Routers an dieses Ziel gesendet. Hardwareseitige Generierung mag sich zwar nach einem Kinderspiel anhören, aber es kann durchaus sein, dass Ihnen der Netzwerkadministrator die Erlaubnis dafür verweigert. Auf Routinggeräten, die bereits durch erhebliche Mengen von Datenverkehr belastet sind, kann die zusätzlich erforderliche Verarbeitungsleistung zur Generierung und Übertragung von Flussdatensätzen an einen externen Kollektor die CPU-Nutzung so weit 4.2 Sitzungsdaten erfassen 127 steigern, dass die Netzwerkbandbreite gefährdet ist. Der Zusatzaufwand für die Flussgenerierung ist zwar minimal, kann in Umgebungen mit starkem Datenverkehr aber trotzdem erhebliche Auswirkungen zeigen. Wie nicht anders zu erwarten, bringen die meisten Geräte von Cisco eine Möglichkeit zur Generierung von NetFlow-Daten mit. Um diese Funktionen auf einem Cisco-Router einzurichten, schlagen Sie in der entsprechenden Dokumentation des Herstellers nach. Auf http://www.cisco.com/en/US/docs/ios/netflow/command/reference/nf_cr_book.pdf bietet Cisco eine Anleitung zur Konfiguration von NetFlow unter Cisco IOS. 4.2.2 Softwareseitige Generierung Die meisten NSM-Experten wenden die softwareseitige Generierung an, weil sie mehrere Vorteile bietet. An erster Stelle steht dabei die Flexibilität bei der Bereitstellung. Es ist viel einfacher, einen Server mit einer Software zur Flussgenerierung in ein Netzwerksegment einzubauen, als die Architektur des Segments zu ändern, um einen Router zur Flussgenerierung aufzustellen. Um Flussdaten mithilfe von Software zu generieren, müssen Sie auf dem Sensor einen Daemon ausführen, der die Flussdatensätze gemäß seiner Konfiguration erfasst und weiterleitet. Erstellt werden die Flussdaten aus den Daten, die an der Erfassungsschnittstelle eingehen. In den meisten Fällen handelt es sich dabei um dieselbe Schnittstelle, die auch von anderer Erfassungs- und Erkennungssoftware genutzt wird. Sehen wir uns nun einige der am weitesten verbreiteten Softwarelösungen für diesen Vorgang an. Fprobe Fprobe ist eine Minimallösung zum Generieren von NetFlow-Daten. Diese Software steht in den meisten modernen Repositorys für Linux-Distributionen zur Verfügung und kann mithilfe der meisten Paketverwaltungssysteme (wie yum oder apt) auf dem Sensor installiert werden. Wenn auf dem Sensor keine ausgehenden Netzwerkverbindungen zur Verfügung stehen, können Sie das Paket ohne seltsame Warnhinweise und obskure Optionen kompilieren und manuell installieren. Zur Initialisierung geben Sie den Befehl fprobe und nennen dabei die IP-Adresse und den Port des Orts, an den die Flussdaten geleitet werden sollen. Wollen Sie beispielsweise Flussdaten an Schnittstelle eth1 generieren und zu einem Kollektor senden, der auf dem Host 192.168.1.15 an Port 2888 lauscht, müssen Sie folgenden Befehl geben: fprobe -i eth1 192.168.1.15:2888 128 4 Sitzungsdaten YAF YAF (Yet Another Flowmeter) generiert IPFIX-Flussdaten. Das Tool wurde vom NetSATeam (Network Situation Awareness) des CERT entwickelt, um IPFIX-Datensätze für die Verwendung in SiLK (siehe den nächsten Abschnitt) zu generieren. Wie bereits erwähnt, stellt NetFlow 5 unidirektionale Flussinformationen bereit. Das kann zu redundanten Daten in den Flussstatistiken führen und damit in großen, dezentralen Systemen zur Flusserfassung die Datenabfragen erheblich beeinträchtigen. Um mit der naturgemäß wachsenden Bandbreite Schritt zu halten und den Analytikern bidirektionale Flussinformationen zur Verfügung zu stellen, wurde IPFIX als eine unverzichtbare Ergänzung von SiLK angesehen. Um einen IPFIX-Generator zur Verfügung zu haben, wurde YAF entwickelt. Ein zusätzlicher Vorteil von YAF besteht darin, dass es die Template-­ Architektur von IPFIX in Kombination mit SiLK-Anwendungskennzeichen nutzen kann. Damit ist eine detailliertere Analyse möglich als mit dem Pentupel von NetFlow 5. Je nachdem, was Sie beabsichtigen und wie groß Ihre Umgebung ist, kann YAF ein Muss für Sie sein. Die Installation dieser Software ist ganz einfach. In diesem Buch werden wir nicht auf die Einzelheiten eingehen, aber es gibt einige Kleinigkeiten, die zu einem reibungslosen Vorgang beitragen. Lesen Sie die NetSA-Dokumentation gründlich durch, bevor Sie YAF kompilieren. NetSA bietet auch ergänzende Installationstutorials, die Ihnen bei der Einrichtung helfen. Das entsprechende Dokument finden Sie auf https://tools. netsa.cert.org/confluence/pages/viewpage.action?pageId=23298051. 4.3 Flussdaten mit SiLK erfassen und analysieren SiLK (System for Internet-Level Knowledge) ist eine Werkzeugsuite, die eine effiziente, netzwerkübergreifende Sicherheitsanalyse ermöglicht. Sie dient nicht nur als Flusskollektor, sondern kann auch Flussdaten speichern, abrufen, untersuchen und anzeigen. Das Projekt wird zurzeit von der NetSA-Gruppe des CERT entwickelt, aber wie die meisten großartigen Sicherheitstools wurde es aus der Not heraus geboren. Ursprünglich hieß es »Sureh's Work« und kam zustande, als ein Analytiker Flussdaten schnell und effizient ohne komplizierte, CPU-intensive Skripte untersuchen musste. SiLK besteht aus C-, ­Python- und Perl-Code und funktioniert damit in praktisch allen Umgebungen auf UNIX-Grundlage. Dokumentation ist stets von größter Wichtigkeit. Wie großartig ein Tool, ein Skript oder ein Gerät auch immer sein mag, es nützt überhaupt nichts, wenn niemand außer dem Entwickler es einsetzen kann. Was Tools zur Informationssicherheit angeht, so ist die Dokumentation von SiLK unübertroffen. In den folgenden Abschnitten verweisen wir nicht nur auf die Dokumentation, sondern nutzen sie auch im Rahmen des Anwendungsbeispiels.3 Es ist keine Übertreibung, wenn ich sage, dass die Dokumentation von SiLK und die Community, die dieses Tool unterstützt, zu den besten Merkmalen dieses Projekts gehören. 3 http://tools.netsa.cert.org/silk/docs.html 4.3 Flussdaten mit SiLK erfassen und analysieren 129 4.3.1 Das Packsystem von SiLK SiLK besteht aus zwei Hauptkomponenten, dem Packsystem und der Analysesuite. Mit dem Paketsystem erfasst und speichert SiLK Flussdaten in einem einheitlichen, eigenen Format. Die Bezeichnung »Packsystem« bezieht sich darauf, dass SiLK die Flussdaten in einem platzsparenden Binärformat speichert, das ideal für die Untersuchung durch die Analysesuite geeignet ist. Diese Suite wiederum besteht aus verschiedenen Werkzeugen zum Filtern, Anzeigen, Sortieren, Zählen, Gruppieren, Vereinigen usw. Es handelt sich dabei um äußerst flexible Befehlszeilenwerkzeuge, die nicht nur jedes für sich sehr leistungsfähig sind, sondern auch über Pipes verkettet werden können, um die logische Ausgabe des einen Tools in das nächste einzuspeisen. Um die Erfassungs- und Analysefunktionen von SiLK nutzen zu können, müssen Sie ihm Daten aus einem Flussgenerator zuführen. Wenn der Kollektor Flussdatensätze eines Generators empfängt, trennt er sie logisch nach Flusstypen. Die Flusstypen werden dann auf der Grundlage einer Konfigurationsdatei untersucht, die bestimmt, ob es sich um Datensätze über ausgehenden, eingehenden oder internen Datenverkehr handelt. Der lauschende Erfassungsprozess von SiLK ist ein Tool namens Rwflockpack. Es ist dafür zuständig, den Flusstyp zu untersuchen, den Sensor zu ermitteln, von dem die Daten kommen, und die aufbereiteten Flussdaten in seiner Datenbank zu speichern, damit sie von den Werkzeugen in der Analysesuite untersucht werden können. Den Arbeitsablauf sehen Sie in Abb. 4.4. Abbildung 4.4: Der Arbeitsablauf von SiLK 130 4 Sitzungsdaten Wie Rwflowpack ausgeführt wird, können Sie über die Konfigurationsdatei rwflockpack. conf und über zusätzliche Befehlszeilenargumente steuern. Die üblichste Methode, dieses Programm aufzurufen, bietet der folgende Befehl: service rwflowpack start Rwflowpack bestätigt, dass die Einstellungen in den Dateien silk.conf und sensor.conf korrekt sind und dass alle in sensor.conf genannten Sockets zur Verfügung stehen. Wenn alles in Ordnung ist, legt Rwflowpack los, und Sie erhalten eine Bestätigung auf dem Bildschirm. Der Packprozess in SiLK ist zwar unkompliziert, allerdings bietet er mehr Optionen, als nur Flussdaten zu empfangen und zu optimieren. Das Packsystem von SiLK besteht aus acht verschiedenen Tools, mit denen eingehende Flüsse akzeptiert und legitimiert werden. Wie bereits erwähnt, nimmt Rwflockpack Daten von den Flussgeneratoren an, die in den beiden Hauptkonfigurationsdateien silk.conf und sensor.conf angegeben sind, und konvertiert und sortiert die Flussdaten in geeignete Binärdateien für die Analysesuite. Die einfachste Möglichkeit, SiLK-Sitzungsdaten zu generieren, besteht darin, die Flussdaten direkt zu einem Rwflowpack-Listener weiterzuleiten. Häufig ist jedoch eine Zwischenstation erforderlich, um die Daten zwischen Generator und Kollektor vorübergehend zu speichern und weiterzuleiten. Dazu können Sie Flowcap verwenden. In den meisten Situationen fungiert Flowcap als Präprozessor von Rwflowpack: Es nimmt die Flussdaten entgegen und sortiert sie aufgrund der Quelle und einer Einheiten- oder Zeitvariable in Behälter. In der SiLK-Dokumentation wird diese Speicherung mit »eine Datei pro Quelle und Quantum« beschrieben, wobei ein Quantum entweder eine Zeitüberschreitung oder eine maximale Dateigröße ist. In Form von Werkzeugen wie Rwflowappend, Rwpackchecker und Rwpollexec verfügt das Packsystem auch über Möglichkeiten für die Nachbearbeitung. Rwflowappend und Rwpackchecker tun genau das, was ihre Namen besagen: Rwflopappend hängt SiLK-Datensätze an vorhandene Datensätze an, während Rwpackchecker die SiLK-Dateien auf Integrität und Beschädigungen prüft. Rwpollexec überwacht die eingehenden SiLK-Datendateien und führt für jede einen vom Benutzer festgelegten Befehl aus. Diese drei Tools können als Postprozessor bezeichnet werden, da sie nach der Konvertierung der Rohflüsse in binäre SiLK-Dateien eine Nachbearbeitung an diesen Dateien vornehmen. Unter dem Strich gibt es mehr als genug Möglichkeiten, Ihre Daten von Rwflowpack in binäre SiLK-Dateien umwandeln zu lassen. 4.3.2 Flusstypen in SiLK SiLK ordnet Flüsse nach Typen, die zur Filterung und Sortierung der Flussdatensätze herangezogen werden. Das geschieht auf der Grundlage der Netzwerkbereiche, die in der Rwflowpack-Konfigurationsdatei sensor.conf für die internen und externen IP-Adressblöcke angegeben werden (siehe Abb. 4.5). Es gibt folgende Flusstypen: •• In: Eingehend auf einem Gerät in einem internen Netzwerk. •• Out: Ausgehend zu einem Gerät in einem externen Netzwerk. 4.3 Flussdaten mit SiLK erfassen und analysieren 131 •• Int2int: Von einem Gerät in einem internen Netzwerk zu einem Gerät im selben oder einem anderen internen Netzwerk. •• Ext2ext: Von einem Gerät in einem externen Netzwerk zu einem Gerät im selben oder einem anderen externen Netzwerk. •• Inweb: Eingehend auf einem Gerät in einem internen Netzwerk über Port 80, 443 oder 8080. •• Outweb: Ausgehend zu einem Gerät in einem externen Netzwerk über Port 80, 443 oder 8080. •• Inicmp: Eingehend auf einem Gerät in einem internen Netzwerk über ICMP (IP-Protokoll 1). •• Outicmp: Ausgehend zu einem Gerät in einem externen Netzwerk über ICMP (IP-Protokoll 1). •• Innull: Eingehender gefilterter Datenverkehr oder eingehender Datenverkehr zu den in sensor.conf genannten Null-IP-Adressblöcken. •• Outnull: Ausgehender gefilterter Datenverkehr oder ausgehender Datenverkehr zu den in sensor.conf genannten Null-IP-Adressblöcken. •• Other: Quelle nicht intern oder extern oder Ziel nicht intern oder extern. Abbildung 4.5: Flusstypen in SiLK Kenntnisse dieser Flusstypen sind bei der Verwendung der Filterwerkzeuge, mit denen wir uns als Nächstes beschäftigen werden, sehr hilfreich. 4.3.3 Die Analysesuite von SiLK Die Arbeit mit Flussdaten erfolgt zum größten Teil in der Analysesuite. In der SiLK-Installation sind mehr als 55 Tools enthalten, die alle sehr nützlich sind, wobei aber natürlich einige häufiger verwendet werden als andere. Diese Analysewerkzeuge sind für den kombinierten Einsatz vorgesehen, wobei die Daten nahtlos von einem Tool zum anderen weitergeleitet werden können. Am häufigsten verwenden Analytiker Rwfilter, um die SiLK-Binärdateien nach den Daten zu filtern, die sie brauchen. Wir haben schon erwähnt, dass der Umfang der Flussdatensätze es ermöglicht, sie lange Zeit aufzubewahren. Offensichtlich muss es daher eine bequeme Möglichkeit geben, diese Daten zu filtern, damit 132 4 Sitzungsdaten sie nur diejenigen sehen, die sie für die vorliegende Aufgabe benötigen. Stellen Sie sich beispielsweise einen Analytiker vor, der nur Daten aus einer bestimmten Woche des Vorjahres benötigt, und zwar nur über Datenverkehr von einer bestimmten Quelladresse in einem bestimmten Teilnetzwerk zu Zieladressen in einem bestimmten Land. Diese Auswahl lässt sich mithilfe von Rwfilter sehr einfach treffen. Sofern nicht anders verlangt, ist die Ausgabe von Rwfilter eine weitere SiLK-Binärdatei, die über Pipes zur Untersuchung oder Bearbeitung an andere Werkzeuge weitergeleitet werden kann. Das Tool wird in der SiLK-Dokumentation ausführlich beschrieben, sowohl was die Filtermöglichkeiten als auch Zählen, Gruppieren und andere Funktionen angeht. Da es in diesem Teil des Buches hauptsächlich um die Erfassung geht, sehen wir uns hier nur einige wenige Verwendungszwecke der Analysesuite an. 4.3.4 SiLK in Security Onion installieren Die Installation der einzelnen Werkzeuge werden wir in diesem Buch nicht ausführlich beschreiben, da diese Vorgänge meistens recht gut dokumentiert sind. In Security Onion sind die meisten davon ohnehin schon vorinstalliert. Leider ist das bei SiLK zurzeit noch nicht der Fall. Eine ausführliche Anleitung zur Installation finden Sie im Applied-NSMBlog auf http://www.appliednsm.com/silk-on-security-onion/. 4.3.5 Flussdaten mit Rwfilter filtern Der breite Anwendungsbereich der Flusserfassung und die Geschwindigkeit des Abrufs von Flussdaten mit SiLK legen es nahe, eine Flusserfassung in jeder Umgebung vorzusehen. Mithilfe von SiLK kann jeder Analytiker den Umfang eines Netzwerkzwischenfalls mit einer Geschwindigkeit eingrenzen, die mit anderen Datentypen nicht erreichbar ist. In den folgenden Beispielen sehen wir uns eine Reihe typischer Situationen an, in denen Sie SiLK einsetzen können, um Netzwerkzwischenfälle zu ermitteln oder um eine große Datenmenge durch Filterung auf eine handhabbare Größe zu schrumpfen. Eine der ersten Tätigkeiten bei einer Untersuchung besteht meistens darin, den Umfang des Schadens zu ermitteln, den ein angreifender Host mit einer einzigen IP-Adresse angerichtet hat. Es kann sehr zeitraubend, wenn nicht gar unmöglich sein, dies mit PCAPDaten zu versuchen. In SiLK können Sie als Erstes den Befehl rwfilter mit mindestens einer Eingabe-, einer Ausgabe- und einer Partitionierungsoption geben. An erster Stelle steht die Option --any-addrss, die die Datenmenge nach allen Flussdatensätzen zu der angegebenen IP-Adresse abfragt. Dies können Sie mit den Optionen --start-date und --end-date kombinieren, um den Zeitrahmen anzugeben, an dem Sie interessiert sind. Des Weiteren können Sie die Option -type=all verwenden, um anzugeben, dass Sie sowohl an ein- als auch an ausgehenden Flüssen interessiert sind. Die Option --pass=stdout versetzt Sie in die Lage, die Ausgabe über ein Pipe-Symbol an Rwcut zu übergeben, sodass sie im Terminal-Fenster dargestellt wird. Der fertige Rwfilter-Befehl sieht dann wie folgt aus: 4.3 Flussdaten mit SiLK erfassen und analysieren 133 rwfilter --any-address=1.2.3.4 --start-date=2013/06/22:11 --enddate=2013/06/22:16 --type=all --pass=stdout | rwcut Wenn Sie nur ein Startdatum eingeben, wird die Suche auf einen Zeitraum eingeschränkt, der durch den kleinsten angegebenen Zeitwert bestimmt wird. Beispielsweise zeigt der Befehl --start-date=2013/06/22:11 alle mit dem Filter übereinstimmenden Flussdaten der elften Stunde dieses Tages an. Bei --start-date=2013/06/22 erhalten Sie die Datensätze für den gesamten Tag. Durch Kombination dieser Optionen können Sie einzelne Ereignisse in den verschiedenen Datentypen korrelieren, aber sich auch ein Gesamtbild über die Situation verschaffen. Nehmen wir beispielsweise an, es gibt mehrere Ereignisse, bei denen eine verdächtige IPAdresse (6.6.6.6) kurz nach Mitternacht plötzlich erhebliche Mengen verschlüsselter Daten von einem sicheren Webserver erhält. Die einfachste Möglichkeit, den Umfang dieses verdächtigen Datenverkehrs abzuschätzen, besteht darin, eine breit gefasste SiLK-Abfrage auszuführen: rwfilter --start-date=2013/06/22:00 --any-address=6.6.6.6 --type=all --pass=stdout | rwcut Sind die Daten zu umfangreich, fügen Sie einfach die Partitionierungsoption --aport=443 hinzu, um die Suche auf Ereignisse in Zusammenhang mit Interaktionen zwischen der verdächtigen IP-Adresse und beliebigen sicheren Webservern einzuschränken. Die Option --aport führt eine Filterung nach dem angegebenen Port durch, in unserem Fall also 443, dem am häufigsten für die HTTPS-Kommunikation verwendeten Port. rwfilter --start-date=2016/06/22:00 --any-address=6.6.6.6 --aport=443 --type=all --pass=stdout | rwcut Bei der Untersuchung der Daten stellen Sie fest, dass der verdächtige Webserver mit mehreren Hosts in Ihrem Netzwerk kommuniziert. Sie möchten sich aber insbesondere die Kommunikation von einem bestimmten internen Host (192.168.1.100) zu der verdächtigen IP-Adresse ansehen. Statt -any-address können Sie in diesem Fall die Optionen --saddress und --daddress verwenden, um nach bestimmten Quell- bzw. Zieladressen zu filtern. Der Befehl dazu sieht wie folgt aus: rwfilter --start-date=2013/06/22:00 --saddress=192.168.1.100 --daddress=6.6.6.6 --aport=443 --type=all --pass=stdout | rwcut 134 4 Sitzungsdaten 4.3.6 Verketten von Analysetools Analytiker prüfen die Integrität von NSM-Daten oft durch eine Untersuchung des eingehenden Datenverkehrs. In den folgenden Beispielen lernen Sie eine Reihe von Rw-Tools kennen und erfahren, wie Sie sie verketten können. Rwfilter macht nichts anderes, als die Auswahl der eingegebenen Binärdateien einzuschränken. Dieses Tool gibt die Menge von Binärdateien aus, die den Filteroptionen genügen. In den vorherigen Beispielen haben wir die übereinstimmenden Binärdaten mithilfe der Option --pass=stdouot an das Terminal gesendet und mithilfe einer Pipe an Rwcut übergeben, sodass sie im Terminal in einem von Menschen lesbaren ASCII-Format angezeigt werden. In gewissem Sinne haben wir also bereits Rw-Tools verkettet. Bei Rwcut handelt es sich um das grundlegendste dieser Werkzeuge – und auch um das wichtigste, da es die Daten in eine Form überführt, die die Analytiker lesen können. Allerdings führt es keine Berechnungen oder Sortierungen aus, sondern wandelt einfach nur die Binärdaten in ASCII-Daten um und bereitet sie nach den vom Benutzer gewählten Optionen zur Anzeige auf. Um Berechnungen an den gefilterten Daten anzustellen, müssen Sie diese direkt in ein Analysewerkzeug leiten. Als Beispiel sehen wir uns das Tool Rwcount an, das einen Überblick über den gesamten Netzwerkdatenverkehr im Verlauf der Zeit gibt. Daraus können Analytiker ein besseres Verständnis der Netzwerke gewinnen, die sie überwachen. Rwcount wird gewöhnlich für die Erstinspektion eines neuen Sensors verwendet. Wenn Sie einen neuen Sensor online bringen, müssen Sie viele Dinge beachten. Wie viele Endbenutzer überwachen Sie? Wann herrscht der stärkste Datenverkehr vor? Was ist in den Abendstunden zu erwarten? Rwcount liefert Ihnen den gewünschten Überblick über den Datenverkehr. Dabei stützt sich das Werkzeug auf binäre SiLK-Daten. Wenn Sie diese Daten von Rwfilter an Rwcount übergeben, erhalten Sie einen Überblick über die Daten, die die Filterkriterien erfüllen, im ASCII-Format. Nehmen wir an, Sie müssen herausfinden, wie viele Daten von Ihrem SiLK-Manager erfasst werden. Dazu können Sie mit Rwfilter alle an einem Tag erfassten Daten ausgeben und sie anschließend über eine Pipe an Rwcount übergeben: rwfilter --start-date=2013/6/22 --proto=0-255 --pass=stdout --type=all | rwcount --bin-size=60 Aufgrund dieses Befehls wird ein Überblick über den Datenverkehr im Zeitverlauf angezeigt. Dabei wird die Anzahl der Datensätze, Bytes und Pakete pro Minute für den Tag ausgegeben, der als Filterkriterium festgelegt wurde. Das Zeitintervall, auf das die Werte bezogen sind, geben Sie mit der Option --bin-size an, in diesem Beispiel also 60 Sekunden. Wenn Sie den Wert auf 3600 erhöhen, erhalten Sie die Datensätze, Bytes und Pakete pro Stunde (siehe Abb. 4.6). Wie bereits erwähnt, müssen Sie bei Rwfilter mindestens eine Eingabe-, eine Ausgabe- und eine Partitionierungsoption angeben. Hier verwenden wir die Eingabeoption --type=all, um sämtlichen Datenverkehr am 22.6.2013 zu erfassen. 4.3 Flussdaten mit SiLK erfassen und analysieren 135 Um alle Daten an die Standardausgabe zu liefern, geben wir an, dass die Daten zu sämtlichen Protokollen (--proto=0-255) an stdout übergeben werden sollen (--pass=stdout). Damit erfassen wir den gesamten Datenverkehr für den angegebenen Zeitraum. Abbildung 4.6: Ausgabe der Flussdaten durch Rwcount Nachdem Sie nun die grundlegende Filterung von Flussdatensätzen mit Rwfilter und den Einsatz von Rwcount kennengelernt haben, wollen wir diese beiden Tools mit Rwsetbuild kombinieren. Letzteres ermöglicht es uns, eine binäre SiLK-Datei zu erstellen, die SiLK mit verschiedenen Partitionierungsoptionen verarbeiten kann. Sie werden häufig eine Abfrage brauchen, die mehrere IP-Adressen berücksichtigt. Zwar enthält SiLK Tools, mit denen sich mehrere Abfragen kombinieren lassen, doch mithilfe von Rwsetbuild wird dies unnötig. Dieses Werkzeug vereinfacht den Vorgang. Legen Sie eine lineare Liste von IPAdressen und Subnetzen in Textform an (in unserem Beispiel testIPlist.txt) und lassen Sie sie wie folgt von Rwsetbuild verarbeiten: rwsetbuild testIPlist.txt testIPlist.set Anschließend können Sie Rwfilter mit der Option --anyset einsetzen, um alle Flussdatensätze herauszufiltern, bei denen IP-Adressen aus der Liste im Feld für die Quell- oder die Zieladresse stehen. Der Befehl dazu sieht wie folgt aus: rwfilter --start-date=2014/06/22 --anyset=/home/user/testIPlist.set --type=all --pass=stdout | rwcut Damit können Sie einen wahren Schatz an Informationen finden. Nehmen wir an, dass Sie die Kommunikationsdaten Ihres internen Netzwerks mit einer Liste schädlicher IPAdressen abgleichen wollen. Insbesondere interessieren Sie sich dafür, wie viele ausge- 136 4 Sitzungsdaten hende Daten an diese »bösen« IP-Adressen übertragen werden. Die beste Möglichkeit, das herauszufinden, bieten die Flussdaten, da Sie Rwsetbuild und Rwcount kombinieren können, um sich eine übersichtliche Statistik der ausgehenden Daten zu diesen Adressen anzeigen zu lassen. Gehen Sie dazu folgendermaßen vor: 1. Erstellen Sie die Datei badhosts.txt mit einer Liste der IP-Adressen. 2. Erstellen Sie mit folgendem Befehl die Set-Datei: rwsetbuild badhosts.txt badhosts.set 3. Führen Sie mit folgendem Befehl die Abfrage durch, um die Statistik zu erstellen: rwfilter --start-date=2013/06/22 --dipset=badhosts.set --type=all --pass=stdout | rwcount --bin-size=3600 Als Nächstes wollen wir uns mit einer Situation beschäftigen, die mir täglich begegnet und nach der ich oft gefragt werde: die Abfrage der Hosts im Netzwerk, die am meisten kommunizieren. Eine solche Abfrage kann sehr unterschiedlicher Natur sein. So kann es um Hosts mit einem hohen Aufkommen an ausgehendem Datenverkehr in fremde Länder gehen, um kommunikationsintensive Tor-Ausgangsknoten, die mit internen Geräten sprechen, oder um geschwätzige lokale Geräte an den Ports 1 bis 1024. Um solche Dinge in Erfahrung zu bringen, müssen Sie Statistiken für die Daten abrufen, die den entsprechenden Filterkriterien genügen. Das Werkzeug, das wir dazu verwenden, trägt – wie sollte es auch anders sein – den einfallsreichen Namen Rwstats. Wenn Sie die Ergebnisse von Rwfilter an Rwstats übergeben, erhalten Sie eine Liste der obersten oder untersten n Ergebnisse des betreffenden Filters. Im folgenden Beispiel suchen wir nach den aktivsten ausgehenden Verbindungen nach China. Insbesondere sind wir dabei an Kommunikationsvorgängen interessiert, bei denen Daten an flüchtige Ports (> 1024) zurückgegeben werden. Das können Sie mit folgendem Befehl erreichen: rwfilter --start-date=2013/06/22 --dcc=cn --sport=1024-65535 --type=all --pass=stdout | rwstats --top --count=20 --fields=sip --value=bytes In diesem Rwfilter-Befehl kommt eine Option vor, die wir bisher noch nicht verwendet haben, nämlich -dcc. Damit können wir Datenverkehr filtern, der an einen bestimmten Ländercode gerichtet ist. Das Gegenstück dazu ist der Filter -scc für Quellländercodes. Im Lieferzustand ist eine Filterung nach Ländercode bei SiLK jedoch noch nicht möglich. Um diese Funktion und damit den oben angegebenen Befehl nutzen zu können, müssen Sie zunächst folgende Schritte ausführen: 1. Laden Sie mithilfe von wget die GeoIP-Datenbank MaxMind herunter: wget http://geolite.maxmind.com/download/geoip/database/ GeoLiteCountry/GeoIP.dat.gz 4.3 Flussdaten mit SiLK erfassen und analysieren 137 2. Entpacken Sie die Datei und konvertieren Sie sie in das passende Format: gzip -d -c GeoIP.dat.gz | rwgeoip2ccmap --encoded-input > country_codes.pmap 3. Kopieren Sie die resultierende Datei an den passenden Speicherort: cp country_codes.pmap /usr/local/share/silk/ Das Ergebnis der zuvor genannten Abfrage sehen Sie in Abb. 4.7. Abbildung 4.7: Das Ergebnis der Rwstats-Abfrage Obwohl wir mit --count=20 angegeben haben, dass wir die obersten 20 IP-Adressen anzeigen lassen möchten, gibt Rwstats in diesem Beispiel nur drei Adressen aus, die mit China kommunizieren. Das liegt daran, dass in dem betreffenden Zeitraum nur diese drei Adressen Verbindungen mit China hatten. Wären es 50 gewesen, wären nur die oberen 20 angezeigt worden. Die Option --value=bytes gibt an, dass die Statistik auf der Anzahl von Bytes im Datenverkehr beruhen soll. Ohne diese Option würde stattdessen die Statistik für die Anzahl der Flussdatensätze erstellt. Als nächster logischer Schritt müssen Sie in dieser Situation herausfinden, mit wem diese Adressen kommunizieren und ob sie Datenverkehr akzeptieren. Um die chinesischen Adressen zu ermitteln, müssen Sie den Rwfilter-Teil des Befehls und die entsprechenden Felder in Rwstats ändern. Mit der Option --saddress engen Sie außerdem die Suche auf den Host ein, der am stärksten mit China kommuniziert. rwfilter --start-date=2013/06/22 --saddress=192.168.1.12 --dcc=cn --sport=1024-65535 --type=all --pass=stdout | rwstats --top --count=20 --fields=dip --value=bytes Mit den Rwfilter-Befehlen aus den früheren Beispielen können Sie außerdem die Flussdatensätze für alle Hosts abrufen, um die Art der übertragenen Daten zu bestimmen. Mithilfe dieser Informationen und der zugehörigen Zeitstempel lassen sich auch andere nützliche Daten für die Untersuchung gewinnen, z. B. PCAP-Daten. 138 4 Sitzungsdaten 4.3.7 Zusätzliche Werkzeuge und Dokumentation SiLK und YAF bilden nur einen kleinen Teil der Werkzeuge, die NetSA bereitstellt. Ich rate Ihnen, sich auch die anderen öffentlich verfügbaren Tools anzusehen, die Sie neben SiLK einsetzen können. So bietet NetSA mit iSiLK ein grafisches Front-End an, mit dem auch Personen, die weniger Erfahrungen mit Unix haben, SiLK nutzen können. Ein weiteres hervorragendes Werkzeug ist Analysis Pipeline, eine Engine zur Automatisierung der Flussanalyse, die fortlaufend weiterentwickelt wird und in die Flusserfassung integriert werden kann. Sie müssen für Analysis Pipeline Regeln konfigurieren und können das Tool dann nutzen, um an SiLK-Daten eine Blacklist-, DDoS- und Beacon-Erkennung vorzunehmen, ohne selbst Skripte dafür schreiben zu müssen. Die Dokumentation von SiLK ist an sich schon hervorragend und eine unschätzbare Quelle für professionelle Analytiker. Daneben gibt es noch ergänzende Handbücher und Anleitungen, um auch das Interesse von Amateuranalytikern zu wecken und um Profis beim Aufstellen von Abfragen zu unterstützen. Das Analyst Handbook4 ist eine umfassende, 107 Seiten starke Anleitung für viele SiLK-Anwendungsfälle. Es dient als offizielles Einführungstutorial zur Verwendung von SilK für die Flussdatenanalyse. Andere Dokumente nennen Tipps und Tricks für die Analyse oder geben Informationen über die Installation. Es gibt auch eine Einführung in PySiLK für diejenigen, die SiLK als Python-Erweiterung implementieren wollen. Wir empfehlen Ihnen sehr, sich die üblichen Installationsszenarios anzusehen, um sich eine Vorstellung davon zu verschaffen, wie Sie SiLK in Ihrer eigenen Umgebung implementieren. 4.4 Flussdaten mit Argus erfassen und analysieren Auch wenn wir uns in diesem Buch auf SiLK als Werkzeug zur Flussanalyse konzentrieren, müssen wir Argus zumindest erwähnen. Auch dieses Tool ist aus den ersten Bemühungen des CERT-CC auf dem Gebiet der Flussanalyse hervorgegangen. 1989 wurde Argus zum ersten Mal von staatlichen Stellen genutzt und wurde der erste Echtzeit-Netzwerkflussanalysator.5 Ab 1991 unterstützte das CERT Argus offiziell. Von diesem Zeitpunkt an setzte eine rasche Entwicklung ein. 1995 wurde Argus schließlich für die Öffentlichkeit freigegeben. Argus wird als definitive Flussanalyselösung angepriesen, die nicht nur Flussdaten berücksichtigt, sondern einen umfassenden, systematischen Überblick über den gesamten Netzwerkverkehr in Echtzeit bietet. Es handelt sich dabei um eine bidirektionale Flussanalysesuite, die beide Richtungen von Netzwerkkonversationen verfolgt und Messgrößen für die zugehörigen Flussdatensätze bereitstellt.6 Neben vielen der Merkmale, die auch andere IPFIX-Analyselösungen mitbringen, verfügt Argus über seine eigenen Tools zur statistischen Analyse und seine eigenen Erkennungs- und Alarmmechanismen, die es von 4 http://tools.netsa.cert.org/silk/analysis-handbook.pdf 5 http://www.qosient.com/argus/presentations/Argus.FloCon.2012.Tutorial.pdf 6 http://qosient.com/argus/argusnetflow.shtml 4.4 Flussdaten mit Argus erfassen und analysieren 139 anderen Produkten abheben. In den nächsten Abschnitten gebe ich Ihnen einen Überblick über die grundlegende Architektur und die Integration in Security Onion. Dabei werde ich die bereits bekannten Aspekte nicht wiederholen, sondern mich auf das konzentrieren, was wesentlich ist, um Daten erfassen und anzeigen zu können. Wie bereits erwähnt, hebt sich Argus in einigen wichtigen Bereichen von anderen Werkzeugen ab. Ich werde Beispiele dafür geben, wie Argus Ihrer Organisation mit diesen Merkmalen mehr nutzen kann als vergleichbare Flussanalysesoftware. 4.4.1 Architektur Argus ist zwar in Security Onion enthalten, aber es ist dennoch wichtig, sich mit dem allgemeinen Arbeitsablauf zum Abrufen und Verifizieren der Daten vertraut zu machen. Trotz der Integration in Security Onion kann es vorkommen, dass Sie Probleme bei der NSM-Erfassung beheben müssen. Es ist auch möglich, dass Sie Daten von externen Geräten verwenden möchten, bei denen es sich nicht um Security Onion-Sensoren handelt. Für solche Fälle vermittelt Ihnen dieser Abschnitt Kenntnisse darin, wie Sie Argus bereitstellen und wie die Einzelteile zusammenwirken, damit Sie das Flussanalysepaket ohne übermäßigen Zusatzaufwand nutzen können. Bei dieser Erörterung beschränken wir uns auf Argus als eigenständige Bereitstellung. Argus besteht aus zwei Hauptpaketen. Das erste wird ganz allgemein als »Argus« bezeichnet und zeichnet den Datenverkehr an einer festgelegten Netzwerkschnittstelle eines beliebigen Geräts auf. Es kann Daten auf die Festplatte schreiben, von wo aus sie weitergeleitet werden können, aber auch eine Socketverbindung zu einem zentralen Sicherheitsserver unterhalten, um die Daten direkt zu übertragen. Diese Komponente befindet sich gewöhnlich auf einem Sensor und sendet Daten an einen zentralen Protokollserver. Bei der zweiten Komponente handelt es sich um das Argus-Clientpaket. Es liest Daten aus Protokolldateien, Verzeichnissen oder Socketverbindungen zur Echtzeitanalyse. Die Clientwerkzeuge erfassen nicht nur Daten von externen Generatoren, sondern dienen auch als Hauptanalysewerkzeug. Daher benötigen Sie die Tools auf allen Geräten, auf denen Sie die Argus-Flussanalyse durchführen wollen. Beim Arbeitsablauf unterscheiden sich Argus und vergleichbare Programme kaum. Das Grundprinzip besteht darin, dass es eine Erfassungsschnittstelle gibt, auf der sich ein Flussgenerator-Daemon befindet. Dieser Daemon erkennt den Datenverkehr, generiert Flüsse und leitet die Flussdaten an eine zentrale Erfassungsplattform weiter, so sie gespeichert und analysiert werden. 4.4.2 Merkmale Argus ist einzigartig, da es mehr Merkmale enthält als die meisten anderen Flussanalysewerkzeuge. Eine eigenständige Bereitstellung von Argus bietet mehr als nur grundlegende Flussabfragen und Statistiken. Da über die Erfassung von IPFIX-Flussdaten und deren 140 4 Sitzungsdaten Import in Argus auch Anwendungsteildaten abgerufen werden können, ist es möglich, Aufgaben wie eine Filterung nach HTTP-URLs vorzunehmen. In heutigen NSM-Geräten sind jedoch meistens bereits Werkzeuge enthalten, die diese zusätzlichen Aufgaben erledigen. Mechanismen wie die URL-Filterung sind daher redundant, wenn sie zusätzlich nach der Analyse anderer Datentypen, etwa Paketstringdaten, eingesetzt werden. Da wir hier über die Standardinstallation von Argus in Security Onion sprechen, werde ich die zusätzlichen Analysemöglichkeiten auf Anwendungsebene an dieser Stelle nicht behandeln. In Kapitel 6 beschäftigen wir uns mit Paketstringdaten. 4.4.3 Grundlegender Datenabruf Wenn Sie Daten in verschiedenen Flussanalysewerkzeugen abrufen, kann das aufgrund der Ähnlichkeiten der Daten zu einem Déjà-vu führen. Die eigentlichen Unterschiede zwischen den Tools liegen in der Abfragesyntax und in den Möglichkeiten zum Aufstellen von Statistiken. Auf den ersten Blick scheint Argus eine sehr einfache Abfragesyntax zu haben, doch der Lernvorgang kann sehr anspruchsvoll sein. Angesichts der großen Anzahl von Abfrageoptionen und der eher schwammigen Dokumentation, die online zu finden ist, bilden die man-Seiten für diese Software oft den Rettungsanker, um sich mit Argus vertraut zu machen. Das nützlichste Tool innerhalb der Clientsuite ist ra, das die grundlegenden Möglichkeiten zum Filtern und Durchsuchen der von Argus erfassten Rohdaten bereitstellt. Es muss in der Lage sein, auf eine Datenmenge zuzugreifen. Diese Daten können mithilfe der Option -r über eine Argus-Datei bereitgestellt werden, aber auch über eine Pipe in den Standard­ eingang geleitet oder von einem entfernten Feed bezogen werden. Da wir hier eng mit Security Onion zusammenarbeiten, können Sie auf das Verzeichnis für Argus-Dateien in /nsm/sensor_data/<Schnittstellte>/argus/ verweisen. Auf den ersten Blick scheint es sich bei ra um ein sehr einfaches Werkzeug handeln, und Sie werden häufig einfache Abfragen stellen, die nur aus einer Leseoption und einem Berkeley-Paketfilter (BPF) am Ende bestehen. Wenn Sie beispielsweise den Verdacht haben, dass in Ihrem Netzwerk mehrere Genies unterwegs sind, weil die HTTP-Protokolle Besuche auf www.appliednsm.com ausweisen, können Sie sich die Daten mit folgendem Befehl in Argus ansehen: ra –r /nsm/sensor_data/<Schnittstelle>/argus/<Datei> - port 80 and host 67.205.2.30 Eine Beispielausgabe für diesen Befehl sehen Sie in Abb. 4.8. 4.4 Flussdaten mit Argus erfassen und analysieren 141 Abbildung 4.8: Beispielausgabe von ra Einer der größten Vorteile von Argus gegenüber anderen Flussanalyseprogrammen ist seine Fähigkeit, Protokolle mithilfe derselben BPFs zu untersuchen, wie sie auch von Tools wie Tcpdump genutzt werden. Dadurch lassen sich die einfachsten Funktionen von ra und Argus schnell und wirkungsvoll nutzen. Wenn Sie sich mit den grundlegenden Filtermethoden von ra vertraut gemacht haben, können Sie zu den zusätzlichen Optionen übergehen. Wie bereits gesagt, kann ra die Standardeingabe verarbeiten und Daten über die Standardausgabe an andere Argus-Tools weiterleiten. Wenn die Option -r nicht angegeben ist, liest ra standardmäßig von der Standardeingabe. Um die Ergebnisse von ra in einer Datei auszugeben, verwenden Sie die Option -w. Betrachten Sie dazu als Beispiel den folgenden Befehl: cat /nsm/sensor_data/<Schnittstelle>/argus/<Datei> | ra -w - - ip and host 67.205.2.30 | racluster -M rmon -m proto –s proto pkts bytes Hier verarbeitet ra die Standardeingabe und sendet die Ausgabe aufgrund der Option -w an die Standardausgabe, wo sie an das Werkzeug Racluster übergeben wird. Dieses wiederum führt eine Datenaggreation zur IP-Profilerstellung aus. In dem Beispiel nimmt Racluster die Ergebnisse von ra entgegen und fasst die Ergebnisse protokollweise zusammen. Ein Blick auf die man-Seite von ra zeigt, dass das Tool auch Racluster-Optionen zur Untersuchung der Ausgabe entgegennimmt. Der zuvor gezeigte Beispielbefehl führt zu einer Ausgabe wie der in Abb. 4.9. 142 4 Sitzungsdaten Abbildung 4.9: Beispielausgabe von ra und Racluster 4.4.4 Weitere Informationen über Argus Wir werden in diesem Buch zwar nicht ausführlich auf die Verwendung von Argus zur Analyse eingehen, aber es ist dennoch sinnvoll, es mit anderen Flussanalysesuites wie SiLK zu vergleichen. Bei der Auswahl eines Flussanalysetools müssen Analytiker das Werkzeug finden, das sich am besten für ihre Bedürfnisse, ihre Fähigkeiten und ihre Umgebung eignet. Die Möglichkeit, in ra zur Filterung von Daten BPFs einzusetzen, macht Argus selbst für Anfänger in Sachen Flussanalyse zu einem leicht anzuwendenden Werkzeug. Eine anspruchsvolle Analyse mit Argus erfordert jedoch umfassende Kenntnisse sowohl der Vorgänge als auch der Ra-Tools. Mehr über Argus erfahren Sie auf http://quosient.com/argus/ index.shtml. Genauere technische Einzelheiten zur Arbeit mit Argus bietet http://nsmwiki. org/index.php?title=Argus. 4.5 Überlegungen zur Speicherung von Sitzungsdaten Im Vergleich zu anderen Daten weisen Sitzungsdaten nur einen geringen Umfang auf. Allerdings darf die Flussdatensteuerung auch nicht auf die leichte Schulter genommen werden. Ich habe es schon erlebt, dass Flussdaten als einzige Möglichkeit zur Protokollkorrelation aufgestellt wurden, es aber nach einigen Monaten der Datenerfassung nicht mehr möglich war, die Protokolle abzufragen. Das lag an einem inkorrekten Überschreiben älterer Flussdaten. Werden Flussdaten sich selbst überlassen, können sie mit der Zeit zu einer nicht mehr handhabbaren Größe anwachsen. Es gibt keine konkreten Empfehlungen für die Speicherkapazität, die Sie für Flussdaten vorhalten sollten, da dies davon abhängt, welche Daten für Sie von Bedeutung sind und wie hoch der Durchsatz ist. Das heißt aber noch lange nicht, dass Sie einen Universalfilter für den gesamten Datenverkehr definieren sollten, den Sie erfassen. Selbst wenn Sie keine FPC-Daten für bestimmte Protokolle erfassen, beispielsweise für verschlüsselte GRE-Tunnel oder HTTPS-Datenverkehr, sollten Sie Flussdatensätze dieser Kommunikationsarten aufbewahren. Um die Menge des Speicherplatzes zu bestimmen, den Sie für Flussdaten benötigen, können Sie ein Arbeitsblatt heranziehen, dass das NetSA-Team des CERT für SiLK aufgestellt hat. Zu finden ist es auf http://tools.netsa.cert.org/releases/SiLK-Provisioning-v3.3.xlsx. 4.5 Überlegungen zur Speicherung von Sitzungsdaten 143 Es gibt viele Möglichkeiten, Netzwerkprotokolleinträge zu verwalten. Als einfachste Möglichkeit für mich hat sich ein cron-Job erwiesen, der die Daten überwacht und bei Bedarf nach einem festgelegten Zeitraum überschreibt. Viele Datenerfassungswerkzeuge verfügen über Funktionen, um ältere Daten zyklisch zu überschreiben, allerdings müssen Sie die Verwaltung dieser Funktionen meistens manuell durchführen. Das kann beispielsweise bei Flussdaten der Fall sein, wobei jedoch viele Organisationen Flussdaten nur dann überschreiben, wenn es nötig ist. Eine Möglichkeit, die Datenmenge zu begrenzen, besteht darin, einen einfachen cron-Job aufzustellen, der das Flussdatenverzeichnis bereinigt, indem er alle Dateien löscht, die älter als x Tage sind. Für SiLK können Sie das beispielsweise mit folgendem cron-Job tun: 30 12 * * * find /data/silk/* -mtime +29 -exec rm {} \; Hier werden jeden Tag um 12.30 Uhr alle Dateiendateien, die 30 Tage alt oder noch älter sind, aus dem Verzeichnis /data/silk/directory entfernt. Falls Sie die Konfigurationsdateien im selben Verzeichnis untergebracht haben wie die Daten, müssen Sie jedoch aufpassen, dass Sie sie nicht versehentlich ebenfalls entfernen. Viele Organisationen bewahren außerdem gern einen redundanten Satz der Flussdaten auf. Dazu können Sie die Daten wie folgt auf ein externes USB-Speichergerät übertragen: */30****rsync--update-vr/data/silk//mnt/usb/data/silk/&>/dev/null Dieser Befehl kopiert alle zwei Minuten sämtliche neuen Flussdateien auf das angegebene Gerät. Wie Sie den cron-Job ausführen, hängt von der Art des Betriebssystems ab. Übrigens enthält auch SiLK Funktionen, um Daten an andere Orte zu übertragen. Steuerbefehle wie diese schließe ich gern in ein allgemeines »Watchdog«-Skript ein. Es soll dafür sorgen, dass bei einem Fehler oder einem Neustart des Systems die Dienste neu gestartet werden, enthält aber auch regelmäßige Datenaktualisierungen und -löschungen, die Übertragung und Kopie redundanter Daten, Statusskripts zur Sensorüberwachung sowie Skripts zur Dienstüberwachung, die dafür sorgen, dass die Prozesse aktiv bleiben. Das bietet den zusätzlichen Vorteil, dass Fehler beim Start des Sensors vermieden werden und dass die Dienste starten, sobald der cron-Job ausgeführt wird, und nicht erst zusammen mit dem restlichen Kernel-Startvorgang. Der größte Vorteil eines solchen Skripts aber besteht darin, dass es eine zentrale Stelle bietet, um die Sensoren auf korrektes Funktionieren hin zu überwachen. Dazu gehört es auch, dafür zu sorgen, dass die Daten kontinuierlich fließen. Mit dem folgenden Skript können Sie YAF überwachen, um sicherzustellen, dass das Programm permanent läuft. Möglicherweise müssen Sie es jedoch an Ihre Produktionsumgebung anpassen. 144 4 Sitzungsdaten #!/bin/bash function SiLKSTART { sudo nohup /usr/local/bin/yaf --silk --ipfix=tcp --live=pcap --out=192.168.1.10 --ipfix-port=18001 --in=eth1 --applabel --maxpayload=384 --verbose --log=/var/log/yaf.log & } function watchdog { pidyaf=$(pidof yaf) if [ -z "$pidyaf" ]; then echo "YAF is not running." SiLKSTART fi } watchdog Ein weiteres Tool, das Sie ständig überwachen sollten, um sicherzustellen, dass es ständig läuft und Flussdaten erfasst, ist Rwflowpack. Dazu können Sie folgenden Code verwenden: #!/bin/bash pidrwflowpack=$(pidof rwflowpack) if [ echo sudo sudo fi 4.6 -z "$pidrwflowpack" ]; then "rwflowpack is not running." pidof rwflowpack | tr ' ' '\n' | xargs -i sudo kill -9 {} service rwflowpack restart Zusammenfassung In diesem Kapitel haben wir Ihnen einen Überblick über die grundlegenden Prinzipien der Erfassung von Sitzungsdaten gegeben. Das umfasste eine Beschreibung der verschiedenen Arten von Sitzungsdaten wie NetFlow und IPFIX, eine Beschreibung der Datenerfassung und -gewinnung mit SiLK und eine kurze Einführung in Argus. Ich kann die Wichtigkeit von Sitzungsdaten nicht genug betonen. Wenn Sie ein neues Sicherheitsprogramm aufstellen oder NSM in einer Organisation einrichten, bilden die Sitzungsdaten den besten Ausgangspunkt und liefern den meisten Wert für die erforderlichen Bemühungen. 5 FPC-Daten Die NSM-Daten mit dem größten Wert für Analytiker sind FPC-Daten (Full Packet Capture, »vollständige Paketerfassung«). Sie legen Rechenschaft über jedes Datenpaket ab, das zwischen zwei Endpunkten übertragen wurde. FCP-Daten lassen sich mit den Aufzeichnungen einer Überwachungskamera vergleichen. Wenn ein Angreifer über ein Netzwerk auf ein System zugreift, dann finden sich Spuren davon in den FPC-Daten. Wegen ihrer Vollständigkeit können FPC-Daten erdrückend umfangreich wirken. Gerade der große Detailreichtum aber ist für die Analyse sehr wertvoll. Der Preis dafür besteht jedoch in dem hohen Platzbedarf für die langfristige Speicherung. Manche Organisationen haben nicht die Ressourcen, um in ihrer NSM-Infrastruktur FPC-Daten auf sinnvolle Weise zu berücksichtigen. Am häufigsten liegen FPC-Daten im PCAP-Format vor (siehe Abb. 5.1). Es wird von den meisten Open-Source-Tools zur Erfassung, Erkennung und Analyse unterstützt und galt relativ lange Zeit als Standard für FPC-Daten. Es gibt mehrere Bibliotheken, um Software zu schreiben, die PCAP-Dateien generieren und verarbeiten kann. Die am weitesten verbreitete ist Libpcap, eine Open-Source-Bibliothek, mit deren Hilfe Anwendungen mit Netzwerkkarten arbeiten können, um Pakete zu erfassen. Der Hauptzweck dieser 1994 geschriebenen Bibliothek bestand darin, eine plattformunabhängige API für die Paketerfassung bereitzustellen, für die keine betriebssystemspezifischen Module erforderlich waren. Viele Anwendungen für die Paketerfassung und -analyse nutzen Libpcap, darunter auch 146 5 FPC-Daten mehrere der in diesem Buch besprochenen Tools wie Dumpcap, Tcpdump, Wireshark usw. Da Bibliotheken wie diese die Arbeit mit PCAP-Daten so leicht machen, werden andere NSM-Datentypen, z. B. statische oder Paketstringdaten, oft aus PCAP-Daten gewonnen. Abbildung 5.1: PCAP-Daten in Wireshark Als Nachfolgeformat von PCAP hat sich in letzter Zeit PCAP-NG entwickelt. Es bietet mehr Möglichkeiten als der Vorgänger. Unter anderem ist es möglich, Kommentare in Paketerfassungen aufzunehmen (siehe Abb. 5.2). Das ist sehr hilfreich, wenn Analytiker bereits untersuchte Dateien zu einer weiteren Analyse durch sie selbst oder durch Kollegen speichern. Die meisten in diesem Buch besprochenen Tools unterstützen PCAP-NG. Bericht von der Front Das Format einer Paketerfassungdatei können Sie mithilfe des Tools Capinfos ermitteln, das im Lieferumfang von Wireshark enthalten ist (siehe Kapitel 13). Dazu müssen Sie den Befehl capinfos -t <Datei> ausführen. Bei einer PCAPDatei gibt Capinfos die Bezeichnung libpcap zurück, bei einer PCAP-NG-Datei pcapng. 5.1 Dumpcap 147 Abbildung 5.2: Ein kommentiertes Paket im Format PCAP-NG In diesem Kapitel sehen wir uns mehrere beliebte FPC-Erfassungsprodukte und deren Vorteile an. Außerdem beschäftigen wir uns mit Strategien, um FPC-Lösungen auf möglichst wirtschaftliche Weise in Ihrem Netzwerk umzusetzen. 5.1 Dumpcap Eine der einfachsten Möglichkeiten für eine vollständige Paketerfassung bietet Dumpcap. Es ist in Wireshark enthalten, was bedeutet, dass es auf den Systemen der meisten Analytiker bereits vorhanden ist – möglicherweise ohne dass sich die Analytiker dessen bewusst sind. Dieses einfache, auf Libpcap gestützte Tool dient einem einzigen Zweck, nämlich Pakete an einer Schnittstelle zu erfassen und im Format PCAP-NG auf die Festplatte zu schreiben. In Security Onion ist Wireshark bereits installiert und damit auch Dumpcap. Außerdem können Sie die Suite auch von http://www.wireshark.org herunterladen. Sie ist mit dem Libpcap-Treiber gebündelt, der für die Paketerfassung erforderlich ist. Um Pakete zu erfassen, rufen Sie Dumpcap wie folgt auf und geben die Erfassungsschnittstelle an: dumpcap –i eth1 Dieser Befehl sorgt dafür, dass Pakete erfasst und in eine zufällig benannte Datei im aktuellen Arbeitsverzeichnis geschrieben werden. Diese Erfassung wird so lange fortgesetzt, bis Sie sie abbrechen. Um die Erfassung und Speicherung der Paketdaten zu steuern, können Sie in Dumpcap verschiedene Optionen angeben: •• -a <Wert>: Gibt an, wann das Schreiben in Erfassungsdateien beendet werden soll. Dazu können Sie eine Zeitdauer, eine Dateigröße oder die Anzahl geschriebener Dateien angeben. Es ist auch möglich, mehrere Bedingungen zu kombinieren. •• -b <Optionen>: Veranlasst Dumpcap dazu, aufgrund festgelegter Kriterien mehrere Dateien zu schreiben. Hierbei kann es sich um eine Zeitdauer, eine Dateigröße oder 148 5 FPC-Daten •• •• •• •• •• die Anzahl geschriebener Dateien handeln. Es ist auch möglich, mehrere Bedingungen zu kombinieren. -B <Wert>: Gibt die Puffergröße an, also die Menge der Daten, die zwischengespeichert werden, bevor sie auf die Festplatte geschrieben werden. Wenn Paketverluste auftreten, sollte dieser Wert erhöht werden. -f <Filter>: BPF-Befehle (Berkeley-Paketfilter) zum Filtern der Erfassungsdatei. -i <Schnittstelle>: Nennt die Schnittstelle, an der Pakete erfasst werden sollen. -P: Speichert die Dateien im PCAP- statt im PCAP-NG-Format. Das ist sinnvoll, wenn Sie für Abwärtskompatibilität mit Tools sorgen müssen, die mit PCAP-NG nicht umgehen können. -w <Dateiname>: Legt den Namen der Ausgabedatei fest. In einer Produktionsumgebung kann der Dumpcap-Befehl beispielsweise wie folgt aussehen: dumpcap –i eth1 –b duration:60 –b files:60 –w NYC01 Auf diesen Befehl hin erfasst Dumpcap Pakete an der Schnittstelle eth1 (-i eth1) und speichert sie in 60 Dateien (-b files:60), die jeweils 60 s Datenverkehr enthalten (-b duration:60). Nachdem die 60. Datei geschrieben wurde, wird die erste Datei überschrieben. Die Dateinamen bestehen aus dem angegebenen String, der laufenden Nummer der Datei und einem Zeitstempel (-w NYC01). Dumpcap lässt sich leicht einrichten, hat aber seine Grenzen. Erstens kann es in Hochleistungsumgebungen mit hohem Durchsatz nur schwer mithalten, was dazu führt, dass Pakete verloren gehen. Aufgrund seiner Einfachheit ist dieses Tool auch nicht gerade sehr vielseitig. Das zeigt sich insbesondere in der beschränkten Anzahl von Konfigurationsoptionen, etwa bei der Ausgabe der erfassten Daten. Sie können dem Namen der ­Paketerfassungsdateien zwar einen selbst gewählten Text voranstellen, doch weitere Möglichkeiten, die Benennung der Dateien zu beeinflussen, haben Sie nicht. Das kann problematisch werden, wenn Sie für ein selbst geschriebenes Untersuchungsskript oder ein Erkennungs- und Analysetool eines anderen Anbieters ein bestimmtes ­Namensschema einhalten müssen. Wenn Sie die FPC-Erfassung möglichst schnell und mit einem Minimum an Aufwand einrichten möchten, bietet Dumpcap eine brauchbare Lösung. Falls Sie aber eine höhere Vielseitigkeit brauchen oder Pakete an einer Verbindung mit hohem Durchsatz erfassen müssen, sollten Sie sich lieber nach einem anderen Produkt umsehen. 5.2 Daemonlogger 149 5.2 Daemonlogger Daemonlogger wurde von Marty Roesch kreiert, dem ursprünglichen Entwickler des IDS Snort. Es handelt sich dabei um eine Paketaufzeichnungsanwendung für NSM-Umgebungen. Sie nutzt Libpcap zur Datenerfassung und weist zwei verschiedene Betriebsarten auf. Im Hauptmodus werden die erfassten Pakete direkt auf die Festplatte geschrieben, im zweiten Modus auf eine zweite, andere Schnittstelle übertragen. Dadurch fungiert Daemonlogger praktisch als Software-Tap. Ebenso wie Dumpcap lässt sich Daemonlogger sehr einfach verwenden, um Pakete zu erfassen. Um mit der Erfassung zu beginnen, müssen Sie lediglich den Befehl geben und die Schnittstelle nennen: daemonlogger -i eth1 Damit werden standardmäßig Pakete erfasst und im aktuellen Arbeitsverzeichnis abgelegt. Wenn die Erfassungsdatei eine Größe von 2 GB erreicht, wird eine neue Datei angelegt. Das läuft so weiter, bis der Prozess angehalten wird. Auch in Daemonlogger können Sie die Art und Weise, wie die Pakete gespeichert werden, mit einer Reihe von Optionen steuern. Besonders nützlich sind dabei die folgenden: •• •• •• •• •• •• •• •• •• •• -d: Wird als Daemon ausgeführt. -f <Dateiname>: Lädt BPFs (Berkeley-Paketfilter) aus der angegebenen Datei. -g <Gruppe>: Wird als die angegebene Gruppe ausgeführt. -i <Schnittstelle>: Legt die Schnittstelle fest, an der Pakete erfasst werden sollen. -l <Verzeichnis>: Gibt das Verzeichnis an, in dem die Daten abgelegt werden sollen. -M <Prozentwert>: Im Ringpuffermodus werden die Paketdaten aufgehoben, bis der angegebene Prozentwert der Datenträgerkapazität erreicht ist. Um den Ringpuffermodus zu aktivieren, müssen Sie die Option -r angeben. -n <Präfix>: Gibt das Namenspräfix für die Ausgabedateien an (sehr praktisch ist hier die Angabe des Sensornamens). -r: Aktiviert den Ringpuffermodus. -t <Wert>: Überschreibt die Protokolldatei nach dem angegebenen Zeitraum. -u <Benutzer>: Wird als der angegebene Benutzer ausgeführt. In einer Produktionsumgebung kann Daemonlogger beispielsweise wie folgt aufgerufen werden: daemonlogger –i eth1 –d –f filter.bpf –l /data/pcap/ -n NYC01 Hier wird Daemonlogger als Daemon ausgeführt (-d), erfasst Pakete an der Schnittstelle eth1 (-i eth1) und schreibt sie in das Verzeichnis /data/pcap (-l /data/pcap). Den Datei- 150 5 FPC-Daten namen wird der String NYC01 vorangestellt, um anzugeben, von welchem Sensor sie stammen (-n NYC01). Gefiltert werden die Daten anhand der BPF-Anweisungen in der Datei filter.bpf (-f filter.bpf). Was die Leistung angeht, zeigt Daemonlogger einige der Schwächen, die auch Dumpcap aufweist. Daemonlogger verkraftet zwar höhere Durchsätze als Dumpcap, stößt in sehr großen Unternehmensumgebungen aber ebenfalls an seine Grenzen. Die Möglichkeiten zur Benennung der Dateien sind in Daemonlogger ebenfalls eingeschränkt. Sie können Text auswählen, mit dem die Dateinamen beginnen sollen, an diesen Text wird unveränderlich der Zeitpunkt der Erfassung im Epochenformat angehängt. Es gibt keine Möglichkeit, ein anderes Datums- und Uhrzeitformat auszuwählen. Zwar könnten Sie die Dateien anschließend mit einem selbst geschriebenen Skript umbenennen, aber das stellt einen weiteren Vorgang dar, um den Sie sich kümmern müssten. Die Funktion, mit der sich Daemonlogger zurzeit von der Masse abhebt, ist der Ringpuffermodus, der eine manuelle Verwaltung des PCAP-Speicherplatzes unnötig macht. Mithilfe der Option -r -M <Prozentwert> sorgen Sie dafür, dass ältere Daten automatisch entfernt werden, wenn der Platz für die Speicherung der PCAP-Daten den angegebenen prozentualen Wert übersteigt. In manchen Fällen kann diese Möglichkeit einen entscheidenden Vorteil darstellen. Wenn Sie jedoch auch andere Arten von Daten sammeln, ist wahrscheinlich schon eine Speicherverwaltung in Form anderer Prozesse in Kraft (mit denen wir uns weiter hinten in diesem Kapitel noch beschäftigen werden). Auch Daemonlogger ist daher eine großartige FPC-Lösung, wenn Sie Ihre Erfassungsmöglichkeiten einfach und mit wenig Aufwand einrichten möchten. Es ist äußert stabil, und ich habe es schon in verschiedenen Unternehmensumgebungen erfolgreich im Einsatz gesehen. Ob Daemonlogger für Sie geeignet ist, bestimmen Sie am besten, indem Sie es an der Netzwerkschnittstelle ausprobieren, die Sie überwachen wollen, und prüfen, ob dabei Paketverluste auftreten. 5.3 Netsniff-NG Netsniff-NG ist ein Hochleitungswerkzeug zur Paketerfassung, entworfen von Daniel Borkmann. Während sich die bisher besprochenen Tools auf Libpcap stützten, verwendet Netsniff-NG einen Zero-Copy-Mechanismus, um eine vollständige Paketerfassung auch an Verbindungen mit hohem Durchsatz zu ermöglichen. Eines der praktischen Merkmale von Netsniff-NG besteht darin, dass es nicht nur eine Paketerfassung mit RX_RING erlaubt, sondern auch eine Paketübertragung mit TX_Ring, sodass Sie Pakete an einer Schnittstelle lesen und zu einer anderen Schnittstelle umleiten können. Diese Möglichkeit gewinnt noch dadurch an Wert, dass Sie die Pakete zwischen diesen Schnittstellen filtern können. 5.3 Netsniff-NG 151 Um Pakete mit Netsniff-NG zu erfassen, müssen Sie einen Eingang und einen Ausgang festlegen. In den meisten Fällen handelt es sich bei dem Eingang um eine Netzwerkschnittstelle und bei dem Ausgang um eine Datei oder einen Ordner auf der Festplatte: netsniff-ng –i eth1 –o data.pcap Dieser Befehl sorgt dafür, dass Pakete an der Schnittstelle eth1 (-i eth1) erfasst und in die Datei data.pcap im aktuellen Arbeitsverzeichnis geschrieben werden (-o data.pcap), bis die Anwendung angehalten wird. Wenn Sie diesen Befehl ausführen, wird der Inhalt der erfassten Pakete auf dem Bildschirm dargestellt. Um dieses Verhalten zu unterbinden, können Sie Netsniff-NG mit dem Flag -s in den stillen Modus versetzen. Wenn Sie den Prozess beenden (durch Drücken von (Strg) + (C)), gibt Netsniff-NG einige grundlegende Statistiken über die erfassten Daten aus (siehe Abb. 5.3). Abbildung 5.3: Die Ausgabe von Netsniff-NG Netsniff-NG bietet eine Menge Funktionen, die wir auch schon in den anderen FPCAnwendungen kennengelernt haben, darunter die folgenden: •• -g <Gruppe>: Wird als die angegebene Gruppe ausgeführt. •• -f <Dateiname>: Lädt BPFs (Berkeley-Paketfilter) aus der angegebenen Datei. •• -F <Wert>: Dateigröße oder Zeitraum, um zu bestimmen, wann die Erfassung im Einzeldateimodus enden bzw. wenn im Ringpuffermodus zur nächsten Datei übergegangen werden soll. •• -H: Setzt die Priorität auf »hoch«. •• -i <Schnittstelle>: Legt die Schnittstelle fest, an der Pakete erfasst werden sollen. •• -o <Datei>: Gibt die Datei an, in die die Daten ausgegeben werden sollen. •• -t <Typ>: Verarbeitet nur Pakete der angegebenen Typen (Host-, Broadcast-, Multicast- oder ausgehende Daten). •• -P <Präfix>: Gibt das Namenspräfix für die Ausgabedateien an (sehr praktisch ist hier die Angabe des Sensornamens). 152 5 FPC-Daten •• -s: Stummer Modus. Die erfassten Pakete werden nicht auf dem Bildschirm ausgegeben. •• -u <Benutzer>: Wird als der angegebene Benutzer ausgeführt. In einer Produktionsumgebung kann Netsniff-NG beispielsweise wie folgt aufgerufen werden: netsniff-ng -i eth1 –o /data/ -F 60 -P "NYC01" Dieser Befehl führt Netsniff-NG im Ringpuffermodus aus, was Sie an der Angabe eines Ausgabeverzeichnisses anstelle eines Dateinamens im Parameter -o erkennen können (-o /data/). Alle 60 s wird eine neue PCAP-Datei erstellt (-F 60), an deren Namen jeweils der Sensorname NYC01 steht (-P "NYC01"). In unseren Tests hat Netsniff-NG von allen in diesem Buch besprochenen FPC-Programmen an Verbindungen mit hohem Durchsatz die beste Leistung gezeigt. Sie ist so gut, dass dieses Tool als Standardprogramm für die FPC-Erfassung in Security Onion enthalten ist. 5.4 Das passende FPC-Erfassungswerkzeug auswählen Wir haben drei verschiedene FPC-Lösungen besprochen und sind in den Beschreibungen auch jeweils auf die Leistung insgesamt eingegangen. Dumpcap und Daemonlogger funktionieren in den meisten Situationen reibungslos und ohne Paketverluste, doch in Umgebungen mit einem anhaltend hohen Aufkommen an Datenverkehr brauchen Sie ein Tool wie Netsniff-NG. Wenn Sie Ihre Erfassungswerkzeuge nicht an den Durchsatz Ihrer Umgebung anpassen, verschwenden Sie CPU-Zyklen und sammeln unvollständige Daten. Für Analytiker gibt es nichts Frustrierenderes, als einen Datenstream zu rekonstruieren und dabei festzustellen, dass ein Paket fehlt, sodass alle Anstrengungen umsonst waren. In der Geschichte der FPC-Erfassungswerkzeuge ging es immer wieder darum, Daten »auf die beste Weise« zu generieren. Manchmal kann »die beste Weise« bedeuten, dass eine Vielzahl von Funktionen zur Verfügung steht, aber meistens wurden neue FPC-Lösungen erstellt, um die Anforderungen neuer, schnellerer Netzwerke zu erfüllen. Das bedeutet aber nicht, dass das beste FPC-Erfassungstool dasjenige ist, das die Daten am schnellsten aufnehmen kann, sondern dasjenige, das die wenigsten Pakete verliert und gleichzeitig genügend Möglichkeiten bietet, die Daten in einem Format zu speichern, das Ihre Erkennungs- und Analysetools verarbeiten können. Die drei zuvor erwähnten Tools werden wir auch weiterhin in diesem Buch verwenden. In der Netzwerkumgebung, für die sie geschaffen sind, erfüllen sie alle erwiesenermaßen ihren Zweck, und sie gehören zu den bekanntesten und am weitesten verbreiteten kostenlosen Lösungen. Das passende Werkzeug für Ihre Organisation müssen Sie aufgrund der Kriterien auswählen, die für Sie selbst am wichtigsten sind. 5.5 Die FPC-Datenerfassung planen 153 5.5 Die FPC-Datenerfassung planen Bei der Festlegung der Sensorarchitektur sollten Sie der Erfassung der FPC-Daten eine hohe Priorität einräumen. Dafür gibt es viele Gründe, unter anderem die Tatsache, dass Sie praktisch alle anderen wichtigen Datentypen aus FPC-Daten gewinnen können. FPCDaten sind ein »primärer« Datentyp, der direkt von der Verbindung abgegriffen wird. Sie umfassen weit mehr Daten pro Zeiteinheit als alle anderen Typen, weshalb Sie auch mehr Festplattenplatz benötigen als die anderen Typen. Das heißt aber nicht, dass FPC immer den größten Teil der Festplatte einnehmen. Viele Organisationen legen auch viel Wert auf eine rückblickende Protokollanalyse und -korrelation und widmen oft einen vergleichbaren oder noch größeren Anteil des Festplattenplatzes anderen Arten von Protokollen, z. B. Bro-Protokollen. Dabei kann es natürlich sein, dass die PCAP-Daten nur 24 Stunden lang aufbewahrt werden, die Bro-Protokolle dagegen ein Jahr lang. Der Kernpunkt ist, dass viele der Daten, die Sie erfassen, von PCAP-Daten abgeleitet sind, und dass die erheblichen Speicheranforderungen der PCAP-Daten Auswirkungen auf die Erfassung anderer Daten haben. Der wichtigste Aspekt, den Sie bei der Bereitstellung einer FPC-Lösung bedenken müssen, ist der Durchsatz, also die durchschnittliche Rate des Netzwerkverkehrs an den überwachten Schnittstellen. Bevor Sie einen Sensor kaufen, sollten Sie den Durchsatz an dem zu überwachenden Port bestimmen, damit der Sensor auch die nötigen Ressourcen für die Erfassung und Erkennung im erforderlichen Maßstab mitbringt. Erst die Hardware zu kaufen und dann nachträglich zu versuchen, diese Voraussetzungen zu erfüllen, endet gewöhnlich in einem Desaster. 5.5.1 Speicherplatz Der wichtigste Gesichtspunkt im Zusammenhang mit FPC-Daten ist der Speicherplatz. PCAP-Daten nehmen im Vergleich zu allen anderen Datentypen sehr viel Platz ein. Daher ist es von entscheidender Bedeutung, den Umfang der FPC-Daten zu bestimmen, die Sie speichern wollen. Dazu müssen Sie als Erstes einen Aufbewahrungsplan nach Zeit oder nach Umfang aufstellen. Bei der Aufbewahrung nach Zeit legen Sie fest, dass die PCAP-Daten mindestens den angegebenen Zeitraum über gespeichert bleiben sollen, beispielsweise 24 Stunden. Bei der Aufbewahrung nach Umfang geben Sie die Höchstmenge an PCAP-Daten an, die gespeichert bleiben können, was gewöhnlich durch den Datenträger bestimmt wird, z. B. 10 TB, festgelegt durch ein 10-TB-RAID-Array. Bei beiden Verfahren sollte Ihre Organisation ein Betriebsminimum und ein Optimum festlegen. Das Minimum nennt die Mindestanforderungen dafür, um NSM-Dienste in sinnvollem Umfang durchführen zu können. Es gibt die erforderliche Aufbewahrungszeit oder den erforderlichen Umfang dafür an, die kleinstmögliche Datenmenge zu speichern. Das Optimum dagegen stellt einen angestrebten Wert dafür an, ein Network Security Monitoring auf bestmögliche 154 5 FPC-Daten Weise durchzuführen. Hier stehen der Zeit- bzw. der Umfangswert für die Menge der Daten, die Sie unter idealen Bedingungen speichern möchten. Kurz gesagt, sollten Sie immer wenigstens über das Minimum verfügen, aber das Optimum anstreben. Ob Sie sich für eine Aufbewahrung nach Zeit oder nach Umfang entscheiden, hängt von vielen verschiedenen Faktoren ab. In regulierten Branchen, in denen Normen erfüllt werden müssen, kann eine Organisation keine andere Wahl haben, als eine Aufbewahrung nach Zeit durchzuführen. In anderen Branchen kann die Entscheidung für die Aufbewahrung nach Zeit auch einfach fallen, weil dies den üblichen Verfahren in der Organisation entgegenkommt. Sind dagegen das Budget oder die Hardwareressourcen knapp, bietet sich eine Aufbewahrung nach Umfang an. Dieses Verfahren wird auch oft in unhomogenen oder rasch wachsenden Netzwerken angewendet, da die Menge des erforderlichen Speicherplatzes für eine Aufbewahrung nach Zeit unter diesen Umständen nicht genau abgeschätzt werden kann. Wenn Sie eine Aufbewahrung nach Zeit planen, können Sie aus dem durchschnittlichen Durchsatz an einer Schnittstelle theoretisch ermitteln, wie viele Daten Sie pro Zeiteinheit auf gegebenem Festplattenplatz speichern können. Nehmen wir an, an einer Schnittstelle tritt durchschnittlich ein Durchsatz von 100 MB/s auf und Sie haben 1 TB Festplattenplatz zur Verfügung. Theoretisch können Sie daher FPC-Daten 24 Tage lang speichern. In der Praxis ist es jedoch ein – weit verbreiteter – Fehler, sich ausschließlich auf die Messung des durchschnittlichen Durchsatzes zu verlassen, da hierbei die Spitzen nicht berücksichtigt werden, also kurze Zeiträume, in denen der Durchsatz dramatisch ansteigt. Solche Spitzen treten aus einer Reihe von Gründen auf. Unter anderem können sie durch geplante, regelmäßige Ereignisse wie Backups und Anwendungsaktualisierungen zustande kommen, aber auch durch zufällige Gegebenheiten wie eine höhere Webaktivität als üblich. Da es sich bei FPC-Daten um einen primären Datentyp handelt, rufen diese Spitzen auch ein höheres Aufkommen der anderen Daten hervor, die aus ihnen abgeleitet werden, was die Auswirkungen der Spitzen noch verstärkt. Aufgrund der Natur des Netzwerkverkehrs ist es sehr schwer, Spitzen beim Durchsatz vorherzusagen. Daher müssen Organisationen, die sich für eine Aufbewahrung nach Zeit entschieden haben, eine erheblich kürzere Aufbewahrungsdauer wählen, als mit der Hardware theoretisch machbar wäre, um Reserveplatz bereitzustellen. Ansonsten bestünde die Gefahr, dass Daten verloren gehen oder der Sensor vorübergehend überlastet wird. Die Aufbewahrung von FPC-Daten nach Umfang lässt sich einfacher handhaben und ist auch von Natur aus gegen Spitzen abgesichert. Bei dieser Methode bestimmen Sie den maximalen Betrag an Festplattenplatz, den FPC-Daten einnehmen können. Sobald dieser Grenzwert erreicht ist, werden die ältesten FPC-Daten entfernt, um Platz für die neuen zu machen. Wie bereits erwähnt, ist diese Funktion in Daemonlogger bereits eingebaut. 5.5 Die FPC-Datenerfassung planen 155 5.5.2 Den Durchsatz an der Sensorschnittstelle mit Netsniff-NG und Ifpps berechnen Wir haben schon mehrfach erwähnt, dass es für die Erfassung und Speicherung von FPC-Daten erforderlich ist, den Durchsatz an der Überwachungsschnittstelle des Sensors zuverlässig zu bestimmen. Im Folgenden sehen wir uns an, wie Sie Durchsatzstatistiken berechnen können. Eine Möglichkeit dazu bietet das in der Netsniff-NG-Suite enthaltene Tool Ifpps. In Security Onion wird Netsniff-NG allerdings ohne Ifpps installiert. Wenn Sie die Erklärungen in diesem Abschnitt nachvollziehen möchten, müssen Sie es daher wie folgt manuell nachinstallieren: 1. Installieren Sie mit apt die Voraussetzung libncurses-dev. sudo apt-get install libncurses-dev 2. Laden Sie Netsniff-NG mit git herunter. git clone https://github.com/borkmann/netsniff-ng.git 3. Konfigurieren, erstellen und installieren Sie nur Ifpps. ./configure make && sudo make install ifpps_install Um sich die möglichen Argumente für Ifpps anzeigen zu lassen, führen Sie es mit dem Argument -h aus. Wenn Sie dagegen gleich loslegen wollen, verwenden Sie den folgenden Befehl, der ständig aktualisierte Netzwerkstatistiken anzeigt: iffpss -d <Schnittstelle> Diese Statistiken geben den aktuellen Durchsatz an der angegebenen Schnittstelle sowie Daten zur CPU, zur Festplatten-E/A und anderen Gesichtspunkten des Systems an. Ein Beispiel dafür sehen Sie in Abb. 5.4. 156 5 FPC-Daten Abbildung 5.4: Netzwerkstatistiken mit Ifpps gewinnen Das Einheit .../t gibt an, dass die Werte auf das Zeitintervall bezogen sind, das oben rechts angezeigt wird und das Sie mit der Option -t festlegen können. Der Standardwert beträgt 1000 ms. Ifpps zeigt Ihnen eine Momentaufnahme des Durchsatzes an der Schnittstelle. Bei einer umfangreichen Stichprobe kann diese Statistik sehr nützlich sein. Bei dieser Methode müssen Sie aber sicherstellen, dass Sie genügend Stichproben von Spitzen- und ruhigen Zeiten aufnehmen, um daraus den durchschnittlichen Durchsatz zu bestimmen. Leider ist der Funktionsumfang von Ifpps eingeschränkt. Sie können keine Filter anwenden, weshalb dieses Tool nicht so gut geeignet ist, wenn Sie, wie weiter hinten erklärt, die FPC-Erfassung verschlanken wollen. 5.5.3 Den Durchsatz an der Sensorschnittstelle mithilfe von Sitzungsdaten berechnen Die wahrscheinlich flexibelste Möglichkeit, Durchsatzstatistiken zu berechnen, bieten die Sitzungsdaten. Im Folgenden sehen wir uns an einem Beispiel an, wie Sie das mit den SiLK-Tools Rwfilter, Rwcount und Rwstats tun können. Als Erstes wählen wir mit Rwfilter die Daten eines bestimmten Zeitintervalls aus. Am einfachsten ist es, die Daten eines Geschäftstags zu erfassen: rwfilter --start-date=2013/10/04 --proto=0- --type=all --pass=daily.rw Durch diesen sehr einfachen Filter werden alle am 4. Oktober erfassten Sitzungsdaten ausgewählt und in der Datei daily.rw gespeichert. Mit dem folgenden Befehl können Sie sich eine Stichprobe der Daten in dieser Datei ansehen: cat daily.rw | rwcut | head 5.5 Die FPC-Datenerfassung planen 157 Nun können wir ermitteln, wie viele Daten über die Verbindung übertragen wurden. Daher rufen wir Rwcount für die ausgewählten Daten auf: cat daily.rw | rwcount --bin-size=60 Dieser Befehl leitet die gefilterte Datenmenge an das Tool Rwcount weiter, das einen Überblick darüber ausgibt, wie viele Daten pro Minute durch den Sensor laufen. Das Zeitintervall wird durch die Einstellung --bin-size bestimmt, die angibt, dass die Daten in Abschnitte von je 60 s gegliedert werden sollen. Das Ergebnis sehen Sie in Abb. 5.5. Abbildung 5.5: Datendurchsatz pro Minute außerhalb von Spitzenzeiten In der Abbildung können Sie erkennen, dass wir in den ruhigen Zeiten um 0.00 Uhr UTC (was 20.00 EST, also Ortszeit, entspricht) einen Durchsatz von ca. 1,5 GB pro Minute haben. In Abb. 5.6 wird deutlich, dass der Datenverkehr zu Spitzenzeiten, also um 17.00 UTC (15.00 Uhr Ortszeit), auf 8 bis 9 GB pro Minute anwächst. 158 5 FPC-Daten Abbildung 5.6: Datendurchsatz pro Minute in Spitzenzeiten Um den durchschnittlichen Durchsatz an einem Tag zu bestimmen, erhöhen Sie zunächst den Wert von --bin-size auf 86.400 s, sodass sämtliche Daten eines Tages in ein einziges Intervall fallen: cat daily.rw | rwcount --bin-size=86400 Das Ergebnis sehen Sie in Abb. 5.7. Abbildung 5.7: Die Gesamtmenge der Daten an einem Tag Insgesamt haben wir an diesem Tag ein Verkehrsaufkommen von 4.915.977.947.088,87 Byte. Um diese Zahl besser handhabbar zu machen, teilen wir sie dreimal durch 1024 (4.915.977.947.088,87 x 1024-3), sodass wir zu 4578,36 GB kommen. Um den durchschnittlichen Durchsatz des Tages zu bestimmen, müssen wir dieses Gesamtaufkommen durch das gewünschte Zeitintervall teilen. Wenn Sie den Durchsatz in Bytes pro Minute haben wollen, dividieren Sie den Wert durch 1440 Minuten. Für den Durchsatz in Bytes pro Sekunde müssen Sie eine Division durch 86.400 Sekunden ansetzen. Die Ergebnisse lauten 3,18 GB/Minute bzw. 54,26 MB pro Sekunde. Bei diesen Berechnungen wurden alle Zahlen auf zwei Dezimalstellen gerundet. 5.6 Den Speicherbedarf für FPC-Daten senken 159 5.6 Den Speicherbedarf für FPC-Daten senken Es wäre ideal, FPC-Daten für jeden Host, jeden Port und jedes Protokoll in Ihrem Netzwerk zu erfassen und lange Zeit zu speichern. In der Praxis gibt es jedoch Budgetgrenzen und andere Einschränkungen, die das verhindern, sodass wir gezwungen sind, die Menge der erfassten Daten zu verringern. Im Folgenden lernen Sie verschiedene Maßnahmen kennen, um die Menge der aufbewahrten FPC-Daten zu verringern, sodass Sie den Speicherplatz für Zwecke des Network Security Monitoring bestmöglich ausnutzen können. 5.6.1 Dienste ausschließen Die erste und einfachste Methode, die Menge der gespeicherten FPC-Daten zu verringern, besteht darin, den von bestimmten Diensten generierten Datenverkehr auszuschließen. Eine Möglichkeit, herauszufinden, welche Dienste sich dafür anbieten, besteht in der Verwendung von Rwstats. Dieses Tools zeigt ausführlich an, welchen Anteil die Daten über einzelne Ports, Protokolle und Hosts am Gesamtumfang der FPC-Datenspeicherung haben. Eine ausführliche Beschreibung von Rwstats finden Sie in Kapitel 11, doch wir wollen uns hier schon mit zwei Rwstat-Befehlen beschäftigen, mit denen wir die Ports bestimmen können, an denen die größte Menge von ein- und ausgehendem Verkehr anfällt. Als Erstes ermitteln wir mit Rwstats die Ports, die für den Großteil der eingehenden Kommunikation in unserem Netzwerk verantwortlich sind. Dazu verwenden wir folgenden Befehl: cat daily.rw | rwstats --fields=sport --top --count=5 --value=bytes Dieser Befehl übergibt unsere ursprüngliche Datenmenge an Rwstats, das die ersten fünf (--top --count=5) Quellports (--fields=sport) mit dem größten Aufkommen an Datenverkehr in Byte (--value=bytes) ermittelt. Das Ergebnis sehen Sie in Abb. 5.8. Abbildung 5.8: Die kommunikationsintensivsten Quellports Wie Sie sehen, fällt der Großteil des Datenverkehrs in diesem Netzwerksegment an Port 80 an, der für HTTP zuständig ist. Genauer gesagt, macht der HTTP-Datenverkehr 44 % des Verkehrsaufkommens aus. Da der HTTP-Datenverkehr für die NSM-Erkennung und -Analyse von unschätzbarem Wert ist, dürfen wir natürlich nicht darauf verzichten. 160 5 FPC-Daten In der nächsten Zeile können Sie jedoch erkennen, dass mehr als 16 % der insgesamt übertragenen Daten vom Quellport 443 ausgingen. Um uns einen Gesamtüberblick zu verschaffen, sehen wir uns wie folgt auch die verkehrsreichsten fünf Zielports an: cat daily.rw | rwstats --fields=dport --top --count=5 --value=bytes Die Ausgabe dieses Befehls sehen Sie in Abb. 5.9. Abbildung 5.9: Die kommunikationsintensivsten Zielports Daraus können Sie ablesen, dass 4 % des Datenverkehrs an den TCP-Port 443 geht. Daraus folgt, dass an 20,9 % des Datenverkehrs an dem untersuchten Geschäftstag über diesen Port abgewickelt wurde. Wenn wir den TCP-Datenverkehr über Port 443 herausfiltern, können wir damit die Aufbewahrung von FPC-Daten durchschnittlich um 20,9 % pro Geschäftstag steigern. Gewöhnlich schließen Organisationen auch verschlüsselte Daten im Rahmen der HTTPSKommunikation von der Erfassung aus. Die Headerinformationen der verschlüsselten Daten und die zugehörigen Statistiken sind für Untersuchungen verwendbar, die verschlüsselten Daten selbst jedoch meistens nicht. Das ist ein gutes Beispiel dafür, wie Sie eine wirtschaftlichere Speicherung von FPC-Daten erreichen können, indem Sie auf die Aufbewahrung von Daten verzichten, die Ihnen ohnehin nicht weiterhelfen können. Nachdem wir den Datenverkehr über TCP-Port 443 ausgeschlossen haben, können wir unsere frühere Durchsatzberechnung wiederholen, um herauszufinden, wie stark die Verringerung ist. Dazu ändern wir die vorhandene Datenmenge, indem wir mit Rwfilter jeglichen TCP-443-Datenverkehr aus der Datei daily.rw ausschließen: cat daily.rw | rwfilter --input-pipe=stdin --aport=443 --fail=stdout| rwcount --bin-size=86400 Dieser Befehl übergibt die vorhandene Datenmenge daily.rw an einen weiteren Filter, der alle Einträge mit dem Quell- oder Zielport 443 herausnimmt. Anschließend werden diese bereinigten Daten an Rwcount übergeben, um eine gefilterte Statistik der Daten darzustellen, die die Sensorschnittstelle durchlaufen (siehe Abb. 5.10). 5.6 Den Speicherbedarf für FPC-Daten senken 161 Abbildung 5.10: Gesamtes Datenaufkommen des Tages ohne TCP-443-Datenverkehr Diese Statistik gilt für die gleiche Datenmenge, allerdings unter Ausschluss des TCP-Verkehrs an Port 443. Bei der Berechnung des Durchsatzes kommen wir auf Werte von 2,52 GB/Minute bzw. 42,9 MB/s. Das Herausnehmen des TCP-443-Datenverkehrs hat also tatsächlich zu einer Verringerung der Datengesamtmenge um ca. 20,9 % während eines Geschäftstages geführt. Auf die gleiche Weise können Sie auch bei anderen Ports vorgehen, die verschlüsselte Daten übertragen, z. B. für verschlüsselte VPN-Tunnel. Der Ausschluss verschlüsselter Daten von der FPC-Datenerfassung mag nicht für jede Organisation geeignet sein, ist aber ein gutes Beispiel dafür, wie Sie die Anforderungen für die FPC-Datenspeicherung verringern, indem Sie auf die Aufbewahrung der Daten für bestimmte Dienste verzichten. Das zahlt sich auch später aus, wenn Sie die FPC-Daten durchgehen, um daraus die sekundären Datentypen zu erstellen, und wenn Sie sie zur Erkennung und Analyse untersuchen. Es gibt aber weitere Möglichkeiten, die Speicherlast durch FPC-Daten zu verringern. 5.6.2 Kommunikation zwischen bestimmten Hosts ausschließen Eine weitere Möglichkeit, die Menge der gespeicherten FPC-Daten zu verringern, besteht darin, die Kommunikation zwischen bestimmten Hosts nicht aufzubewahren. Da wir bereites wissen, wie stark der Datenverkehr durch den Verzicht auf die TCP443-Kommunikation reduziert wird, nehmen wir diese Daten gleich aus unserem nächsten Beispiel heraus. Wie Sie schon im vorherigen Beispiel gesehen haben, können wir alles herausfiltern, was bestimmten Kriterien genügt. In diesem Beispiel nutzen wir das aus und sehen uns nur die kommunikationsintensivsten Quell- und Zieladressen für den Datenverkehr an, der nicht über Port 443 läuft: cat daily.rw | rwfilter --input-pipe=stdin --aport=443 --fail-=stdout| rwstats --fields=sip,dip --top --count=5 --value=bytes Dieser Befehl leitet unsere vorhandene Datenmenge durch einen Filter, der den gesamten TCP-443-Datenverkehr entfernt, und übergibt die Daten dann an Rwstats, das die kommunikationsintensivsten Paare von Quell- und Zieladressen (--fields=sip,dip) nach der übertragenen Datenmenge in Byte (--value=bytes) bestimmt. Das Ergebnis sehen Sie in Abb. 5.11. 162 5 FPC-Daten Abbildung 5.11: Die kommunikationsintensivsten Paare von IP-Adressen Wie Sie sehen, erfolgen 19 % der Kommunikation in diesem Netzwerksegment zwischen den Hosts mit den Adressen 141.239.24.49 und 200.7.118.91. Um zu bestimmen, ob die Kommunikation zwischen diesen Geräten ein guter Kandidat für den Ausschluss aus der FPC-Datenerfassung ist, müssen Sie jedoch noch etwas mehr nachforschen. Im Idealfall haben Sie Informationen über den internen Host, für den Sie verantwortlich sind, und können den Dienst identifizieren, der für das hohe Aufkommen an Datenverkehr sorgt. Eine Möglichkeit, das mit Rwstats zu tun, bietet folgende Abfrage: cat daily.rw | rwfilter --input-pipe=stdin --saddress=141.239.24.49 --daddress=200.7.118.91 --pass=stdout| rwstats --fields=sport --top --count=10 --value=bytes Das Ergebnis sehen Sie in Abb. 5.12. Abbildung 5.12: Die Kommunikation zwischen zwei Hosts untersuchen Demnach tritt die gesamte Kommunikation an Port 22 auf. Unter der Voraussetzung, dass es sich um eine rechtmäßige Verbindung handelt, bedeutet das, dass es ein SSH-VPN zwischen den beiden Geräten gibt. Falls Sie nicht in der Lage sind, diesen Datenverkehr zu entschlüsseln und zu überwachen (z. B. durch einen zwischengeschalteten Proxy), dann ist diese Verbindung ein guter Kandidat dafür, von der FPC-Datenerfassung ausgeschlossen zu werden. Den gezeigten Vorgang können Sie anschließend für andere kommunikationsintensive Hosts im Netzwerk wiederholen. Mit den vorgestellten Verfahren haben wir die Menge der zu speichernden FPC-Daten um ca. 40 % verringert, was bedeutet, dass der Sensor 40 % mehr brauchbare Daten aufbewahren kann. Leider können wir keine allgemein gültigen Beispiele für die Dinge anführen, die Sie in jedem Netzwerk aus der FPC-Datenspeicherung herausnehmen können, 5.7 Die Aufbewahrung der FPC-Daten verwalten 163 da dies je nach Netzwerk und nach den Zielen der Organisation sehr unterschiedlich sein kann. Wenn Sie die Anleitungen aus Kapitel 2 zur Planung der Datenerfassung befolgen, kann Ihnen das jedoch bei diesen Entscheidungen helfen. Vorsicht Zu Beginn dieses Kapitels haben wir gesagt, dass häufig viele andere Datentypen aus FPC-Daten abgeleitet werden, beispielsweise PSTR-Daten. Wenn das in Ihrer Umgebung der Fall ist, dann müssen Sie dies bedenken, wenn Sie bestimmte Arten von Daten aus der FPC-Erfassung herausnehmen. Nehmen wir beispielsweise an, Sie gewinnen aus den FPC-Daten PSTR-Daten. Wenn Sie dann den Datenverkehr über Port 443 ausschließen, können Sie keine Paketstrings für den HTTPS-Handshake generieren, was zu einem blinden Fleck in Ihrer Sicht auf das Netzwerk führt. Bei beschränktem Platz lässt sich das möglicherweise nicht vermeiden, aber wenn Sie diese PSTR-Daten trotzdem aufbewahren möchten, müssen Sie eine andere Möglichkeit finden, sie zu gewinnen, etwa indem Sie sie über einen anderen Prozess direkt an der Verbindung erfassen. 5.7 Die Aufbewahrung der FPC-Daten verwalten Da FPC-Daten pro Sekunde mehr Festplattenplatz verbrauchen als andere Datentypen, steht zu befürchten, dass sie Ihren Sensor überlasten, wenn Sie die Aufbewahrung und das Überschreiben älterer Daten nicht richtig einrichten. Ich habe selbst in erfahrenen Organisationen Situationen erlebt, in denen die FPC-Daten beim Auftreten von Datenspitzen schneller auf die Festplatte geschrieben wurden, als sie gelöscht werden konnten. Das kann eine ganze Reihe übler Auswirkungen haben. Sie sollten die FPC-Daten auf einem anderen Volume als dem Betriebssystem unterbringen, um das Schlimmste zu verhindern. Aber auch wenn die FPC-Daten auf einem freigegebenen, dynamisch erweiterten virtuellen Datenträgern abgelegt werden, kann eine anhaltende Spitze dazu führen, dass andere virtuelle Geräte der erforderlichen Ressourcen beraubt werden, was letzten Endes einen Systemabsturz verursachen kann. Es gibt Dutzende von möglichen Vorfällen, die zu den berüchtigten Anrufen des Systemadministrators um 2 Uhr morgens führen. Da niemand gern einen solchen Anruf tätigen möchte, beschäftigen wir uns in diesem Abschnitt mit der Verwaltung von FPC-Daten, und zwar insbesondere mit dem Entfernen alter Daten. Es gibt verschiedene Möglichkeiten zur Verwaltung von FPC-Daten. Was wir uns im Folgenden ansehen werden, ist eine einfache Vorgehensweise, für die nur Werkzeuge gebraucht werden, die in den meisten Linux-Distributionen enthalten sind. Diese Tools sind nicht nur sehr wirkungsvoll, es lassen sich auch sehr einfach Skripte dafür erstellen. Einige der hier beschriebenen Techniken mögen vielleicht nicht ganz passend für Ihre Umgebung sein, aber sie lassen sich relativ leicht anpassen. 164 5 FPC-Daten Wir haben bereits zwei Aufbewahrungsstrategien für FPC-Daten kennengelernt, nämlich die Aufbewahrung nach Zeit und nach Umfang. Dafür gibt es auch jeweils eigene Verwaltungsmethoden. 5.7.1 Aufbewahrung nach Zeit Die Aufbewahrung nach Zeit lässt sich sehr einfach und automatisch verwalten. Das ­Linux-Dienstprogramm find kann Dateien aufspüren, die vor einer bestimmten Zeit zum letzten Mal geändert wurden. Um beispielsweise alle Dateien im Verzeichnis /data/pcap/ zu finden, die älter als 60 Minuten sind, müssen Sie lediglich folgenden Befehl ausführen: find /data/pcap -type f -mtime +60 Mithilfe dieses Befehls könne Sie eine Liste der PCAP-Dateien aufstellen, die gelöscht werden sollen. Um die Daten, die das Kriterium erfüllen, automatisch zu entfernen, kombinieren Sie den Befehl mit xargs. Mit der folgenden einfachen Zeile löschen Sie jegliche Daten, die älter als 60 Minuten sind: find /data/pcap -type f -mtime +60 | xargs -i rm {} 5.7.2 Aufbewahrung nach Umfang Bei der Aufbewahrung nach Umfang ist die Verwaltung etwas schwieriger. Bei dieser Methode werden die ältesten PCAP-Dateien gelöscht, sobald das Speichervolumen einen bestimmten Prozentsatz des Festplattenplatzes übersteigt. Je nachdem, wie Sie die FPC-Datenerfassung eingerichtet haben, kann es ziemlich knifflig sein, dies umzusetzen. Daemonlogger kann diese Art der Datenbereinigung selbstständig vornehmen, aber wenn Sie ein Werkzeug einsetzen, dass nicht über diese Funktion verfügt, müssen Sie etwas mehr Gehirnschmalz aufwenden. Eine Möglichkeit besteht darin, ein bash-Skript wie das folgende zu verwenden: #!/bin/bash ## Dieses Skript löscht PCAP-Daten, wenn ihr prozentualer Anteil am insgesamt ## verfügbaren Speicherplatz den vordefinierten Grenzwert erreicht. Der ## Einheitlichkeit halber wird für alle PCAP-Datenquellen derselbe Grenzwert ## verwendet. Die Einstellungen finden Sie im Konfigurationsabschnitt am Ende ## des Skripts. 5.7 Die Aufbewahrung der FPC-Daten verwalten 165 # Beispielkonfiguration ## Konfiguration der Datenlöschung #dir="/data/pcap/eth1/" #percentage=1 #datamanage $dir $percentage #dir="/data/pcap/eth2/" #percentage=3 #datamanage $dir $percentage ################################################################## ## FUNKTION ####################################################### ################################################################## totaldiskspace=$(df | grep SOsensor-root | awk '{print $2}') function datamanage { # Erste Datenbewertung datadirectory="$1" datapercent="$2" datasize=$(du -s $datadirectory | awk '{print $1}') diskstatus=$(df | grep SOsensor-root | awk '{print $5}' | egrep -o '[0-9]{1,3}') datapercentusage=$(echo "scale=2; $datasize / $totaldiskspace * 100" | bc | sed 's/\..*//g') echo "Data usage in $datadirectory is at $datapercentusage% of hard drive capacity)" # Prozedur zur Datenlöschung while [ "$datapercentusage" -gt "$datapercent" ]; do filestodelete=$(ls -tr1 $datadirectory | head -20) printf %s "$filestodelete" | while IFS=read -r ifile do echo $ifile if [ -z $datadirectory$ifile ]; then exit fi echo "Data usage in $data directory ($datapercentusage%) is greater than your desired amount ($datapercent% of hard drive)" echo "Removing $datadirectory$ifile" sudo rm -rf $datadirectory$ifile du -s $datadirectory # datasize=$(du -s $datadirectory | awk '{print $1}') done datasize=$(du -s $datadirectory | awk '{print $1}') 166 5 FPC-Daten datapercentusage=$(echo “scale=2; $datasize / $totaldiskspace * 100” | bc | sed ‘s/\..*//g’) du -s $datadirectory datasize=$(du -s $datadirectory | awk ‘{print $1}’) datapercentusage=$(echo "scale=2; $datasize / $totaldiskspace * 100" | bc | sed 's/\..*//g') done } # Konfiguration der Datenlöschung pidofdiskclean=$(ps aux | grep diskclean.sh | wc -l) echo $pidofdiskclean if [ "$pidofdiskclean" -le "4" ]; then dir="/data/pcap/eth1/" percentage=40 datamanage $dir $percentage dir="/data/pcap/eth2/" percentage=40 datamanage $dir $percentage wait echo "" fi Um dieses Skript nutzen zu können, müssen Sie den Namen des Volumes angeben, auf dem die Daten gespeichert werden sollen. Dazu bearbeiten Sie die Variable dir. Außerdem müssen Sie im Konfigurationsabschnitt am Ende des Skripts die Verzeichnisse angeben, in denen die PCAP-Daten gespeichert sind, sowie den Betrag an leerem Pufferplatz, den Sie auf dem Volume vorhalten möchten. Anhand dieser Variablen bestimmt das Skript den Prozentsatz des verfügbaren Speicherplatzes, den die Daten einnehmen. Übersteigt dieser Prozentsatz den zulässigen Grenzwert, entfernt das Skript die ältesten Dateien, bis wieder eine akzeptable Nutzung des Speicherplatzes erreicht ist. Dieses Skript können Sie mit einem cron-Job regelmäßig ausführen lassen, sei es stündlich, alle zehn Minuten oder gar alle 60 Sekunden. Wie oft Sie das Skript ausführen müssen, hängt davon ab, wie viel Speicherplatz Sie freihalten wollen und wie groß der Durchsatz ist. Wenn Sie bei hohem Durchsatz nur 5 % Reserveplatz einräumen, müssen Sie das Skript praktisch permanent ausführen, damit die Festplatte bei Spitzen nicht gefüllt wird. Haben Sie dagegen eine Reserve von 30 % und nur wenig Durchsatz auf der überwachten Verbindung, kann es ausreichen, dass Skript nur stündlich auszuführen. In dem erstgenannten Fall, also bei starker Belastung des Sensors und stark eingeschränktem Pufferplatz, kann es vorkommen, dass der cron-Job nicht schnell genug ausgeführt wird, um 5.7 Die Aufbewahrung der FPC-Daten verwalten 167 die ältesten Dateien zu löschen. Selbst wenn Sie das Skript kontinuierlich ausführen, etwa über einen Ruhezustandstimer, besteht die Gefahr, dass das Skript bei der Berechnung der Festplattenbelegung zu langsam ist. Daher ist es oft am besten, das Skript bei einem Übersteigen des Grenzwerts gleich die zehn ältesten Dateien löschen zu lassen statt nur eine. Das kann die Leistung des Skripts erheblich verbessern, führt aber zu einer (leichten) Verringerung der Aufbewahrungsdauer. Das folgende Skript geht auf diese Weise vor: #!/bin/bash #!/bin/bash ## Dieses Skript löscht PCAP-Daten, wenn ihr prozentualer Anteil am insgesamt ## verfügbaren Speicherplatz den vordefinierten Grenzwert erreicht. Der ## Einheitlichkeit halber wird für alle PCAP-Datenquellen derselbe Grenzwert ## verwendet. Die Einstellungen finden Sie im Konfigurationsabschnitt am Ende ## des Skripts. # Beispielkonfiguration ## Konfiguration der Datenlöschung #dir="/data/pcap/eth6/" #percentage=1 #datamanage $dir $percentage #dir="/data/pcap/eth7/" #percentage=3 #datamanage $dir $percentage ################################################################## ## FUNKTION ####################################################### ################################################################## totaldiskspace=$(df | grep SOsensor-root | awk '{print $2}') function datamanage { # Initial data evaluation datadirectory="$1" datapercent="$2" datasize=$(du -s $datadirectory | awk '{print $1}') diskstatus=$(df | grep SOsensor-root | awk '{print $5}' | egrep -o '[0-9] {1,3}') datapercentusage=$(echo "scale=2; $datasize / $totaldiskspace * 100" | bc | sed 's/\..*//g') echo "Data usage in $datadirectory is at $datapercentusage% of hard drive capacity)" 168 5 FPC-Daten # Data Removal Procedure while [ “$datapercentusage” -gt “$datapercent” ]; do filestodelete=$(ls -tr1 $datadirectory | head - 10) echo $filestodelete printf %s “$filestodelete” | while IFS=read -r ifile do echo $ifile if [ -z $datadirectory$ifile ]; then exit fi echo "Data usage in $datadirectory ($datapercentusage%) is greater than your desired amount ($datapercent% of hard drive)" echo "Removing $datadirectory$ifile" sudo rm -rf $datadirectory$ifile done datasize=$(du -s $datadirectory | awk '{print $1}') datapercentusage=$(echo "scale=2; $datasize / $totaldiskspace * 100" | bc | sed 's/\..*//g') done } # Konfiguration der Datenlöschung pidofdiskclean=$(ps aux | grep diskclean.sh | wc -l) echo $pidofdiskclean if [ "$pidofdiskclean" -le "4" ]; then # Konfiguration der Datenlöschung dir='/data/pcap/eth1/' percentage=10 datamanage $dir $percentage dir="/data/pcap/eth2/" percentage=10 datamanage $dir $percentage wait fi Es kann sein, dass diese Codebeispiele nicht unmittelbar in Ihrer Umgebung anwendbar sind, aber sie bieten sicherlich eine Grundlage, die Sie an Ihre Bedürfnisse der Datenerfassung anpassen können. Schauen Sie sich auch die Skripte an, mit denen Security Onion die Aufbewahrung von Paketdaten verwaltet. Diese Skripte nutzen ähnliche Techniken, setzen sie aber in leicht abweichender Weise ein. 5.8 Zusammenfassung 169 5.8 Zusammenfassung FPC-Daten geben Ihnen die gründlichste und umfassendste Darstellung von Netzwerkdaten, die Sie erfassen können. Sie sind schon für sich genommen äußerst nützlich, aber ihr Wert steigt noch dadurch, dass viele andere Datentypen von ihnen abgeleitet werden können. In diesem Kapitel haben wir uns verschiedene Technologien angesehen, um FPCDaten zu erfassen und zu speichern. Wir haben auch verschiedene Techniken zur effizienten Erfassung von FPC-Daten, zur Reduzierung der Menge von erfassten FPC-Daten und zur Löschung alter Daten angesehen. Im Rest des Teils über die Datenerfassung wollen wir uns nun damit beschäftigen, wie Sie aus diesen FPC-Daten andere Datentypen gewinnen können. 6 Paketstringdaten Viele NSM-Teams sehen sich dem Problem gegenüber, dass bei einer rückblickenden Analyse – also nach mehreren Tagen – keine ausreichenden Datenmengen für eine sinnvolle Untersuchung mehr vorhanden sind. Im Idealfall erfasst eine Organisation sowohl FPCals auch Sitzungsdaten, doch leider weisen Sitzungsdaten nicht den Detaillierungsgrad auf, um mit ihrer Hilfe genau zu bestimmen, was bei dem Netzwerkverkehr im Einzelnen geschehen ist, während die FPC-Daten aufgrund ihrer Anforderungen an den Speicherplatz nicht länger als wenige Tage oder allerhöchstens zwei Wochen aufbewahrt werden, sodass sie für eine rückblickende Analyse nicht zur Verfügung stehen. Daher kann es vorkommen, dass wir Daten aus einem Zeitraum untersuchen müssen, für den die Aufbewahrungszeit der FPC-Daten längst abgelaufen ist, sodass uns nur Sitzungsdaten zur Verfügung stehen, die aber viele Frage unbeantwortet lassen. Beispielsweise ist es nur mithilfe von Sitzungsdaten nicht möglich, folgende Aufgaben durchzuführen, die bei einer rückblickenden Analyse häufig erforderlich sind: •• Einen HTTP-Benutzeragenten identifizieren, der zu einem neu ermittelten Angreifer gehört •• Die Benutzer ermitteln, die eine Phishing-E-Mail erhalten haben, mit deren Hilfe ein Einbruch erfolgte •• Nach Dateidownloads suchen, die nach kürzlich erkannten und möglicherweise gefährlichen HTTP-Anforderungen erfolgten 172 6 Paketstringdaten Eine Lösung für dieses Problem besteht darin, Paketstringdaten (PSTR) zu erfassen. In diesem Kapitel sehen wir uns an, was PSTR-Daten sind und wie sie manuell oder mit Tools wie Httpry und Justniffer erfasst werden können. Der Erfassungsvorgang ist zwar einfach und die Daten selbst sind sehr vielseitig nutzbar, aber das Prinzip ist relativ neu, sodass es noch nicht viele Organisationen gibt, die diesen Datentyp verwenden. Da sie einerseits ebenso viele Kontextinformationen liefern wie FPC-Daten, andererseits aber auch den Geschwindigkeitsvorteil, die geringeren Speicheranforderungen und die statistische Analysierbarkeit von Sitzungsdaten bieten, stellen sie den besten Kompromiss zwischen FPC- und Sitzungsdaten dar, der sich sowohl für die Echtzeit- als auch die rückblickende Analyse erzielen lässt. 6.1 Was sind Paketstringdaten? Wie Sie »Paketstringdaten« definieren, hängt gewöhnlich davon ab, wie Sie sie verwenden. Grob gesagt, handelt es sich um eine Auswahl von wichtigen, für Menschen lesbaren Daten aus den vollständigen FPC-Daten. Diese Daten können unterschiedliche Formen annehmen. Manche Organisationen generieren PSTR-Daten in einem bestimmten Format, um damit die Headerdaten gebräuchlicher Protokolle der Anwendungsschicht (wie HTTP und SMTP) ohne die unnötigen Payloaddaten darzustellen. Ich habe hier bewusst »unnötig« gesagt, da es bei der Analyse von PSTR-Daten nicht darum geht, Dateien zu extrahieren oder den Datenverkehr Byte für Byte zu untersuchen, sondern um den Analytikern eine Momentaufnahme der Daten zu präsentieren, anhand der sie die Fragen klären können, die bei der rückblickenden Analyse aufgetreten sind. Ein Beispiel dieser Art von PSTR-Daten sehen Sie in Abb. 6.1. Abbildung 6.1: PSTR-Protokolldaten, die eine HTTP-Anforderung und -Antwort zeigen 6.1 Was sind Paketstringdaten? 173 Diese Abbildung gibt ein Beispiel für die Daten, die gewöhnlich für die rückblickende Analyse verwendet werden. Die beiden PSTR-Datensätze zeigen die vollständigen Anforderungs- und Antwortheader für eine einzelne HTTP-Kommunikationssequenz. Die Datenerfassung in diesem Beispiel ist ziemlich umfassend und speichert eine große Menge der Informationen aus den Headern der Anwendungssschicht. In dem Beispiel aus Abb. 6.2 dagegen wird nur ein einziges Feld gespeichert. Abbildung 6.2: PSTR-Protokolldaten, die nur den angeforderten URL zeigen In diesem Beispiel werden nur die HTTP-URL-Anforderungen als PSTR-Daten gespeichert. Viele Organisationen bewahren PSTR-Daten zunächst nur für die rückblickende Analyse auf, doch in diesem Beispiel werden sie in beinahe Echtzeit erfasst. Dadurch können die Daten mehreren Zwecken dienen, unter anderem auch für automatische reputationsbasierte Erkennungsmechanismen, wie wir sie in Kapitel 8 betrachten werden. Damit lässt sich die gleiche Aufgabe viel schneller erledigen als mit der Untersuchung von FPCDaten. Eine dritte mögliche Variante besteht darin, sich ganz auf die Payloaddaten des Pakets zu konzentrieren, die auf den Header der Anwendungsschicht folgen. Dabei wird eine eingeschränkte Menge von Nichtbinärbytes der Payload erfasst, um eine Vorstellung von dem Zweck des Pakets zu gewinnen. Einfach ausgedrückt: Stellen Sie sich vor, Sie würden das Unix-Werkzeug strings auf Paketdaten anwenden. Ein Beispiel für diese Art von Daten sehen Sie in Abb. 6.3. Es handelt sich dabei um eine Momentaufnahme der für Menschen lesbaren Daten, die bei den Surfvorgängen eines Benutzers aufgetreten sind. Insbesondere können Sie erkennen, welche Seite besucht wurde, wobei jedoch nicht sehr viele Einzelheiten angegeben sind. Da nicht lesbare Zeichen gar nicht erst gespeichert werden, ermöglicht dies eine wirtschaftliche Datenspeicherung. Der Nachteil besteht jedoch in dem Zusatzaufwand, den die Generierung von PSTR-Payloaddaten erfordert. Außerdem werden dabei auch eine Menge überflüssiger Daten erfasst, denn nur weil sich ein Byte in ein lesbares ASCII-Zeichen übersetzen lässt, muss es noch lange keinen Sinn ergeben. Das können Sie an der Menge der zufälligen Zeichen erkennen, mit denen die Anzeige in der Abbildung übersät ist. Die Speicherung dieser zusätzlichen, aber unnützen Bytes stellt eine überflüssige Belastung dar. Des Weiteren gibt es nur wenige rationelle Methoden, um PSTR-Payloaddaten zu generieren, weshalb Sie fast immer auf selbst geschriebene Skripte oder andere Hilfsprogramme zurückgreifen müssen. Daher kommt das Kosten/Nutzen-Verhältnis dieser Daten nicht unbedingt dem anderer Daten- 174 6 Paketstringdaten typen gleich, die mit einfacheren Werkzeugen generiert werden können. Das beste Kosten/ Nutzen-Verhältnis bei mehrzeiligen PSTR-Formaten erzielen Sie mit Protokolldaten wie denen mit den Anforderungs- und Antwortheadern in Abb. 6.1. Abbildung 6.3: PSTR-Payloaddaten 6.2 PSTR-Datenerfassung Wir haben uns bereits mit der FPC-Datenerfassung beschäftigt, und da FPC für »full packet capture« steht, könnten wir PSTR-Daten als »partial packet capture«, also als eine Teilerfassung von Paketen ansehen. Daher ist es nicht überrraschend, dass manche Organisationen die PSTR-Daten aus den ohnehin schon erfassten FPC-Daten gewinnen. Es ist jedoch auch möglich, PSTR-Daten auf ähnliche Weise die FPC-Daten direkt an dem überwachten Port eines Sensors zu erfassen. Wie auch immer Sie vorgehen, so ist es doch von großem Vorteil, die Erfassung an derselben Quelle durchzuführen wie die der anderen Daten, also auf dem NSM-Sensor. Dadurch vermeiden Sie Korrelationsfehler bei der Analyse. So habe ich beispielsweise schon Organisationen gesehen, die ihre PSTR-Daten über die HTTP-Kommunikation von Gerä- 6.2 PSTR-Datenerfassung 175 ten zur Filterung von Webinhalten bezogen. Dabei kann es geschehen, dass das Segment, das der Webfilter beobachtet, nicht mit dem NSM-Sichtfeld übereinstimmt, für das sich die Analytiker interessieren, weshalb die Daten nichts zur Analyse beitragen können. Außerdem haben Sie die volle Kontrolle über die PSTR-Daten, wenn Sie sie auf Ihrem NSMSensor erfassen oder generieren. Falls Sie die Daten von einem anderen Gerät beziehen, insbesondere dem eines Drittanbieters, müssen Sie sich mit den Daten zufrieden geben, die der betreffende Hersteller zur Verfügung stellt, da die Daten intern schon einer nicht offensichtlichen Filterung unterzogen werden können. Wie bei allen NSM-Daten müssen Sie auch bei der Erstellung und Untersuchung von PSTR-Daten eine schon paranoide Wachsamkeit an den Tag legen. Bevor wir mit der Erfassung oder Generierung von PSTR-Daten beginnen können, müssen wir einige Überlegungen anstellen. Erstens müssen Sie den Umfang der zu erfassenden PSTR-Daten abschätzen. Im Idealfall erfassen Sie so viele der wichtigen Anwendungsschichtdaten aus Klartextprotokollen, wie die Möglichkeiten zur langfristigen Speicherung zulassen. Da es verschiedene Arten von PSTR-Daten gibt, kann auch der erforderliche Speicherplatz dafür stark schwanken. Wenden Sie daher eine der Methoden aus Kapitel 3 an, um anhand des gewählten Datenformats und Ihrer Netzwerkgeräte zu bestimmen, wie viel Platz Sie wahrscheinlich für die PSTR-Daten benötigen werden. Dazu müssen Sie einen temporären Sensor mit installierten Tools zur Erfassung bzw. Generierung von PSTR-­ Daten bereitstellen, sodass Sie Stichproben der Daten zu verschiedenen Zeiten nehmen und auf längere Zeiträume extrapolieren können. Dabei kann es vorkommen, dass Sie den gewünschten Umfang der PSTR-Daten anpassen müssen, um die Daten länger aufbewahren zu können. Sie müssen nicht nur entscheiden, welche Arten von PSTR-Daten erstellt werden sollen, sondern auch, wie lange Sie sie aufbewahren möchten. Die Aufbewahrung von FPC-Daten zählt oft nach Stunden oder Tagen, während Sitzungsdaten gewöhnlich für ganze Quartale oder gar Jahre gespeichert werden. Die Aufbewahrungszeiten für PSTR-Daten liegen in der Mitte und belaufen sich auf Wochen oder Monate. Wenn Sie den Speicherbedarf für PSTR-Daten bestimmen, müssen Sie daran denken, dass große Schwankungen auftreten können. Beispielsweise können Sie während der Mittagspausen Spitzenwerte bei der HTTP-Kommunikation feststellen, während der Datenverkehr über Protokolle, die stärker mit geschäftlichen Vorgängen verknüpft sind, zurückgeht. Das muss sich nicht unbedingt auf die Gesamtmenge der PCAP-Daten auswirken, die während dieser Zeit erfasst werden, wird aber die Menge der PSTR-Daten merkbar erhöhen. Es gibt eine Reihe von kostenlosen und Open-Source-Anwendungen sowohl für die direkte Erfassung von PSTR-Daten an einer Schnittstelle als auch für ihre Generierung aus FPC-Daten. Bei der Auswahl der entsprechenden Software müssen Sie sicherstellen, dass die resultierenden Daten auf solche Weise standardisiert sind, dass Sie sie für Ihre Erkennungs- und Analysetools und -prozesse nutzen können. Im Rest dieses Abschnitts sehen wir uns einige dieser Erfassungs- und Generierungswerkzeuge an. 176 6 Paketstringdaten 6.2.1 PSTR-Daten manuell generieren Bevor wir einige Werkzeuge zur automatischen Generierung von PSTR-Daten unter die Lupe nehmen, wollen wir alternative Möglichkeiten ansehen, um PSTR-Daten mithilfe der Tools zu generieren, die in der Bash-Umgebung von Linux vorhanden sind. Als Ausgangspunkt verwenden wir die ASCII-Daten aus einer PCAP-Datei. Da wir nur an Daten interessiert sind, die aus für Menschen lesbaren Zeichen bestehen, grenzen wir die Auswahl ein, indem wir die Daten an das Linux-Dienstprogramm strings übergeben. Aus dem Ergebnis können wir nun verschiedene Arten von PSTR-Daten generieren, beispielsweise Protokoll- oder Payloaddaten. Das folgende Skript erstellt Protokolldaten ähnlich wie in Abb. 6.2, wobei in den einzelnen Zeilen die URIs der vom Benutzer angeforderten Seiten aufgeführt werden. #!/bin/bash # Sendet ASCII-Zeichen aus den FPC-Daten an stdout /usr/sbin/tcpdump -qnns 0 -A -r test.pcap | \ # Normalisiert die PCAP-Daten strings |\ # Entfernt alle Zeitstempelheader und Host-Felder grep -e '[0\-9][0\-9]\:[0\-9][0\-9]\:[0\-9][0\-9].[0\-9]\{6\}\| Host:'| grep -B1 "Host:" |\ # Bereinigt die Ergebnisse grep -v -- "--"| sed 's/\(Host.*$\)/\1\n/g'| \ tr "\n" "-" | sed 's/--/\n/g'| sed 's/-Host:/ -/g' Das folgende Payloadskript erzeugt PSTR-Daten, deren Datensätze durch Bindestriche getrennt sind. In diesem Beispiel werden alle lesbaren Strings für sämtliche Protokolle entnommen. Es gibt zurzeit nur wenige Möglichkeiten, solche Daten auf andere Weise als manuell zu generieren. #!/bin/bash # Sendet ASCII-Zeichen aus den FPC-Daten an stdout /usr/sbin/tcpdump -qnns 0 -A -r test.pcap |\ # Normalisiert die PCAP-Daten strings |\ # Entfernt alle leeren Zeilen sed '/°$/d' |\ 6.2 PSTR-Datenerfassung 177 # Ersetzt die Leerzeilen zwischen den Datensätzen durch Trennzeichen sed 's/Ë„$/\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\\-\-\-/g' |\ #Entfernt doppelte Sonderzeichen sed 's/[Ë„[:alnum:][:space:]_():-]\+/./g' Solche manuellen Lösungen sind bei der Verarbeitung der Daten gewöhnlich langsamer, aber dafür haben Sie unbegrenzte Verarbeitungsmöglichkeiten für die eingehenden Daten. Als Nächstes sehen wir uns einige der Tools an, mit denen sich PSTR-Protokolldaten effizient generieren lassen. 6.2.2 URLsnarf Die Dsniff-Suite ist eine Sammlung von Tools, die für Zwecke der Netzwerksicherheit sehr nützlich sein können. Die einzelnen Werkzeuge fallen dabei in zwei Kategorien: Die einen dienen eher offensiven Zwecken, während es sich bei dem Rest – und das ist der Teil, den wir benötigen – um Snarf-Tools handelt, mit denen Sie das Netzwerk passiv auf interessante Informationen im Zusammenhang mit Dateien, E-Mails, Webanforderungen usw. überwachen können. In diesem Buch beschäftigen wir uns vor allem mit URLsnarf. URLsnarf sammelt passiv HTTP-Anforderungsdaten und speichert sie im allgemeinen Protokollformat CLF. Die Dsniff-Suite habe ich sehr liebgewonnen, da es die Werkzeuge schon lange gibt und sehr leicht zu installieren und anzuwenden sind. URLsnarf ist dabei keine Ausnahme. Meistens können Sie Dsniff einfach über ihre bevorzugte Paketverwaltung installieren. Da die Suite in Security Onion nicht standardmäßig installiert ist, können Sie das mit apt nachholen: sudo apt-get install dsniff Anschließend können Sie die Installation von URLsnarf prüfen, indem Sie den Befehl urlsnarf ohne Argumente geben. URLsnarf lauscht dann passiv an einer Schnittstelle und übergibt die erfassten Daten an die Standardausgabe, wobei sie im Terminal-Fenster sichtbar werden. Standardmäßig lauscht das Programm an der Schnittstelle eth0. Die Überwachung des Datenverkehrs an den TCP-Ports 80, 8080 und 3128 ist hartkodiert. Für URLsnarf gibt es nur vier Optionen: •• •• •• •• -p: Führt URLsnarf für eine bereits erfasste PCAP-Datei aus. -i: Gibt die Netzwerkschnittstelle an. -n: Durchsucht die Daten, ohne DNS-Adressen aufzulösen. -v <Ausdruck>: Standardmäßig können Sie zur Laufzeit einen Ausdruck angeben, sodass nur URLs angezeigt werden, die mit diesem Ausdruck übereinstimmen. Wenn Sie die Option -v verwenden, werden dagegen alle URLs ausgegeben, die nicht dem Ausdruck entsprechen. 178 6 Paketstringdaten Ich finde es einfacher, die Ausgabe an BASH-Befehlszeilentools wie grep, cut und awk zu übergeben, anstatt Ausdrücke mit -v anzugeben. In Abb. 6.4 habe ich zunächst den Datenverkehr mit Tcpdump erfasst und dann mit der Option -p an URLsnarf übergeben. Es ist zwar nicht erforderlich, auf diese Weise vorzugehen, aber in einer Produktionsumgebung werden Sie häufig bereits vorhandene FPC-Daten verwenden. Wenn Sie die Option -p weglassen, werden die Daten direkt an der Verbindung erfasst. Abbildung 6.4: Beispieldaten von URLsnarf Die Ausgabe, die Sie in Abb. 6.4 sehen, besteht aus einem Satz von Standardprotokoll­ daten mit ausführlichen Angaben zu den HTTP-Anforderungen während meines Besuchs auf appliednsm.com. Auf den ersten Blick scheint dieses Tool zu nicht mehr nütze zu sein, als Protokolldaten für die rückblickende Analyse zu speichern. Mithilfe von geschicktem »Befehlszeilen-Kung-Fu« können Sie diese Ausgabe auch zu einer ernsthaften Live-Untersuchung des Benutzerdatenverkehrs in einem umfangreichen Netzwerk verwenden. URLsniff ist zwar sehr einfach zu benutzen, doch diese Einfachheit kann auch ein Problem darstellen. Wenn Sie eine weniger umfangreiche Ausgabe wünschen, müssen Sie die Daten mit einem zusätzlichen Tool bearbeiten. Wollen Sie dagegen noch mehr Informationen, haben Sie Pech, denn im Gegensatz zu anderen Programmen ist eine mehrzeilige Datenausgabe in URLsnarf nicht möglich. 6.2.3 Httpry Httpry ist ein auf die Anzeige und Protokollierung von HTTP-Datenverkehr spezialisierter Paketsniffer. Er kann ausschließlich HTTP-Datenverkehr erfassen, bietet im Vergleich zu URLsnarf aber viel mehr Optionen für den Umgang mit den Daten. Beispielsweise können Sie eine beliebige Auswahl von HTTP-Headern erfassen und in beliebiger Reihenfolge ausgeben. Darüber hinaus lassen sich die PSTR-Daten an die Bedürfnisse Ihrer Umgebung anpassen. Aufgrund dieser zusätzlichen Anpassungs- und Nachbearbeitungsmöglichkeiten kostet es jedoch etwas mehr Mühe, den Umgang mit Httpry zu erlernen. 6.2 PSTR-Datenerfassung 179 Standardmäßig ist Httpry in Security Onion nicht enthalten, es kann aber ziemlich leicht installiert werden, indem man die Anwendung aus dem Quellcode erstellt. Dazu gehen Sie folgendermaßen vor: 1. Installieren Sie die Entwicklungsbibliothek libpcap, die vorhanden sein muss, um Httpry kompilieren zu können: sudo apt-get install libpcap-dev 2. Laden Sie das Tar-Archiv von Jason Bittels Httpry-Website herunter: wget http://dumpsterventures.com/jason/httpry/httpry-0.1.7.tar.gz 3. Entpacken Sie das Archiv: tar -zxvf httpry-0.1.7.tar.gz 4. Wechseln Sie in das Httpry-Verzeichnis und erstellen und installieren Sie die Anwendung: make && sudo make install Wenn Sie das Programm anschließend ohne Argumente ausführen, beginnt es damit, HTTP-Datenverkehr an Port 80 an der Netzwerkschnittstelle mit der kleinsten Nummer zu erfassen. In Abb. 6.5 ist das Argument -r angegeben, sodass Httpry Datenverkehr aus einer Datei liest und ausgibt. Abbildung 6.5: Httpry-Beispielausgabe Es gibt eine Reihe von Befehlszeilenargumenten für Httpry. Für den Anfang sind die folgenden am nützlichsten: 180 6 Paketstringdaten •• -r <Datei>: Liest Datenverkehr aus der angegebenen PCAP-Datei, anstatt sie direkt zu erfassen. •• -o <Datei>: Schreibt die Daten in eine Httpry-Protokolldatei. (Dies ist für die Anwendung von Parserskripts erforderlich.) •• -i <Schnittstelle>: Gibt die zu überwachende Schnittstelle an. •• -d: Führt Httpry als Daemon aus. •• -q: Führt Httpry im stummen Modus aus. Dabei werden nicht kritische Ausgaben wie Banner und Statistiken unterdrückt. Das Standardprotokollformat von Httpry ist nicht unbedingt als Analysegrundlage für jede Umgebung geeignet. Zum Glück können Sie die Daten jedoch mit ein bisschen Befehlszeilenzauberei in eine Form umwandeln, die sich von Ihren Erkennungsmechanismen und Analysetools leicht untersuchen lässt. Im Lieferumfang von Httpry sind mehrere Skripte enthalten, mit denen Sie die Ausgabe bearbeiten können. Um die von Httpry erfassten Daten über eines dieser Plug-Ins auszugeben, verwenden Sie den Schalter -o. Beispielsweise können Sie Hostnamenstatistiken und HTTP-Protokollzusammenfassungen generieren oder die Daten in gebräuchliche Protokollformate umwandeln. Damit können Sie ähnliche Ergebnisse erzielen wie mit URLsnarf. Bei den einzelnen Feldern gibt es kleine Unterschiede zur Ausgabe von URLsnarf, und da die gängigen Protokollformate ebenfalls leicht voneinander abweichen, kann es sein, dass Parser einen Unterschied bemerken. Mithilfe von Parserskripten können Sie mehrere Plug-Ins nahtlos kombinieren und so eine vollständige Lösung zur Generierung von PSTR-Daten auf der Grundlage von Httpry zusammenstellen. Zur Konvertierung von Daten ist das Skript parse_log.pl erforderlich, das sich im Httpry-Verzeichnis scripts/plugins/ befindet und die in diesem Verzeichnis vorhandenen Plug-Ins nutzt. Das folgende Beispiel zeigt die Befehle, die Sie brauchen, um ein Parserskript auszuführen. Hier geben wir die Httpry-Daten in einem gebräuchlichen Protokollformat aus, das für die Untersuchung durch Erkennungs- und Analysetools geeignet ist. 1. Führen Sie Httrpy aus und leiten Sie die Ausgabe in eine Datei: httpry –o test.txt 2. Konvertieren Sie die Ausgabe: perl scripts/parse_log.pl -p scripts/plugins/common_log.pm test.txt Dieser Befehl funktioniert nicht so, wie Sie es erwarten würden. Der Versuch, HttpryAusgaben einem Programm zu übergeben, das sie bearbeitet, wird fehlschlagen, da die richtigen Spaltenköpfe fehlen. Daher muss die Httpry-Ausgabe erst mit der Option -o in eine Datei geschrieben werden. Anschließend kann das Skript parse_log.pl ausgeführt werden, um die Daten zu konvertieren. Ein Beispiel der Ausgabe sehen Sie in Abb. 6.6. 6.2 PSTR-Datenerfassung 181 Abbildung 6.6: Beispielausgabe von Httpry, konvertiert in ein gebräuchliches Format Mit Httpry lassen sich PSTR-Daten gewöhnlich deutlich schneller generieren als mit URLsnarf. Der wahre Vorteil von Httpry für NSM-Umgebungen ist aber die Vielseitigkeit bei der Datenausgabe. 6.2.4 Justniffer Justniffer ist ein komplettes Protokollanalysetool, das eine umfassende Anpassung der Ausgabe erlaubt. Damit ist es hervorragend dafür geeignet, TCP-PSTR-Daten zu generieren, die über den bloßen HTTP-Datenverkehr hinausgehen. Hauptsächlich wurde Justniffer entwickelt, um die Störungssuche in Netzwerken zu vereinfachen. Es konzentriert sich auf Anforderungen und Antworten im Netzwerkverkehr, um nur die Informationen zu liefern, die nötig sind, um Kommunikationsprobleme einzugrenzen. Das ist aber auch genau das, was wir mit den PSTR-Daten für NSM-Zwecke erreichen wollen. Justniffer kann jedoch nicht nur Klartext-Protokollheader erfassen, sondern lässt sich mithilfe einfacher Skripte auch erweitern. So kann es etwa mit einem einfachen BASH-Skript seine Ausgabe, sortiert noch Hosts, direkt von der Verbindung zu einem lokalen Ordner zu leiten. Ein weiteres Beispiel ist das mitgelieferte Python-Skript Justniffer-grab-http-traffic, das die bei der HTTP-Kommunikation übertragenen Dateien extrahiert. Es gibt auch Möglichkeiten, mit Justniffer eine Leistungsmessung aufgrund der Antwortzeiten, der Verbindungszeiten usw. vorzunehmen. Dank seiner Vielseitigkeit ist Justniffer äußerst nützlich für eine Vielzahl von Aufgaben im Rahmen der Erfassung von PSTR-Daten. Justniffer ist in Security Onion nicht standardmäßig enthalten. Um es zu installieren, gehen Sie wie folgt vor: 1. Fügen Sie das passende PPA-Repository hinzu: sudo add-apt-repository ppa:oreste-notelli/ppa 2. Aktualisieren Sie das Repository: sudo apt-get update 3. Installieren Sie Justniffer mit apt: sudo apt-get install justniffer 182 6 Paketstringdaten Zur Installation von Justniffer auf einer anderen Distribution können zusätzliche Schritte erforderlich sein. Weitere Informationen erhalten Sie auf http://justniffer.sourceforge.net/#!/ install. Die ersten Schritte mit Justniffer sind ziemlich einfach, allerdings kann es knifflig sein, genau die Ausgabe zu bekommen, die Sie haben wollen. Wenn Sie keine Argumente angeben, erfasst Justniffer die Daten an der Schnittstelle eth0 und zeigt den gesamten HTTP-Datenverkehr in fast dem gleichen Format an wie URLsnarf. Darüber hinaus bietet Justniffer einige sehr praktische Befehlszeilenargumente: •• •• •• •• •• -i <Schnittstelle>: Legt die Schnittstelle fest, an der Datenverkehr erfasst werden soll. -f <Datei>: Liest die Daten aus der angegebenen PCAP-Datei. -p <Filter>: Wendet einen Paketfilter an. -l <Format>: Gibt an, wie der Ausgabestring aufgebaut sein soll. -u: Kodiert nicht druckbare Zeichen als Punkte. Die standardmäßige Ausgabeformat von Justniffer ist zwar für den Anfang schon ganz gut, aber es lassen sich auch anspruchsvollere Protokolle generieren. In Abb. 6.1 haben Sie die vollständigen Anforderungs- und Antwortheader der HTTP-Kommunikation gesehen. Mit Justniffer können Sie diese Ausgabe sehr leicht erzeugen, indem Sie die Schlüsselwörter request.header und response.header verwenden: sudo justniffer -f packets.pcap -p "tcp port 80" -u -l "%newline%request.header%newline%response.header" Die Option -f dient dazu, Daten aus einer Paketerfassungsdatei zu lesen. (Wenn Sie die Daten direkt von der Verbindung abgreifen wollen, ersetzen Sie diese Option einfach durch -i <Schnittstelle>.) Mit -p wird ein BPF angegeben, -u sorgt für die Konvertierung nicht druckbarer Zeichen in Punkte, und mit -l geben Sie Ihr eigenes Protokollformat an. Das Ergebnis sehen Sie in Abb. 6.7. Gezeigt werden hier zwei HTTP-Transaktionen. 6.2 PSTR-Datenerfassung 183 Abbildung 6.7: Beispiel für die Justniffer-Datenausgabe in einem benutzerdefinierten Format Die Ausgabe dieses Beispiels ähnelt der aus der ursprünglichen Version in Abb. 6.1, allerdings ist sie aufgrund eines Mangels an entscheidenden Informationen nicht so gut für die Analyse geeignet. Um die Daten angemessen untersuchen zu können, müssen wir wissen, welche Hosts für diese Kommunikation verantwortlich sind und wann sie aufgetreten ist. Hier sehen wir nur das »Was«, wir brauchen aber auch das »Wer« und »Wann«. Zur Verbesserung weisen wir Justniffer ausdrücklich an, die entsprechenden Felder auszugeben. Zurzeit bietet Justniffer 85 Formatierungsoptionen, von einfachen Trennzeichen zu elementaren Optionen für Anforderungen, Antworten und Leistungsmaßen. Um die gewünschte Formatierung zu erzielen, brauchen wir einige weitere Schlüsselwörter sowie ein benutzerdefiniertes Trennzeichen zu Beginn jedes mehrzeiligen Eintrags. Der entsprechende Befehl sieht wie folgt aus: sudo justniffer –f packets.pcap -p "tcp port 80" -u -l "------------------------------- %newline%request.timestamp - % source.ip ->%dest.ip %newline%request.ader%newline%response.timestamp %newline%response.header" Eine mit diesem Befehl generierte Beispielausgabe finden Sie in Abb. 6.8. Wie Sie sehen, haben wir jetzt zwei komplette HTTP-Transaktionen einschließlich Angabe der Hosts, die für die Kommunikation verantwortlich sind, und eines Zeitstempels. Damit kennen wir jetzt das »Was«, das »Wer« und das »Wann«. Wir werden uns später noch mehrere Methoden ansehen, um diese Daten weiterzubearbeiten, sowohl mit BASHSkripten als auch mit kostenlosen Open-Source-Tools. 184 6 Paketstringdaten Abbildung 6.8: Zur Analyse geeignete mehrzeilige Justniffer-Ausgabe Mit Justniffer können wir auch ähnliche Daten generieren wie in Abb. 6.2, also in Form eines minimalistischen, einzeiligen Protokolls, das nur den Zeitstempel, die Quell- und Zieladresse und den angeforderten URL zeigt. Dazu benötigen wir den folgenden Befehl, der nur wenige besondere Trennzeichen und die Variable request.url nutzt: sudo justniffer –f packets.pcap -p "tcp port 80" -u -l "%request.timestamp %source.ip ->%dest.ip - %request.header.host%request.url" Die Ausgabe dieses Befehls sehen Sie in Abb. 6.9. Abbildung 6.9: Zur Analyse geeignete einzeilige Justniffer-Ausgabe 6.2 PSTR-Datenerfassung 185 Um URLsnarf diese Ausgabe zu entlocken, müssten wir einen erheblichen Aufwand an Befehlszeilen-Kung-Fu betreiben. Bis jetzt haben wir uns nur mit HTTP-Datenverkehr beschäftigt, da einige der besprochenen Tools nur HTTP erfassen können. Justniffer dagegen ist ein umfassender TCP-Analysator und kann problemlos auch Nicht-HTTP-Datenverkehr untersuchen. Beispielsweise können Sie damit auch Klartext-Maileinträge der Protokolle SMTP und POP aus den FPC-Daten herausziehen oder direkt erfassen. Um ähnliche Ergebnisse wie zuvor für SMTP-Daten zu erhalten, weisen wir Justniffer mit folgendem Befehl an, auf Datenverkehr an Port 25 zu lauschen: justniffer -f packets.pcap -r -p "port 25" Ein Beispiel dafür sehen Sie in Abb. 6.10. Abbildung 6.10: Generieren von SMTP-PSTR-Daten mit Justniffer 186 6 Paketstringdaten 6.3 PSTR-Daten anzeigen Ebenso wie bei NSM-Daten ist auch für eine PSTR-Datenlösung ein Zusammenwirken von Erfassungs- und Anzeigemechanismus erforderlich. Je weiter ein benutzerdefinierter Erfassungsmechanismus von den Standards abweicht, umso ausgefallenere Zerlegungsmethoden sind erforderlich. In diesem Abschnitt sehen wir uns einige Lösungen an, um PSTR-Daten zu zerlegen, anzuzeigen und zu verarbeiten. Dabei greifen wir auf einige der zuvor besprochenen Formatierungsbeispiele zurück. 6.3.1 Logstash Logstash ist ein weit verbreiteter Protokollparser, der mehr- und einzeilige Protokolle verschiedener Typen verarbeiten kann, und zwar neben gebräuchlichen Formaten wie Syslog und JSON auch benutzerdefinierte Protokolle. Dieses kostenlose Open-Source-Werkzeug ist äußerst leistungsfähig und lässt sich auch in großen Umgebungen relativ einfach einrichten. Zur Veranschaulichung konfigurieren wir Logstash zum Zerlegen von Protokollen, die mit URLsnarf erfasst wurden. Seit der Version 1.2.1 enthält Logstash die Schnittstelle Kibana zur Anzeige der Protokolle. Wir werden auch ihre Funktionen besprechen, mit denen Sie die Daten abrufen können, die Sie brauchen, ohne von denen abgelenkt zu werden, die Sie nicht brauchen. Logstash ist nicht in Security Onion enthalten. Um die Beispiele in diesem Abschnitt nachzuvollziehen, laden Sie es von der Projektwebsite www.logstash.net herunter. Das Programm ist komplett in einem einzigen Java-Paket enthalten, weshalb Sie die JavaLaufzeitumgebung benötigen (zu finden auf http://openjdk.java.net/install/; Sie können auch einfach sudo apt-get install java-default ausführen.) Logstash benötigt eine Konfigurationsdatei, die ihm mitteilt, wie ihm die zu zerlegenden Daten zugeführt werden. In der Praxis wird wahrscheinlich ein stetiger Datenstrom von einer Protokollquelle eingehen. In diesem Beispiel soll Logstash die Daten verwenden, die an einen bestimmten Speicherort geschrieben werden. Die Konfigurationsdatei trägt den Namen urlsnarf-parse.conf und enthält eine sehr einfache Konfiguration: input { file { type =>"urlsnarf" path =>"/home/idsusr/urlsnarf.log" } } output { elasticsearch { embedded ¼>true } } 6.3 PSTR-Daten anzeigen 187 Damit wird Logstash angewiesen, auf Daten jeglicher Art zu lauschen, die in /home/ idsusr/urlsnarf.log geschrieben werden, und davon auszugehen, dass alle in diese Datei geschriebenen Protokolle vom Typ urlsnarf sind. Der Abschnitt zur Ausgabe startet eine Instanz von Elasticsearch, um die Indizierung und Durchsuchung der empfangenen Daten zu ermöglichen. Nachdem wir die Konfigurationsdatei erstellt haben, können wir Logstash starten und initialisieren. Damit Logstash mit aktiviertem Web-Front-End Kibana startet, verwenden wir folgenden Befehl: java -jar logstash-1.2.1-flatjar.jar agent -f urlsnarf-parse.conf -- web Die Ausgabe dieses Befehls sehen Sie in Abb. 6.11. Abbildung 6.11: Logstash ausführen Dieser Befehl initialisiert den Agenten und gibt hinter der Option -f die Konfigurationsdatei urlsnarf-parse.conf an. Die Option --web am Ende sorgt dafür, dass zusammen mit dem Protokollagenten auch Kibana gestartet wird. Der Erststart kann einige Minuten dauern. Da die Ausgabe dieses Werkzeugs nicht allzu ausführlich ist, können Sie sich jedoch auf einfache Weise davon überzeugen, dass es läuft, indem Sie netstat für das System aufrufen: sudo netstat –antp | grep java Wenn alles ordnungsgemäß funktioniert, werden mehrere Ports angezeigt, die der gestartete Java-Dienst geöffnet hat (siehe Abb. 6.12). 188 6 Paketstringdaten Abbildung 6.12: Diese offenen Ports zeigen, dass Logstash ordnungsgemäß läuft Vergewissern Sie sich anschließend, dass das Front-End Kibana funktioniert, indem Sie in Ihrem Browser http://127.0.0.1:9292 aufrufen (wobei Sie 127.0.0.1 durch die IP-Adresse des Systems ersetzen müssen, auf dem Sie Logstash installiert haben). Dadurch gelangen Sie zum Dashboard von Kibana. Vorsicht Wenn Sie Logstash auf einem Security-Onion-System installiert haben, können Sie die Webschnittstelle Kibana standardmäßig nicht von einem anderen System aus erreichen (etwa vom Hostsystem der virtuellen Maschine aus), weil die Firewall des Security-Onion-Systems aktiviert ist. Mit dem Befehl sudo ufw allow 9292/ tcp können Sie eine Ausnahme für die Firewall aufstellen. Da Logstash nun lauscht und das Front-End Kibana läuft, können Sie die Ausgabe von URLsnarf an die in urlsnarf-parse.conf angegebene Datei senden: sudo urlsnarf > /home/idsusr/urlsnarf.log Nach der Initialisierung von URLsnarf öffnen Sie Ihren Browser (oder verwenden Sie curl an der Befehlszeile) und besuchen Sie einige Websites, um Daten zu generieren. Beenden Sie anschließend den URLsnarf-Prozess mit (Strg) + (C). Vergewissern Sie sich in Kibana, dass die Protokolle eingehen. Auf dem Bildschirm sollten ähnlich wie in Abb. 6.13 einige Daten dargestellt werden. Ist das nicht der Fall, prüfen Sie, ob Sie am oberen Rand des Dashboards den richtigen Zeitraum ausgewählt haben. 6.3 PSTR-Daten anzeigen 189 Abbildung 6.13: Anzeige von Protokolldaten in Kibana Dieses Diagramm stellt die »rohen« Protokolldateien dar, die zum Großteil noch nicht in ihre einzelnen Elemente zerlegt sind. Wenn Sie sich ein Protokoll ansehen, werden Sie feststellen, dass zurzeit nur der Eingangszeitstempel und der Hostname des aktuellen Geräts vorhanden sind. Das liegt darin, dass in der Logstash-Konfiguration noch kein Filter definiert ist und das Programm daher nicht weiß, wie es die einzelnen Felder in den Protokolleinträgen verarbeiten soll. Die Filter bilden das Herz der Konfiguration und legen fest, wie die Protokolle indiziert werden. Daher wollen wir nun eigene Filter definieren, um nützliche Informationen in Kibana hervorzurufen. Logstash verwendet die Sprache GROK, um Textmuster und reguläre Ausdrücke zu kombinieren. Damit ist eine Durchsuchung des Protokolltextes leichter möglich, als es allein mit regulären Ausdrücken möglich wäre. Um die Syntax kennenzulernen, beginnen wir mit einem einfachen Beispiel. Wir erstellen einen Filter, der nach übereinstimmenden Textfeldern in einem mit Justniffer generierten Protokoll sucht, wobei am Ende der Sensorname angegeben sein soll (siehe Abb. 6.14). Abbildung 6.14: Benutzerdefinierte Justniffer-Daten mit Angabe des Sensornamens Um zu zeigen, wie Logstash mit grundlegenden Vergleichen (im Gegensatz zu vorgefertigten Mustern) umgeht, verwenden wir in der Konfiguration einen Vergleichsfilter (»match«). Die Grundkonfiguration sieht wie folgt aus: 190 6 Paketstringdaten input { file { type =>"Justniffer-Logs" path =>"/home/idsusr/justniffer.log" } } filter { grok { type =>"Justniffer-Logs" match =>[ "message", "insertfilterhere" ] } } output { elasticsearch { embedded =>true } } Wir verwenden die integrierten GROK-Muster, um die erforderlichen Daten für die Konfiguration zu erstellen, die wir schlicht justniffer-pare.conf nennen wollen. Diese Muster sind auf https://github.com/logstash/logstash/blob/master/patterns/grok-patterns zu finden. Bevor wir überlegen, welche Muster wir verknüpfen wollen, müssen wir uns jedoch das Protokollformat ansehen und festlegen, welche Felder wir finden wollen. Das Datenformat weist folgenden Aufbau auf: datestamp timestamp – IP ->IP – domain/path – sensorname SENSOR Um das in GROK zu übersetzen, benötigen wir den GROK-Debugger, den Sie auf http:// grokdebug.herokuapp.com/ finden. Geben Sie die Protokollstrings, die Sie mit dem Filter vergleichen wollen, einfach in die obere Zeile ein, und das GROK-Muster, mit dem sie Ihrer Meinung nach übereinstimmen, in die Zeile darunter. Die Anwendung zeigt Ihnen, bei welchen Daten eine Übereinstimmung auftritt. Bei der Entwicklung von Strings im GROK-Format ist es entscheidend, mit kleinen Mustern zu beginnen, und sie nach und nach zu erweitern, bis die gesamte Protokollzeile eine Übereinstimmung zeigt. Abbildung 6.15: Der GROK-Debugger 6.3 PSTR-Daten anzeigen 191 Um eine Übereinstimmung mit der Protokollzeile zu erzielen, mit der wir arbeiten, verwenden wir folgendes Muster: %{DATE:date} %{TIME:time} - %{IP:sourceIP} ->%{IP:destIP} %{URIHOST:domain}%{URIPATHPARAM:request} - %{DATA:sensor} SENSOR Bei jedem Feld ist eine Feldbezeichnung angegeben. Wenn wir diesen Filter in die Konfigurationsdatei einbauen, erhalten wir eine Konfiguration, mit der wir sämtliche eingehenden Justniffer-Logs zerlegen können, die mit dem zuvor angegebenen Format übereinstimmen. Die resultierende Konfigurationsdatei sieht wie folgt aus: input { file { type =>"Justniffer-Logs" path =>"/home/idsusr/justniffer.log" } } filter { grok { type =>"Justniffer-Logs" match =>[ "message", "%{DATE:date} %{TIME:time} - %{IP:sourceIP} ->%{IP:destIP} - %{URIHOST:domain}%{URIPATHPARAM:request} - %{DATA: sensor} SENSOR" ] } } output { elasticsearch { embedded =>true } } Nun können Sie den Logstash-Kollektor mit dem folgenden Befehl starten, sodass er die neue Konfigurationsdatei nutzt: java -jar logstash-1.2.1-flatjar.jar agent -f justniffer-parse.conf --web Sobald Logstash läuft, können Sie mit die Datenerfassung mit dem folgenden JustnifferBefehl starten. Dadurch werden die Protokolldaten in dem Format generiert, das in der neuen Konfiguration angegeben ist: sudo justniffer -p "tcp port 80" -u -l "%request.timestamp - %source.ip >%dest.ip - %request.header.host%request.url - IDS1 SENSOR" >> /home/ idsusr/justniffer.log 192 6 Paketstringdaten Suchen Sie erneut einige Websites auf, um Protokolle zu generieren. Prüfen Sie dabei, ob in Kibana Protokolle angezeigt werden. Wenn alles richtig funktioniert, sollten jetzt die komplett zerlegten Protokolle angezeigt werden. Sie können sie aber nicht nur einsehen, sondern mit dem Feld Query am unteren Rand der Dashboard-Hauptseite von Kibana auch durchsuchen. Mit dem Ereignisfilter Fields links neben dem Feld Query können Sie außerdem die Anzeige auf die Felder eingrenzen, die Sie sehen wollen (siehe Abb. 6.16). Abbildung 6.16: Untersuchung einzelner Protokolle in Kibana Um Messgrößen für ein Feld einzusehen, klicken Sie in der Liste auf der linken Bildschirmseite auf den entsprechenden Feldnamen. Abb. 6.17 zeigt Messgrößen für das Host-Feld. ­Darin werden alle besuchten Hosts aufgeführt, die in den aktuellen Protokollen vorkommen. Abbildung 6.17: Messgrößen für Felder in Kibana 6.3 PSTR-Daten anzeigen 193 Dieses Beispiel ist ein guter Ausgangspunkt für die benutzerdefinierte Zerlegung von Protokollen mit Logstash. Einige Protokolltypen sind jedoch schwerer zu verarbeiten. Beispielsweise sind URLsnarf-Protokolle bis auf ein oder zwei Zeichen identisch mit Apache-Zugriffsprotokollen. Logstash kann normale Apache-Zugriffsprotokolle zwar mit Leichtigkeit handhaben, doch die zusätzlichen Zeichen der URLsnarf-Protokolle können die integrierten Filter in Verwirrung stürzen. Im folgenden Beispiel sehen wir uns daher an, wie wir eigene GROK-Filter als Ersatz für die vorhandenen Filtermuster für Apache-Zugriffsprotokolle schreiben können, um damit URLsnarf-Protokolle zu verarbeiten. Der neue Filter berücksichtigt die Unterschiede und löst die Unstimmigkeiten durch die zusätzlichen Bindestriche auf. Da die Filter dem integrierten Muster sehr ähnlich sind, können wir einfach das Muster nach Bedarf abwandeln. Die neuesten GROKMuster sind im Git-Repository von Logstash auf https://github.com/logstash/logstash/ blob/­master/patterns/grok-patterns zu finden. Wenn Sie sich den Filter COMBINEDAPACHELOG genau ansehen, werden Sie feststellen, dass das Problem durch einen fehlenden Bindestrich verursacht wird, der im folgenden Code ergänzt wurde: COMBINEDAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[% {HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/ %{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response}|(?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} Dieser Filter sieht nicht nur kompliziert aus, er ist es auch. Ihn zu zerlegen ist eine Aufgabe, die Sie am besten dem GROK-Debugger überlassen. Die Änderungen gegenüber dem ursprünglichen Filter bestehen in der Ergänzung des Bindestrichs und im Auskommentieren der inneren Anführungszeichen. Diesen GROK-Filter können wir der zuvor erstellten Grundkonfiguration hinzufügen. Damit sieht die Konfigurationsdatei wie folgt aus: input { file { type =>"urlsnarf" path =>"/home/idsusr/urlsnarf.log" } } filter { grok { type =>"urlsnarf" match =>[ "message", "%{IPORHOST:clientip} %{USER:ident} %{USER: auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE: request} (?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" (% {NUMBER:response}|-) (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS: agent}" ] } } 194 6 Paketstringdaten output { elasticsearch { embedded =>true } } Ohne einen GROK-Filter würden die Protokolle in Kibana wie in Abb. 6.18 aussehen: Die Daten würden in einer fortlaufenden Zeile angezeigt, was eine weitergehende Analyse der einzelnen Felder unmöglich macht. Abbildung 6.18: Darstellung der Protokolldaten ohne GROK Mit dem neuen Filter wird das Protokoll vollständig in seine einzelnen Felder zerlegt, wie Sie in Abb. 6.19 sehen können. Abbildung 6.19: Darstellung der Protokolldaten mit GROK Wie Sie sehen, bilden Logstash, Kibana und GROK ein leistungsfähiges Trio zur Zerlegung von Protokollen wie denen von PSTR-Daten. Um mehr über diese Werkzeuge zu lernen, besuchen Sie http://logstash.net/. 6.3 PSTR-Daten anzeigen 195 6.3.2 Rohtextzerlegung mit BASH-Tools Logstash und Kibana eignen sich hervorragend zur Zerlegung von einzeiligen PSTR-Daten, lassen sich aber nicht in jeder Umgebung anwenden. Je nachdem, wie Sie die Daten beziehen, kann es sein, dass Sie einen umfangreicheren Satz von Werkzeugen benötigen. Selbst wenn Hilfsprogramme zum Durchsuchen von Protokollen vorhanden sind, sollten die Analytiker stets eine Möglichkeit haben, direkt auf Protokolle in linearem Textformat zuzugreifen. In den folgenden Beispielen schauen wir uns PSTR-Daten mit mehrzeiligen Anforderungs- und Antwortheadern an. Dazu erzeugen wir zunächst ebenso wie in früheren Beispielen PSTR-Daten mit Justniffer: sudo justniffer -i eth0 -p "tcp port 80” -u -l "------------------------------ %newline%request.timestamp - %source.ip -> %dest.ip %newline%request.header%newline%response.timestamp - %newline% response.header">pstrtest.log Dadurch werden Daten wie in Abb. 6.7 generiert und in der Datei pstrtest.log gespeichert. Die Zerlegung von Rohdaten mithilfe von BASH-Tools wie sed, awk und grep ruft manchmal irrationale Ängste hervor, die aber zum Großteil unberechtigt sind. Schließlich gehört die Zerlegung solcher Texte zu den am umfangreichsten dokumentierten und am häufigsten diskutierten Themen in Unix-Foren. Ein unlösbares Problem ist mir dabei noch nie untergekommen. Aus den zuvor genannten Beispieldaten können wir eine Menge nützlicher Daten für die Analyse gewinnen. Mit grep lassen sie sich sehr einfach durchsuchen und zerlegen. Beispielsweise können wir in den Daten nach allen Hosts forschen, indem wir einfach wie folgt nach dem entsprechenden Feld suchen: cat pstrtest.log | grep "Host:" Dadurch werden alle Zeilen ausgegeben, die das Wort »Host:« enthalten – und zwar in jedem Kontext, also möglicherweise auch in Zusammenhängen, die Sie gar nicht brauchen. Damit nur Zeilen gefunden werden, bei denen »Host:« am Anfang steht, müssen Sie Option -e und das Zirkumflexsymbol (^) angeben. cat pstrtest.log | grep -e "^Host: " Dieses Symbol bedeutet, dass der angegebene Text am Anfang der Zeile stehen muss. Daher erfüllen alle Zeilen, die mit »Host:« beginnen, diese Bedingung. Im jetzigen Zustand wird bei der Suche noch zwischen Groß- und Kleinschreibung unterschieden. Wenn Sie das nicht wollen, müssen Sie die Option -i angeben. Die Suche ist die einfachste und am häufigsten eingesetzte Funktion von grep, allerdings können Sie damit auch eine Suche nach regulären Ausdrücken, eine Zerlegung und weitere Bearbeitung der Daten vornehmen. Nehmen wir beispielsweise an, Sie wollen nach Etags in einem bestimmten Format suchen (siehe Abb. 6.20). 196 6 Paketstringdaten Abbildung 6.20: Etags in PSTR-Daten Die Einträge haben zwar im Allgemeinen ein sehr ähnliches Format, doch einige weisen zusätzliche Zeichen auf, z. B. mehr als einen Bindestrich. Ein Beispiel dafür finden Sie in der fünften Zeile. Um solche Einträge zu finden, müssen wir theoretisch nach allen Zeilen suchen, die mit ETag beginnen und auf die ein Wert mit zwei Bindestrichen folgt. Ausgeben wollen wir jedoch nur die eigentlichen Etags. Das können wir mit dem folgendem Befehl erreichen: cat pstrtest.log | grep -e "^ETag" | grep -oP "\".*?\-.*?\-.*?\"" | sed 's/ "//g' Dieser Befehl sieht zwar ziemlich kompliziert aus, macht aber tatsächlich, was wir wollen. Sehen wir uns die einzelnen Bestandteile dieses Befehls an: 1. cat pstrtest.log Als Erstes sorgen wir dafür, dass die Datei pstrtest.log auf dem Bildschirm (Standardausgabe) ausgegeben wird. 2. grep -e "^ETag" Anschließend übergeben wir die Ausgabe der Datei an grep und suchen dort nach Zeilen, die mit dem Text ETag beginnen. 3. grep -oP "\".*?\-.*?\-.*?\"" Die gefundenen Etags werden an einen weiteren grep-Befehl geleitet, der mithilfe eines regulären Ausdrucks nach Daten mit dem richtigen Format sucht. Dieses Format besteht aus beliebig vielen Zeichen (.*?) zwischen einem Anführungszeichen und einem Bindestrich, gefolgt von beliebig vielen Zeichen zwischen diesem und einem weiteren Bindestrich und anschließend weiteren beliebig vielen Zeichen und einem Anführungszeichen. 4. sed 's/"//g' Schließlich übergeben wir die Ausgabe des letzten grep-Befehls an sed, um alle Anführungszeichen daraus zu entfernen. 6.3 PSTR-Daten anzeigen 197 In diesem Beispiel haben wir auch sed genutzt. Dieser Befehl eignet sich zum Suchen und Ersetzen von Text. Hier durchsucht er sämtliche Zeilen und ersetzt sämtliche Vorkommen von doppelten Anführungszeichen (") durch nichts. Einfacher ausgedrückt, er entfernt alle doppelten Anführungszeichen. Die Ausgabe des Befehls sehen Sie in Abb. 6.21. Abbildung 6.21: Extraktion von Etags mit einem bestimmten Format aus PSTR-Daten Eine weitere praktische Bearbeitungsmöglichkeit besteht darin, die vorhandenen Daten zu ordnen und zu zählen. Das mag sich nach einer sehr einfachen Aufgabe anhören, bietet aber enorm viel Nutzen. Betrachten Sie als Beispiel den User-Agent-String in den HTTPHeaderinformationen. Durch die Sortierung dieser Strings von den am wenigsten zu den am häufigsten genutzten Benutzeragenten können wir schon eine gewisse rudimentäre Erkennung durchführen, denn unerwartete User-Agent-Strings können auf verdächtige Aktivitäten hindeuten. cat pstrtest.log | grep -e "^User Agent: " | sort | uniq -c | sort –n Dadurch geben wir nur die Zeilen der PSTR-Daten aus, die mit dem Text User Agent: beginnen, und übergeben sie an den Befehl sort. Die geordneten Ergebnisse werden dann an den Befehl uniq weitergeleitet, der alle eindeutigen Zeilen zählt und in der linken Spalte angibt. Das Ergebnis dieses Vorgangs wird dann erneut an sort übergeben, wobei sie diesmal aufgrund des Schalters -n nach der Anzahl der Vorkommen sortiert werden. Am Ende erhalten wir die in Abb. 6.22 gezeigten Daten. Abbildung 6.22: Sortierte User-Agent-Daten 198 6 Paketstringdaten Eine Analyse dieser Daten lässt sofort einige ungewöhnliche und möglicherweise verdächtige Benutzeragenten erkennen. Davon ausgehend können wir die entsprechenden Kommunikationsvorgänge genauer untersuchen. Das ist ein Beispiel für die Generierung grundlegender statistischer Daten aus PSTR-Daten. 6.4 Zusammenfassung Die verschiedenen Spielarten von Paketstringdaten sind von entscheidender Bedeutung, um die Effizienz der Erkennung und Analyse zu erhöhen. Angesichts des schnellen Zugriffs, der Breite der Daten, der Leichtigkeit der Bereitstellung und der geringen Speicheranforderungen für die Aufbewahrung bilden PSTR-Daten einen perfekten Kompromiss zwischen FPC- und Sitzungsdaten. In diesem Kapitel haben wir uns angesehen, was PSTRDaten sind, und einige Möglichkeiten besprochen, Daten dieses Typs zu erfassen und zu untersuchen. In späteren Kapiteln dieses Buches werden wir Situationen kennenlernen, in denen PSTR-Daten die Analyse unterstützen können. Teil 2 Erkennung 7 Erkennungsmechanismen, Einbruchs­ indikatoren und Signaturen Für die Erkennungsphase des Network Security Monitoring müssen Sie die Taktiken der Gegner verstehen, Ihre eigenen Erkennungsmöglichkeiten kennen und diese anwenden, indem Sie die erfassten Daten untersuchen und Anomalien aufspüren. In diesem ersten Kapitel des Teils über die Erkennung beschäftigen wir uns mit Erkennungsmechanismen, Indikatoren für einen Einbruch (Indicators of Compromise, IOCs) und Signaturen. Insbesondere sehen wir uns an, wie Sie Indikatoren aus Netzwerkangriffen ableiten können, wie Sie Indikatoren und Signaturen verwalten und welche gebräuchlichen Frameworks es für sie gibt. 7.1 Erkennungsmechanismen Allgemein gesagt, erfolgt die Erkennung mithilfe einer Software, die die erfassten Daten durchforstet und Alarmdaten generiert. Diese Software bezeichnen wir als Erkennungsmechanismen. Die Alarmdaten werden anschließend einem Analytiker übergeben. An dieser Stelle endet die Erkennungsphase, und es beginnt die Analyse. Das mag sich nach 202 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen einem vollautomatischen Vorgang anhören, aber nichts könnte weiter von der Wahrheit entfernt sein. Für eine erfolgreiche Erkennung müssen Sie den Erkennungsmechanismus sorgfältig auswählen und ihm ebenso sorgfältig Daten zuführen. Bei den meisten in diesem Buch besprochenen Erkennungsmechanismen handelt es sich um Netzwerk-IDS (Intrusion-Detection-Systeme). Davon gibt es zwei Hauptklassen, nämlich für die signatur- und die anomaliegestützte Erkennung. Die signaturgestützte Erkennung ist die älteste Form der Intrusion Detection. Dabei werden die Daten nach bestimmten Mustern durchsucht. Es kann sich dabei um einfache Muster wie IP-Adressen oder Textstrings handeln, aber auch um kompliziertere wie eine bestimmte Anzahl von Null-Bytes, die bei der Verwendung eines bestimmten Protokolls hinter einem bestimmten String auftreten. Wenn Sie diese Muster in objektive, plattform­unabhängige Daten zerlegen, erhalten Sie Einbruchsindikatoren. Wenn Sie sie in der plattformspezifischen Sprache des Erkennungsmechanismus ausdrücken, erhalten Sie Signaturen. Eine Unterkategorie der signaturgestützten Erkennung ist die reputationsgestützte Erkennung. Dabei geht es darum, eine Kommunikation zwischen den Hosts in Ihrem Netzwerk mit Hosts im Internet aufzuspüren, die aufgrund einer früheren Teilnahme an schädlichen Aktionen als bedrohlich eingestuft werden. Diese Erkennung erfolgt im Prinzip anhand von einfachen Signaturen in Form von IP-Adressen oder Domänennamen. In Kapitel 9 werden wir mehrere weit verbreitete signaturgestützte Erkennungsmechanismen besprechen, darunter Snort und Suricata. Um die reputationsgestützte Erkennung geht es in Kapitel 8. Die anomaliegestützte Erkennung ist eine jüngere Form der Intrusion Detection, die dank Tools wie Bro rasch an Bedeutung zunimmt. Hierbei werden Ereignisse im Netzwerk beobachtet und anomaler Datenverkehr mithilfe von Heuristiken und Statistiken erkannt. Solche Mechanismen alarmieren Sie nicht nur, wenn sie ein zuvor festgelegtes Muster gefunden haben, sondern können Angriffsmuster erkennen, die vom üblichen Netzwerk­ verhalten abweichen. Diese Art der Erkennung ist unendlich viel leistungsfähiger, aber auch deutlich schwieriger umzusetzen. In Kapitel 10 sehen wir uns Bro als Beispiel für einen solchen anomaliegestützten Mechanismus an, und in Kapitel 11 beschäftigen wir uns mit statistischer anomaliegestützter Erkennung. Eine neue, aufkommende Unterkategorie der anomaliegestützten Erkennung ist die Verwendung von Honeypotmechanismen. Honeypots werden schon seit vielen Jahren eingesetzt, um Malware und Angriffsproben zu Forschungszwecken zu sammeln, lassen sich aber auch für die Erkennung nutzen. Dabei wird ein Honeypotsystem eingerichtet, das den Aufbau des Produktionssystems widerspiegelt. Es weist oft bekannte Schwachstellen auf, enthält aber keine vertraulichen Daten. Dieses System wird umfangreich protokolliert, teilweise in Zusammenhang mit anderen Arten von Netzwerk- oder Host-IDS. Die Erkennung mithilfe von Honeypots ist Thema von Kapitel 12. Welchen Erkennungsmechanismus Sie bereitstellen, hängt davon ab, wie ausgereift Ihr Sicherheitsprogramm ist. Die meisten Organisationen beginnen mit einem signatur­ 7.2 Einbruchsindikatoren und Signaturen 203 gestützten Mechanismus und warten, bis sie sich in der Anwendung der ersten Technologie ausreichend sicher fühlen, bevor sie zu etwas Anspruchsvollerem wie etwa einem anomaliegestützten Mechanismus übergehen. Das trägt zu einer gesunden Entwicklung bei. Ich habe schon Organisationen kennengelernt, die von Anfang an die gesamte Palette der Erkennungsmechanismen umzusetzen versuchten und dabei einen argen Fehlschlag erlitten, weil es nicht möglich ist, sich all die verschiedenen Fähigkeiten gleichzeitig anzueignen. 7.2 Einbruchsindikatoren und Signaturen Erkennungsmechanismen sind nutzlos, wenn sie nicht korrekt gespeist und gewartet werden. Dazu müssen Einbruchsindikatoren und Signaturen entwickelt, gepflegt und implementiert werden. Ein Einbruchsindikator ist eine Information, die objektiv und plattformunabhängig ein Eindringen in ein Netzwerk beschreibt. Dabei kann es sich um einen einfachen Indikator wie die IP-Adresse eines Steuerservers (Command and Control, C2) handeln, aber auch um einen vielschichtigen Satz von Verhaltensweisen, die anzeigen, dass ein Mailserver als SMTP-Relay für schädliche Zwecke missbraucht wird. Es gibt die unterschiedlichsten Arten von Indikatoren, und sie können auf unterschiedliche Weise formatiert werden, um sie den verschiedenen Erkennungsmechanismen zuzuführen. Während das eine Tool IP-Adressen in kommagetrennten Listen verarbeiten kann, mag es für ein anderes erforderlich sein, die Adressen in eine SQL-Datenbank einzufügen. Die Darstellung der Indikatoren kann sich ändern, doch die Indikatoren selbst bleiben gleich. Außerdem kann ein einzelner Verhaltensindikator in mehrere Einzelteile zerlegt und mehreren Erkennungsmechanismen zugeführt werden. Wird ein Indikator in einer plattformspezifischen Sprache oder einem plattformspezifischen Format verwendet, etwa in einer Snort-Regel oder einer Bro-Datei, so wird er Teil einer Signatur, wobei eine Signatur auch mehrere Indikatoren umfassen kann. Im Rest dieses Kapitels sehen wir uns die verschiedenen Klassen von Indikatoren und Signaturen und ihre Verwaltung an. Hinweis für Analytiker In diesem Buch verwende ich statt »Einbruchsindikator« auch oft einfach den Begriff »Indikator«. Dieser Begriff für sich allein kann je nach Zielpublikum unterschiedliche Bedeutungen haben. Personen mit einem Hintergrund in der Rüstungsindustrie mögen dabei eher an Verhaltens- oder Attributionsindikatoren denken und weniger an objektive Informationen zur Beschreibung eines Eindringens in das Netzwerk. 204 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen 7.2.1 Host- und Netzwerkindikatoren Die allgemeinste und am weitesten verbreitete Klassifizierung von Indikatoren ist ihre Einteilung in Host- und Netzwerkindikatoren. Das gibt die grundlegende Natur des Indikators an, sodass Sie erkennen können, für welche Erkennungsmechanismen er geeignet ist. Hostindikatoren sind Informationen, die auf einem Host zu finden sind und objektiv einen Einbruch beschreiben. Zu den bekanntesten Indikatoren dieser Art gehören: •• •• •• •• •• •• •• •• Registrierungsschlüssel Dateiname Textstring Prozessname Mutex Dateihash Benutzerkonto Verzeichnispfad Netzwerkindikatoren beschreiben ebenfalls objektiv einen Einbruch, werden aber zwischen den Hosts im Netzwerk erfasst. Zu den bekanntesten zählen: •• •• •• •• •• •• •• •• IPv4-Adresse IPv6-Adresse X509-Zertifikathash Domänenname Textstring Kommunikationsprotokoll Dateiname URL Die meisten dieser Indikatoren sind zwar sowohl im Netzwerk als auch auf dem Host anzutreffen, doch die Klassifizierung richtet sich danach, wo sie hauptsächlich zu finden sind. Einige Indikatoren sind in beiden Kategorien aufgeführt, da sie gleichermaßen stark an beiden Orten vertreten sind, beispielsweise Textstrings und Dateinamen. Die Einteilung in Host- und Netzwerkindikatoren ist für den Anfang schon sehr praktisch, aber wir können auch noch eine Unterteilung in statische und variable Indikatoren vornehmen. 7.2 Einbruchsindikatoren und Signaturen 205 7.2.2 Statische Indikatoren Als statisch werden Indikatoren bezeichnet, für die ausdrücklich Werte definiert sind. Es gibt drei Varianten davon, nämlich elementare, berechnete und Verhaltensindikatoren (siehe Abb. 7.1). Elementare Indikatoren sind kleiner und spezifischer und lassen sich nicht in kleinere Bestandteile zerlegen, haben aber immer noch eine Bedeutung im Zusammenhang mit Eindringversuchen. Dazu gehören Dinge wie IP-Adressen, Textstrings, Hostnamen, ­E-Mail-Adressen und Dateinamen. Berechnete Indikatoren werden aus den Daten eines Zwischenfalls abgeleitet. Dazu zählen u. a. Hashwerte, reguläre Ausdrücke und Statistiken. Verhaltensindikatoren sind eine logische Kombination von elementaren und berechneten Indikatoren, die oft dazu dient, einen gewissen Kontext herzustellen. Das kann beispielsweise eine Zusammenstellung von Dateinamen und der zugehörigen Hashwerte sein oder eine Kombination aus Textstrings und regulären Ausdrücken. Abbildung 7.1: Verhaltensindikatoren sind aus elementaren und berechneten Indikatoren zusammengesetzt Nehmen wir an, Sie vermuten, dass in ein Gerät in Ihrem Netzwerk eingebrochen wurde. Anhand einer Analyse der NSM-Daten und der forensischen Hostdaten können wir erkennen, dass die folgenden Ereignisse in der angegebenen Reihenfolge eingetreten sind: 1. Ein Benutzer hat eine E-Mail von chris@appliednsm.com mit der Betreffzeile »Payroll Information« und der angehängten PDF-Datei Payroll.pdf mit dem MD5-Hash e0b359e171288512501f4c18ee64a6bd erhalten. 2. Der Benutzer hat das PDF geöffnet und dadurch den Download der Datei kernel32.dll mit dem MD5-Hash da7140584983eccde51ab82404ba40db von http://www.appliednsm. com/kernel32.dll ausgelöst. 3. Mit dieser Datei wurde C:/Windows/System32/kernel32.dll überschrieben. 206 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen 4. Code in der DLL wurde ausgeführt und hat eine SSH-Verbindung mit der IP-Adresse 192.0.2.75 an Port 9966 aufgebaut. 5. Die Malware hat nach allen DOC-, DOCX- und PDF-Dateien auf dem betroffenen Host gesucht und sie über die SSH-Verbindung an den gegnerischen Host übertragen. Diese vollständige Beschreibung des Zwischenfalls lässt sich durchaus als Verhaltensindikator ansehen. Er bietet zwar einen guten Überblick über den Vorfall, ist aber zu komplex, um uns für die NSM-Erkennung gute Dienste zu leisten. Um signatur- und anomaliegestützte sowie statistische Erkennungsmechanismen richtig einzustellen, müssen wir erst den Indikator in brauchbarere Einzelteile zerlegen und dabei sicherstellen, dass noch ein sinnvoller Kontext erhalten bleibt. Beispielsweise können wir dabei zu folgenden Verhaltensindikatoren (B für »behaviour«) kommen: •• B-1: Ein Benutzer empfängt eine E-Mail von chris@appliednsm.com mit der Betreffzeile »Payroll Information« und der angehängten PDF-Datei Payroll.pdf. Die PDFDatei hat den MD5-Hash e0b359e171288512501f4c18ee64a6bd. •• B-2: Die Datei kernel32.dll mit dem MD5-Hash da7140584983eccde51ab82404ba40db wird von http://www.appliednsm.com/kernel32.dll heruntergeladen. •• B-3: Die Datei C:/Windows/System32/Kernel32.dll wird durch eine Schaddatei desselben Namens mit dem MD5-Hashwert da7140584983eccde51ab82404ba40db überschrieben. •• B-4: Der Opfer-Host versucht eine SSH-Verbindung zu dem gegnerischen Host 192.0.2.75 an Port 9966 aufzubautén. •• B-5: Über eine verschlüsselte Verbindung werden DOC-, DOCX- und PDF-Dateien an 192.0.2.75 und Port 9966 übertragen. Als Nächstes versuchen wir, diese Verhaltensinicatoren in elementare (A, »atomic«) und berechnete (C, »calculated«) Indikatoren zu zerlegen. Das Ergebnis sieht wie folgt aus: •• •• •• •• •• •• •• •• •• •• •• •• C-1: MD5-Hash e0b359e171288512501f4c18ee64a6bd C-2: MD5-Hash da7140584983eccde51ab82404ba40db A-1: Gegnerische Domäne appliednsm.com A-2: E-Mail-Adresse chris@appliednsm.com A-3: Betreffzeile »Payroll Information« A-4: Dateiname Payroll.pdf A-5: Dateiname Kernel32.dll A-6: Gegnerische IP-Adresse 192.0.2.75 A-7: Port 9966 A-8: Protokoll SSH A-9: Dateitypen DOC, DOCX und PDF A-10: Dateiname Kernel32.dll 7.2 Einbruchsindikatoren und Signaturen 207 Damit haben wir insgesamt fünf Verhalts-, zwei berechnete und zehn elementare Indikatoren, die wir in unsere Erkennungsmechanismen aufnehmen können. Unter anderem können diese Indikatoren in Signaturen für verschiedene Mechanismen umgewandelt werden, wie die folgenden Beispiele zeigen: •• C-1/2: Antivirussignatur, um das Vorhandensein des Hashwerts zu erkennen •• A-1: Snort-/Suricata-Signatur, um jegliche Kommunikation mit der gegnerischen Domäne zu erkennen •• A-2: Snort-/Suricata-Signatur, um E-Mails von der gegnerischen E-Mail-Adresse zu erkennen •• A-3: Snort-/Suricata-Signatur, um die Betreffzeile zu erkennen •• A-3: Bro-Skript, um die Betreffzeile zu erkennen •• A-4/C-1: Bro-Skript, um zu erkennen, dass der Dateiname oder der MD5-Hashwert über das Netzwerk übertragen wird •• A-5/C-S: Bro-Skript, um zu erkennen, dass die Datei Kernel32.dll oder eine Datei mit dem MD5-Hashwert über das Netzwerk übertragen wird •• A-6: Snort-/Suricata-Signatur, um die Kommunikation mit der IP-Adresse zu erkennen •• A-7/A-8: Snort-/Suricata-Signatur, um die Kommunikation mit Port 9966 zu erkennen •• A-10: HIDS-Regel, um Änderungen an Kernel32.dll zu erkennen Wie Sie sehen, gibt es verschiedene Vorgehensweisen für die Erkennung auf der Grundlage dieser aus einem einzigen Zwischenfall abgeleiteten Indikatoren. Wenn wir noch mehr Einzelheiten hätten, könnten wir aus dieser Situation sogar noch weitere Erkennungsmöglichkeiten gewinnen. Beispielsweise können wir schädliche Objektaufrufe in der PDF-Datei selbst oder die Merkmale möglicherweise benutzter besonderer Protokolle erkennen. Je nach der Architektur des zu schützenden Netzwerks können mehrere Erkennungsmechanismen für ein und denselben Indikator vorhanden sein, es ist aber auch möglich, dass sich einige Indikatoren überhaupt nicht erkennen lassen. Welche Methode die beste ist, um einen bestimmten Indikator zu erkennen, hängt von der Infrastruktur des Netzwerks, den Details der Erkennungsmethoden und der Natur der Informationen ab, die ein Indikator bietet. 208 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen Bericht von der Front Manche Organisationen verwenden mehrere Versionen desselben Entdeckungsmechanismus für Indikatoren unterschiedlicher Wichtigkeit, beispielsweise mehrere Instanzen des IDS Snort für die signaturgestützte Erkennung. Snort erkennt Einbrüche, indem es die übertragenen Pakete »live« analysiert oder regelmäßig vorhandene PCAP-Dateien untersucht. Das Hauptgewicht liegt dabei auf der Snort-Instanz, die den Datenverkehr im laufenden Betrieb analysiert. Diese Echtzeit-Instanz ist für hocheffiziente Signaturen im Zusammenhang mit Indikatoren reserviert, die Informationen oberster Priorität liefern. Um Signaturen mit geringerer Vertrauenswürdigkeit sowie allgemeine Malwaresignaturen kümmert sich dagegen die Snort-Instanz, die regelmäßig die PCAP-Dateien untersucht. Dadurch können Alarmdaten zu kritischen Indikatoren schneller generiert werden, was den Analytikern eine schnellere Reaktion ermöglicht. 7.2.3 Variable Indikatoren Wenn die Erkennungsmechanismen in Ihrem Netzwerk nur Angriffe aufspüren können, für die es bekannte Indikatoren gibt, dann wird mit hoher Wahrscheinlichkeit eines Tages etwas Schlimmes durchschlüpfen. Irgendwann in der Punkt erreicht, an dem wir auch variable Indikatoren einsetzen müssen, also solche, deren Werte unbekannt sind. Um sie abzuleiten, wird gewöhnlich eine Folge von Ereignissen aufgestellt, bei der möglicherweise ein Angriff vorliegen könnte (was einen Verhaltensindikator darstellt), und versucht, die möglichen Variablen dabei ausfindig zu machen. Im Grunde genommen geht es darum, einen theoretischen Angriff zu untersuchen und nicht einen, der tatsächlich stattgefunden hat. Diese Art von Ursachenanalyse wird für einzelne Angrifftechniken durchgeführt und nicht für Angriffe eines bestimmten Gegners. Ich stelle mir variable Indikatoren gern wie das Drehbuch eines Films vor: Es sagt Ihnen, was geschehen wird, aber Sie wissen nicht, wer die einzelnen Rollen spielt. Bei erfahrenen Schauspielern besteht auch immer die Möglichkeit der Improvisation. Für signaturgestützte Erkennungsmechanismen sind variable Indikatoren nicht sehr sinnvoll, aber sie werden sehr häufig in Anwendungen wie Bro eingestzt. Um uns ein Beispiel für die Entwicklung von variablen Indikatoren anzusehen, beschäftigen wir uns noch einmal mit der Situation aus dem letzten Abschnitt. Hier jedoch geht es nicht um einen tatsächlich erfolgten, sondern um einen theoretisch möglichen Angriff. In diesem Sinne umformuliert, sieht das Szenario grob gesehen wie folgt aus: 1. Ein Benutzer erhält eine E-Mail mit einem schädlichen Anhang. 2. Der Benutzer öffnet den Anhang und löst damit den Download einer Datei aus einer gegnerischen Domäne aus. 7.2 Einbruchsindikatoren und Signaturen 209 3. Mit dieser Datei wird eine Systemdatei durch eine schädliche Version überschrieben. 4. Der Code in der Schaddatei wird ausgeführt und baut eine verschlüsselte Verbindung zu einem Schadserver auf. 5. Nach dem Aufbau der Verbindung werden große Mengen von Daten aus dem System herausgeschleust. Diese Schritte stellen Verhaltensindikatoren dar, die wiederum mehrere variable elementare und berechnete Indikatoren enthalten, darunter die folgenden: •• VB-1: Ein Benutzer erhält eine E-Mail mit einem schädlichen Anhang. • VA-1: E-Mail-Adresse • VA-2: Betreffzeile der E-Mail • VA-3: Schädliche E-Mail-Quelldomäne • VA-4: Schädliche E-Mail-Quell-IP-Adresse • VA-6: Dateiname des schädlichen Anhangs • VC-1: MD-5-Hash des schädlichen Anhangs. •• VB-2: Der Benutzer öffnet den Anhang und löst damit den Download einer Datei aus einer gegnerischen Domäne aus. • VA-6: Schädliche Umleitungsdomäne/IP-Adresse • VA-7: Name der heruntergeladenen Schaddatei • VC-2: MD-5-Hash der heruntergeladenen Schaddatei •• VB-3: Mit der Datei wird eine Systemdatei durch eine schädliche Version überschrieben. •• VB-4: Der Code in der Schaddatei wird ausgeführt und baut eine verschlüsselte Verbindung zu einem Schadserver über einen nicht standardmäßigen Port auf. • VA-8: IP-Adresse des externen C2-Servers • VA-9: Port des externen C2-Servers • VA-10 Protokoll des externen C2-Servers •• VB-5: Nach dem Aufbau der Verbindung werden große Mengen von Daten aus dem System herausgeschleust. Das V in den Indikatornamen deutet auf ihre variable Natur hin. Wie hier aufgezählt, gibt es zehn variable elementare Indikatoren, zwei variable berechnete Indikatoren und fünf variable Verhaltensindikatoren. Nun können wir uns Methoden überlegen, um diese Indikatoren in Signaturen für Erkennungsmechanismen aufzunehmen. Um eine Erkennung für eine breite Skala von möglichen Angriffen zu ermöglichen, werden variable Indikatoren gewöhnlich wiederverwendet und kombiniert. 210 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen •• VB-1 (VA-3/VA-4) VB-2 (VA-6) VB-4 (VA-8) VB-5 (VA-8): Snort-/Suricata-Regel, um eine Kommunikaton mit IP-Adressen und Domänen zu erkennen, die eine schlechte Reputation haben •• VB-1 (VA-5/VC-1) VB-2 (VA-7/VC-2): Bro-Skript, um Dateien aus der Verbindung herauszunehmen und ihre Namen und MD-5-Hashes mit denen auf einer Liste von Dateinamen und MD-5-Hashes schlechter Reputation zu vergleichen. •• VB-1 (VA-5/VC-1) VB-2 (VA-7/VC-2): Bro-Skript, um Dateien aus der Verbindung herauszunehmen und in einer Sandbox zu platzieren, in der eine rudimentäre Malwareanalyse vorgenommen wird. •• VB-2 (VA-6/VA-7/VC-2): HIDS-Signatur, um zu erkennen, dass der Browser von einem Dokument aus gestartet wird. •• VB-3: HIDS-Signatur, um zu erkennen, dass eine Systemdatei überschrieben wird •• VB-4 (VA-9/VA-10) VB-5: Bro-Skript, um verschlüsselten Datenverkehr über einen nicht standardmäßigen Port zu erkennen •• VB-4 (VA-9/VA-10) VB-5: Snort-/Suricata-Regel, um verschlüsselten Datenverkehr über einen nicht standardmäßigen Port zu erkennen •• VB-5: Eigenes Skript, das anhand von Sitzungsdatenstatistiken umfangreichen ausgehenden Datenverkehr von Arbeitsstationen erkennt Analytiker halten sich gewöhnlich auf dem neuesten Stand der Informationssicherheit, z. B. anhand der Protokolle von entsprechenden Konferenzen sowie der Blogs und Tweets von Branchenexperten. Dadurch kann ihre Organisation mit neuen Angriffstechniken Schritt halten und ihre Verteidigungsmaßnahmen darauf einstellen. Dabei ist es äußerst wertvoll, einen Angriff in variable Indikatoren zu zerlegen. Wenn plattformspezifische Signaturen bereitgestellt werden, können daraus einzelne Indikatoren abgeleitet und für die vorhandenen Erkennungsmechanismen genutzt werden. Das ist eine äußerst nützliche Übung für NSM-Analytiker. Sie hilft ihnen dabei, die Funktionsweise des Angriffs besser zu verstehen und sich klar zu machen, wie der Erkennungsmechanismus eingesetzt werden kann, um die einzelnen Phasen dieses Angriffs wirkungsvoll zu erkennen. Die Bestandteile der variablen Indikatoren lassen sich für alle Arten der Erkennung einsetzen, aber am nützlichsten sind sie, um Dinge mit unbekannten Entitäten wahrzunehmen. 7.2.4 Evolution von Indikatoren und Signaturen Softwareentwicklung ist gewöhnlich ein evolutionärer Prozess, in dem die Software als »unreif« angesehen wird, bis sie vollständig getestet ist. Danach hat sie, während sie in der Produktion eingesetzt wird, einen »reifen« Zustand, und wird schließlich »ausgemustert«, wenn sie nicht mehr nützlich ist. Ebenso wie Software haben auch Indikatoren und Signaturen ein Verfallsdatum, und auch sie durchlaufen die Phasen »unreif«, »reif« und »ausgemustert« (siehe Abb. 7.2). 7.2 Einbruchsindikatoren und Signaturen 211 Abbildung 7.2: Evolution von Indikatoren und Signaturen Unreife Indikatoren und Signaturen sind solche, die erst neu entdeckt wurden, etwa durch die interne Untersuchung eines Zwischenfalls oder aufgrund von Informationen einer externen Quelle. In diese Kategorie fallen auch neu aufgestellte variable Indikatoren, die noch nicht vollständig in eine Signatur für einen Erkennungsmechanismus umgesetzt worden sind. Das Vertrauen, das die Organisation in unreife Indikatoren und Signaturen setzt, kann zu Anfang stark schwanken, was vor allem von ihrer Quelle abhängt. Unreife Indikatoren und Signaturen können sich auch häufig ändern und werden gewöhnlich erst in einer Testumgebung bereitgestellt, bevor sie in der Produktion eingesetzt werden. Zu diesem Test kann auch die Anwendung in verschiedenen Erkennungsmechanismen gehören, um herauszufinden, für wen sie am besten geeignet sind. Analytiker müssen diese bereitgestellten Signaturen daher genau auf falsch positive oder falsch negative Ergebnisse überwachen. In manchen Situationen ist es angebracht, Alarme aufgrund von unreifen Indikatoren und Signaturen nur von Analytikern der zweiten und dritten Ebene bearbeiten zu lassen, von denen zu erwarten ist, dass sie mit der entsprechenden Vorsicht vorgehen. Indikatoren und Signaturen, die sich für die NSM-Umgebung als nützlich erwiesen haben, kein Übermaß an Fehlalarmen hervorrufen und auch keine Zwischenfälle übersehen, werden als »reif« eingestuft. Reife Indikatoren und Signaturen werden nicht mehr so häufig revidiert wie unreife. Sie gelten als zuverlässig und stabil und können auch vertrauensvoll mit anderen Indikatoren zu detaillierteren Verhaltungsindikatoren kombiniert werden, um anspruchsvollere Signaturen zu erstellen. Jegliche Änderungen oder Revisionen an reifen Indikatoren und Signaturen sollten dokumentiert werden. Irgendwann ist ein Indikator oder eine Signatur nicht mehr wirkungsvoll oder wird nicht mehr benötigt. Das kommt häufig im Zusammenhang mit Phishingkampagnen, mit Drive-by-Downloads und mit den Steuerservern von Botnetzen vor. Das Prinzip der ordnungsgemäßen Archivierung und die Notwendigkeit rückblickender Analyse legen nahe, dass Sie diese Elemente jedoch nicht einfach löschen sollen. Stattdessen werden nicht mehr aktiv genutzte Indikatoren und Signaturen als »ausgemustert« betrachtet. Ein ausgemusterter Indikator wird nicht mehr in einer Signatur für einen Erkennungsmechanismus bereitgestellt, eine ausgemusterte Signatur wird nicht mehr von einem Erkennungsmechanismus genutzt. Wenn es notwendig werden sollte, ausgemusterte Indikatoren oder 212 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen Signaturen zu ändern und wiederzufinden, müssen sie wieder in den unreifen oder reifen Zustand zurückversetzt werden. 7.2.5 Signaturen optimieren Die Optimierung von Signaturen ist eine wichtige Aufgabe für Sicherheitsteams – und zwar eine, die nie abgeschlossen ist. Dabei wird sichergestellt, dass die Indikatoren, auf denen die Signaturen beruhen, auf zuverlässige und wirkungsvolle Weise eingesetzt werden und die Phasen der Indikatorevolution ordnungsgemäß durchlaufen. In manchen Fällen lässt sich sehr leicht bestimmen, wie wirkungsvoll eine Signatur ist. Nehmen wir an, Sie stellen eine Signatur mit neuen Indikatoren bereit, und sie fängt sofort an, die Bildschirme aller Analytiker mit Tausenden von Alarmen zu überfluten. Das bedeutet, dass die Signatur höchstwahrscheinlich zu weit gefasst ist und noch umgearbeitet werden muss, um die Fehlalarme auszuschließen. Allerdings lässt sich die Leistung von Signaturen nicht immer so einfach feststellen. Wie vergleichen Sie beispielsweise zwei Signaturen, die demselben Zweck dienen, und wie bestimmen Sie, welche davon die wirkungsvollere ist? Dabei können Ihnen Statistiken helfen. Um die Reife und die Vertrauenswürdigkeit einer Signatur zu bewerten, müssen Sie vier Aspekte berücksichtigen, nämlich wahr und falsch positive Ergebnisse sowie wahr und falsch negative. Wahr positiv (WP): Ein Alarm, der die angegebene Aktivität korrekt erkannt hat. Wenn eine Signatur dazu dient, eine bestimmte Art von Malware zu erkennen, und beim Start dieser Malware auf einem System ein Alarm ausgelöst wird, dann handelt es sich um ein wahr positives Ergebnis. Das ist genau das, was wir mit unseren Signaturen erreichen wollen. Falsch positiv (FP): Ein Alarm, der die angegebene Aktivität fälschlicherweise erkannt hat, also ein Fehlalarm. Wenn eine Signatur dazu dient, eine bestimmte Art von Malware zu erkennen, und ein Alarm ausgelöst wird, obwohl diese Malware gar nicht vorhanden ist, dann haben wir es mit einem falsch positiven Ergebnis zu tun. Wahr negativ (WN): Es wird kein Alarm ausgelöst, wenn die angegebene Aktivität nicht vorhanden ist. Wenn eine Signatur dazu dient, eine bestimmte Art von Malware zu erkennen, und kein Alarm ausgelöst wird, eben weil diese Malware nicht gestartet wurde, dann haben wir es mit einem wahr negativen Ergebnis zu tun. Das ist ebenfalls eine wünschenswerte Reaktion. Wahr negative Ereignisse lassen sich im Rahmen der NSM-Erkennung nur sehr schwer quantifizieren, aber es ist nicht unmöglich. Falsch negativ (FN): Es wird kein Alarm ausgelöst, obwohl die angegebene Aktivität aufgetreten ist. Wenn eine Signatur dazu dient, eine bestimmte Art von Malware zu erkennen, und kein Alarm ausgelöst wird, obwohl weil diese Malware auf dem System gestartet wurde, dann haben wir es mit einem falsch negativen Ergebnis zu tun. Das bedeutet, dass wir etwas nicht erkennen, was wir hätten erkennen sollen – und das ist der schlimmstmögliche Fall. Die Anzahl falsch negativer Ereignisse lässt sich nur schwer berechnen, denn wie 7.2 Einbruchsindikatoren und Signaturen 213 wollen Sie darauf aufmerksam werden, wenn die Signaturen die betreffenden Aktivitäten nicht bemerken? Dies ist einer der vielen Gründe, warum eine Post-mortem-Analyse nach einem Zwischenfall so wichtig ist. Dabei gehen Sie den Vorfall systematisch durch, um zu bestimmen, wann die Signatur eine Aktivität hätte erkennen sollen, und zeichnen Ihre Ergebnisse auf. Diese Daten sind schon für sich allein nützlich, um zu ermitteln, wie erfolgreich eine Signatur bei der Erkennung ist. Allerdings bieten diese Zahlen noch mehr Wert, wenn Sie sie dazu heranziehen, die Genauigkeit der Signatur zu berechnen. Genauigkeit Die Genauigkeit einer Signatur, manchmal auch positiver Vorhersagewert genannt, ist ein Maß für ihre Fähigkeit, zu wahr positiven Ergebnissen zu kommen. Berechnet wird sie als Anteil der wahr positiven an sämtlichen positiven Ergebnissen (also sowohl wahr als auch falsch positiven): Genauigkeit = WP / (WP + FP) Dafür lässt sich die Wahrscheinlichkeit dafür ermitteln, dass bei einem Alarm die erkannte Aktivität auch tatsächlich aufgetreten ist. Wenn ein Alarm aufgrund einer Signatur mit einer hohen Genauigkeit ausgelöst wird, ist es sehr wahrscheinlich, dass die betreffende Tätigkeit korrekt erkannt wurde. Stellen Sie sich eine Situation vor, in der ein und derselbe Netzwerkverkehr zwei verschiedene Alarme ausgelöst hat, die den Angriff auf zwei verschiedene Arten von Malware zurückführten. SID 1 in dem einen Alarm nennt Malware A als Übeltäter, SID 2 im anderen Alarm dagegen Malware B. Wenn SID 1 eine Genauigkeit von 90 hat, SID 2 dagegen nur eine Genauigkeit von 40, dann ist es wahrscheinlich, dass SID 1 die richtige Malware identifiziert hat. Hinweis für Analytiker Eine SID-Nummer (Signatur-ID) ist ein eindeutiger Bezeichner für eine Signatur. Eine hohe Genauigkeit ist eine wünschenswerte Eigenschaft für Signaturen, und je höher sie ist, umso vertrauenswürdiger ist die Signatur. Wenn Sie feststellen, dass eine Signatur eine geringe Genauigkeit hat, dann sollten Sie versuchen, dies zu korrigieren, indem Sie die Signatur weiterentwickeln, weitere Indikatoren hinzufügen oder sie in Kombination mit anderen Signaturen einsetzen. Wenn Sie keine eigene Anwendung für solche Statistiken haben, können Sie sie ziemlich einfach in einem Arbeitsblatt oder einer CSV-Datei verfolgen, wie das Beispiel in Tabelle 7.1 zeigt. 214 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen Tabelle 7.1: Signaturstatistiken Indikator-­ GUID IndikatorRevisionsnummer Bereit­ stellung Änderungsdatum WP FP WN FN 60003023 1 Snort-Signatur: 1000492 6/19/2013 1 432 0 0 60003023 2 Snort-Signatur: 1000492 6/23/2013 5 3 0 0 60003024 1 Snort-Signatur: 1000493 6/23/2013 2 17 0 0 60003025 1 Snort-Signatur: 1000494 6/25/2013 1 2 0 0 60003026 1 Snort-Signatur: 1000495 6/25/2013 3 0 0 1 60003026 2 Snort-Signatur: 1000495 6/28/2013 1 0 0 0 Anhand dieser Statistiken können Sie bestimmen, wie vertrauenswürdig eine Signatur ist. Das wirkt sich darauf aus, wie Sie reagieren, wenn aufgrund dieser Signatur ein Alarm ausgelöst wird, und wie viel Aufwand Sie betreiben, um die Signatur zu optimieren und ihre Zuverlässigkeit zu erhöhen. Es gibt noch verschiedene andere Techniken und Statistiken, mit denen Sie bestimmen können, wie wirkungsvoll eine Signatur ist. Für mich hat die Genauigkeit in vielen verschiedenen Organisationen immer gleichbleibend gut funktioniert. 7.2.6 Entscheidende Kontextinformationen für Indikatoren und Signaturen Ohne Kontext sind Indikatoren und Signaturen nicht besonders sinnvoll. Bei einem neuen Alarm sollten Analytiker als eine der ersten Maßnahmen den Kontext der Signatur und den Kontext der in ihr enthaltenen Indikatoren untersuchen. Die Natur des Kontextes, der für eine Signatur oder einen Indikator bereitgestellt werden kann, kann sehr stark schwanken, aber auf jeden Fall ist er von entscheidender Bedeutung für die Untersuchung eines Zwischenfalls. Es ist wichtig, eine Norm für ein Minimum an entscheidenden Kontext­ informationen für Indikatoren und Signaturen aufzustellen. Dadurch wird sichergestellt, dass die Indikatoren und Signaturen eindeutig und rückverfolgbar sind und bei einem Einbruch, einem Audit oder einem anderen Vorfall, bei dem es auf Genauigkeit ankommt, korrekt angesprochen werden können. Es handelt sich dabei um folgende entscheidende Angaben: 7.2 Einbruchsindikatoren und Signaturen 215 •• Eindeutiger Bezeichner: Ein Wert, der dazu dient, den Indikator oder die Signatur eindeutig zu identifizieren. Diese Bezeichner dürfen nicht mehrfach verwendet werden. Die meisten Organisationen verwenden einfach automatisch inkrementierte laufende Nummern oder zufällig generierte global eindeutige Bezeichner (Globally Unique Identifiers, GUIDs) für Indikatoren. Die Bezeichner für Signaturen hängen gewöhnlich von dem Erkennungsmechanismus ab, in dem sie eingesetzt werden. Am gebräuchlichsten ist eine SID-Nummer (Signatur-ID). Diese Art der Benennung hat auch den Vorteil, dass Sie in beliebigen Kommunikationsmedien auf bestimmte Indikatoren oder Signaturen verweisen können, ohne sie ausführlich beschreiben zu müssen. Das verhindert auch Fehlalarme durch die Erwähnung von Indikatoren und Signaturen in E-Mails oder ähnlichen Kommunikationsformen. •• Autor: Der Analytiker, der den Indikator oder die Signatur erstellt oder hinzugefügt hat. Wenn ein Alarm ausgelöst wird und Unklarheit über den Indikator oder die Signatur selbst oder die Implementierung herrscht, bietet diese Angabe die Gelegenheit, Informationen beim Urheber einzuholen. •• Erstellungsdatum: Das Datum, an dem der Indikator oder die Signatur erstellt wurde. Falls es aus einer fremden Quelle stammt, kann dies das Datum sein, an dem es Ihrem internen System hinzugefügt wurde. •• Änderungsdatum: Das Datum der jüngsten Änderung an dem Indikator oder der Signatur. Ideal wäre es, jegliche Änderungen an Indikatoren und Signaturen zu dokumentieren. Das werden wir weiter hinten ansprechen. •• Quelle: Die Quelle, aus der der Indikator oder die Signatur stammt. Das kann eine andere Organisation, ein URL, eine interne Fallnummer oder sogar ein anderer Indikator sein. •• Typ: Die Art des Indikators. Host- oder Netzwerkindikator, statischer oder variabler Indikator, elementarer, berechneter oder Verhaltensindikator. Bei Signaturen sind dies Typen wie Snort, Suricata, Bro, Antivirus usw. •• Klassifizierung: Die allgemeine Klasse, in die der Indikator oder die Signatur fällt. Indikatoren können als IP-Adressen, Hashwerte, Dateinamen, Betreffzeilen, DNS-Namen usw. klassifiziert sein. Bei Signaturen handelt es sich um die Kategorie der Bedrohung, um deren Erkennung es jeweils geht, also etwa Malwareaktivitäten, Botnetz-Steuerserver, Exploits, Phishing usw. •• Evolutionsphase: Der Zustand der Entwicklung, in dem sich der Indikator oder die Signatur gerade befindet, also unreif, reif oder ausgemustert. •• Vertrauenswürdigkeit: Eine Angabe, wie viel Vertrauen dem Indikator oder der Signatur geschenkt werden kann. Damit wird bestimmt, wie zuverlässig das Element ist und wie wahrscheinlich es ist, dass bei einem dadurch ausgelösten Alarm tatsächlich ein Zwischenfall vorliegt. Bei dieser Abschätzung können mehrere Faktoren berücksichtigt werden, darunter die Genauigkeit, die Quelle und ihr Entwicklungsstand. Es ist nicht ungewöhnlich, dass sich die Vertrauenswürdigkeit von Indikatoren und Signaturen mit der Zeit ändert. Ausgedrückt wird sie gewöhnlich durch eine Zahl (1 bis 100) oder eine relative Einschätzung (niedrig, mittel, hoch, sehr hoch). •• Indikator/Signatur: Der eigentliche Indikator bzw. die Signatur in ihrem eigenen Format. 216 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen Neben der Aufbewahrung und Klassifizierung von Indikatoren und Signaturen ist auch ein einheitliches Vorgehen äußerst wichtig. Um diese Einheitlichkeit zu erreichen, ist es unverzichtbar, den Prozess gut zu dokumentieren und in der Organisation häufig zu üben. 7.3 Indikatoren und Signaturen verwalten Die Anzahl der Indikatoren und Signaturen, die eine Organisation verwaltet, kann im Laufe der Zeit stark wachsen. Es ist wichtig, dass eine Organisation eine Strategie dafür entwickelt, wie diese Indikatoren und Signaturen aufbewahrt werden, wie der Zugriff darauf erfolgt und wie sie weitergegeben werden. Die meisten Organisationen speichern Indikatoren und Signaturen ausschließlich in dem Erkennungsmechanismus, in dem sie eingesetzt werden. Wenn eine Organisation beispielsweise Snort verwendet, um den Zugriff auf bekanntermaßen schädliche Domänen (elementare Indikatoren) zu erkennen und zu protokollieren, dann speichert sie diese Indikatoren als Snort-Signaturen dort, wo Snort unmittelbar darauf zurückgreift. Das ist zwar die einfachste Möglichkeit aber sie schränkt die Möglichkeiten für die Verwendung der Indikatoren ein. Es kann auch eine einfache Weitergabe einzelner Indikatoren oder ihre Konvertierung in Signaturen für einen anderen Erkennungsmechanismus unmöglich machen. Um Indikatoren und Signaturen bestmöglich zu nutzen, sollten Sie sich zu ihrer Verwaltung daher nach folgenden empfohlenen Vorgehensweisen richten: Rohdatenformat. Am einfachsten lässt sich mit Indikatoren arbeiten, wenn sie in ihrer ursprünglichen Form vorliegen. Es sollte immer möglich sein, auf Indikatoren ohne zusätzliche Inhalte und ohne irrelevante Verarbeitungsschritte zuzugreifen. Das sorgt dafür, dass die Indikatoren übertragbar sind, leicht von automatischen und selbst geschriebenen Tools untersucht werden können und sich Signaturen verschiedener Erkennungsmechanismen einsetzen lassen. Das bedeutet beispielsweise, dass IP-Adressen und Dateihashes als Klartext vorliegen sollten, Binärdaten dagegen im Binärformat. Leichter Zugriff. Analytiker müssen in der Lage sein, ohne großen Aufwand auf Indikatoren und Signaturen zuzugreifen und sie zu bearbeiten. Wenn sie erst eine Menge komplizierter Schritte durchlaufen müssen, bevor sie neue Indikatoren hinzufügen oder die Quelle eines Indikators herausfinden können, dann verschlingt das wertvolle Zeit. Es kann Analytiker sogar davon abhalten, sich mit den Indikatoren und Signaturen zu beschäftigen, und das wäre das Letzte, was Sie wollen. Leicht auffindbar. Es dauert nicht lange, bis ein Verzeichnis oder eine Datenbank voller Indikatoren und Signaturen zu groß geworden ist, um darin manuell zu suchen. Um Analytikern eine schnelle Untersuchung zu ermöglichen, müssen die Indikatoren und Signaturen so gespeichert werden, dass sie leicht aufzufinden sind. Das bedeutet, dass es eine Möglichkeit geben sollte, die Indikatoren und Signaturen als solche zu finden, aber auch, um nach den zusammen damit gespeicherten Kontextdaten zu suchen, z. B. nach dem Erstellungsdatum, der Quelle oder dem Typ. Bei der Speicherung in einer Datenbank 7.3 Indikatoren und Signaturen verwalten 217 kann dies über einen Datenbankclient oder ein einfaches Web-Front-End geschehen. Sind die Indikatoren oder Signaturen in linearen Dateien gespeichert, lassen sich mit LinuxBefehlszeilenwerkzeugen wie grep Lösungen erstellen. Dokumentation von Revisionen. Signaturen werden häufig revidiert, etwa wenn sie zu viele Fehlalarme verursachen, wenn sie eine schädliche Aktivität nicht erkennen oder wenn sich die Strategien des Gegners oder die Angriffstechniken geändert haben. In jedem Fall sollten die Revision, die Person, die sie durchgeführt hat, und das Datum aufgezeichnet werden, damit jegliche Probleme aufgrund dieser Änderung angegangen werden können. Idealerweise sollte auch der Grund der Revision dokumentiert werden. Dokumentation der Bereitstellung. Der Zweck eines Indikators besteht darin, in einer Signatur für einen Erkennungsmechanismus eingesetzt zu werden. Wenn das geschieht, sollte festgehalten werden, für welchen Erkennungsmechanismus der Indikator verwendet wird. Dadurch können Analytiker verstehen, wie die NSM-Infrastruktur bei der Nutzung dieses Indikators verwendet wird. Es verhindert auch, dass Indikatoren versehentlich mehrfach im gleichen Erkennungsmechanismus bereitgestellt werden. Dazu wird oft eine einfache Zuordnung des Indikator-GUIDs zu einer SID verwendet. Datensicherung. Inzwischen sollte Ihnen klar geworden sein, wie wichtig Indikatoren und Signaturen für die NSM-Erkennung sind. Diese Daten sind von entscheidender Bedeutung für den Erfolg der NSM und sollten daher entsprechend sorgfältig gesichert werden. Dazu gehört auch eine auswärtige Lagerung der Sicherung als Vorsichtsmaßnahme gegen eine Katastrophe, die den Hauptsitz beeinträchtigt. 7.3.1 Einfache Verwaltung von Indikatoren und Signaturen mit CSV-Dateien Organisationen unterschiedlicher Größe setzen jeweils andere Techniken ein, um Indikatoren und Signaturen zu speichern und zu verwalten. Einige nutzen kommerzielle Lösungen, während andere selbst geschriebene Web-Front-Ends für eine Datenbank bereitstellen. Alle diese Methoden sind sicherlich wirkungsvoll, aber es erfordert schon einen gewissen Reifegrad der Organisation, bevor sie umgesetzt werden können. Aber selbst kleine und weniger reife Sicherheitsteams brauchen eine Möglichkeit, Indikatoren und Signaturen zu verwalten. Es mag sich zwar primitiv anhören, aber eine solche Verwaltung lässt sich bereits auf durchaus wirkungsvolle Weise mithilfe von CSV-Dateien (Comma-Separated Values, also »durch Kommata getrennte Werte«) erreichen. In solchen Dateien sind die Daten in Zeilen und Spalten angeordnet, wobei die Spalten durch Kommata und die Zeilen durch Zeilenumbrüche voneinander getrennt sind. Dieses Format ist für viele Arten von Daten hervorragend geeignet, da es sich mit den im Lieferumfang von Linux enthaltenen Befehlszeilenwerkzeugen wie Grep, Cut, Sed, Awk und Sort leicht lesen und analysieren lässt. CSV-Dateien können Sie auch in Microsoft Excel, Libre Office/Open Office Calc und den meisten anderen grafischen Tabellenkalkulationsprogrammen öffnen. 218 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen Um Indikatoren und Signaturen anhand der hier vorgestellten empfohlenen Vorgehensweisen wirkungsvoll zu verwalten, brauchen Sie mindestens drei CSV-Dateien, nämlich die Statistikdatei, die wir uns schon zuvor angesehen haben (Tabelle 7.1), eine Masterliste und eine Revisionstabelle. 7.3.2 Masterliste der Indikatoren und Signaturen Die wichtigste CSV-Datei ist die Masterliste, denn in ihr sind die Indikatoren und Signaturen gespeichert. Sie enthält Felder für alle zuvor erwähnten kritischen Angaben sowie Felder zum Nachvollziehen der Bereitstellung. Ein Beispiel sehen Sie in Tabelle 7.2. Diese Liste kann auf zwei einfache Weisen durchsucht werden. Erstens können Sie ein grafisches Tabellenkalkulationsprogramm wie Microsoft Excel verwenden und darin eine einfache Sortierung vornehmen oder mit (Strg) + (F) nach bestimmten Werten suchen. Je größer die CSV-Datei wird, umso schwieriger wird das jedoch. Daher verwenden Analytiker gewöhnlich Linux-Befehlszeilenwerkzeuge, um solche Listen abzufragen. Nehmen wir an, es wurde ein Alarm zur Signatur SID 710031 generiert. Um weitere Informationen über diese Signatur und die damit verknüpften Indikatoren zu gewinnen, können Sie die Masterdatei wie folgt mit Grep nach allen Vorkommen der betreffenden SID durchsuchen: grep 7100031 master_ioc_list.csv Das Ergebnis dieses Befehls sehen Sie in Abb. 7.3. Unsere Suche gibt sowohl die Signatur als auch den darin verwendeten Indikator zurück. Abbildung 7.3: Durchsuchen der CSV-Datei nach einer SID Manchmal kann es auch praktisch sein, die Spaltenköpfe mit auszugeben. Grep jedoch sieht nur Daten und hat keine Vorstellung von Spalten, sodass es dazu nicht in der Lage ist. Sie könnten Sed oder Awk mit Mustererkennung verwenden, es ist aber auch möglich, einfach mit dem Befehl head die erste Zeile auszugeben, bevor Sie die Grep-Suche durchführen: head -1 master_ioc_list.csv && grep 7100031 master_ioc_list.csv Da die Befehle durch zwei kaufmännische Und-Zeichen (&&) verknüpft sind, werden sie nacheinander ausgeführt. Abb. 7.4 zeigt das Ergebnis. 3/18/2013 3/18/2013 3/19/2013 3/24/2013 3/20/2013 3/24/2013 3/18/2013 10003 Sanders 3/18/2013 10004 Sanders 3/19/2013 3/20/2013 10005 Randall 10006 Sanders 3/20/2013 10007 Sanders 3/21/2013 3/20/2013 3 1 4 1 1 1 2 Protokoll/ Port Protokoll/ Port IP-Adresse Verhalten/ variabel Verhalten/ variabel Verhalten/ variabel Elementar/ statisch Elementar/ statisch Elementar/ statisch Domäne E-MailAdresse Berechnet/ statisch Typ MD5 Klasse Interne Statisch Diskussion RSS-Feed Analytiker ZeusTracker Fall 1498 MalwareDomänen­ liste Fall 1492 Erstellungs­ Änderungs­ Rev. Quelle datum datum Sanders 3/17/2013 10002 Smith 10001 GUID Autor Tabelle 7.2: Masterliste der Indikatoren und Signaturen Hoch Sehr hoch Mittel Sehr hoch Mittel Unreif Niedrig Reif 42039 18ee64a6bd Eigenes SiLK-Skript SnortSignatur 7100032 Verhältnis des ausgehenden Datenverkehrs größer als 4:1 SSH/9966 Eigenes SiLK-Skript SuricataSignatur 7100038 Verschlüsselter Bro-Skript Datenverkehr über nicht standardmäßigen Port 192.0.2.99 com chris@appliednsm. SnortSignatur 7100031 Signature 88512501f4c appliednsm. com Antivirus Bereit­ stellung e0b359e1712 Vertrauens­ Indikator würdigkeit Unreif Mittel Reif Reif Reif Reif Phase 7.3 Indikatoren und Signaturen verwalten 219 220 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen Abbildung 7.4: Ausgabe mit Spaltenköpfen Wenn wir nur die Signatur selbst daraus gewinnen wollen, können wir das Ergebnis des vorherigen Befehls (ohne die Spaltenköpfe) an einen weiteren Grep-Befehl übergeben, der nach Zeilen mit dem Text sid sucht. Dadurch werden nur die Signaturen gefunden, nicht die Indikatoren. Diese Ausgabe wiederum leiten wir mit dem Pipe-Symbol | an einen Cut-Befehl, in dem wir mit dem Schalter -d das Komma als Trennzeichen angeben und dann mit -f die elfte Spalte auswählen. Der Befehl sieht insgesamt wie folgt aus: grep 7100031 master_ioc_list.csv | grep sid | cut –d , –f11 Das gleiche Ziel können wir auch mit dem Befehl awk erreichen. Mit dem Schalter -F können wir Awk anweisen, eine bestimmte Spalte auszugeben: grep 7100031 master_ioc_list.csv | grep sid | awk –F '{print $11}' Diese Techniken lassen sich noch erweitern, um die Suche zu verfeinern. Nehmen wir an, Sie wollen alle E-Mail-Adressen aus der Liste abrufen, die noch aktiv als Indikatoren verwendet werden (also nicht ausgemustert sind), um sie in einem Erkennungsmechanismus bereitzustellen. Das können Sie mit folgendem Befehl erreichen: grep –v retired master_ioc_list.csv | grep IP | cut –d , -f11 Der Schalter -v in der ersten grep-Anweisung besagt, dass alles gesucht werden soll, was nicht mit dem angegebenen Muster übereinstimmt. Hier weisen wir Grep an, alle Indikatoren aufzuführen, die nicht ausgemustert (»retired«) sind, also alle reifen und unreifen Indikatoren. Vorsicht Selbst sauber formatierte CSV-Dateien können unerwartete Befehlsausgaben hervorrufen, wenn für die Daten nicht genügend Sorgfalt aufgewendet wird. Stellen Sie sich einmal vor, eine Signatur enthielte ein Komma. Dadurch würden die hier vorgestellten Tools bei der Zählung der Spalten durcheinanderkommen. Seien Sie sich immer bewusst, dass in einer CSV-Datei Trennzeichen am falschen Ort stehen können. Es kann auch angebracht sein, bestimmte Zeichen zu ersetzen, um Verarbeitungsfehler zu vermeiden. 7.3 Indikatoren und Signaturen verwalten 221 Als Nächstes suchen wir nach allen Indikatoren, bei denen es sich um Domänennamen handelt und die aktiv im IDS Snort bereitgestellt sind. Das erreichen wir mit folgendem Befehl: head -1 master_ioc_list.csv && grep –v retired master_ioc_list.csv | grep Domain | grep Snort Die Suchbegriffe »Domain« und »Snort« stehen hier in Großbuchstaben. Standardmäßig unterscheidet Grep zwischen Groß- und Kleinschreibung, was hier praktisch ist, um nur die gewünschten Einträge zu finden und nicht auch andere Stellen, in denen sie mit kleinem Anfangsbuchstaben vorkommen. Wenn Sie bei der Suche nicht zwischen Groß- und Kleinschreibung unterscheiden wollen, verwenden Sie die Befehlsoption -i. Wichtig ist, dass Sie wissen, wie die Einträge geschrieben sind, nach denen Sie mit Grep suchen wollen. Im Zweifelsfall verwenden Sie -i. Um die CSV-Datei zu ergänzen oder zu ändern, können Sie einen Befehlszeilen-Texteditor nach Ihrem Geschmack verwenden, z. B. Vim, Emacs oder Nano. Achten Sie dabei darauf, dass Sie nicht versehentlich Zeileneinbrüche einfügen, was die Untersuchung erschweren würde. 7.3.3 Revisionstabelle für Indikatoren und Signaturen Ich habe bereits erwähnt, dass Indikatoren und Signaturen häufig revidiert werden und dass es wichtig ist, diese Revisionen zu dokumentieren. Dazu verwenden Sie eine zweite CSV-Datei neben der Masterliste. Sie sollte sehr einfach gehalten sein und nur den eindeutigen Bezeichner des Indikators oder der Signatur, das Datum der Änderung, den Urheber der Änderung, die Revisionsnummer, die Nummer der geänderten Spalte, den alten und den neuen Wert der geänderten Daten sowie eine Begründung für die Änderung enthalten. Damit lässt sich die Entwicklung eines Indikators oder einer Signatur nachvollziehen, insbesondere, wenn ein Fehler aufgetreten ist. Dokumentieren Sie nicht nur Änderungen am Indikator oder der Signatur selbst, sondern auch Änderungen der Kontextinformationen, z. B. der Erkennungsmethode, für die das Element bereitgestellt wird. Ein Beispiel für eine solche CSV-Datei finden Sie in Tabelle 7.3. Diese CSV-Datei soll nicht sämtliche Informationen enthalten, sondern zusammen mit der Masterliste verwendet werden. Mit Befehlen wie dem folgenden können Sie sich dann den Änderungsverlauf eines Elements ansehen: Abbildung 7.5: Änderungsverlauf des Indikators 10005 Autor Sanders Sanders Randall Smith Sanders Sanders GUID 10001 10005 10005 10005 10007 10007 3/24/2013 3/22/2013 3/24/2013 3/21/2013 3/21/2013 3/20/2013 Datum 3 2 4 3 2 2 Revi­ sion Indikator Indikator Phase | Vertrauen Bereit­ stellung Typ | Indikator Vertrauen Geändertes Feld Tabelle 7.3: Revisionstabelle für Indikatoren und Signaturen Verhältnis des ausgehenden Daten­ verkehrs größer als 3:1 Verhältnis des ausgehenden Datenverkehrs größer als 2:1 Wenige Fehlalarme. Wird weiterhin überwacht. Zu viele Fehlalarme. Immer noch zu viele Fehlalarme. Verhältnis des ausgehenden Daten­ verkehrs größer als 3:1 Verhältnis des ausgehenden Daten­ verkehrs größer als 4:1 Skript fertig gestellt. Neue Informationen ergänzt. Funktioniert sehr gut. Keine Fehlalarme. Hinweis Reif | Mittel Bro-Skript NULL Unreif | Niedrig Protokoll/Port |SSH/9966 Hoch Neuer Wert Port | 9966 Mittel Alter Wert 222 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen 7.4 Frameworks für Indikatoren und Signaturen 223 Wenn Sie noch nie mit Linux-Befehlszeilenwerkzeugen gearbeitet haben, kann das zunächst ziemlich mühselig sein und sogar einschüchternd wirken. Je mehr Erfahrung Sie gewinnen, umso mehr wird Ihnen der Umgang mit diesen Tools jedoch zur zweiten Natur. Die beste Möglichkeit zum Lernen besteht darin, sich mit diesen Werkzeugen zu beschäftigen und verschiedene Sachen auszuprobieren, bis Sie herausgefunden, haben, wie sie funktionieren. Irgendwann werden Sie dabei an die Grenzen stoßen, die Werkzeugen wie Grep gesetzt sind, und damit beginnen, Tools wie Sed und Awk für anspruchsvollere Aufgaben einzusetzen. Solide Kenntnisse in diesen Programmen sind für Analytiker unverzichtbar. Mit genügend Wissen können Sie die Tools sogar in Skripte einsetzen, um häufig vorkommende Aufgaben zu automatisieren. CSV-Dateien sind zwar schön einfach, aber diese Einfachheit bedeutet auch, dass Sie dem Zustand der Daten besondere Aufmerksamkeit schenken müssen. Da die meisten Eingaben und Änderungen an diesen Dateien mithilfe eines Texteditors vorgenommen werden, gibt es keine Vorkehrungen, um sicherzustellen, dass die Daten das richtige Format haben. Das kann dazu führen, dass ein Analytiker versehentlich die Formatierung der CSV-Datei durcheinanderbringt oder Daten in die falsche Spalte schreibt. Aus diesem Grund sind Sicherungskopien der Dateien ein Muss. Es ist auch sehr zu empfehlen, die Daten regelmäßig auf korrekten Zustand zu überprüfen. Wenn Ihre Organisation auf diese Dateien angewiesen ist, dann lohnt es sich, Zeit in ein Skript zu investieren, das die Fehlerfreiheit der Dateien garantieren kann. Mit der CSV-Bibliothek für Python können Sie ein solches Skript relativ schnell schreiben. Vorlagen für diese CSV-Dateien finden Sie auf http://www.appliednsm.com/resources. 7.4 Frameworks für Indikatoren und Signaturen Eines der größten Probleme für Personen, die auf dem Gebiet der Informationssicherheit arbeiten, ist das Fehlen eines allgemeinen Frameworks, um Indikatoren und Signaturen zu erstellen, zu verwalten und weiterzugeben. Alle benutzen Indikatoren und Signaturen, aber jeder hat seine eigenen Methoden, um sie zu ordnen und zu speichern. Daher sind Indikatoren und Signaturen nicht übertragbar und lassen sich nicht so einfach anderen Organisationen zur Verfügung stellen. Die Daten selbst, also etwa IP-Adressen, lassen sich zwar oft sehr einfach weitergeben, aber wenn es darum geht, Kontextinformationen für andere bereitzustellen, wird es schwierig. In den letzten Jahren hat es einige Versuche gegeben, Frameworks für die gemeinsame Nutzung von Indikator- und Signaturdaten aufzustellen. 7.4.1 OpenIOC Einer der größten Fortschritte auf dem Weg zu einem gemeinsamen Framework für Informationen über Bedrohungen ist das Projekt OpenIOC von Mandiant. Ursprünglich 224 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen wurde es entwickelt, um es den Produkten von Mandiant zu ermöglichen, Informationen zu kodifizieren und dadurch rasch auf mögliche Sicherheitsvorfälle zu untersuchen. Im Jahr 2010 wurde es als standardisiertes Open-Source-Schema für die Weitergabe von Informationen über Bedrohungen veröffentlicht. Im Grunde genommen ist OpenIOC ein XML-Schema, mit dem die technischen Merkmale schädlicher Aktivitäten beschrieben werden. Mithilfe von OpenIOC können Sie Einbruchs­indikatoren zusammen mit vielen Kontextinformationen verwalten, die erforderlich sind, um die Indikatoren wirkungsvoll einzusehen. Ein Beispiel für IOC sehen Sie in Abb. 7.6. Abbildung 7.6: Ein einfacher Indikator im XML-Format von OpenIOC In diesem Indikator sind die folgenden Kontextinformationen gespeichert: •• •• •• •• •• •• •• •• •• •• 9ad0ddec-dc4e-4432-9687-b7002806dcf8 – Ein eindeutiger Bezeichner PHISH-UPS-218934 – Eine Kurzbeschreibung bzw. ein zusätzlicher Bezeichner Part of the UPS Phishing scheme reported on 12/4. – Eine ausführliche Beschreibung Chris Sanders – Der Autor 2013-02-20 T01:02:00 – Erstellungsdatum und -uhrzeit des Indikators http://www.appliednsm.com – Die Quelle des Indikators Mature – Die Phase des Indikators im Lebenszyklus (»reif«) Atomic – Die Art des Indikators (»elementar«) E-Mail/Subject – Die Klassifizierung des Indikators UPS Alert: Shipment Delayed – Der eigentliche Indikator, hier die Betreffzeile einer E-Mail. 7.4 Frameworks für Indikatoren und Signaturen 225 Auf einem Windows-Computer besteht die einfachste Möglichkeit, Indikatoren im OpenIOC-Format zu erstellen und zu bearbeiten, darin, den kostenlosen OpenIOC ­Editor von Mandiant zu nutzen. Dieses Programm lässt sich ziemlich einfach benutzen und ermöglicht es Ihnen, Indikatoren von Grund auf neu zu erstellen sowie vorhandene Indikatoren zu ändern. Abbildung 7.7: Der OpenIOC Editor für Windows von Mandiant Wenn Sie OpenIOC Editor zum ersten Mal öffnen, werden Sie aufgefordert, Ihr Verzeichnis mit den Indikatoren auszuwählen. Anschließend sehen Sie einen Bildschirm wie den in Abb. 7.7. Die Oberfläche von OpenIOC Editor besteht aus drei Teilen. Der linke Bereich enthält eine Liste der Indikatoren in Ihrem Indikatorenverzeichnis. Wenn Sie dort auf einen Indikator klicken, werden die beiden anderen Bereiche ausgefüllt. Im oberen rechten Bereich sehen Sie alle Informationen über den Indikator wie den Namen, den Autor, den GUID, das Erstellungs- und das Änderungsdatum, eine Beschreibung sowie jegliche anderen Angaben, die Sie definiert haben, z. B. Quelle, Phase oder Typ. Im unteren rechtern Bereich wird der Indikator selbst angezeigt. Dabei können auch mehrere Indikatoren mit einem logischen UND oder ODER verknüpft sein. Der OpenIOC Editor behandelt jeden Indikator als eine eigene Datei. Wenn Sie einen neuen Indikator anlegen, finden Sie ihn daher in Form einer Datei in Ihrem Indikatorenverzeichnis. Leider gibt es den OpenIOC Editor zur Zeit der Abfassung dieses Buches nur für Windows. Wenn Sie eine *nix-Plattform verwenden, wie es unter NSM-Analytikern üblich ist, 226 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen bleibt das Erstellen und Bearbeiten von Indikatoren in diesem Format daher Handarbeit. Alternativ können Sie den OpenIOC Editor auch in einer virtuellen Maschine oder mithilfe von WINE ausführen. Die meisten kommerziellen Produkte von Mandiant können mit Indikatoren in diesem Format umgehen. Darüber hinaus gewinnt der OpenIOC-Standard immer mehr an Verbreitung. Es ist nur eine Frage der Zeit, bis Tools zur Verwaltung von OpenIOC-Indikatoren allgemein erhältlich werden. Auf http://www.openioc.org erfahren Sie mehr über das OpenIOC-Format. Dort können Sie auch das XML-Schema und sogar einige Beispielindikatoren herunterladen. 7.4.2 STIX STIX (Structured Threat Information eXpressions) ist ein von der Community getragenes, von MITRE für das US-Heimatschutzministerium entwickeltes Open-Source-Projekt zur Standardisierung von Informationen über Bedrohungen, das bei staatlichen Stellen und in der Rüstungsbranche immer mehr an Beliebtheit gewinnt. Die Architektur von STIX basiert auf unabhängigen Konstrukten und ihren Beziehungen (siehe Abb. 7.8). Abbildung 7.8: Die STIX-Architektur Den Dreh- und Angelpunkt dieser Architektur bilden Observablen (»beobachtbare Elemente«), die als statusbehaftete Eigenschaften oder messbare Ereignisse im Zusammen- 7.4 Frameworks für Indikatoren und Signaturen 227 hang mit dem Betrieb von Computern und Netzwerken definiert werden. Dabei kann es sich um einen Dienst handeln, der gestoppt wird, um einen Dateinamen, um ein System, das neu gestartet wird, oder um den Aufbau einer Verbindung. Diese Observablen werden in einem XML-Format gespeichert, das die Sprache CybOX verwendet, ein weiteres MITRE-Projekt. Abb. 7.9 zeigt ein Beispiel für eine Observable, in diesem Fall eine IPv4-Adresse mit einigen damit in Zusammenhang stehenden Objekten, die anhand ihrer global eindeutigen Bezeichner angegeben sind. Abbildung 7.9: Eine STIX-Observable für eine IP-Adresse mit zugehörigen Objekten Im STIX-Framework können Observablen mit Inikatoren, Zwischenfällen, TTPs, spezifischen Bedrohungsakteuren, Feindkampagnen, bestimmten Zielen, Datenkennzeichnungen und Maßnahmenm verknüpft werden. Zusammengenommen bilden all diese Elemente mehr als nur ein einfaches Verwaltungssystem für Indikatoren, nämlich ein vollständiges Verwaltungssystem für Informationen über Bedrohungen. Indikatoren sind Darstellungen möglicherweise anomaler Aktivitäten und werden durch die Kombination von Observablen gebildet. Abb. 7.10 zeigt einen Indikator, der Domänen auf einer Beobachtungsliste enthält. Abbildung 7.10: Ein STIX-Indikator mit Domänen auf einer Beobachtungsliste 228 7 Erkennungsmechanismen, Einbruchs­indikatoren und Signaturen Tatsächlich besteht dieser Indikator nur aus einer einzigen Observablen, nämlich der Liste von Domänennamen. Dies ist ein Beispiel für einen elementaren Indikator im STIX-Framework. Indikatoren können beliebig viele Observablen enthalten, wodurch das Framework auch für Verhaltensindikatoren geeignet ist. Durch die Verknüpfung der Indikatoren mit den anderen STIX-Konstrukten bieten sich Ihnen viele Möglichkeiten. Zum Zeitpunkt der Abfassung dieses Buches gab es nur zwei Möglichkeiten, STIX-Objekte zu erstellen, zu bearbeiten und zu verwalten. Die eine besteht darin, einen vor kurzem veröffentlichten Satz von Python-Bindungen nutzen, um eigene Python-Anwendungen zu schreiben. Ansonsten können Sie auch auf einen einfachen Text- oder XML-Editor z­ urückgreifen. Das STIX-Potential bietet sehr viel Potenzial. Neben DHS wird auch STIX zurzeit von mehreren Organisationen beurteilt, darunter mehreren Behörden und militärischen Dienststellen, Rüstungsfirmen und privaten Organisationen. Es gibt zurzeit zwar noch nicht viele Tools, die bei der Nutzung von STIX helfen könnten, aber das wird sich sicherlich ändern, wenn das Framework weiter ausgereift ist und erweitert wird. Mehr über STIX erfahren Sie auf http://stix.mitre.org. 7.5 Zusammenfassung In diesem Kapitel haben wir uns die Grundlagen von Erkennungsmechanismen, Einbruchsindikatoren und Signaturen und ihre Rolle in der NSM-Erkennung angesehen. Dabei ging es um die verschiedenen Arten von Indikatoren, um wichtigste Kontextinformationen zu Indikatoren und Signaturen und um empfohlene Vorgehensweisen zu ihrer Verwaltung. Dabei haben wir uns einerseits geeignete Verwaltungsmethoden für kleinere und weniger erfahrene Organisationen als auch die Frameworks OpenIOC und STIX angesehen. In den folgenden Kapiteln des Teils »Erkennung« geht es darum, wie die verschiedenen Erkennungsmechanismen, die Sie mit den Indikatoren und Signaturen speisen, eingesetzt werden. 8 Reputationsgestützte Erkennung Die grundlegendste Form der Intrusion Detection ist die reputationsgestützte Erkennung. Dabei wird versucht, Vorgänge zu erkennen, bei denen die Hosts in Ihrem Netzwerk mit Hosts im Internet kommunizieren, die aufgrund ihres schlechten Rufs als schädlich eingestuft werden. Die Reputation oder der Ruf ist laut Definition die weit verbreitete Auffassung, dass etwas oder jemand eine bestimmte Angewohnheit oder Eigenschaft hat. Im Zusammenhang mit dem Schutz von Netzwerken kann ein Host einen guten, einen schlechten oder gar keinen Ruf haben. Da Sie den Hosts in Ihrem Netzwerk, die unter Überwachung Ihres Sicherheitsteams stehen, vertrauen, haben sie im Allgemeinen einen guten Ruf. Hosts mit negativer Reputation werden als mögliche Bedrohung Ihrer vertrauenswürdigen Systeme eingeschätzt. Es gibt verschiedene Gründe, aus denen ein Host einen schlechten Ruf erwirbt. Am häufigsten ist der Fall, dass ein öffentlich zugängliches System geknackt und dazu missbraucht wird, Schaddateien vorzuhalten, sodass Besucher der betreffenden Website häufig mit derselben Art von Malware infiziert werden. In Branchen, in denen Wirtschaftsspionage blüht und gedeiht, können IP-Adressbereiche, die Konkurrenten gehören, eine negative Reputation haben, weil man mit dem Diebstahl geistigen Eigentums rechnet. In staatlichen und militärischen Netzwerken haben Hosts, die zu feindlichen Staaten gehören oder bekanntlich vom Geheimdienst dieser Staaten geknackt wurden, einen schlechten Ruf. 230 8 Reputationsgestützte Erkennung In diesem Kapitel sehen wir uns öffentliche Reputationslisten und verschiedene Möglichkeiten an, eine reputationsgestützte Erkennung durchzuführen. Dabei erhalten Sie auch einen Überblick über die Verwendung von BASH-Skripten, CIF, Snort, Suricata und Bro für diesen Zweck. 8.1 Öffentliche Reputationslisten In der Praxis nutzen die meisten Organisationen zur reputationsgestützten Erkennung öffentliche Listen elementarer Indikatoren (hauptsächlich IP-Adressen und Domänennamen) mit negativer Reputation. Solche schwarzen Listen (»Blacklists«) werden einem Erkennungsmechanismus übergeben, der die Analytiker alarmiert, wenn eigene Hosts mit einem in dieser Liste aufgeführten externen Gerät kommunizieren. Die Verwendung öffentlicher Reputationslisten bietet mehrere Vorteile. Erstens haben die meisten Organisationen keinen so weit reichenden Einblick, dass sie selbst Reputationslisten mit sinnvollem Umfang aufstellen könnten. Selbst mit Sensoren in Zweigstellen rund um die Welt können Sie nur eine begrenzte Anzahl von Vorfällen erkennen und selbst diese nicht alle vollständig untersuchen. Bei der Nutzung einer öffentlichen Liste greifen Sie auf ein viel umfassenderes Netzwerk von Sensoren zurück, die Vorfälle an die für die Listen zuständigen Gruppen melden. Die meisten dieser Listen werden auch gut gepflegt. Viele der Hosts, die auf einer solchen Liste landen, sind in Wirklichkeit völlig legitime Server, die nur zeitweilig missbraucht werden, um über sie deren Benutzer anzugreifen (»Wasserstellen-Angriff«). Daher ist es sehr wichtig, Hosts wieder von der Liste zu entfernen, sobald ihre Vertrauenswürdigkeit wieder sichergestellt ist. Allerdings weisen diese öffentlichen Listen auch Nachteile auf. Die Urheber dieser Listen bieten nicht immer Kontext zu den einzelnen IP-Adressen und Domänen an. Wenn aufgrund der Kommunikation mit einem Host auf dieser Liste ein Alarm ausgelöst wird, können Sie daher oft nicht erkennen, warum der betreffende Host eine negative Reputation hat. Liegt es daran, dass er wegen einer inzwischen behobenen XSS-Schwachstelle eine Zeit lang Besucher zu einer Schadwebsite umgeleitet hat, oder ist er einer der Hauptknoten in einem großen Botnetz? Mehr Kontext wäre wünschenswert, um die Untersuchung in die richtige Richtung zu lenken. Letzten Endes überwiegen die Vorteile der öffentlichen Listen aber ihre Nachteile. Die bestehenden Probleme lassen sich überwinden, wenn man für die Listen die entsprechende Sorgfalt walten lässt, um sie zu überprüfen und ihre Benutzung zu regeln. Stellen Sie sicher, dass die Listen, die Sie in ihr Erkennungssystem aufnehmen, den Zielen ihrer Organisation entsprechen, und dass die Analytiker darin geschult werden, wie Alarme aufgrund dieser Informationen bewertet und untersucht werden sollten. Bei richtiger Anwendung kann die reputationsgestützte Erkennung Ihnen die wenigen leicht zu erringenden Siege bringen, die bei der NSM zu haben sind. 8.1 Öffentliche Reputationslisten 231 8.1.1 Gängige öffentliche Reputationslisten Es stehen viele öffentliche Reputationslisten zur Verfügung. In diesem Abschnitt stelle ich Ihnen einige meiner Favoriten vor und gebe dabei jeweils die Vor- und Nachteile sowie Hinweise dafür an, wie Sie sie bestmöglich nutzen können. Malware Domain List Obwohl allgemein große Sorge über gezielte Angriffe durch ausgefuchste Gegner vorherrscht, verbringen Analytiker den Großteil ihrer Zeit mit der Untersuchung von Zwischenfällen, bei denen es um die Infektion ihrer Systeme mit Malware geht. Daher ist es unverzichtbar, Malware sowohl auf einzelnen Hosts als auch im Netzwerk erkennen zu können. Eine der einfachsten Möglichkeiten, um Malware im Netzwerk aufzuspüren, bietet die Verwendung von öffentlichen Reputationslisten mit IP-Adressen und Domänennamen, die mit der Verbreitung von Malware in Verbindung stehen. Die Malware Domain List (MDL) ist ein nicht kommerzielles Community-Projekt, das Listen schädlicher Domänen und IP-Adressen unterhält. Es wird von einer offenen Gemeinschaft von Freiwilligen getragen und stützt sich auf deren Arbeit, um Einträge der Liste hinzuzufügen, aber auch um sie zu überprüfen und gegebenenfalls wieder zu entfernen. Die MDL-Listen können Sie von Fall zu Fall abfragen, Sie können sie aber auch in verschiedenen Formaten herunterladen, u. a. als CSV-Datei, als RSS-Feed oder als hosts.txtDatei. Es gibt auch Listen, die nur die täglichen Neueinträge nennen, sowie Listen der Sites, die früher einmal auf der Hauptliste gestanden haben, inzwischen aber nicht mehr als schädlich eingestuft werden oder offline sind. MDL gehört zu den umfangsreichsten und am häufigsten genutzten Reputationslisten. Ich habe viele Organisationen kennengelernt, die mit MDL als Quelle für die reputationsgestützte Erkennung große Erfolge beim Erkennen von Malwareinfektionen und BotnetzSteuerservern (C2) erzielt haben. Der große Umfang von MDL kann jedoch manchmal zu Fehlalarmen führen. Wenn ein Alarm ausgelöst wird, weil einer Ihrer Hosts einen Host besucht, der in der MDL verzeichnet ist, reicht das für sich allein noch nicht aus, um das Vorliegen eines Zwischenfalls zu konstatieren. Bei solchen Alarmen müssen Sie zusätzliche Datenquellen untersuchen und sich die Kommunikation Ihres Hosts in breiterem Rahmen ansehen, um nach Anzeichen für eine Infektion oder einen Einbruch Ausschau zu halten. Mehr über MDL erfahren Sie auf http://www.malwaredomainlilst.com. ZeuS Tracker und SpyEye Tracker von Abuse.ch ZeuS und SpyEye waren erschreckend weit verbreitete Crimeware-Kits, die von Angreifern benutzt wurden, um Systeme zu infizieren und darin eine Vielzahl schädlicher Aktionen auszuführen. Mit diesen Kits war es möglich, Malware zu erstellen, die über einen Driveby-Download andere Computer infizierte, um sie einem Botnetz hinzuzufügen, und dieses Botnetz wiederum konnte mit dem Kit gesteuert werden. Eine Zeit lang war ZeuS das 232 8 Reputationsgestützte Erkennung größte Botnetz der Welt, mit SpyEye als größtem Konkurrenten. Der Urheber von ZeuS hat 2010 zwar angekündigt, dass er den Quellcode ausmustert, aber die Veröffentlichung des Codes hat dazu geführt, dass auch heute noch mit ZeuS-Infektionen zu rechnen ist. Auch SpyEye-Infektionen treten noch sehr häufig auf, obwohl der Urheber dieser Software angeblich 2013 geschnappt und ins Gefängnis gesperrt worden ist. Die Projekte ZeuS Tracker (siehe Abb. 8.1) und SpyEye Tracker führen eine Liste der Steuerserver für ZeuS- und SpyEye-infizierte Computer sowie der Hosts, die mit ZeuS- und SpyEye-Dateien verseucht sind oder Exploits für Drive-by-Downloads vorhalten. Diese Listen sind für Eingaben von Benutzern offen und können fallweise abgefragt oder komplett heruntergeladen werden. Für den Download stehen verschiedene Formate zur Verfügung, beispielsweise als reine Auflistung der Domänen oder IP-Adressen oder in Form von Squid-, Iptables-, oder Hostdatei-Sperrlisten. Es wird auch eine Liste der in letzter Zeit entfernten Einträge geführt. Abbildung 8.1: Zeus Tracker Nach meiner Erfahrung weisen beide Listen eine hohe Qualität auf und verursachen nur sehr wenige Fehlalarme bei der reputationsgestützten Erkennung. Wie Sie auf einen Alarm reagieren, der durch die Kommunikation mit einem Host einer dieser Listen ausgelöst wurde, hängt von der Art der Kommunikation und davon ab, ob es Anzeichen für eine tatsächliche Injektion des Opferhosts mit diesen Arten von Malware gibt. Weitere Informationen erhalten Sie auf https://zeustracker.abuse.ch/ bzw. https:/spyeyetracker. abuse.ch/. 8.1 Öffentliche Reputationslisten 233 PhishTank Viele gezielte Angriffe beginnen mit irgendeiner Art von Phishingvorgang. Die meisten Organisationen bemerken solche Vorgänge erst in einem späteren Stadium. Für die Früherkennung (aber auch für die rückblickende Analyse) wäre es sehr praktisch, sofort feststellen zu können, ob ein Benutzer zu einer bekannten Phishingwebsite umgeleitet wird. PhishTank wird von OpenDNS betrieben und ist eine freie, von der Community getragene Website zum Austausch von Daten über Phishing. Registrierte Benutzer können Links einreichen, die bei Phishingversuchen verwendet wurden. PhishTank ist in dem Sinne einzigartig, dass es sich nicht nur zum Einreichen von Einträgen, sondern auch zu deren Überprüfung auf die Community stützt. Damit ein URL in die Liste aufgenommen wird, muss er von einer bestimmten Anzahl registrierter PhishTank-Benutzer verifiziert werden. Je mehr URLs ein Benutzer erfolgreich bestätigt hat, umso höheres Gewicht wird seinen Beurteilungen beigemessen. Liegen in einem Fall Verifizierungen durch solche vertrauenswürdigeren Benutzer vor, sind also insgesamt weniger Verifizierungen dafür erforderlich. Eine besonders nützliche Funktion ist die Websuche nach Zielmarken (»Targeted Brand«), also nach Firmennamen, die häufig in Phishingangriffen vorgespiegelt werden. Wenn Ihre Organisation häufig als Köder für Phishingversuche missbraucht wird (z. B. eine Bank), können Sie die PhishTank-Liste nutzen, um nach Gegnern zu suchen, die es auf Ihre Kunden abgesehen haben. Die PhishTank-Listen werden in verschiedenen Formaten angeboten. Außerdem gibt es eine API für die Integration in eigene Anwendungen. Es gibt zwar kein Webforum für PhishTank, dafür aber eine offene Mailingliste für Benutzer und Entwickler. Wenn Sie PhishTank-Listen in die Erkennungsmechanismen in Ihrem Netzwerk aufnehmen, müssen Sie den Dingen besondere Aufmerksamkeit schenken, die unmittelbar auf den ersten Besuch eines Geräts auf einer bekannten Phishingwebsite folgen. Insbesondere sollten Sie nach Umleitungen, dem Download von ausführbaren Inhalten oder der Eingabe von Anmeldeinformationen durch Ihre Benutzer Ausschau halten. Weitere Informationen über PhishTank erhalten Sie auf http://www.phishtank.com/. Tor-Austrittsknotenliste Wenn Sie mit einem Gerät im Internet kommunizieren, z. B. mit einem Webserver, nimmt Ihr Client unmittelbar Kontakt mit diesem Gerät auf. Der Webserver kann ein Protokoll der Kommunikationsvorgänge führen, in dem auch die IP-Adressen der Clients aufgeführt sind. Wird der Webserver von einem NSM-Sensor überwacht, dann erscheinen die IP-Adressen der Clients auch in anderen Datenquellen, z. B. in Paketerfassungs- oder Sitzungsdaten. Dienste wie Tor bieten jedoch die Möglichkeit, zu verhindern, dass die wahre IP-Adresse des Clients in solchen Protokollen auftaucht. Bei Tor handelt es sich um ein offenes Netz- 234 8 Reputationsgestützte Erkennung werk, mit dessen Hilfe Benutzer ihre IP-Adresse verschleiern und beim Zugriff auf Geräte im Internet anonym bleiben können. Wenn Sie im Web unterwegs sind und dabei einen Tor-Client nutzen, wird Ihr ausgehender Datenverkehr in das Tor-Netzwerk geleitet statt zum Zielwebserver. Innerhalb dieses Netzwerks wird er dann schließlich zu einem Austrittsknoten weitergeleitet, der die Verbindung zum eigentlichen Zielserver herstellt. Das Protokoll auf dem Webserver und sämtliche NSM-Einrichtungen zeigen daher die IP-Adresse des Tor-Austrittsknotens statt derjenigen des Clients, der die Kommunikation ausgelöst hat. Eine Darstellung dieses Vorgangs sehen Sie in Abb. 8.2. Abbildung 8.2: Kommunikation über Tor Wenn jemand versucht, seine Identität bei der Kommunikation mit einem Gerät in Ihrem Netzwerk zu verschleiern, kann das ein verdächtiger Vorgang sein, der eine nähere Untersuchung rechtfertigt. Allerdings nutzen viele Personen Tor für eine völlig legitime Anonymisierung. Datenverkehr von einem Tor-Austrittsknoten mag verdächtig erscheinen, aber für sich allein genommen reicht dies nicht aus, um daraus in einer Untersuchung irgendwelche Schlüsse zu ziehen. Datenverkehr, der aus dem Tor-Netzwerk kommt, können Sie erkennen, indem Sie Listen der Tor-Austrittsknoten in Ihren Erkennungsmechanismen verwenden. Eine solche Liste finden Sie auf blutmagie.de. Sie können sie im Browser abfragen oder als CSV-Datei herunterladen. Mehr über die Tor-Austrittsknotenliste finden Sie auf http://torstatus.blutmagie.de/. Spamhaus-Sperrlisten Spamhaus ist eine internationale Nonprofit-Organisation, die es sich zur Aufgabe gemacht hat, die Tätigkeiten von Spammern und die Quellen von Spam im Internet zu verfolgen. Diese Organisation führt unter anderem folgende Listen: 8.1 Öffentliche Reputationslisten 235 •• Spamhaus Block List (SBL): Eine Datenbank mit IP-Adressen, von denen Sie nach Empfehlung von Spamhaus keine E-Mails annehmen sollten. •• Exploits Block List (XBL): Eine Datenbank mit IP-Adressen von Systemen, die von Exploits infiziert und gekapert wurden. Zu solchen Exploits zählen u. a. offene Proxys sowie Würmer und Viren mit eingebauten Spam-Engines. •• Policy Block List (PBL): Eine Datenbank mit Endbenutzer-IP-Adressbereichen, die keine nicht authentifizierten SMTP-E-Mails an irgendwelche Internet-Mailserver ausliefern sollten. Damit soll im Grunde verhindert werden, dass Hosts, die keine E-Mails senden dürfen, dies trotzdem tun. Hauptsächlich dient dies dazu, dass Netzwerke ihre Richtlinien für bestimmungsgemäßen Gebrauch durchsetzen können. •• Domain Block List (DBL): Eine Datenbank mit Domänen, die in Spamnachrichten gefunden wurden. •• Don't Route or Peer (DROP): Eine Liste gekaperter Netzwerkblöcke des IP-Adressraums, die direkt Spammern zugeordnet sind. Diese Blöcke wurden gewöhnlich von Netzwerkbesitzern vergessen und durch verschiedene Techniken von Spammern in Anspruch genommen, z. B. durch die Registrierung aufgegebener Domänennamen, Dokumentenfälschung und Social Engineering. Spamhaus bietet auch eine erweiterte DROP-Liste an (EDROP oder Extended DROP), die über den gesamten Inhalt der DROP-Liste hinaus auch IP-Adressen enthält, die höchstwahrscheinlich im Zusammenhang mit Cyberkriminalität stehen, aber nicht direkt Spamverteilern zugeordnet sind. Die Listen SBL, XBL, PBL und DBL stehen für den nicht kommerziellen Gebrauch kostenlos zur Verfügung. Für andere Anwendungen ist der Erwerb eines Abonnements erforderlich. Dagegen sind die Listen DROP und EDROP stets kostenlos, was sie zu guten Kandidaten für die Aufnahme in ein reputationsgestütztes Erkennungssystem macht. Sie werden auch gut gepflegt, sodass sie sehr nützlich sind, um zu erkennen, wann interne Hosts mit bekannten Spamsystemen kommunizieren. Besonders interessant ist die Verzahnung der DROP-Liste mit dem Signaturverzeichnis ET für neu aufkommende Bedrohungen (Emerging Threats). ET unterhält einen Satz von Signaturen aus Spamhaus-DROP-Listen, die in den Intrusion-Detection-Systemen Snort und Suricata verwendet werden können. Das vereinfacht die Anwendung dieser Listen in der Praxis. Die Nutzung dieser Listen zur Spamerkennung ist zwar nicht sehr ergiebig, doch es kann schon sehr wertvoll sein, informiert zu werden, wenn ein eigener Host (außer einem Mailserver) mit Systemen aus einem Adressbereich kommuniziert, der gewöhnlich von Spammern genutzt wird. Mehr über die DROP-Listen von Spamhaus erfahren Sie auf http://www.spamhaus.org/ drop/. 236 8 Reputationsgestützte Erkennung Weitere Listen Es gibt eine Menge anderer Reputationslisten, auf denen IP-Adressen und Domänen verzeichnet sind – zu viele, um sie alle in diesem Buch zu behandeln. Unter anderem aber sind die folgenden Listen einen Blick wert: •• AlientVault Labs IP Reputation Database: http://labs.alienvault.com/labs/index.php/projects/open-source-ip-reputationportal/ •• MalC0de Database http://malc0de.com/database/ •• SRI Malware Threat Center http://www.mtc.sri.com/live_data/attackers/ •• Project Honeypot https://www.projecthoneypot.org/list_of_ips.php •• Emerging Threats Rules http://www.emergingthreats.net/open-source/etopen-ruleset/ 8.1.2 Häufig auftretende Probleme bei der Verwendung öffentlicher Reputationslisten Die reputationsgestützte Erkennung ermöglicht zwar oft einen leichten Sieg, allerdings lauern dabei auch einige Fallstricke. Automatische Blockierung Öffentliche Blacklists sollten Sie niemals in Kombination mit automatischer Blockierung oder mit sonstigen Sperrmechanismen verwenden, ohne irgendeine Form von manueller Überprüfung vorzusehen. Ansonsten können auch völlig harmlose Websites blockiert werden. Es ist sogar möglich, dass Dienste in Ihrem eigenen Netzwerk unerreichbar werden. Bekannt geworden ist der Fall, in dem die US Navy Hosts auf der Grundlage der nicht ausreichend überprüften Reputationsliste eines Drittherstellers automatisch blockieren ließ. Danach hatte die Navy auch auf eine Reihe harmloser Websites keinen Zugriff mehr, darunter Google. Ein anderer Fall betraf eine Organisation, die eine öffentliche Reputationsliste unmittelbar in ihre internen DNS-Server einspeiste, um Namensabfragen für Schaddomänen umzuleiten und dadurch den Zugriff darauf zu blockieren. Das funktionierte ganz gut, bis eines Tages der eigene Mailserver auf der Liste stand. Dadurch könnten die Benutzer keine E-Mails mehr senden und empfangen. Der Netzwerkadministrator brauchte eine ganze Weile, um der Ursache des Problems auf die Spur zu kommen. 8.1 Öffentliche Reputationslisten 237 Es gibt nichts Peinlicheres, als solche Zustände in der eigenen Organisation heraufzubeschwören. Daher sollten Sie öffentliche Reputationslisten ausschließlich in Kombination mit Erkennungsmechanismen einsetzen. Pflege der Listen Es kommt recht häufig vor, dass mit dem Internet verbundene Server geknackt und zeitweilig für die Verbreitung von Malware oder anderen unerwünschten Inhalten missbraucht werden, was dazu führt, dass die IP-Adresse des Servers oder der Domänenname auf eine Sperrliste gesetzt wird. Über kurz oder lang bemerken die Besitzer des betroffenen Systems, was da geschehen ist, und sanieren den Server wieder. Nicht immer aber wird das System zeitnah wieder von der Liste entfernt. Dadurch können bei der Kommunikation mit diesem Server Fehlalarme auftreten. Diese Art von Fehlalarmen kommt relativ häufig vor und lässt sich bei der reputationsgestützten Erkennung nie ganz ausschließen. Allerdings sollten Sie Ihr Möglichstes tun, ihr Vorkommen zu minimieren, damit Sie nicht kostbare Analysezeit verschwenden. Grundsätzlich sollten Sie sich vergewissern, ob die Betreiber der Liste Einträge mit dem gleichen Eifer wieder von der Liste herunternehmen wie sie hinzufügen. Sorgen Sie außerdem dafür, dass Sie regelmäßige aktualisierte Listen vom Server des Anbieters beziehen, und zwar mindestens täglich. Wir werden uns weiter hinten in diesem Kapitel noch mehrere Möglichkeiten ansehen, diesen Vorgang zu automatisieren. Gemeinsam genutzte Server Es kommt erstaunlich häufig vor, dass die IP-Adressen gemeinsam genutzter Server, wie sie oft von Providern genutzt werden, auf öffentlichen Sperrlisten landen. Der Grund dafür ist, das die Domäne eines einzigen Benutzers dieses Servers geknackt wurde und irgendwelche schädlichen Inhalte bereitstellt. Statt dieser einen Domäne wird nun die IPAdresse des gesamten Servers auf die Sperrliste gesetzt, sodass bei Benutzern, die eine andere auf diesem Server vorgehaltene Website besuchen möchten, Alarm ausgelöst wird, obwohl gar keine schädliche Tätigkeit vorliegt. Dieses Problem ist für einen großen Teil von Fehlalarmen verantwortlich. Wenn ein Angreifer allerdings bereits in einer Website auf einem gemeinsam genutzten Server Fuß gefasst hat, wächst auch die Gefahr, dass er in andere Websites eindringt. Daher sollten Sie zunächst einmal jeden dieser Alarme untersuchen, sofern Sie keine zusätzlichen Kontextinformationen haben. Falls Sie herausfinden, dass die Probleme eines gemeinsam genutzten Servers auf der Liste von einer Art sind, die sich nicht auf die anderen darauf untergebrachten Hosts auswirken kann, z. B. siteübergreifende Skripterstellung (CrossSite Scripting, XSS), dann können Sie die IP-Adresse des Servers aus der Speerliste herausnehmen und durch einen Eintrag für die Domäne ersetzen, die tatsächlich Schadinhalte bereitstellt. 238 8 Reputationsgestützte Erkennung Werbenetzwerke Werbenetzwerke ermöglichen ihren Kunden, Code für Werbeanzeigen einzureichen, die automatisch auf den Websites der der Abonnenten dieses Netzwerks angezeigt wird. Das ist ein Riesengeschäft und die Haupteinnahmequelle vieler Websites. Es ist aber auch ein lukratives Ziel für Angreifer, da es ihnen die Möglichkeit bietet, Schadcode in Anzeigen einzubauen, die automatisch auf viele häufig besuchte Websites verteilt werden. Die meisten Werbenetzwerke führen zwar eine Überprüfung durch, um einen solchen Missbrauch auszuschließen, aber erstens machen das nicht alle Werbenetzwerke, und zweitens gelingt es Angreifern hin und wieder, eine Überprüfung zu unterlaufen. Das kann dazu führen, dass die mit einem Werbenetzwerk verknüpfte Domäne auf öffentlichen Sperrlisten landet. Wenn das der Fall ist und Sie eine reputationsgestützte Erkennung durchführen, erhalten Sie jedes Mal einen Alarm, wenn ein Benutzer eine Anzeige von dem betroffenen Werbenetzwerk angezeigt bekommt, ob sie nun schädlich ist oder nicht. Das kann zu einer Menge von Fehlalarmen führen. Glauben Sie mir nicht? Dann suchen Sie doch einmal in den Webprotokollen Ihrer Organisation nach Anforderungen für die Domänen akamai.com oder scorecardresearch.com. Beide gehören zu umfangreichen Werbenetzwerken und werden von einer Vielzahl populärer Websites genutzt. Die zweckmäßigste Methode, das Übermaß an Fehlalarmen aufgrund von Werbenetzwerken zu verringern, besteht darin, alle Verweise auf diese Netzwerke von den Sperrlisten zu entfernen, die Sie verwenden. Im Allgemeinen enthalten die Anzeigen nicht den Schadcode selbst, sondern Code, der Benutzer zu einer Stelle umleitet, an der der eigentliche Schadcode lauert. Es ist besser, sich auf andere Erkennungsmechanismen zu verlassen, anstatt sich mit all den Fehlalarmen abzuplagen, die ansonsten auftreten könnten. Verringern von Fehlalarmen durch Whitelists Bis jetzt haben wir nur über Listen mit Indikatoren für eine negative Reputation gesprochen (sogenannte Blacklists oder Sperrlisten). Es ist jedoch auch sinnvoll, Listen mit Indikatoren für eine positive Reptuation (Whistlists) zu verwenden. In Kombination mit einem Erkennungsmechanismus können Sie mit Sperrlisten zwar sehr gute Ergebnisse erzielen, allerdings treten dabei auch oft Fehlalarme auf, insbesondere wenn die Listen nicht gut gepflegt werden. Eine Vorgehensweise, um die Menge der Fehlalarme bei der reputationsgestützten Erkennung wirkungsvoll zu reduzieren, besteht darin, die Liste »Alexa Top Sites« als Whitelist zu verwenden. Diese Liste enthalt die 1.000.000 meistbesuchten Websites im Internet. Kürzen Sie sie auf die ersten 100 bis 500 Einträge und sorgen Sie dafür, dass keine der Websites auf dieser Whiteliste einen Alarm auslöst, wenn sie in einer Blacklist erwähnt wird. Natürlich können auch diese Websites mit irgendeiner Form von Malware infiziert werden, aber die Wahrscheinlichkeit dafür ist gering, und wenn dieser Fall eintritt, dann wird das Unternehmen, dem die betroffene Website gehört, schnellstens dafür sorgen, das Problem zu beheben. 8.2 Automatisieren der reputationsgestützten Erkennung 239 8.2 Automatisieren der reputationsgestützten Erkennung Für die reputationsgestützte Erkennung brauchen Sie zwei Dinge. Das erste ist mindestens eine Liste von IP-Adressen oder Domänen mit negativer Reputation. Im vorherigen Abschnitt haben wir schon einige öffentlich verfügbare Sperrlisten besprochen, aber Sie können sie auch um private, branchenspezifische oder interne Listen ergänzen. Die Inhalte dieser Listen müssen Sie nun einem Mechanismus zuführen, der eine Erkennung auf der Grundlage dieser Listen durchführt. Es gibt verschiedene Möglichkeiten, diese Aufgabe durchzuführen und zu automatisieren. 8.2.1 Manuelles Abrufen und Erkennen mit BASH-Skripten Im weiteren Verlauf dieses Kapitels werden wir verschiedene kostenlose und OpenSource-Tools für die reputationsgestützte Erkennung kennenlernen. All diese Werkzeuge lassen sich in den meisten Organisationen wirkungsvoll einsetzen. Andererseits ist die reputationsgestützte Erkennung so einfach, dass Sie auch simple Linux-BASHSkripte dafür einsetzen können. In den folgenden Beispielen werden wir genau das tun, um eine öffentliche Reputationsliste herunterzuladen und zu durchlaufen und anhand dieser Liste schädliche Domänen und IP-Adressen im Netzwerkverkehr aufzuspüren. Die Liste herunterladen und vorbereiten Das Erste, was Sie für die reputationsgestützte Erkennung benötigen, ist eine Liste der Adressen oder Domänen, die einen schlechten Ruf haben. In diesem Beispiel verwenden wir eine der besonders beliebten Listen, nämlich die Malware Domain List (MDL). Die Betreiber pflegen sowohl eine Liste von Domänennamen als auch von IP-Adressen, und wir wollen beide nutzen. Wir brauchen diese Listen als Textdateien, in denen die Einträge durch Zeilenumbrüche getrennt sind. Die IP-Adressliste können Sie wie folgt mit curl herunterladen: curl http://www.malwaredomainlist.com/hostslist/ip.txt > mdl.iplist Das Größer-als-Symbol (>) dient dazu, die Ausgabe des Befehls in die Datei mdl.iplist umzuleiten. Wenn Sie sich diese Datei ansehen, werden Sie feststellen, dass darin alles so aussieht, wie wir es erwarten – bis auf eine Abweichung, um die wir uns kümmern müssen, um die Liste später fehlerfrei durchlaufen zu können. Wenn Sie den Befehl file mdl.iplist ausführen, erhalten Sie die Meldung, dass es sich bei der gerade erstellten Datei um ASCII-Text mit CRLF-Zeienendezeichen handelt. Um den Beginn einer neuen Zeile zu markieren, verwendet Windows sowohl ein Zeilenwechsel- (\n in ASCII, 0x10 in Hex) als auch ein Wagenrücklaufzeichen (\r in ASCII, 0x0D in Hex), wohingegen Unix-Betriebssysteme nur das Zeilenwechsel einsetzen. Wenn wir die 240 8 Reputationsgestützte Erkennung Datei später mit Unix-Tools durchlaufen, würde das zusätzliche Wagenrücklaufzeichen am Ende jeder Zeile zu unerwarteten Ergebnissen führen. Es gibt verschiedene Möglichkeiten, das Wagenrücklaufzeichen von allen Zeilen in der Datei zu entfernen. Am einfachsten geht es mit dem Hilfsprogramm Dos2unix. Falls es nicht im Lieferumfang Ihrer Distribution enthalten ist, können Sie es ganz einfach von den meisten Standardrepositorys installieren (apt-get install dos2unix, yum install dos2unix usw.). Die Ausgabe des curl-Befehls können wir direkt an dieses Hilfsprogramm übergeben, bevor wir die Datei ausgeben. In dieser Form sieht der Befehl wie folgt aus: curl http://www.malwaredomainlist.com/hostslist/ip.txt | dos2unix>mdl.iplist Jetzt müssen wir das Gleiche noch mit der MDL-Liste schädlicher Domänen machen. Versuchen wir es zunächst mit dem folgenden Befehl, der genauso aufgebaut ist wie der letzte: curl http://www.malwaredomainlist.com/hostslist/hosts.txt | dos2unix>mdl. domainlist Abbildung 8.3: Die Domänenliste in der ursprünglichen Form Wenn Sie anschließend mdl.domainlist öffnen, werden Ihnen einige Probleme auffallen (siehe Abb. 8.3). Zu Anfang der Datei befinden sich einige zusätzliche Textzeilen sowie Leerzeilen, die alle entfernt werden müssen, da sie sonst bei der Verarbeitung der Datei Fehler hervorrufen würden. Um diese Zeilen loszuwerden, können wir Sed anweisen, die ersten sechs Zeilen der Datei zu entfernen: 8.2 Automatisieren der reputationsgestützten Erkennung 241 curl http://www.malwaredomainlist.com/hostslist/hosts.txt | sed '1,6d' | dos2unix>mdl.domainlist Des Weiteren stehen in jeder Zeile zwei Werte, wobei der erste jeweils die Loopbackadresse 127.0.0.1 ist und der zweite den eigentlichen Domänennamen nennt. Die Liste wird in diesem Format angeboten, damit man sie leicht in eine Hosts-Datei kopieren kann, um Anforderungen für diese Hosts umzuleiten. Das ist allerdings nicht die Art und Weise, wie wir diese Liste verwenden wollen. Um nur die Daten der zweiten Spalte beizubehalten, verwenden wir Awk: curl http://www.malwaredomainlist.com/hostslist/hosts.txt | sed '1,6d' | awk '{print $2}' | dos2unix>mdl.domainlist Die resultierende Datei sehen Sie in Abb. 8.4. Abbildung 8.4: Die bereinigte Domänenliste Damit haben wir jetzt zwei sauber formatierte Dateien mit IP-Adressen und Domänen, die wir für die Erkennung nutzen können. Die beiden vorherigen Befehle können Sie auch in ein Skript aufnehmen, das Sie regelmäßig ausführen, um die Listen auf dem neuesten Stand zu halten. Ich empfehle Ihnen, einen Cron-Job anzulegen, um diese Daten mindestens einmal täglich herunterzuladen. Der folgende Eintrag in /etc/crontab sorgt dafür, dass das Aktualisierungsskript jeden Tag um 6.30 Uhr ausgeführt wird: 30 6 * * * /home/sanders/GatherMDL.sh 242 8 Reputationsgestützte Erkennung Schädliche IP-Adressen in Sitzungsdaten erkennen Mit diesen Listen können wir nun versuchen, jegliche Kommunikation zwischen Hosts in unserem Netzwerk und Hosts auf der IP-Adressliste von MDL zu erkennen. Eine der effizientesten Möglichkeiten dazu bieten die Sitzungsdaten. Im Folgenden schreiben wir ein kurzes Skript, um eine Erkennung mithilfe von SiLK durchzuführen. Als Erstes müssen wir den Zeitrahmen der Untersuchung festlegen. Hier entscheiden wir uns dafür, den gesamten Datenverkehr der letzten Stunde zu überprüfen. Mit dem Befehl date können wir sowohl die Uhrzeit und das Datum des aktuellen Zeitpunkts als auch des Zeitpunkts vor einer Stunde abrufen. Diese Werte speichern wir in Variablen: start=$(date -ud '-60 minutes'+%Y/%m/%d:%T) endd=$(date -ud+%Y/%m/%d:%T) Als Nächstes müssen wir die zuvor abgerufene Liste der IP-Adressen in einen Satz von IPAdressen umwandeln, den das SiLK-Werkzeug Rwfilter durchlaufen kann. Dazu verwenden wir den Befehl rwsetbuild, dem wir neben dem Namen der Eingabedatei auch den der Ausgabedatei angeben, in unserem Fall mdl.iplist.set: rwsetbuild mdl.iplist mdl.iplist.set Schließlich suchen wir mit Rwfilter nach allen Datensätzen der letzten Stunde, bei denen die IP-Adresse mit denen auf der Liste übereinstimmt. Der Befehl dazu lautet wie folgt: rwfilter –start-date=$start –end-date=$end --anyset=mdl.iplist.set --proto=0-255 --type=all --pass=stdout | rwcut Dieser Befehl enthält verschiedene der Rwfilter-Optionen, die wir schon in Kapitel 4 kennengelernt haben, sowie die zuvor erstellten Variablen als Werte für die Optionen --startdate und --enddate. Mit --anyset wird die Eingabedatei angegeben. Das komplette Skript sieht wie folgt aus: #!/bin/bash start=$(date -ud '-60 minutes'+%Y/%m/%d:%T) end=$(date -ud+%Y/%m/%d:%T) rwsetbuild mdl.iplist mdl.iplist.set rwfilter --active-time=$start-$end --anyset=mdl.iplist.set --proto=0-255 --type=all --pass=stdout | rwcut Die Ausgabe dieses Skripts sehen Sie in Abb. 8.5. 8.2 Automatisieren der reputationsgestützten Erkennung 243 Abbildung 8.5: SiLK-Ausgabe mit übereinstimmenden IP-Adressen schlechter Reputation Schädliche Domänen in FPC-Daten erkennen Unsere nächste Aufgabe besteht darin, jegliche Kommunikation zwischen unseren eigenen Hosts und möglicherweise schädlichen Domänen auf der MDL-Liste zu finden. Da die dazu erforderlichen Daten nicht in den Sitzungsdaten enthalten sind, sehen wir uns stattdessen die vollständigen Paketdaten (FPC) an. Dies ist etwas anspruchsvoller als die Überprüfung von IP-Adressen mit Rwfilter. Für die einzelnen Vorgänge wenden wir daher BASH-Funktionen an. Bevor wir die erste Funktion schreiben, müssen wir dem Skript jedoch mitteilen, dass wir die zu untersuchende PCAP-Datei als Befehlszeilenargument angeben werden, wenn das Skript ausgeführt wird. Das erreichen wir mit folgender Anweisung: pcapfile=$(echo $1) Unsere erste Funktion nutzt Justniffer (siehe Kapitel 6), um die bereitgestellte PCAP-Datei zu durchlaufen und alle Domänennamen im Zusammenhang mit HTTP-Kommunikation über TCP-Port 80 in die Datei temp.domains zu schreiben: ParsePCAP() { justniffer -p "tcp port 80" -f $pcapfile -u -l "%request.timestamp - %source.ip ->%dest.ip - %request.header.host %request.line">temp.domains } Als Nächstes schreiben wir die Funktion, die mit grep in einer while-Schleife den Inhalt von temp.domains auf Überstimmungen mit der MDL-Domänenliste durchsucht. Die Ausgabe zeigt die HTTP-Anforderungen, bei denen eine Übereinstimmung festgestellt 244 8 Reputationsgestützte Erkennung wurde. Die sed-Anweisung dient dazu, am Ende der Anforderung Text hinzuzufügen, der angibt, welche übereinstimmende Domäne gefunden wurde. Die Ausgabe erfolgt nicht nur in der Konsole, sondern mithilfe des Befehls tee auch in einer Datei namens alert.txt. DetectMDL() { while read blacklistterm; do grep -i $blacklistterm temp.domains | sed "s,$, Match\:$blacklistterm,g"| tee -a alert.txt done<"mdl.domainlist" } Wir nehmen beide Funktionen in ein Skript auf und fügen eine weitere hinzu, die die bei der Untersuchung der PCAP-Dateien erstellte temporäre Datei wieder löscht: #!/bin/bash pcapfile=$(echo $1) ParsePCAP() { justniffer -p "tcp port 80" -f $pcapfile -u -l “%request.timestamp %source.ip ->%dest.ip - %request.header.host - %request.line">temp. domains } DetectMDL() { while read blacklistterm; do grep -i $blacklistterm temp.domains | sed "s,$, Match\:$blacklistterm,g"| tee -a alert.txt done<"mdl.domainlist" } CleanUp() { rm -rf temp.domains } ParsePCAP DetectMDL CleanUp Exit Abb. 8.6 zeigt die Ausgabe dieses Skripts. 8.2 Automatisieren der reputationsgestützten Erkennung 245 Abbildung 8.6: Domänennamen mit schlechter Reputation in einer PCAP-Datei aufspüren Die hier vorgestellten Skripte sind sehr einfach gehalten und können noch auf verschiedene Weise verbessert werden. Unter anderem sind folgende Erweiterungen denkbar: •• Durchsuchung eines gesamten Verzeichnisses statt einer einzelnen PCAP-Datei •• Möglichkeit, sowohl eine strikte als auch eine lockere Suche nach Übereinstimmungen durchzuführen •• Fehlerprüfung •• Ausgabe in Systemprotokolle, eine Datenbank, per E-Mail usw. Eine ausgefeiltere Version dieser Skripte haben wir in dem Tool Scruff zur Verfügung gestellt, dass Sie auf http://www.appliednsm.com/scruff finden können. 8.2.2 Collective Intelligence Framework (CIF) Das Collective Intelligence Framework (CIF) ist ein Verwaltungssystem für Informationen über Cyberbedrohungen. Entwickelt wurde es von Wes Young bei REN-ISAC. In CIF können Analytiker die zu verwendenden Listen festlegen, die dann automatisch regelmäßig abgerufen werden. Die Daten werden normalisiert und in der CIF-Datenbank gespeichert. Wenn das geschehen ist, können sie von CIF abgefragt oder mithilfe eines Verarbeitungsskripts einem Erkennungsmechanismus bereitgestellt werden. CIF kann im Lieferzustand verschiedene Listen verarbeiten, darunter ZeuS/SpyEye Tracker, die DROP-Liste von Spamhaus usw. Darüber hinaus ist es möglich, eigene Erweiterungen für die Verarbeitung von Listen zu schreiben, für die die Software nicht vorkonfiguriert ist. Außerdem können Sie Ausgabe-Plug-Ins nutzen, um die Listen den von Ihnen verwendeten Erkennungsmechanismen zuzuführen. CIF ist nicht im Standardumfang von Security Onion enthalten. Wenn Sie die Beispiele in diesem Kapitel nachvollziehen wollen, installieren Sie es nach der Anleitung auf https:// code.google.com/p/collective-intelligence-framework/wiki/ServerInstall_v1. Indikatorlisten aktualisieren und hinzufügen Nach der Installation von CIF sollten Sie als Erstes Befehle geben, die die Software dazu veranlassen, ihre Datenbank mit Einträgen aus den Listen zu füllen, die bereits eingerichtet sind. Die Listen sind in zwei Gruppen eingeteilt – stündlich und täglich aktualisierte Listen. Rufen Sie als Erstes die stündlich aktualisierten Listen ab: 246 8 Reputationsgestützte Erkennung cif_crontool -d -p hourly Als Nächstes sind die täglich aktualisierten Listen an der Reihe, von denen es aber viel mehr gibt. Je nach der verfügbaren Bandbreite und der Leistung Ihres Systems kann dieser Vorgang einige Zeit in Anspruch nehmen. Der Befehl dafür lautet: cif_crontool -d -p daily Anschließend ist die CIF-Datenbank mit Ergebnissen aus allen vorab eingerichteten Listen gefüllt. CIF bietet auch eine Möglichkeit, weitere Reputationslisten bereitzustellen und zu verarbeiten, die noch nicht im Lieferumfang enthalten sind. Das ist insbesondere für private Reputationslisten praktisch, die nicht öffentlich zur Verfügung stehen oder nicht im Internet bereitgestellt werden. CIF kann Daten in Textdateien mit und ohne Trennzeichen, in XML-Dateien, JSON-Dateien usw. verarbeiten. Um herauszufinden, wie Sie CIF dazu bringen, eigene Listen abzurufen, können Sie sich die vorhandenen Konfigurationsdateien ansehen. Abb. 8.7 zeigt die Konfigurationsdatei für die Liste von malwaredomains.com, eine Textdatei mit Trennzeichen. Abbildung 8.7: Konfigurationsdatei für eine Textliste mit Trennzeichen Für diese Art von Liste ist nur eine minimale Konfiguration erforderlich. Der erste Abschnitt der Konfigurationsdatei gibt an, wo die Liste zu finden ist (Feed), und legt verschiedene Werte fest, darunter die Vertrauenswürdigkeit der Liste (confidence) und eine Klassifizierung, wofür der Indikator verwendet wird (assessment). Der zweite Abschnitt definiert, wie die einzelnen Textteile den Spalten in der CIF-Datenbank zugeordnet werden (values), welche Trennzeichen in der Textdatei verwendet werden (delimiter) und wie oft die Liste aktualisiert werden sollte (period). In dem Beispiel werden die Einträge in der 8.2 Automatisieren der reputationsgestützten Erkennung 247 Liste durch ein Tabulator- und ein Seitenvorschubzeichen getrennt (\t|\f), und die Liste wird täglich aktualisiert. Mehr darüber, wie Sie eigene Konfigurationsdateien für verschiedene Datentypen erstellen können, erfahren Sie auf der CIF-Website. Indikatoren abfragen Nun brauchen wir eine Möglichkeit, die CIF-Informationen abzufragen. Dazu gibt es zwei Möglichkeiten, den Perl-Client von CIF und die Webschnittstelle, wobei der PerlClient nicht nur der Standardmechanismus für den Umgang mit CIF-Daten ist, sondern auch die stabilste Methode darstellt. Mit dem Befehl cif können Sie jeden Indikatortyp abfragen, der in der CIF-Datenbank enthalten ist. Nehmen wir beispielsweise an, Sie suchen eine IP-Adresse, von der Sie vermuten, dass sie im Zusammenhang mit schädlichen Aktivitäten steht. Das können Sie mit folgendem Befehl erreichen: cif –q 112.125.124.165 Die Option -q sorgt für eine einfache Abfrage aller verfügbaren CIF-Daten. Sie können mit der CIDR-Schreibweise (also z. B. 112.125.124.0/24) auch nach IP-Adressbereichen suchen. Das Ergebnis des vorstehenden Befehls sehen Sie in Abb. 8.8. Abbildung 8.8: IP-Adressabfrage in CIF Diese Ausgabe zeigt, dass die fragliche IP-Adresse in den Reputationslisten sowohl von ZeuS Tracker als auch von Alientvault enthalten ist und als Teil eines Botnetzes eingestuft wird. In der Ausgabe ist auch der URL zu beiden Listen enthalten, sodass Sie weitere Kontextinformationen über den Indikator in Erfahrung bringen können. Des Weiteren sind Informationen über Einschränkungen und die Vertrauenswürdigkeit angegeben. All diese Werte können in der CIF-Konfiguration angegeben werden, wobei manche Listen Vorgabewerte für Einschränkungen und Vertrauenswürdigkeit erhalten. Wenn Sie den Befehl ein weiteres Mal ausführen, erscheint in der Liste ein weiterer Eintrag mit dem Vermerk »searched« unter der Überschrift »Assessment«. Sobald jemand in CIF nach einem bestimmten Indikator sucht, wird dieser Vorgang protokolliert und in den Suchergebnissen angegeben. Das ist praktisch, um herauszubekommen, ob schon einmal andere Analytiker nach demselben Indikator gesucht wurden. Es kann vorkommen, dass ein bestimmter Indikator, über den Sie sich Sorgen machen, in keiner öffentlichen Repu- 248 8 Reputationsgestützte Erkennung tationsliste enthalten ist, dass aber mehrere andere Analytiker Ihrer Organisation schon wiederholt danach gesucht haben. Wenn so viele Leute misstrauisch sind, deutet das darauf hin, dass Aktivitäten im Zusammenhang mit diesem Indikator eine weitere Untersuchung rechtfertigen. Die Ausgabe in Abb. 8.9 zeigt die CIF-Abfrage nach einem Indikator, nach dem schon mehrfach gesucht wurde. Abbildung 8.9: Eine CIF-Abfrage mit mehreren vorherigen Suchvorgängen Wenn Sie die Ausgabe von Einträgen aufgrund früherer Benutzerabfragen unterdrücken wollen, können Sie die Option -e verwenden. Hinter diesem Schalter können Sie unter dem Punkt »Assessment« alle Arten von Informationen angeben, die Sie in den Suchergebnissen nicht sehen wollen. Um Angaben zu vorherigen Suchen zu unterdrücken, hängen Sie an Ihre Abfrage -e search an. Indikatoren bereitstellen Eine meiner Lieblingsfunktionen von CIF ist die Möglichkeit, eigene Ausgabe-Plug-Ins zu erstellen und zu nutzen. Damit können Sie die Indikatoren in der CIF-Datenbank in einem geeigneten Format für verschiedene Erkennungsmechanismen ausgeben. CIF ermöglicht die Ausgabe von Daten in verschiedenen Formen, z. B. als CSV-Dateien, ASCII-Tabellen, HTML-Tabellen, Iptables-Firewall-Regeln, PCAP-Filter, Snort-Regeln und Bro-Eingaben. Standardmäßig gibt CIF Ergebnisse in einem Tabellenformat aus, um die Lesbarkeit in einem Terminal-Fenster zu erhöhen. Wenn Sie stattdessen eines der anderen Formate verwenden möchten, geben Sie es mit der Option -p an. Um beispielsweise die Ergebnisse der vorherigen Abfrage als Snort-Regel auszugeben, geben Sie folgenden Befehl: cif –q 112.125.124.165 –p Snort Wie Sie in Abb. 8.10 sehen, wird daraufhin für jede Eintrag in den Suchergebnissen eine Snort-Regel ausgegeben. 8.2 Automatisieren der reputationsgestützten Erkennung 249 Abbildung 8.10: Ausgabe einer CIF-Abfrage als Snort-Regel Wenn Sie Snort-Regeln auf der Grundlage von CIF-Ausgaben erstellen, müssen Sie die Regeln immer sorgfältig überprüfen, bevor Sie sie bereitstellen, damit sie eine optimale Leistung zeigen und mit dem Standard folgen, den Sie für andere IDS-Signaturen in Ihrer Organisation verwenden. Beispielsweise überprüfen von CIF erstellte Snort-Regeln nur ausgehenden Datenverkehr an die genannten IP-Adressen. In vielen Fällen ist es jedoch sinnvoll, diese Regeln so umzuschreiben, dass sie den aus- und den eingehenden Datenverkehr zu und von diesen Adressen überwachen. Die Anpassung dieser Regeln ist ziemlich einfach und wird im nächsten Kapitel behandelt. CIF steckt immer noch in den Kinderschuhen und weist einige Eigenheiten auf, hat aber ein großes Potenzial. Die Unterstützung der Community für dieses Projekt hat enorm zugenommen, wobei viele Benutzer Konfigurationen für verschiedene Arten von Listen und Ausgabe-Plug-Ins beitragen. Ich habe selbst mehrere Organisationen kennengelernt, die CIF erfolgreich zur Verwaltung der reputationsgestützten Erkennung einsetzen. Wenn Sie mehr über CIF erfahren wollen, schauen Sie sich die Projektwebsite auf https://code. google.com/p/collective-intelligence-framework/ an. 8.2.3 Reputationsgestützte IP-Adressenerkennung mit Snort Snort gehört zu den am weitesten verbreiteten signaturgestützten IDS der Welt. Wir werden uns im nächsten Kapitel eingehender damit beschäftigen, uns hier aber schon einmal die Möglichkeiten dieser Software zur reputationsgestützten Erkennung ansehen. Dazu dient in Snort der Reputations-Präprozessor. Früher erfolgte die reputationsgestützte IP-Adressenerkennung in Snort anhand von Standardregeln. Um die Leistungsprobleme zu überwinden, die sich bei dieser Methode stellten, wurde der Reputations-Präprozessor entwickelt. Er wird vor allen anderen Präprozessoren ausgeführt und ist so effizient, dass er auch mit umfangreichen IP-Adressenlisten umgehen kann. In Security Onion ist der Reputations-Präprozessor von Snort zwar standardmäßig aktiviert, die Alarmfunktion aber nicht. Bevor Sie Einträge zur Sperrliste des Präprozessors hinzufügen, sollten Sie die Alarmfunktion einschalten. Dazu müssen Sie auf dem Security-Onion-Sensor zunächst die Datei preprocessor_rules im Verzeichnis /etc/nsm/rules erstellen. Sie muss die folgende Regel zur Alarmierung bei Ereignissen des ReputationsPräprozessors enthalten: 250 8 Reputationsgestützte Erkennung alert ( msg: "EPUTATION_EVENT_BLACKLIST"; sid: 1; gid: 136; rev: 1; metadata: rule-type preproc ; classtype:bad-unknown; ) Als Nächstes müssen Sie die Snort-Konfiguration anpassen, damit die gerade erstellte ­Datei mit der Präprozessorregel auch verarbeitet wird. Dazu öffnen Sie die Datei /etc/ nsm/sensor_name/snort.conf und entfernen die Kommentarzeichen der folgenden Zeile: include $PREPROC_RULE_PATH/preprocessor.rules Jetzt müssen Sie der Sperrliste des Reputations-Präprozessors nur noch IP-Adressen hinzufügen. Die betreffende Datei ist /etc/nsm/rules/black_lists.rules und akzeptiert sowohl einzelne IP-Adressen als auch IP-Adressbereiche in CIDR-Schreibweise. Hinter einem IPAdresseintrag können Sie mithilfe des Zeichens # auch Kommentare angeben. Beispielsweise können Sie eine Adresse, die Sie nur zum Testen des Präprozessors verwenden, wie folgt kennzeichnen: 192.0.2.75 # Testadresse Damit die Änderungen in Kraft treten, müssen Sie Snort auf dem Sensor neu starten (siehe Abb. 8.11). Abbildung 8.11: Neustart des Snort-Prozesses Um die neue Regel zu testen, pingen wir einfach die Adresse 192.0.2.75 von Security Onion oder von einem Gerät an, das von Security Onion überwacht wird. Abbildung 8.12 zeigt einen Alarm, der von dieser Regel ausgelöst wird. Sie können der Datei black_list.rules eine große Menge von IP-Adressen hinzufügen, ohne die Leistung des Sensors zu beeinträchtigen. Da die von diesem Präprozessor ausgegebenen Alarme nicht sehr ausführlich sind, sollten Sie es sich angewöhnen, in der Sperrlistendatei Kommentare mit Kontextinformationen zu den Indikatoren anzugeben, sodass die Analytiker darauf zurückgreifen können, wenn ein Alarm ausgelöst wird. Der Reputations-Präprozessor von Snort bietet nicht viele Extras, aber wenn Sie in Ihrer Umgebung ohnehin schon Snort verwenden, dann ist es sehr einfach, die reputationsgestützte Erkennung von IP-Adressen mit wenigen Änderungen einzurichten. Leider kann 8.2 Automatisieren der reputationsgestützten Erkennung 251 dieser Präprozessor nur IP-Adressen verarbeiten. Wenn Sie in Snort auch die Kommunikation mit schädlichen Domänen erkennen wollen, müssen Sie normale Snort-Regeln verwenden, was wir in Kapitel 9 besprechen. Allerdings kann es zu Leistungsproblemen kommen, wenn die Standardregeln eine sehr große Anzahl von schädlichen Domänen erkennen sollen. Mehr über den Reputations-Präprozessor von Snort und die verschiedenen Konfigurationsoptionen erfahren Sie auf http://manual.snort.org/node175.html. Abbildung 8.12: Ein vom Reputations-Präprozessor ausgelöster Alarm 8.2.4 Reputationsgestützte IP-Adressenerkennung mit Suricata Als Alternative zu Snort für die signaturgestützte Erkennung nimmt Suricata rasch an Beliebtheit zu. Das liegt hauptsächlich daran, dass es in der Lage ist, Datenverkehr parallel in mehreren Threads zu untersuchen, was für die Überwachung von Verbindungen mit hohem Durchsatz von Vorteil ist. Da Suricata die gleiche Regelsyntax verwendet wie Snort, können Regeln zwischen den beiden Systemen ausgetauscht werden. In Kapitel 9 werden wir uns eingehender mit Suricata beschäftigen. Hier schauen wir uns nur die ­reputationsgestützte IP-Adresserkennungs-Engine der Software an. Es kann vorteilhaft sein, das nächste Kapitel vorzulesen, um ein Verständnis für die Funktionsweise von ­Suricata zu bekommen, und dann zu diesem Abschnitt zurückzukehren. Die reputationsgestützte IP-Adresserkennung von Suricata erfolgt auf eine Weise, die die Verarbeitung großer Mengen von Einträgen optimieren soll. Dazu wird die gleiche API verwendet wie für Kennzeichnungen und Schwellenwerte. Um diese Funktion zu aktivieren, müssen Sie in der Konfigurationsdatei Suricata.yaml den folgenden Abschnitt ändern: 252 8 Reputationsgestützte Erkennung # IP Reputation reputation-categories-file: /etc/nsm/sensor-name/iprep/categories.txt default-reputation-path: /etc/nsm/rules reputation-files: - zeustracker.list - spyeyetracker.list - mdl.list - watch.list Das erste Element, das in dieser Konfigurationsdatei definiert wird, ist die Datei mit den Reputationskategorien. Damit können Sie die Listen und die zugehörigen Alarme in verwaltbare Einheiten ordnen. In der Kategoriedatei müssen Sie eine eindeutige ID-Nummer für die Kategorie, den Namen der Kategorie und eine Beschreibung angeben. Das Format der einzelnen Einträge sieht also wie folgt aus: <ID>,<Kurzname>,<Beschreibung> Gewöhnlich werden Kategorien für die einzelnen Quellen von Listen erstellt. Beispielsweise kann eine Kategoriedatei wie folgt aussehen: 1,ZeusTracker,IP-Adressen von Zeus Tracker 2,SpyEyeTracker,IP-Adressen von SpyEye Tracker 3,MDL,IP-Adressen von Malware Domain List 4,Watchlist,IP-Adressen von interner Überwachungsliste Als Nächstes müssen Sie den Standardreputationspfad angeben, also das Verzeichnis, das die Dateien mit den Reputationslisten enthält. In unserem Beispiel haben wir diese Dateien in dasselbe Verzeichnis gestellt, in dem Security Onion Suricata- und Snort-Regeln unterbringt. Mit dem letzten Konfigurationseintrag geben Sie die Listendateien an, die Suricata verarbeiten soll. Diese Dateien müssen sich im Standardreputationspfad befinden. Die Einträge in diesen Dateien müssen folgendes Format aufweisen: <IP-Adresse>,<Kategorie>,<Vertrauenswürdigkeit> Dabei müssen die IP-Adressen im Standardformat aus vier durch Punkten getrennten Oktetten angegeben werden. Dazu müssen eine der Kategorienummern aus der Kategoriedatei sowie ein numerischer Wert für die Vertrauenswürdigkeit angegeben sein. Eine Reputationslistendatei sieht also beispielsweise wie folgt aus: 8.2 Automatisieren der reputationsgestützten Erkennung 253 192.0.2.1,1,65 192.0.2.2,1,50 192.0.2.3,2,95 Nach der Einrichtung der Reputationsfunktion müssen Sie nur noch Alarme definieren, damit die Analytiker informiert werden, wenn eine Kommunikation mit einer der betreffenden IP-Adressen festgestellt wird. Dazu fügen Sie eine Regel mit der Direktive iprep hinzu, die folgende vier Optionen annimmt: •• Richtung des Datenverkehrs (any, src, dst oder both): Damit wird die Richtung des Datenverkehrs zur oder von der IP-Adresse angegeben. •• Kategorie (Kurzname): Der Kurzname der Kategorie, in der Sie nach einer Übereinstimmung suchen. Die Angabe muss genau der Bezeichnung entsprechen, die in der Kategoriedatei angegeben ist. •• Operator (>, <, =): Der Operator, der zusammen mit dem angegebenen Reputationswert verwendet wird. •• Vertrauenswürdigkeit (1 bis 127): Damit werden Übereinstimmungen auf die Fälle beschränkt, in denen der Wert der Vertrauenswürdigkeit mit dem Ausdruck aus dem hier angegebenen Wert und dem Operator übereinstimmt. Diese Direktive kann noch mit anderen Merkmalen kombiniert werden, die gewöhnlich in Suricata-Regeln eingesetzt werden, was eine hohe Vielseitigkeit bietet. Allerdings verringern jegliche zusätzliche Merkmale, etwa eine Überprüfung auf übereinstimmende Inhalte, die Geschwindigkeit, mit der die Reputationsregeln verarbeitet werden. Regeln, die nur eine iprep-Direktive enthalten, bilden die schnellste Möglichkeit, um auch große Mengen von Reputationsregeln auf der Grundlage von IP-Adressen zu verwenden. Das folgende Beispiel zeigt eine sehr einfache reine IP-Adressregel: alert ip any any ->any any (msg:"IPREP Malware Domain List – High Confidence"; iprep:dst,MDL,>,75; sid:1; rev:1;) Diese Regel löst immer dann einen Alarm aus, wenn ausgehende Kommunikation zu einer IP-Adresse in der MDL-Liste mit einer Vertrauenswürdigkeit größer als 75 erkannt wird. Einen solchen Alarm sehen Sie in Abb. 8.13. 254 8 Reputationsgestützte Erkennung Abbildung 8.13: Ein Alarm aufgrund einer iprep-Direktive von Suricata Mit dieser Methode ist Suricata in der Lage, große Mengen von IP-Adressen zu verarbeiten. Ich habe von Organisationen gehört, die das mit Listen von einer Million Adressen getestet haben. Suricata ist sehr stabil und eine hervorragende Wahl für die reputationsgestützte Erkennung von IP-Adressen. 8.2.5 Reputationserkennung mit Bro Das IDS Bro ist eines der leistungsfähigsten und flexibelsten NSM-Erkennungswerkzeuge. Wir werden uns in Kapitel 10 ausführlich damit beschäftigen, wollen uns hier aber schon einmal seine Fähigkeiten zur reputationsgestützten Erkennung ansehen. Bro eignet sich sehr gut für die Erkennung verschiedenere Arten von Indikatoren wie IP-Adressen, Domänen, E-Mail-Adressen und SSl-Zertifikaten. Dazu verwendet es seine eigenen Informationsverarbeitungsfunktionen, die zusammengenommen als »IntelFramework« bezeichnet werden (abgeleitet von »intelligence« für nachrichtendienstliche Informationen, nicht von dem Prozessorhersteller). Tabelle 8.1 nennt die Datentypen, die dieses Framework unterstützt, und die Bezeichnungen, die Bro dafür in seiner Skriptsprache verwendet. Für unser Beispiel beschränken wir uns auf IP-Adressen, Domänen und E-Mail-Adressen. 8.2 Automatisieren der reputationsgestützten Erkennung 255 Tabelle 8.1: Datentypen, die das Intel-Framework von Bro unterstützt Datentyp Bezeichnung in Bro Beschreibung IP-Adresse Intel::ADDR Eine IPv4- oder IPv6-Adresse oder ein CIDR-Block URL Intel::URL Der vollständige URL, aber ohne das Präfix http:// bzw. https:// Softwarename Intel::Softwrae Der Name einer bestimmten Software E-Mail-Adresse Intel::EMAIL Eine E-Mail-Adresse Domänenname Intel::DOMAIN Der vollständige Domänenname einschließlich jeglicher Subdomänen Benutzername Intel::USER Ein Benutzername MD5-, SHA-1- oder SHA256-Dateihash Intel::HASH Der Hash eines Dateiobjekts (hängt vom Bro File Analysis Framework ab) SSL-Zertifikathash Intel::CERT_HASH Der SHA-1-Hash eines SSL-Zertifikats Das Intel-Framework ist eng mit der ausgedehnten Bibliothek von Protokollparsern verzahnt, über die Bro verfügt. Wenn Sie erst einmal einen Indikator in das Intel-Framework geladen haben, müssen Sie sich selbst nicht mehr darum kümmern. Sollte Bro diesen Indikator jemals in irgendeinem der Protokolle finden, weiß es, wie es ihn dekodieren muss, und wird ihn protokollieren, unabhängig davon, wie viele Schichten von Tunneln oder Verschlüsselungen es dabei abschälen muss. Das macht das Intel-Framework zu einer der leistungsfähigsten und flexibelsten Lösungen für die Erkennung von Indikatoren. Bro lässt sich auch erstaunlich stark erweitern. Mit ein bisschen Brogrammierung (ja, so wird das wirklich genannt!) können Sie Ihre eigenen Indikatortypen hinzufügen und Bro danach Ausschau halten lassen. Um das Intel-Framework zu konfigurieren, müssen Sie eine Eingabedatei erstellen, die alle Indikatoren aufführt. Dabei handelt es sich um eine einfache tabulatorgetrennte Textdatei. Die erste Zeile sieht zwar wie ein Kommentar aus, ist aber obligatorisch und beschreibt die Felder in den folgenden Zeilen. In Abb. 8.14 sehen Sie das Format einer solchen Eingabedatei. Was dieses Format angeht, ist Bro ziemlich wählerisch. Achten Sie also darauf, dass Sie die einzelnen Felder durch genau einen Tabulatorschritt trennen und dass die Datei keine Leerzeichen enthält. 256 8 Reputationsgestützte Erkennung Abbildung 8.14: Beispieleinträge in einer Bro-Reputationsliste Jede Datenzeile beginnt mit dem eigentlichen Indikator und seinem Datentyp (nach Tabelle 8.1). Die restlichen Felder müssen zwar in jeder Datenzeile vorhanden sein, die Angabe von Werten ist jedoch optional. Wenn Sie einen Wert nicht bereitstellen wollen, geben Sie einfach einen Bindestrich in das betreffende Feld ein. Im Feld meta.source können Sie den Namen der Quelle angeben, aus der der betreffende Indikator stammt. Innerhalb dieses Namens können Sie Leerzeichen und Satzzeichen verwenden, aber keine Tabulatoren. Ja nach Ihrer Informationsverwaltungsstruktur kann es sich bei der Quelle auch um einen Datenbankschlüssel oder um den URL für eine webgestützte Aufklärungsanwendung handeln. Wenn der Indikator im Datenverkehr vorkommt, protokolliert Bro die entsprechenden Daten und nimmt in das Protokoll den Wert dieses Feldes auf, um etwas Kontext bereitzustellen. Das Feld meta.do_notice nimmt einen booleschen Wert an, also entweder T für wahr oder F für falsch. Damit legen Sie fest, ob Übereinstimmungen mit dem Indikator auch in die Datei notice.log aufgenommen werden sollen. Mit solchen »Notizen« kann Bro zusätzlich Aufmerksamkeit auf ein Ereignis lenken, auch wenn es bereits an anderer Stelle protokolliert ist. Notizen und Gründe für ihre Verwendung werden wir ausführlicher in Kapitel 10 besprechen. Mit dem Feld meta.if_in können Sie die Protokollierung von Notizen auf bestimmte Kontexte einschränken (z. B. »nur wenn es im HTTP-Header Host: vorkommt«). Unabhängig von der Bedingung, die Sie hier angeben, protokolliert das Intel-Framework nach wie vor sämtliche Protokolle, allerdings erstellt es nur dann Notizen, wenn die Bedingung erfüllt ist. Das ist beispielsweise dann praktisch, wenn ein Indikator insbesondere im Zusammenhang mit HTTP-Datenverkehr von Bedeutung ist. Wenn er in DNS- und E-Mail-Datenverkehr auftritt, schreibt Bro dafür auf jeden Fall Einträge in intel.log. Mit der Angabe einer entsprechenden Bedingung können Sie jedoch verhindern, dass auch Notizen dafür angelegt werden, da Sie schließlich nicht so sehr an dieser Aktivität in diesen Zusammenhängen interessiert sind. Es gibt mehrere Möglichkeiten, um die Liste zu füllen. CIF enthält eine Option, um Daten in einem geeigneten Format für das Intel-Framework von Bro auszugeben. Das ist 8.2 Automatisieren der reputationsgestützten Erkennung 257 gewöhnlich die einfachste Möglichkeit. Alternativ können Sie auch ein eigenes Skript schrei­ben, das Listeneinträge in diesem Format ausgibt. Zum Testen der Funktion können wir auch manuell Einträge hinzufügen. Wenn wir die Datendatei mit Reputationsdaten haben, müssen wir sie mithilfe eines BroSkripts in das Intel-Framework laden. Bei der Standardinstallation von Bro werden Konfigurations- und Skriptdateien in /usr/local/bro/share/bro aufbewahrt, bei der in Security Onion enthaltenen Version dagegen in /opt/bro/share/bro, weshalb wir in den folgenden Beispielen diesen Speicherort verwenden. Erstellen Sie darin das Unterverzeichnis Reputation und kopieren Sie die Datendatei als /opt/bro/share/bro/sitze/Reputation/reputation. dat dort hinein. Als Nächstes müssen Sie der Bro-Standardstartdatei /opt/bro/share/bro/site/local.bro folgende Codezeilen hinzufügen: @load frameworks/intel/seen @load frameworks/intel/do_notice redef Intel::read_files+= { "/opt/bro/share/bro/site/Reputation/reputation.dat" }; In Kapitel 10 erfahren Sie mehr über die Skripterstellung in Bro. Der vorstehende Code sollte allerdings auch so verständlich sein. Er lädt zwei Bro-Skritpmodule in das IntelFramework (seen und do_notice), fügt die neue Datendatei und die (zu Anfang leere) Liste der Datendateien hinzu, die es beim Start von Bro lesen wird. Um den ganzen Rest kümmert sich das Framework automatisch. Wenn Sie Ihrer Reputationsliste Einträge hinzufügen oder daraus entfernen müssen, dann können Sie einfach die Datei reputation.dat entsprechend ändern. Bro ist intelligent genug, die Änderungen automatisch mitzubekommen und sich selbst zu aktualisieren. Schließlich müssen wir Bro noch wissen lassen, dass wir die Konfiguration geändert haben. Dazu sind folgende Vorgänge erforderlich: 1. Ausführen von broctl check: Dadurch wird der Code auf Fehler überprüft. 2. Ausführen von broctl install: Dadurch wird das neue Skript installiert. 3. Ausführen von broctl restart: Dadurch wird Bro neu gestartet. Nachdem Sie diese Änderungen vorgenommen haben, sollte alles laufen. Wenn Bro irgendeinen der in der Datendatei aufgeführten Indikatoren erkennt, protokolliert es dies in /usr/local/bro/logs/current/intel.log (Bro-Standardinstalltion) bzw. /etc/nsm/bro/logs/ current/intel.log (Security Onion). Bei Indikatoren, für die Sie meta.do_notice eingeschaltet haben, werden auch entsprechende Einträge in der Datei notice.log im selben Verzeichnis angelegt. Ein Beispiel der Datei intel.log sehen Sie in Abb. 8.15. 258 8 Reputationsgestützte Erkennung Abbildung 8.15: Beispielausgabe von intel.log Die Protokollierung in Bro werden wir in Kapitel 10 noch ausführlicher besprechen. In der Abbildung können Sie aber auch so schon leicht erkennen, dass jemand ein DNSLookup für applliednsm.com vorgenommen und die Security Onion-Website auf Google Code besucht hat. Da die Reputationsdatendatei auch festlegt, dass beim Auftreten des Indikators für appliednsm.com Notizen erstellt werden sollten, wird die DNS-Aktivität für diese Domäne auch in notice.log festgehalten, wie Sie in Abb. 8.16 sehen. Abbildung 8.16: Beispielausgabe von notice.log Zur Veranschaulichung haben wir die Protokollausgaben hier im Rohformat direkt aus den Dateien gelesen. In einer Produktionsumgebung ist es dagegen üblich, sie in ein Programm zur Protokollverwaltung wie ELSA oder Log Stash zu exportieren. Aber unabhängig davon, wie Sie die Daten einsehen, ist Bro ein äußerst wirkungsvolles Werkzeug zur reputationsgestützten Erkennung. 8.3 Zusammenfassung Die reputationsgestützte Erkennung ist eine der wenigen Möglichkeiten, in NSM leichte Siege zu erringen, da sie einfach anzuwenden und doch wirkungsvoll ist. Wenn Sie gerade erst mit Network Security Monitoring beginnen, dann ist die reputationsgestützte Erkennung die einfachste Möglichkeit, gleich von Anfang an möglichst viel aus Ihren Bemühungen herauszuholen. 8.3 Zusammenfassung 259 In diesem Kapitel haben wir uns die Wichtigkeit der reputationsgestützten Erkennung sowie mehrere Quellen für öffentliche Reputationslisten angesehen. Des Weiteren haben wir uns verschiedene Möglichkeiten angesehen, die reputationsgestützte Erkennung zu automatisieren – von einfachen BASH-Skripts über das Collective Intelligence Framework bis zum Einsatz von Snort, Suricata und Bro. Die drei letztgenannten Produkte sehen wir uns in den folgenden Kapiteln genauer an. 9 Signaturgestützte Erkennung mit Snort und Suricata Die gängigste Form von IDS bilden die signaturgestützten Systeme. Sie untersuchen Paketdaten auf Indikatoren eines Einbruchs, wobei die Indikatoren mit IDS-spezifischen Direktiven zu Signaturen kombiniert werden. Diese Signaturen (oder Regeln) sagen dem IDS, wie es die Indikatoren in den Netzwerkdaten finden kann. Wenn ein solches signaturgestütztes IDS Daten findet, die mit dem Inhalt einer Signatur übereinstimmen, generiert es Alarmdaten, um die Analytiker zu benachrichtigen. Die signaturgestützte Erkennung war mehr als ein Jahrzehnt lang das A und O der Netzwerksicherheit, was teilweise an seiner Ähnlichkeit mit der Erkennung schädlicher Aktivitäten durch Antivirussoftware auf Hostebene lag. Das Rezept ist ziemlich einfach: Ein Analytiker beobachtet eine schädliche Aktivität, leitet Indikatoren daraus ab und entwickelt daraus Signaturen. Wenn die Aktivität erneut auftritt, lösen diese Signaturen Alarm aus. Früher, als es nur eine geringe Anzahl von Malwarestämmen gab, über die man sich auf dem Laufenden halten musste, war diese Vorgehensweise äußerst wirkungsvoll, doch in der heutigen Zeit sind signaturgestützte Mechanismen als eine Art von »Antivirussoftware auf Netzwerkebene« nicht mehr so erfolgreich. Das bedeutende Malwarerepository http://www.virusshare.com enthält bereits über elf Millionen verschiedene Malwareproben, und das ist nur ein Teil der gesamten Malware, die in den Weiten des Internets zu 262 9 Signaturgestützte Erkennung mit Snort und Suricata finden ist. Signaturen für all diese Varianten von Malware zu erstellen und zu pflegen ist praktisch unmöglich. In der modernen Zeit stellt sich jedoch heraus, dass signaturgestützte IDS in einer guten Position sind, um andere schädliche Aktivitäten als Malware zu erkennen, beispielsweise übliche Tätigkeiten nach einem erfolgten Einbruch wie der Start einer Shell, das unerwartete Anlegen von Benutzerkonten über das Netzwerk oder Richtlinienverletzungen wie die Bereitstellung von nicht autorisierten Servern oder Systemen, die versuchen, Aktualisierungen von nicht genehmigten Quellen herunterzuladen. Signaturgestützte IDS können immer noch dazu verendet werden, Malware zu erkennen, aber anstatt zu versuchen, jedes Vorkommen von Schadcode im Netzwerk aufzuspüren, ist es am besten, nach Malware im Zusammenhang bestimmter und aktueller Bedrohungen zu suchen. Das können beispielsweise weit verbreitete webgestützte Exploit-Kits (Blackhole, Redkit usw.) oder Malware sein, die im Zusammenhang mit aktuellen Weltereignissen steht. Wie Sie signaturgestützte IDS bestmöglich einsetzen können, hängt letzten Endes von Ihrem Netzwerk und von den Bedrohungen ab, denen Sie sich ausgesetzt sehen. Allerdings ist dies immer ein entscheidender Bestandteil des Network Security Monitoring. In diesem Kapitel lernen Sie mit Snort und Suricata zwei der am weitesten verbreiteten signaturgestützten IDS kennen. Dabei besprechen wir allgemeine Fragen zur Konfiguration beider Tools und sehen uns genauer an, wie Signaturen erstellt werden. Außerdem werfen wir einen Blick auf einige beliebte Methoden, die von Snort und Suricata ausgelösten Alarme sichtbar zu machen. Dieses Kapitel stellt keine erschöpfende Beschreibung von Snort und Suricata dar, sondern soll Ihnen grundlegende Informationen darüber vermitteln, wie sie funktionieren und wie Analytiker damit eine wirkungsvolle signaturgestützte Erkennung erreichen können. 9.1 Snort Das IDS Snort wurde 1998 von Martin Roesch als schlankes, kostenloses Open-Source-Intrusion-Detection-System entwickelt, was schließlich zur Gründung der Firma Sourcefire Inc. führte. Seither hat sich Snort mit über vier Millionen Downloads zum beliebtesten IDS der Welt gemausert. Das »schlanke« System ist zu einer sehr leistungsstarken und flexiblen Software geworden, die in der IDS-Branche Maßstäbe setzt. Snort wird in Universitäten, Unternehmen und Behörden rund um die Welt eingesetzt. 2013 hat Cisco seine Absicht verkündet, Sourcefire zu erwerben. (Bei der Abfassung dieses Kapitels war dieser Handel jedoch noch nicht unter Dach und Fach.)1 Snort ist in Security Onion standardmäßig installiert, lässt sich aber auch sehr leicht manuell installieren. Auf http://snort.org/docs gibt Sourcefire eine Installationsanleitung für verschiedene Betriebssysteme. Wenn Sie bei der Einrichtung von Security Onion Snort als IDS ausgewählt haben, dann läuft es bereits. Das können Sie mit dem Befehl sudo nsm_sensor_ps-status überprüfen. In der Ausgabe in Abb. 9.1 wird snort-1 (alert data) als [OK] geführt. 1 Anmerkung des Verlags: Cisco hat Sourcefire im Jahr 2013 übernommen 9.1 Snort 263 Abbildung 9.1: Überprüfen des Sensorstatus Snort selbst wird von der Befehlszeile aus aufgerufen. Mit snort -V können Sie die Programmversion überprüfen. Die Ausgabe dieses Befehls sehen Sie in Abb. 9.2. Abbildung 9.2: Überprüfen der Snort-Version 9.1.1 Die Architektur von Snort Die Funktionsweise von Snort hängt von dem Betriebsmodus ab, der zur Laufzeit angegeben wurde. Snort verfügt über drei dieser Modi, den Sniffer-, den Paketlogger- und den NIDS-Modus. Im Sniffer-Modus kann Snort Pakete in der Verbindung erkennen und in einem für Menschen lesbaren Format ausgeben. Das ist ähnlich wie bei Tcpdump (was wir in Kapitel 13 besprechen werden), allerdings ist die Ausgabe übersichtlicher, da Snort einzelne Aspekte des Datenverkehrs auf besondere Weise kennzeichnet. Ein Beispiel dafür, wie Snort Paketdaten anzeigt, sehen Sie in Abb. 9.3. Der Sniffer-Modus ist der Standardmodus von Snort. Um die Software in diesem Modus auszuführen, müssen Sie also lediglich mit dem Befehl snort -i <Schnittstelle> die Erfassungsschnittstelle angeben. 264 9 Signaturgestützte Erkennung mit Snort und Suricata Der Paketlogger-Modus funktioniert ähnlich, protokolliert die Pakete aber in einer Datei, anstatt sie auf dem Bildschirm auszugeben. Diese Protokollierung erfolgt gewöhnlich im binären PCAP-Format. Um diesen Modus zu aktivieren, geben Sie den Schalter -l und dahinter das Protokollverzeichnis an: snort -l <Protokollverzeichnis>. Um die PCAP-Dateien später zu lesen, rufen Sie Snort wie folgt mit der Option -r auf: snort -r <PCAP-Datei>. Der Modus, der uns hier am meisten interessiert, ist jedoch der NIDS-Modus, der dazu dient, die im Netzwerk erfassten Daten zu lesen und gegebenenfalls Alarm auszulösen. Dazu durchlaufen die Paketdaten mehrere Schichten der Architektur von Snort, wie Sie in Abb. 9.4 sehen können. Um Daten zu empfangen, kann Snort manuell eine angegebene PCAP-Datei untersuchen oder sie direkt von der Überwachungsschnittstelle des Sensors beziehen. Der erste Schritt nach dem Empfang der Daten besteht darin, sie mit einem Paketdecoder zu analysieren. Tatsächlich handelt es sich dabei um mehrere Decoder, die die Paketdaten untersuchen und normalisieren, um sie in einen geeigneten Zustand für die Präprozessoren und Erkennungsengines zu versetzen. Wenn die Daten den Decoder durchlaufen haben, werden sie an die Präprozessoren von Snort gesandt. Es gibt zwei Arten dieser Präprozessoren: Die erste Art dient nur zur Erkennung, während die zweite die Paketdaten auch verändert, sodass sie von der Erkennungsengine besser untersucht werden können. Abbildung 9.3: Ausgabe von Snort im Sniffer-Modus 9.2 Suricata 265 Rohe Paketdaten vom Überwachungsport Paketdecoder Präprozessoren Erkennungsengines Ausgabe-Plug-Ins Abbildung 9.4: Die Architektur des NIDS-Modus von Snort Nach Abschluss dieser Vorverarbeitung werden die Daten an den eigentlichen Motor der Snort-Architektur weitergeleitet, die Erkennungsengine. Sie ist dafür zuständig, die Regeln anzuwenden und zu bestimmen, ob die in diesen Regeln genannten Bedingungen in dem zu analysierenden Datenverkehr vorherrschen. Wenn die Engine zu dem Schluss kommt, dass der Netzwerkdatenverkehr tatsächlich mit einer der Regeln übereinstimmt, übergibt sie die Daten an die Ausgabe-Plug-Ins, die in der Snort-Konfigurationsdatei aktiviert sind, damit die Analytiker über den Alarm informiert werden. Snort kann Daten in einer Vielzahl von Formaten protokollieren, etwa als einzeilige Alarme in einer Textdatei, als CSV-Datei, im PCAP-Format, im XML-Format, als Systemprotokolleinträge usw. In vielen Produktionsumgebungen ist Snort zur Verwendung des offenen Formats Unified2 eingerichtet, das von Tools wie Barnyard2 und Pigsty gelesen werden kann. Diese Werkzeuge wiederum machen flexiblere Ausgabeformate möglich, z. B. die direkte Ausgabe in eine Datenbank. 9.2 Suricata Snort ist zurzeit das am häufigsten verwendete signaturgestützte IDS, doch die Alternative Suricata gewinnt immer mehr an Beliebtheit. Es handelt sich dabei um ein Open-Source-IDS, das von der Open Information Security Foundation (OISF) entwickelt und zu Anfang vom US-Ministerium für Heimatschutz mitfinanziert wurde. Seit der Veröffentlichung im Jahr 2010 hat es eine große Fangemeinde gewonnen. Das liegt hauptsächlich an seiner Leistung, die durch das Multithreaddesign möglich gemacht wird. In der Funktionsweise ähnelt Suricata sehr stark Snort. Wenn Sie also mit Letzterem vertraut sind, sollten Sie keine Schwierigkeiten haben, sich auch in Suricata zurechtzufinden. 266 9 Signaturgestützte Erkennung mit Snort und Suricata Wenn Sie bei der Einrichtung von Security Onion Suricata als IDS ausgewählt haben, dann läuft es. Das können Sie mit dem Befehl sudo nsm_sensor_ps-status überprüfen. In der Ausgabe in Abb. 9.5 wird suricata (alert data) als [OK] geführt. Abbildung 9.5: Überprüfen des Sensorstatus Wenn Sie auf dem Sensor ein anderes Betriebssystem als Security Onion ausführen, müssen Sie Suricata manuell installieren. Auf https://redmine.openinfosecfoundation.org/ projects/suricata/wiki/Suricata_Installation hat die OISF Installationsanleitungen für verschiedene Betriebssysteme bereitgestellt. Suricata selbst wird von der Befehlszeile aus aufgerufen. Mit suricata -V können Sie die Programmversion überprüfen. Die Ausgabe dieses Befehls sehen Sie in Abb. 9.6. Abbildung 9.6: Überprüfen der Suricata-Version 9.2.1 Die Architektur von Suricata Suricata besteht aus verschiedenen Modulen, die, je nachdem, wie die Software aufgerufen wird, auf unterschiedliche Weise zusammenarbeiten. Der gewählte Betriebsmodus (runmode) gibt an, wie die Module und die damit verknüpften Threads und Warteschlangen angeordnet werden. Welchen Betriebsmodus Sie wählen, hängt davon ob, welchem Verarbeitungsschritt Sie Priorität einräumen möchten. 9.2 Suricata 267 Der Standardmodus ist für die Erkennung optimiert, das ressourcenintensivste Modul. Eine grafische Darstellung dieses Modus sehen Sie in Abb. 9.7. Rohpaketdaten vom Überwachungsport Paketabruf Decoder- und Streamanwendungsschicht Erkennungsengine Erkennungsthread Erkennungsthread Erkennungsthread Ausgaben Abbildung 9.7: Der Standardbetriebsmodus von Suricata In einem anderen Modus wird PF_Ring genutzt, um an Verbindungen mit hohem Durchsatz den Paketabruf und die Dekodierung zu optimieren. Dieser Modus ist in Abb. 9.8 dargestellt. Rohpaketdaten vom Überwachungsport Paketabruf Abruhread Abruhread Decoderthread Decoderthread Abruhread Decoder Decoderthread Flusswarteschlange Streamanwendung Streamthread Streamthread Streamthread Erkennungsengine Erkennungsthread Erkennungsthread Ausgabethread Ausgabethread Erkennungsthread Ausgaben Ausgabethread Abbildung 9.8: Der PF_Ring-Betriebsmodus von Suricata 268 9 Signaturgestützte Erkennung mit Snort und Suricata Unabhängig vom gewählten Betriebsmodus setzt Surcata als Erstes sein Abrufmodul ein, um Pakete an der Netzwerkschnittstelle zu erfassen. Diese Pakete werden dann an den Decoder geleitet, der den Verbindungstyp ermittelt und die Daten dann für die Weiterverarbeitung durch die anderen Module normalisiert. Anschließend gehen die Daten an das Streammodul, das die sitzungsfähigen Protokolle (wie TCP) im Auge behält und die Paketdaten in der korrekten Reihenfolge zusammensetzt. Außerdem sortiert es auch Daten von Protokollen der Anwendungsschicht wie HTTP. Die auf diese Weise aufbereiteten Daten werden danach dem Erkennungsmodul übergeben, das sie auf Übereinstimmungen mit den vom Benutzer angelegten Signaturen oder Regeln überprüft. Wenn ein Alarm auftritt, wird er zusammen mit den zugehörigen Daten an das Ausgabemodul gesendet, das die Daten in verschiedenen Formaten bereitstellen kann. 9.3 IDS-Engines in Security Onion austauschen Wenn Sie Security Onion bereits eingerichtet und Snort oder Suricata als IDS-Engine ausgewählt haben, aber noch eine andere Engine ausprobieren wollen, ohne Security Onion neu zu installieren, können Sie die Engine einfach wie folgt austauschen: 1. Halten Sie die NSM-Prozesse auf dem Sensor an: sudo nsm_sensor_ps-stop 2. Ändern Sie die Hauptkonfigurationsdatei von SO. Für den Wechsel von Snort zu Suricata: sudo sed -i 's|ENGINE=snort|ENGINE=suricata|g' /etc/nsm/securityonion.conf Für den Wechsel von Suricata zu Snort: sudo sed -i 's|ENGINE=suricata|ENGINE=snort|g' /etc/nsm/securityonion.conf 3. Aktualisieren Sie den Satz der Sensorregeln für die entsprechende IDS-Engine: sudo rule-update 4. Starten Sie die NSM-Prozesse auf dem Sensor: sudo nsm_sensor_ps-start 9.4 Snort und Suricata initialisieren 269 Wenn Sie eigene Regeln für Ihren Sensor entwickelt haben, müssen Sie überprüfen, ob sie mit der IDS-Engine kompatibel sind, zu der Sie wechseln, und vorausschauend jegliche Unstimmigkeiten beheben, die die Initialisierung des IDS verhindern könnten. 9.4 Snort und Suricata initialisieren Um Snort und Suricata als IDS zu initialisieren, müssen Sie lediglich mit der Befehlszeilenoption -c eine gültige Konfigurationsdatei und mit der Option -i eine Überwachungsschnittstelle angeben. Snort: sudo snort –c snort.conf –i eth1 Suricata: sudo suricata –c suricata.yaml –i eth1 Vorher allerdings müssen Sie überprüfen, ob die Konfigurationsdatei gültig ist. Das können Sie mit dem Argument -T bewerkstelligen. Damit wird die IDS-Engine versuchsweise mit der angegebenen Konfigurationsdatei gestartet. Snort: sudo snort –Tc snort.conf –i eth1 Suricata: sudo suricata –Tc suricata.yaml –i eth1 Wenn alles funktioniert, wird bei Snort die Meldung aus Abb. 9.9 angezeigt, die besagt, dass die Konfiguration erfolgreich validiert wurde. Nach Abschluss dieses Tests wird Snort wieder beendet. 270 9 Signaturgestützte Erkennung mit Snort und Suricata Abbildung 9.9: Erfolgreicher Test einer Snort-Konfigurationsdatei im NIDS-Modus Bei problemloser Initialisierung von Suricata wird die Meldung aus Abb. 9.10 angezeigt, die besagt, dass die Konfiguration erfolgreich geladen wurde. Auch Suricata wird nach Abschluss des Tests automatisch beendet. Sollten Snort oder Suricata bei diesem Test irgendwelche Fehler melden, müssen Sie diese beheben, bevor Sie die Programme in der Produktion einsetzen können. Ein häufiger Fehler besteht darin, die Tools ohne die erforderlichen Berechtigungen zum Abfangen von Netzwerkverkehr aufzurufen. Um diese Berechtigungen zu erteilen, wird gewöhnlich der Befehl sudo verwendet. 9.4 Snort und Suricata initialisieren 271 Abbildung 9.10: Erfolgreicher Test der Suricata-Konfigurationsdatei im Standardmodus Wenn Snort erfolgreich im NIDS-Modus gestartet wird, werden Sie benachrichtigt, dass mit der Paketerfassung begonnen wurde, wobei auch die Prozessnummer (PID) angegeben wird (siehe Abb. 9.11). Abbildung 9.11: Erfolgreicher Start von Snort im NIDS-Modus 272 9 Signaturgestützte Erkennung mit Snort und Suricata Nach einem erfolgreichen Start von Suricata werden Sie informiert, dass das Programm die Threads initialisiert und die Engine gestartet hat (siehe Abb. 9.12). Abbildung 9.12: Erfolgreicher Start von Snort im Standardmodus In Security Onion können Sie Snort und Suricata mit dem Skript nsm_sensor_ps-start starten. Eine Beschreibung dieses Skripts finden Sie in Anhang A.3. 9.5 Snort und Suricata konfigurieren Die Funktionsweise von Snort und Suricata wird durch Konfigurationsdateien und Befehlszeilenargumente gesteuert. Die Konfigurationsdatei von Snort heißt snort.conf, die von Suricata suricata.yaml. Beide ermöglichen es, praktisch jede Verhaltensweise der jeweiligen Anwendung zu steuern und anzupassen, etwa die Einzelheiten der Erkennungsengines, den Speicherort der Regeldateien oder die Deklaration der Variablen in diesen Regeln. Bei Security Onion finden Sie diese Dateien in /etc/nsm/<Sensorschnittstelle>. Wenn Sie eine Snort- oder Suricata-Installation verwalten oder wenn Sie einfach nur mehr über die Funktionsweise dieser Programme wissen wollen, sollten Sie sich die Zeit nehmen, die Konfigurationsdateien Schritt für Schritt unter die Lupe zu nehmen. Diese Dateien sind ausgesprochen gut kommentiert. Im Folgenden sehen wir uns einige gängige konfigurierbare Elemente an, die in beiden Produkten zur Verfügung stehen. 9.5 Snort und Suricata konfigurieren 273 9.5.1 Variablen In der Informatik sind Variablen symbolische Namen, die auf einen gespeicherten Wert verweisen. Sowohl Snort als auch Suricata verwenden Variablen, um IDS-Regeln leichter erstellen und pflegen zu können und die Vielseitigkeit zu erhöhen. Snort setzt Variablen auch in seiner Konfigurationsdatei ein, um auf Pfade zu verweisen. Eine Variable muss nur einmal angelegt werden, damit sie beim Start von Snort geladen wird. Anschließend können Sie jederzeit in der Konfigurationsdatei oder in den Snort-Regeln darauf verweisen. In unserem Zusammenhang gibt es drei Arten von Variablen: IP-Adress-, Port- und Standardvariablen. IP-Adressvariablen IP-Adressvariablen werden verwendet, um Netzwerkadressen oder Adressbereiche für die Verwendung in IDS-Regeln zu definieren. Mit diesen Adressen werden die Quellen bzw. Ziele des zu untersuchenden Datenverkehrs angegeben. Wenn Sie für häufig vorkommende IP-Adressbereiche Variablen verwenden, müssen Sie bei Änderung nur die Variable anpassen, um sämtliche Regeln, die auf diesen Bereich verweisen, auf den neuesten Stand zu bringen. Bei Snort stehen die IP-Adressvariablen in snort.conf. Zur Definition einer solchen Variable verwenden Sie das Schlüsselwort ipvar gefolgt vom Variablennamen und den IP-Adressen, die darin gespeichert werden sollen. Beispielsweise können Sie die folgende Variable für einen DNS-Server in Ihrem Netzwerk erstellen: ipvar DNS_SERVERS 192.168.1.10 Um mehrere IP-Adressen anzugeben, schließen Sie sie durch Kommata getrennt in eckige Klammern ein. Das folgende Beispiel zeigt dies für mehrere SMTP-Mailserver: ipvar SMTP_SERVERS [192.168.1.75,192.168.1.76,192.168.1.77] Adressbereiche können Sie mit der CIDR-Schreibweise angeben. Auch diese Bereiche lassen sich durch Kommata getrennt in eckigen Klammern kombinieren. Das folgende Beispiel zeigt eine Variable mit zwei Subnetzen, die nur Webserver enthalten: ipvar HTTP_SERVERS [192.168.2.0/24,192.168.12.0/24] In Suricata wird zum Erstellen von Variablen kein besonderes Schlüsselwort gebraucht. Stattdessen werden die Variablen eines bestimmten Typs in einem eigenen Abschnitt von suricata.yaml definiert. Alle Variablen müssen unter der Überschrift vars angelegt werden, IP-Adressvariablen unter der Zwischenunterschrift address-groups. Das Format zur Angabe der Adressen und die Verwendung der CIDR-Schreibweise ist jedoch identisch mit der Vorgehensweise bei Snort: 274 9 Signaturgestützte Erkennung mit Snort und Suricata vars: address-groups: DNS_SERVERS 192.168.1.10 SMTP_SERVERS [192.168.1.75,192.168.1.76,192.168.1.77] HTTP_SERVERS [192.168.2.0/24,192.168.12.0/24] Um eine IP-Adressvariable in einer Regel zu verwenden, stellen Sie ihrem Namen ein Dollarzeichen voran. Im folgenden Beispiel werden die Variablen $SMTP_SERVERS und $EXTERNAL_NET verwendet, um Versuche zu erkennen, die SMTP-Authentifzierung mit einem Brute-Force-Angriff zu knacken: alert tcp $SMTP_SERVERS 25 ->$EXTERNAL_NET any (msg:"GPL SMTP AUTH LOGON brute force attempt"; flow:from_server,established; content:"Authentication unsuccessful"; offset:54; nocase; threshold:type threshold, track by_dst, count 5, seconds 60; classtype:suspicious-login; sid:2102275; rev:3;) Die beiden wichtigsten Netzwerkvariablen sind $HOME_NET und $EXTERNAL_NET. $HOME_NET wird verwendet, um die IP-Adressbereiche anzugeben, die Snort bzw. Suricata schützen soll. Damit werden oft intern verwendete IP-Adressen nach RFC1918 (nicht routingfähig) angegeben, z. B. 10.0.0.0/8, 172.16.0.0/12 oder 192.168.0.0/16m, je nach Platzierung und Sichtfeld des SEnsors. Die Deklaration von $HOME_NET sieht gewöhnlich wie folgt aus: Snort: ipvar HOME_NET [192.168.0.0/16,10.0.0.0/8,172.16.0.0/12] Suricata: vars: address-groups: HOME_NET [192.168.0.0/16,10.0.0.0/8,172.16.0.0/12] Mit $EXTERNAL_NET geben Sie IP-Adressbereiche an, die nicht von Snort bzw. Suricata geschützt werden. Das sind Bereiche, die nicht zur Organisation gehören und außerhalb des Perimeternetzwerks liegen. Im Allgemeinen ist das alles, was nicht zu $HOME_NET gehört, weshalb diese Variable üblicherweise auf !$HOME_NET gesetzt wird. Das Ausrufungszeichen kann in Variablen eingesetzt werden, um den angegebenen Wert zu negieren. Eine andere gebräuchliche Methode besteht darin, die Variable auf any zu setzen, was sämtliche IPAdressen einschließt. Snort: 9.5 Snort und Suricata konfigurieren 275 ipvar EXTERNAL_NET !$HOME_NET Suricata: vars: address-groups: EXTERNAL_NET !$HOME_NET Sowohl in Snort als auch in Suricata sind die Netzwerkvariablen $HOME_NET und $EXTERNAL_NET erforderlich. Die meisten öffentlich verfügbaren Regeln greifen auf diese Werte zurück. Die anderen bereits in snort.conf und suricata.yaml vorhandenen Netzwerkvariablen sind optional, allerdings ist ihre Verwendung sehr empfehlungswert, da sie beim Schreiben von Regeln eine höhere Vielseitigkeit und einen größeren Detaillierungsgrad ermöglichen. Außerdem werden sie in öffentlich erhältlichen Regelsätzen verwendet (über die wir weiter hinten noch sprechen werden). Unter anderem stehen folgende Netzwerkvariablen zur Verfügung: •• $HTTP_SERVERS: Praktisch für Regeln im Zusammenhang mit server- oder clientseitigen Web-Exploits. •• $DNS_SERVERS: Praktisch für Regeln im Zusammenhang mit Domänenreputation und Malware-Steuerservern. •• $SMTP_SERVERS: Praktisch für Regeln im Zusammenhang mit Spam oder schädlichen E-Mail-Anhängen. •• $SSH_SERVERS: Praktisch zum Protokollieren von Aktivitäten im Zusammenhang mit der Verwaltung von Switches, Routern und anderen Netzwerkgeräten über das Protokoll SSH. Mit der weiter vorn angegebenen Syntax können Sie auch eigene Variablen erstellen, was eine praktische Vorgehensweise ist, um Geräte zu gruppieren, beispielsweise wie folgt: •• •• •• •• •• •• Missionskritische Systeme VoIP-Telefone Drucker Netzwerkfähige Fernseher und Projektoren Administrator-Arbeitsstatonen Sensoren Es gibt unbegrenzte Möglichkeiten. Je spezifischer Ihre Gruppen sind, umso mehr Flexibilität haben Sie beim Schreiben von Regeln. 276 9 Signaturgestützte Erkennung mit Snort und Suricata Vorsicht Überprüfen Sie Ihre Variablen genau! Beispielsweise kann es bei der Einrichtung der Variable HTTP_SERVERS sehr leicht passieren, dass man Geräte wie Drucker und Scanner, die über eingebaute Webserver verfügen, übersieht. Portvariablen Portvariablen definieren einen Schicht-4-Port bzw. einen Portbereich für die Verwendung in IDS-Regeln. Damit werden die Quell- bzw. Zielports des zu untersuchenden Datenverkehrs angegeben. Bei Snort werden diese Variablen mit dem Schlüsselwort portvar in snort.conf erstellt. Das folgende Beispiel dient zur Angabe eines einzigen Ports für den SMTP-Dienst: portvar SMTP_PORTS 25 Falls nötig, können Sie auch mehrere Ports gleichzeitig angeben. Dazu verwenden Sie die gleiche Schreibweise wie bei IP-Adressvariablen, nämlich eine kommagetrennte Liste in eckigen Klammern ein. Das folgende Beispiel zeigt dies für mehrere HTTP-Ports: portvar HTTP_PORTS [80,81,82,83,84,85,86,87,88,89,311,383,591,593, 631,901,1220,1414,1741,1830,2301,2381,2809,3037,3057,3128,3702,4343, 4848,5250,6080,6988,7000,7001,7144,7145,7510,7777,7779,8000,8008, 8014,8028,8080,8085,8088,8090,8118,8123,8180,8181,8222,8243,8280,8300,8500, 8800,8888,8899,9000,9060,9080,9090,9091,9443,9999,10000,11371, 34443,34444,41080,50002,55555] Portvariablen sind nützlich, um Regeln für die Kommunikation mit einem Dienst zu schreiben, der nicht immer den erwarteten Port verwendet. Während die HTTP-Kommunikation gewöhnlich über Port 80 erfolgt, gibt es Webserver (insbesondere solche zur Verwaltung von Sonderanwendungen oder besonderen Geräten), die einen anderen als den Standardport verwenden. Portvariablen sind auch praktisch, wenn Dienste in Ihrem Netzwerk so eingerichtet sind, dass sie nicht den Standardport nutzen. Das ist gängige Praxis für administrative Protokolle wie SSH. Administratoren verwenden dafür meistens einen anderen als den Standardport 22, um zu verhindern, dass dieser Dienst durch automatische Scans entdeckt wird. 9.5 Snort und Suricata konfigurieren 277 Standardvariablen Der letzte Typ sind die sogenannten Standardvariablen, die nur von Snort verwendet werden. Erstellt werden sie mit dem Schlüsselwort var. Gewöhnlich besteht ihr Zweck darin, Verzeichnisse zu definieren. In der Standardkonfigurationsdatei snort.conf werden sie häufig eingesetzt, beispielsweise um die Verzeichnisse mit den verschiedenen Arten von Snort-Regeln anzugeben: var RULE_PATH /etc/nsm/rules var SO_RULE_PATH /etc/nsm/rules var PREPROC_RULE_PATH /etc/nsm/rules Der Großteil dieser Variablendefinitionen befindet sich im ersten Abschnitt von snort. conf. Wenn Sie eigene Variablen erstellen und auch in snort.conf unterbringen wollen (statt in einer gesonderten Datei), sollten Sie sie ebenfalls in diesen Abschnitt stellen, damit Sie sie immer leicht wiederfinden können. 9.5.2 Regelsätze definieren Damit Snort und Suricata den Netzwerkverkehr auf Einbruchsindikatoren untersuchen können, müssen Regeln aufgestellt sein, die den Erkennungsengines im Grunde genommen mitteilen, wie sie die Indikatoren im Netzwerkverkehr ausfindig machen können. Die Regeln sind in einfachen Textdateien gespeichert, wobei jede neue Zeile eine neue Regel enthält. Damit Snort und Suricata diese Regeldateien verarbeiten können, müssen sie in den Konfigurationsdateien aufgeführt werden. Snort-Regeldateien definieren Regeldeklarationen erfolgen gewöhnlich im letzten Abschnitt der Konfigurationsdatei snort.conf. Hier müssen Sie mit dem Schlüsselwort include den Pfad zum Regelverzeichnis und den Namen der darin befindlichen Regeldatei angeben. Der Pfad wird dabei meistens mit der Variable $RULE_PATH angegeben, die im ersten Abschnitt von snort.conf definiert ist. include $RULE_PATH/emerging-exploit.rules 278 9 Signaturgestützte Erkennung mit Snort und Suricata Bericht von der Front Anstatt in snort.conf ständig Verweise auf Regeldateien hinzuzufügen und zu entfernen, können Sie eine Regel, die Sie zurzeit nicht nutzen wollen, einfach mit dem Zeichen # am Zeilenanfang auskommentieren. Snort verarbeitet keine Zeilen, die mit diesem Zeichen beginnen. Damit können Sie nicht nur einzelne Konfigurationsdateien vorübergehend außer Kraft setzen, sondern auch Kommentare hinzufügen. Die gleiche Möglichkeit besteht auch in suricata.yaml. Snort ermöglicht auch die Verwendung von anderen Regeln als denen des Standardtyps: •• Präprozessorregeln: Der Aufbau dieser Regeln hängt von den Funktionen ab, die die Präprozessoren zur Verfügung stellen. Sie werden vor den Regeln für die Erkennungsengine verarbeitet. •• Regeln für gemeinsame Objekte: Diese Regeln sind keine interpretierten Textzeilen, sondern werden kompiliert. Damit können hochentwickelte Regeln erstellt werden. Es ist auf diese Weise auch möglich, Regeln zu schreiben, ohne darin auf die Einzelheiten der Indikatoren einzugehen. Diese Regeln können an anderen Speicherorten untergebracht sein, weshalb es für sie eigene Regelpfadvariablen gibt: include $PREPROC_RULE_PATH/preproc.rules include $SO_RULE_PATH/sharedobj.rules Snort lädt die Regeln bei der Initialisierung. Es ist aber auch möglich, eine Aktualisierung der Konfiguration zu erzwingen, ohne Snort komplett neu zu starten. Das bietet den Vorteil, dass Sie die Erkennung nicht jedes Mal für einige Sekunden unterbrechen müssen, wenn Sie eine Regel ändern. Voraussetzung dafür ist, dass Sie Snort mit der Option -­ enable-reload kompiliert haben. Um ein erneutes Laden der Regeln im laufenden Betrieb durchzuführen, gehen Sie wie folgt vor: 1. Bringen Sie die ID des laufenden Snort-Prozesses in Erfahrung. Mit dem Befehl ps können Sie eine Liste der aktuellen Prozesse aufrufen und dann mit grep nach dem Snort-Prozess suchen: ps aux | grep snort.conf In unserem Beispiel aus Abb. 9.13 lautet die Prozess-ID 22859. 9.5 Snort und Suricata konfigurieren 279 Abbildung 9.13: Ermitteln der ID des Suricata-Prozesses 2. Senden Sie den Befehl kill mit der Option -SIGHUP, um das erneute Laden der Regeln auszulösen. In unserem Beispiel lautet der Befehl dafür wie folgt: sudo kill -SIGHUP 22859 3. Snort wird neu gestartet und verarbeitet die Datei snort.conf sowie die zugehörigen Regeln. Beachten Sie, dass einige Konfigurationsoptionen nicht im laufenden Betrieb nachgeladen werden können. Eine Liste der betreffenden Optionen finden Sie auf http://manual.snort.org/node24.html. Suricata-Regeldateien definieren In Suricata geben Sie die Regeldateien im entsprechenden Abschnitt von suricata.yaml an. Dabei müssen Sie zunächst den Regelpfad und dann unter der Überschrift rule-files die Regeldateien angeben, wobei jede Datei in einer eigenen, mit einem Bindestrich eingeleiteten Zeile steht: default-rule-path: /etc/nsm/rules/ rule-files: - local.rules - downloaded.rules Wie Snort muss auch Suricata nicht komplett neu gestartet werden, um neue Regeln in Kraft zu setzen. Mit der folgenden Vorgehensweise können Sie Ergänzungen, Löschungen und Änderungen von Regeln im laufenden Betrieb übernehmen: 1. Vergewissern Sie sich, dass Regelaktualisierungen im laufenden Betrieb in suricata. yaml aktiviert sind: # When rule-reload is enabled, sending a USR2 signal to the Suricata process will trigger a live rule reload. Experimental feature, use with care. - rule-reload: true 280 9 Signaturgestützte Erkennung mit Snort und Suricata 2. Bringen Sie die ID des laufenden Suricata-Prozesses in Erfahrung. Mit dem Befehl ps können Sie eine Liste der aktuellen Prozesse aufrufen und dann mit grep nach dem Suricata-Prozess suchen: ps aux | grep suricata.yaml Nehmen wir für unser Beispiel an, die Prozess-ID laute 30577. 3. Senden Sie den Befehl kill mit der Option -USR2, um das erneute Laden der Regeln auszulösen. In unserem Beispiel lautet der Befehl dafür wie folgt: sudo kill -USR2 30577 Die Protokollausgabe dieses Vorgangs sehen Sie in Abb. 9.14. Abbildung 9.14: Erzwingen einer Regelaktualisierung in Suricata mit dem Befehl kill -USR2 Öffentliche Quellen für Regeln Regeln können manuell erstellt, von Organisationen gemeinsam verwendet oder aus öffentlichen Quellen bezogen werden. Wie Sie eigene Regeln schreiben, werden wir weiter hinten in diesem Kapitel besprechen. Hier wollen wir uns zunächst zwei wichtige Quellen für Snort- und Suricata-Regeln ansehen, nämlich Emerging Threats und Sourcefire VRT. Emerging Threats (ET) wurde ursprünglich unter dem Namen Bleeding Snort im Jahr 2003 von Matt Jonkman gestartet und sollte als offene Plattform für den Austausch von IDS-Signaturen dienen. ET hat die Entwicklung einer umfangreichen und aktiven Community von Signaturentwicklern gefördert und sogar verschiedene Zuschüsse erhalten, mit denen das Projekt noch weiter ausgebaut werden konnte. Die ET-Community ist so stark wie nie zuvor und bietet kostenlose, offene Regelsätze sowohl für Snort als auch für Suricata an. Erstellt und gepflegt werden sie von der Com- 9.5 Snort und Suricata konfigurieren 281 munity. Darüber hinaus gibt es das gebührenpflichtige Abonnement ETPro für Regelsätze, die vom Forschungsteam von Emerging Threats gepflegt werden. Mehr darüber können Sie auf http://www.emergingthreats.net/open-source/etopen-ruleset/ lesen. Auf http://www.emergingthreats.net/blog/ führt das ET-Team auch ein Blog mit Benachrichtigungen über Regelaktualisierungen. Das Vulnerability Research Team (VRT) von Sourcefire – dem Hersteller von Snort – ist eine Elitegruppe von Sicherheitsforschern, die vorausschauend Erkennungsmöglichkeiten für neu aufkommende Angriffstechniken, Malware und Schwachstellen entwickelt. Die äußerst begabten VRT-Mitglieder sind auch für die Entwicklung und Pflege der Regeln im offiziellen Regelsatz von Snort.org verantwortlich. Es gibt drei offizielle Snort-Regelsätze. Der VRT-Regelsatz stellt das Premiumprodukt dar und erfordert ein gebührenpflichtiges Abonnement. Dadurch aber bekommen Sie unmittelbaren Zugriff auf alle vom VRT entwickelten Regeln, sobald sie veröffentlicht sind. An zweiter Stelle steht das Release für registrierte Benutzer, das eine kostenlose Registrierung auf Snort.org erfordert und jeweils 30 Tage nach der Veröffentlichung Zugriff auf die VRT-Regeln erlaubt. Das dritte und letzte Angebot ist der Community-Regelsatz, eine kostenlose Teilmenge des Regelsatzes für Abonnenten. Dafür ist keine Registrierung erforderlich. Dieser Satz wird täglich aktualisiert. Alle in diesem Satz veröffentlichten Regeln unterliegen der GPL2-Lizenz. Das Sourcefire VRT bietet zwar keinen eigenen Regelsatz für Suricata an, doch einige der Regeln funktionieren auch in dieser Software. Allerdings unterstützt Suricata viele der Optionen für Snort-Präprozessoren nicht. Wenn Sie VRT-Regeln für Suricata nutzen wollen, sollten Sie daher einzelne Regeln auswählen und in Suricata testen, anstatt zu versuchen, den kompletten VRT-Regelsatz zu implementieren. So können Sie die Regeln einzeln anpassen. VRT-Regeln für Snort können Sie von http://www.snort.org/snort-rules/ herunterladen. Auf http://vrt-blog.snort.org/ finden Sie außerdem ein sehr informatives Blog des VRT. Weitere Informationen über Regelaktualisierungen und die neuesten Meldungen zu den Regelsätzen gibt es auf http://blog.snort.org. Regelaktualisierungen mit PulledPork verwalten Sowohl Emerging Threats als auch Sourcefire VRT veröffentlichen fast jeden Tag neue Regeln. Es wäre sehr mühselig, wenn Sie manuell nach Aktualisierungen suchen, sie herunterladen, ins richtige Verzeichnis kopieren und in der Produktion bereitstellen würden. Um diesen Vorgang zu automatisieren und dafür zu sorgen, dass Ihre Regeln immer auf dem neuesten Stand sind, können Sie PulledPork verwenden. Zu den vielen Funktionen dieser Software gehören Mechanismen, um Regelaktualisierungen herunterzuladen, die Möglichkeit, auch eigene Regeldateien zu verwalten und zu verteilen, und die Fähigkeit, Regeländerungen nachzuvollziehen. Die Konfiguration von PulledPork können wir in diesem Buch nicht besprechen, aber auf https://code.google.com/p/pulledpork/ erfahren Sie mehr darüber. 282 9 Signaturgestützte Erkennung mit Snort und Suricata Regelverwaltung in Security Onion In Security werden Regeln standardmäßig in /etc/nsm/rules/ untergebracht. Aus öffentlichen Quellen wie Sourcefire VRT oder Emerging Threats heruntergeladene Regeln kommen in die Datei downloaded.rules, selbst erstellte Regeln in local.rules. Sie können auch weitere Regeldateien verwenden, müssen diese aber in snort.conf bzw. suricata.yaml angeben. Wenn Sie Security Onion als Ihre NSM-Plattform nutzen, sollten Sie Regeln nicht mit den in den vorherigen Abschnitten beschriebenen Methoden aktualisieren, sondern das Skript rule-update nutzen. Es führt auch zusätzliche Aufgaben aus, die für andere Tools wie Barnyard2 und PulledPork erforderlich sind. Sie können es wie folgt ausführen: sudo rule-update Einen Auszug der Ausgabe dieses Skripts sehen Sie in Abb. 9.15. Abbildung 9.15: Ausführen des Security Onion-Skripts rule-update Für die Regelverwaltung in Security Onion sind vor allem die beiden Dateien disablesid. conf und modifysid.conf von Bedeutung. Sie gehören zu PulledPork und werden auch dann genauso wie hier beschrieben verwendet, wenn Sie nicht Security Onion ausführen. 9.5 Snort und Suricata konfigurieren 283 Die Datei disablesid.conf dient dazu, Regeln, die Sie nicht mehr anwenden wollen, dauerhaft zu deaktivieren. Das ist insbesondere bei der Nutzung von öffentlich erhältlichen Regeln wichtig, da diese häufig aktualisiert werden. Nehmen wir an, Sie wollen die Regel mit der SID 12345 deaktivieren. Auf den ersten Blick mag es ausreichen, die Regel einfach aus der Regeldatei zu löschen oder sie auszukommentieren. Das mag auch kurzzeitig funktionieren, aber wenn PulledPork später Regelaktualisierungen von Emerging Threats oder Sourcefire herunterlädt, wird die gelöschte oder deaktivierte Regel wiederhergestellt und wieder in der Produktion angewendet. Daher müssen Regeln mithilfe von disablesid .conf deaktiviert werden. Wenn PulledPork Regelaktualisierungen herunterlädt, geht es diese Datei durch, um alle darin aufgenommenen Regeln erneut zu deaktivieren. Die Einträge in dieser Datei haben das Format GID:SID. Um unsere Beispielregel dauerhaft zu deaktivieren, müssen wir daher folgenden Eintrag in die Datei schreiben: 1:12345 Die Datei modifysid.conf dient dazu, aus öffentlichen Quellen bezogene Regeln dauerhaft zu ändern. Ebenso wie bei gelöschten Regeln würde eine Aktualisierung durch PulledPork eine von Ihnen angepasste Regeldatei ersetzen und damit die Änderungen zunichte machen. Daher durchsucht PulledPork nach jeder Aktualisierung die Datei modify.sid, um jegliche Änderungen wieder auf die aktualisierte Regel anzuwenden. Nehmen wir an, wir wollen die folgende Regel ändern: alert ip any any ->any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; fast_pattern:only; classtype: bad-unknown; sid:2100498; rev:8;) Um diese Regel zu ändern, müssen wir in modify.conf einen Eintrag hinzufügen, der die SID der Regel, den zu ändernden Inhalt und die neue Version dieses Inhalts enthält. Hier wollen wir alert ip any any durch alert ip $HOME_NET any ersetzen, damit nur dann ein Alarm ausgelöst wird, wenn das gesuchte Muster in Datenverkehr gefunden ist, der seinen Ursprung in einer IP-Adresse des eigenen Netzwerks hat. Der erforderliche Eintrag in modifysid.conf lautet daher: 2100498 "alert ip any any" "alert ip $HOME_NET any" Sowohl in disablesid.conf als auch in modifysid.conf sind mehrere Beispieleinträge enthalten. Weitere Beispiele speziell für Security Onion finden Sie auf https://code.google.com/p/ security-onion/wiki/ManagingAlerts. 284 9 Signaturgestützte Erkennung mit Snort und Suricata 9.5.3 Alarmausgabe Sowohl Snort als auch Suricata bieten viele Möglichkeiten für die Ausgabe von Alarmdaten zur Analyse. Das ist sehr praktisch, um die Ausgabe an verschiedene Situationen anzupassen. In Snort wird die Alarmausgabe durch den Abschnitt für Ausgabe-Plug-Ins in snort.conf gesteuert. Um ein bestimmtes Ausgabe-Plug-In zu verlangen, geben Sie es hinter dem Schlüsselwort output an. Im Anschluss an den Namen des Plug-Ins können Sie auch noch jegliche Optionen nennen, die es benötigt. output<Plug-In-Name>: <Optionen> Das Standardprotokollverzeichnis von Snort ist /var/log/snort, allerdings können Sie zur Laufzeit mit dem Argument -l auch ein anderes Verzeichnis angeben. In Suricata wird die Alarmausgabe durch den Ausgabeabschnitt in suricata.yaml gesteuert. Unter der Überschrift outputs werden hier die einzelnen Ausgabemöglichkeiten zusammen mit den relevanten Optionen aufgeführt: outputs: - <Ausgabetyp>: <Optionen> Das Standardprotokollverzeichnis von Suricata ist /var/log/suricata, allerdings können Sie zur Laufzeit mit dem Argument -l auch ein anderes Verzeichnis angeben. Hinweis für Analytiker Sowohl in Snort als auch in Suricata können gleichzeitig mehrere Ausgabemöglichkeiten genutzt werden. Sie werden dann in der Reihenfolge aufgerufen, in der sie in snort.conf bzw. suricata.yaml aufgeführt sind. Im Folgenden sehen wir uns einige häufig verwendete Ausgabemöglichkeiten an. Es gibt natürlich noch mehr als die in diesem Abschnitt genannten. Wenn Sie eine bestimmte Option brauchen, schauen Sie am besten in der Dokumentation von Snort bzw. Suricata nach, denn wahrscheinlich gibt es sie schon. Für die Alarmbeispiele habe ich http://www.testmyids.com besucht, um einen Alarm aufgrund der Regel mit der SID 2100498 auszulösen: alert ip any any ->any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; fast_pattern:only; classtype: bad-unknown; sid:2100498; rev:8;) 9.5 Snort und Suricata konfigurieren 285 Schnell Bei dieser Option werden Alarme in einem sehr einfachen, einzeiligen Format angezeigt. Das ist die kompakteste Möglichkeit. Sie lässt sich von Analytikern noch bequem an der Befehlszeile einsehen und enthält ein Minimum an Informationen, um mit der Untersuchung der verknüpften Daten beginnen zu können. 08/05-15:58:54.524545 [**] [1:2100498:8] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 217.160.51.31:80 ->172.16.16.20:52316 Vollständig Neben allem, was im Schnellformat angezeigt wird, enthält das vollständige Format zusätzliche Angaben aus dem Header des Pakets, das den Alarm verursacht hat. Alarme in diesem Format umfassen mehrere Zeilen, weshalb sie nicht so leicht mit Befehlszeilenwerkzeugen untersucht werden können. [**] [1:2100498:8] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] 08/05-15:58:54.524545 217.160.51.31:80 ->172.16.16.20:52316 TCP TTL:40 TOS:0x20 ID:44920 IpLen:20 DgmLen:299 DF ***AP*** Seq: 0x6BD4465B Ack: 0xE811E4E6 Win: 0x36 TcpLen: 20 Systemprotokoll Alarme in diesem Format werden an einen Systemprotokollserver gesandt, der entweder auf dem Sensor selbst oder auf einem anderen Gerät ausgeführt werden kann. Es handelt sich hierbei um ein sehr weit verbreitetes Protokollformat, das von vielen verschiedenen Geräten unterstützt wird und von den meisten Protokollverwaltungs- und Analysewerkzeugen verarbeitet werden kann. Systemprotokollausgaben umfassen eine einzige Zeile und lassen sich an der Befehlszeile leicht durchsuchen. Die Menge der in diesem Format bereitgestellten Informationen entspricht derjenigen des Schnellformat. Aug 5 15:58:54 lakota snort: [1:2100498:8] GPL ATTACK_RESPONSE id check returned root [Classification: Potentially Bad Traffic] [Priority: 2]: {TCP} 217.160.51.31:80 ->172.16.16.20:52316 286 9 Signaturgestützte Erkennung mit Snort und Suricata Paketprotokollierung Alarme in Textform bilden zwar einen hervorragenden Ausgangspunkt, aber im Laufe der Untersuchung wollen Sie wahrscheinlich auch die Pakete inspizieren, die den Alarm ausgelöst haben. Wenn Sie wie in Kapitel 5 beschrieben vollständige Paketdaten (FCP) erfassen, dann werden Sie sicherlich dort nachschauen. Wenn nicht, können Sie Snort und Suricata so einrichten, dass sie die Pakete, die zu einem Alarm führen, im PCAP-Format festhalten. In Abbildung 9.16 sehen diesen Vorgang für das Paket, das unseren Beispiel­ alarm verursacht hat. Abbildung 9.16: Ein Paket, das mit Regel SID 2100498 übereinstimmt Unified2 Das am häufigsten verwendete Protokollformat in Unternehmensumgebungen ist Unified2. Es handelt sich dabei um ein Binärformat, das sowohl die Alarmdaten als auch die zugehörigen Paketdaten festhalten kann. Wenn Sie versuchen sollten, eine solche Datei manuell zu untersuchen, werden Sie jedoch feststellen, dass sie nicht lesbar ist. Unified2Ausgaben sind nicht dazu gedacht, von Menschen gelesen oder von Befehlszeilenwerkzeugen untersucht zu werden. Stattdessen werden sie von Tools wie Barnyard2 oder Pigsty interpretiert, die wiederum die Alarmdaten in eine Datenbank stellen, z. B. MySQL oder PostgreSQL. Snort enthält auch das Programm u2spewfoo, das in der Lage ist, das Format Unified2 zu lesen und den Inhalt an der Befehlszeile auszugeben. Barnyard2 gilt seit Jahren als Standardwerkzeug zum Speichern von Unified2-Alarmen in Datenbanken, und es funktioniert gut. Darüber hinaus unterstützt es andere Ausgabemodi. Mehr über Barnyard2 erfahren Sie auf https://github.com/firnsy/barnyard2. 9.5 Snort und Suricata konfigurieren 287 Ein neueres Werkzeug ist Pigsty, entwickelt von Threat Stack, von dem auch das weiter hinten in diesem Kapitel besprochene Tool Snorby stammt. Pigsty soll die gleichen Aufgaben auszuführen wie Barnyard2, dabei aber mehr Erweiterungsmöglichkeiten bieten. Um die Vielseitigkeit der Ausgabeoptionen für Alarmdaten von Snort und Suricata noch zu erweitern, erlaubt Pigsty Ihnen, eigene Ausgabe-Plug-Ins zu schreiben. Neben Ausgabe-Plug-Ins für Datenbanken unterstützt diese Software auch andere Ausgabemethoden, z. B. Web­ sockets, Sguild, IRC und REST. Mehr erfahren Sie auf https://github.com/threatstack/pigsty. Wenn Sie mehr darüber wissen wollen, wie Sie die Alarmausgabe einrichten, schlagen Sie in den entsprechenden Abschnitten der Onlinedokumentation von Snort oder Suricata nach. 9.5.4 Snort-Präprozessoren Bei Suricata ist die Mehrzahl der Funktionen in die Kernarchitektur eingebaut. Dagegen stellt Snort viele Funktionen in einzelnen Präprozessoren bereit. Wie wir bereits im Überblick über Snort gesehen haben, gibt es zwei Arten von Präprozessoren: Die einen dienen dazu, die Daten vor der Verarbeitung durch die Erkennungengine zu normalisieren, die anderen bieten erweiterte Möglichkeiten für die von dieser Engine verwendeten Regeln. Beide Arten von Präprozessoren aber werden in der Datei snort.conf konfiguriert. Dazu müssen Sie jeweils das Schlüsselwort preprocessor gefolgt vom Namen des Präprozessors und den zugehörigen Optionen angeben. Bei einigen Präprozessoren lassen sich nur wenige Optionen einstellen, beispielsweise beim Präprozessor für die Portscanerkennung: # Portscan detection. For more information, see README.sfportscan # preprocessor sfportscan: proto { all } memcap { 10000000 } sense_level { low } Andere dagegen haben mehrere Optionen, beispielsweise der Präprozessor zur Erkennung von SSH-Anomalien: # SSH anomaly detection. For more information, see README.ssh preprocessor ssh: server_ports { 22 } \ autodetect \ max_client_bytes 19600 \ max_encrypted_packets 20 \ max_server_version_len 100 \ enable_respoverflow enable_ssh1crc32 \ enable_srvoverflow enable_protomismatch Die Präprozessoren werden in der Reihenfolge ausgeführt, in der sie in der Konfigurationsdatei aufgeführt sind. Daher werden sie nach den Netzwerkschichten angeordnet, mit denen sie verknüpft sind. Als Erstes kommen Präprozessoren der Netzwerkschicht wie Frag3, der sich mit dem Zusammenbau von IP-Fragmenten beschäftigt. Darauf folgen Präprozessoren 288 9 Signaturgestützte Erkennung mit Snort und Suricata für Transportschichtprotokolle wie Stream5, der TCP-Streams wieder zusammensetzt, und anschließend Präprozessoren der Anwendungsschicht wie die Anomaliedetektoren für SSH, HTTP und SMTP. Diese Reihenfolge ist wichtig, da die Präprozessoren der Anwendungsschicht keine Daten verarbeiten können, die fragmentiert sind, nicht in der richtigen Reihenfolge vorliegen oder sich in einem sonstigen unerwarteten Zustand befinden. Bei Ihren ersten Schritten mit Snort werden Sie nicht allzu viele Präprozessoren nutzen, und möglicherweise ist Ihnen nicht einmal bewusst, welche Sie tatsächlich einsetzen. Allerdings sollten Sie sich auf jeden Fall die Zeit nehmen, alle in snorf.conf aufgeführten Präprozessoren zu untersuchen und die zugehörigen Readme-Dateien zu lesen. Es kann sonst sein, dass Sie versuchen, komplizierte Regeln zu schreiben, die bei der Verwendung eines Präprozessors viel einfacher sein könnten. Es gibt unter anderem folgende Präprozessoren: •• Reputation: Wird zur reputationsgestützten Erkennung und zum Blockieren der Kommunikation mit bestimmten IP-Adressen verwendet (siehe Kapitel 8). •• ARPSpoof: Kann ARP-Spoofing erkennen. •• SFportscan: Erkennt mögliche Aufklärungsscans. •• Frag3: Defragmentiert IP-Pakete und hilft dabei, ein Unterlaufen des IDS zu verhindern. •• Stream5: Ermöglicht die Statusverfolgung von TCP-Verbindungen und das Aufstellen von statusbehafteten Regeln. •• HTTP_Inspect: Normalisiert HTTP-Datenverkehr, sodass die Erkennungsengine ihn ordnungsgemäß untersuchen kann. Dieser Präprozessor stellt verschiedene Direktiven bereit, die in Snort-Regeln angewendet werden können. Mehr über die Präprozessoren von Snort erfahren Sie im Abschnitt »Preprocessors« des Snort Users Guide. Sie können sich auch die Readme-Dateien der einzelnen Präprozessoren in der Dokumentation zu Snort ansehen. 9.5.5 Zusätzliche Befehlszeilenargumente für den NIDS-Modus Die meisten Optionen werden in snort.conf bzw. suricata.yaml festgelegt. Optionen, die als Befehlszeilenargumente angegeben werden, haben jedoch Priorität gegenüber den Angaben in den Konfigurationsdateien. Es ist üblich, Snort und Suricata unter Angabe einiger dieser Argumente auszuführen. Wenn Sie Security Onion verwenden, können Sie sich die verwendeten Befehlszeilenargumente ansehen, indem Sie den Prozess der IDS-Engine anzeigen lassen. Das Beispiel aus Abb. 9.17 zeigt dies für Snort. Abbildung 9.17: Snort mit Befehlszeilenargumenten 9.5 Snort und Suricata konfigurieren 289 Für Snort können Sie unter anderem die folgenden häufig genutzten Argumente verwenden: •• -A<Modus>: Gibt den Modus für Alarme in Textform an. Mögliche Optionen sind fast, full, unsock, console, cmg und none. •• -c<Datei>: Gibt den Pfad zur Konfigurationsdatei snort.conf für den NIDS-Modus an. •• -D: Führt Snort als Daemon aus (im Hintergrund). •• -F<Datei>: Liest Berkeley-Paketfilter aus einer Datei. BPFs werden ausführlich in Kapitel 13 behandelt. •• -g<Gruppe>: Gibt die Gruppe an, in der Snort nach der Initialisierung ausgeführt wird. Das ermöglicht es, nach der Initialisierung Root-Rechte von Snort zu entfernen. •• -i<Schnittstelle>: Gibt die Überwachungsschnittstelle an. •• -l<Verzeichnis>: Gibt ein Ausgabeverzeichnis für Alarme in Textform an. •• -L<Verzeichnis>: Gibt ein Ausgabeverzeichnis für Alarme im Binärformat an. •• -m<Berechtigung>: Sorgt dafür, dass neue Dateien mit den angegebenen umask-Berechtigungen erstellt werden. •• -u<Benutzer>: Gibt den Benutzer an, unter dessen Konto Snort nach der Initialisierung ausgeführt werden soll. Das ermöglicht es, nach der Initialisierung Root-Rechte von Snort zu entfernen. •• -U: Ändert die Zeitstempel für alle Protokolle und Alarme auf UTC. •• -T: Dient zum Testen der Konfigurationsdatei. •• --perfmon-file<Datei>: Gibt die Datei an, die der Präprozessor perfmon zur Verfolgung der Snort-Statistiken verwenden soll. In Abb. 9.18 können Sie sehen, wie Suricata in Security Onion mit mehreren Befehlszeilenargumenten ausgeführt wird. Abbildung 9.18: Suricata mit Befehlszeilenargumenten Für Suricata können Sie unter anderem die folgenden häufig genutzten Argumente verwenden: •• -c<Datei>: Gibt den Pfad zur Konfigurationsdatei suricata.yaml an. •• -D: Führt Suricata als Daemon aus (im Hintergrund). •• --g<Gruppe>: Gibt die Gruppe an, in der Suricata nach der Initialisierung ausgeführt wird. Das ermöglicht es, nach der Initialisierung Root-Rechte von Suricata zu entfernen. •• -F<Datei>: Liest Berkeley-Paketfilter aus einer Datei. BPFs werden ausführlich in Kapitel 13 behandelt. 290 9 Signaturgestützte Erkennung mit Snort und Suricata •• •• •• •• •• -i<Schnittstelle>: Gibt die Überwachungsschnittstelle an. -l<Verzeichnis>: Gibt das Standardprotokollverzeichnis an. -r<PCAP-Datei>: Untersucht eine PCAP-Datei im Offlinemodus. --runmode<Modus-ID>: Legt fest, in welchem Betriebsmodus Suricata initialisiert wird. -s: Hiermit können Sie manuell eine Datei mit IDS-Signaturen angeben, die neben den in suricata.yaml aufgeführten Dateien verwendet werden soll. •• -T: Dient zum Testen der Konfigurationsdatei. •• --user<Benutzer>: Gibt den Benutzer an, unter dessen Konto Suricata nach der Initialisierung ausgeführt werden soll. Das ermöglicht es, nach der Initialisierung RootRechte von Suricata zu entfernen. Zur Initialisierung von Snort und Suricata stehen weitere Befehlszeilenargumente zur Verfügung. Eine vollständige Liste dieser Optionen finden Sie in den jeweiligen man-Seiten. Um sie aufzurufen, geben Sie an der Befehlszeile man snort bzw. man suricata ein. 9.6 IDS-Regeln Wir haben uns bereits angesehen, wie Sie Snort und Suricata mit Regeln aus öffentlichen Quellen versorgen und wie Sie diese Regeln auf dem neuesten Stand halten. Das ist zwar alles sehr wichtig, aber das tägliche Brot von Analytikern, die mit diesen IDS arbeiten, besteht darin, selbst neue Regeln zu erstellen und vorhandene Regeln zu ändern, um sie zu optimieren. In diesem Abschnitt erfahren Sie, wie Regeln aufgebaut sind und welche gängigen Regeloptionen es gibt. Außerdem gehen wir die Erstellung von Regeln in der Praxis Schritt für Schritt durch. Der Großteil des Stoffes in diesem Abschnitt gilt gleichermaßen für Snort wie für Suricata, da beide dieselbe grundlegende Syntax verwenden. Wenn irgendeine Regeloption für eine dieser beiden Technologien nicht verwendbar ist, weise ich jeweils ausdrücklich darauf hin. 9.6.1 Aufbau von Regeln Die von Snort und Suricata verwendete Regelsyntax ist äußerst flexibel, aber trotzdem müssen Sie sich an einige Vereinbarungen halten. Das folgende Beispiel zeigt eine sehr einfache Regel: alert tcp $EXTERNAL_NET 80 ->$HOME_NET any (msg:"Users Downloading Evil); content:"evil"; sid:55555555; rev:1;) 9.6 IDS-Regeln 291 Diese Regel löst einen Alarm aus, wenn ein Benutzer in Ihrem Netzwerk Daten von einem Webserver herunterlädt, die das Wort »evil« enthalten. Natürlich ist es in Wirklichkeit nicht so einfach, den Download von schädlichen Dingen aus dem Internet zu erkennen! Die Regel besteht aus zwei deutlich verschiedenen Teilen, nämlich dem Regelkopf (Header) und den Regeloptionen. Der Header besteht aus allem, was vor den Klammern steht, während es sich bei den Optionen um den gesamten Inhalt der Klammern handeln. Abb. 9.19 macht diesen Aufbau deutlich. alert tcp $EXTERNAL_NET 80 -> $HOME_NET any (content:”evil”; sid:55555555; rev:1;) Regelheader Regelop€onen Abbildung 9.19: Grundlegender Aufbau einer Regel Regelheader Der Header ist der erste Teil einer Regel und muss auf jeden Fall vorhanden sein. Er gibt an, »wer« für das Datenverkehrsmuster verantwortlich ist, nach dem gesucht wird. Alles, was im Regelheader definiert ist, lässt sich im Paketheader wiederfinden. Abb. 9.20 zeigt den Aufbau des Regelheaders. Quell-/ Zielports Protokoll Quell-/ Zielhosts alert tcp $EXTERNAL_NET 80 -> $HOME_NET any Akon Quell-/ Zielhosts Verkehrsrichtung Quell-/ Zielports Abbildung 9.20: Aufbau eines IDS-Regelheaders Regelheader enthalten immer die folgenden Teile: Aktion, Protokoll, Quell- und Zielhosts, Quell- und Zielports und Richtung des Datenverkehrs. Aktion Der erste Teil einer jeden Regel nennt die Aktion, die das IDS durchführen soll, wenn ein Alarm ausgelöst wird. Hierfür gibt es drei mögliche Optionen: •• Alert: Weist die IDS-Engine an, die Übereinstimmung mit der Regel sowie die damit verbundenen Paketdaten zu protokollieren. Dies ist die übliche Regelaktion. •• Log: Weist die IDS-Engine an, nur die Übereinstimmung mit der Regel, nicht aber die damit verbundenen Paketdaten zu protokollieren. •• Pass: Weist die IDS-Engine an, das Paket nicht weiter zu verarbeiten. 292 9 Signaturgestützte Erkennung mit Snort und Suricata Protokoll Dieses Feld teilt der IDS-Engine mit, auf welches Protokoll die Regel angewendet werden soll. Mögliche Optionen sind tcp, idp, icmp, ip und any. Es kann allerdings immer nur eine dieser Optionen angegeben werden. Wenn Sie also eine Regel schreiben wollen, die sowohl für TCP- als auch für UDP-Datenverkehr gelten soll, dann müssen Sie im Regelheader die Protokolloption ip verwenden. Aus Leistungsgründen sollten Sie das Protokoll, in dem das gesuchte Muster auftritt, möglichst spezifisch angeben. In der Beispielregel sind wir an HTTP-Datenverkehr interessiert. Da er auf dem Protokoll TCP aufsitzt, geben wir tcp an. Quell- und Zielhosts In einer Regel müssen Sie die IP-Adressen der Quell- und Zielhosts für den Datenverkehr nennen, in dem das gesuchte Muster vorkommen soll. Diese Angabe kann auf verschiedene Weise erfolgen, z. B. in Form von Listen oder CIDR-Bereichen, wie wir es schon bei unserer früheren Erörterung der Konfiguration von Snort und Suricata gesehen haben. In unserer Beispielregel haben wir die Variablen $HOME_NET und $EXTERNAL_NET verwendet. Lässt sich die Regel nicht auf eine bestimmte Gruppe von Hosts einschränken, geben Sie das Schlüsselwort any an, um nach Übereinstimmungen in Datenverkehr von bzw. zu jedem beliebigen Host zu suchen. Quell- und Zielports Neben den Hosts müssen wir auch die Layer-4-Ports angeben, über die der gesuchte Datenverkehr läuft. Wie bereits weiter vorn in diesem Kapitel erklärt, können Sie dabei einzelne Ports, Listen oder Bereiche angeben. Wenn es um Datenverkehr über beliebige Ports geht, verwenden Sie das Schlüsselwort any. In der Beispielregel haben wir Port 80 im Zusammenhang mit der Netzwerkvariable $EXTERNAL_NET verwendet und any im Zusammenhang mit $HOST_NET. Verkehrsrichtung Die letzte Angabe im Header nennt die Richtung des Datenverkehrs. Dafür gibt es nur zwei Möglichkeiten: •• ->: Unidirektionaler Datenverkehr von der Quelle zum Ziel •• <>: Bidirektionaler Datenverkehr Beim Schreiben von Regeln müssen Sie zunächst überlegen, ob die Richtung des Datenverkehrs eine Rolle spielt. Wenn das nicht der Fall ist, ist es auch egal, ob Sie erst Quellhost und Quellport und dahinter Zielhost und Zielport angeben oder umgekehrt. Kommt es dagegen auf die Richtung an, dann müssen Quellhost und Quellport an erster Stelle stehen. In dem Header unserer Beispielregel sind wir daran interessiert, ob Benutzer etwas Schädliches von einem externen Webserver herunterladen. Die potenziellen Quellen der Schadpakete sind daher externe Webserver, und das Ziel ist einer unserer internen Hosts. Daher werden zuerst die externen Hosts und Ports aufgeführt ($EXTERNAL_NET 80) und dann hinter dem Richtungsanzeiger (->) die internen Hosts und Ports ($HOME_NET any). 9.6 IDS-Regeln 293 Regeloptionen Im Regelheader geht es um das »Wer«, in den Regeloptionen dagegen um das »Was«. Sie teilen der IDS-Engine genau mit, wonach sie in den untersuchten Paketen Ausschau halten soll und wie sie es finden kann. Welche Optionen Sie angeben, ist von Fall zu Fall verschieden, aber immer müssen Sie den kompletten Optionsabschnitt in Klammern setzen. Innerhalb dieser Klammern werden die einzelnen Optionen in der folgenden Form angegeben: <Option>: <Optionswerte>; Optionsname und Werte werden durch einen Doppelpunkt getrennt, und die Optionswerte werden mit einem Semikolon abgeschlossen. Optionswerte, die Leerzeichen enthalten, müssen in Anführungszeichen stehen. Manche Optionen haben keine Werte, sondern werden einfach wie folgt angegeben: <Option>; Beachten Sie, dass hier ein Semikolon hinter dem Optionsnamen steht. Wenn Sie einen der erforderlichen Doppelpunkte oder ein Semikolon vergessen, kann die IDS-Engine die Regel nicht verarbeiten. Vorsicht Vergessen Sie nicht das Semikolon hinter der letzten Option im Optionsabschnitt! Dieser Fehler ist schnell gemacht und lässt sich später nur schwer finden. Sehen wir uns nun einige gebräuchliche Regeloptionen an. Optionen für Informationen über das Ereignis Diese Optionen geben Kontextinformationen zu einer Regel. Je ausführlicher die Informationen, die Sie dabei angeben, umso besser können die Analytiker die Daten im Zusammenhang mit dem betreffenden Alarm untersuchen. Unter anderem stehen folgende Optionen dieser Art zur Verfügung: Nachricht (msg): Eine kurze Beschreibung der Regel in Textform. Dies wird gewöhnlich als der »Name« der Regel angesehen und ist das, was Analytiker bei der Überprüfung der Alarme als Erstes sehen. Sie sollten diesen Text so aussagekräftig wie möglich gestalten. Die folgenden Beispiele geben Ihnen einige Fingerzeige: •• ET POLICY: Ausgehendes unverschlüsseltes Base64-HTTP-Passwort für einfache Authentifizierung erkannt •• OS-WINDOWS SMB NTLM: Versuchte Einrichtung einer NULL-Sitzung •• EXPLOIT KIT: Jar-Datei mit Explooit-Kit Blackholev2 heruntergeladen 294 9 Signaturgestützte Erkennung mit Snort und Suricata Signatur-ID (sid): Hiermit werden die Regeln eindeutig bezeichnet. Jede Regel muss über eine eindeutige SID verfügen. SIDs sind einfache Zahlen, wobei jedoch einige Bereiche reserviert sind: •• 0–1.000.000: Reserviert für Sourcefire VRT •• 2.000.000–2.999.999: Verwendet von Emerging Threats •• 3.000.000+: Zur öffentlichen Benutzung Um Konflikte zu vermeiden, sollten Sie daher SIDs über 3.000.000 verwenden und eine Liste der auf Ihren Sensoren verwendeten SIDs führen. Revision (rev): Mit der Revisionsoption kennzeichnen Sie Änderungen an Regeln. Wenn Sie eine Regel neu erstellen, weisen Sie ihr rev:1 zu, um anzugeben, dass es sich um die erste Version handelt. Bei einer Änderung der Regel weisen Sie keine neue SID zu, sondern erhöhen lediglich die Revisionsnummer. Wenn Snort oder Suricata zwei Regeln mit identischer SID finden, wenden sie diejenige mit der höheren Revisionsnummer an. Verweis (reference): Mit dem Schlüsselwort reference können Sie externe Quellen für zusätzliche Kontextinformationen angeben. Gewöhnlich wird dabei einfach ein URL genannt: alert tcp $HOME_NET any ->$EXTERNAL_NET $HTTP_PORTS (msg:"ET CURRENT _EVENTS FakeAlert/FraudPack/FakeAV/Guzz/Dload/Vobfus/ZPack HTTP Post 2"; flow:established,to_server; content:"POST"; http_method; content:"/ perce/"; nocase; http_uri; content:"/qwerce.gif"; nocase; http_uri; content:"data="; nocase; reference:url,threatinfo.trendmicro. com/vinfo/virusencyclo/default5.asp?VName=TROJ_AGENT. GUZZ&VSect=T; reference:url,www.threatexpert.com/threats/trojanfraudpacksd6.html; reference:url,vil.nai.com/vil/content/v_157489. htm; reference:url,doc.emergingthreats.net/2010235; classtype:trojanactivity; sid:2010235; rev:6;) Diese Regel dient dazu, verschiedene Arten von Malware zu erkennen, die ähnliche HTTPPOST-Anforderungen an einen Remoteserver stellen. Sie enthält vier Verweise auf weitere Informationsquellen: •• reference:url,threatinfo.trendmicro.com/vinfo/virusencyclo/default5. asp?VName=TROJ_AGENT.GUZZ&VSect=T; •• reference:url,www.threatexpert.com/threats/trojan-fraudpack-sd6.html; •• reference:url,vil.nai.com/vil/content/v_157489.htm; •• reference:url,doc.emergingthreats.net/2010235; Verweise werden in folgendem Format angegeben: reference: <Verweistyp>,<Verweis> 9.6 IDS-Regeln 295 Die verschiedenen Verweistypen werden in der Datei reference.config definiert. Sie wird sowohl in Snort als auch in Suricata verwendet, und in beiden Produkten können Sie den Namen und den Speicherort dieser Datei ändern. In Security Onion befindet sie sich in ­/etc/nsm/<Sensorname>/reference.config. Ein Beispiel dieser Datei sehen Sie in Abb. 9.21. Die Verweistypen definieren Sie dort mit der folgenden Syntax: config reference: <Verweistyp> <Verweispräfix> Der Verweistyp ist ein einzelnes Wort, das Sie für diese Art von Verweis verwenden möchten. Mit dem Präfix können Sie einen URL-Wert zuweisen, der dem in der Regel angegebenen Verweis vorangestellt wird. Das hilft dabei, Regeln einheitlich zu gestalten, und bietet zusätzliche Möglichkeiten für grafische Front-Ends: Analytiker können dann einfach auf den Verweis klicken und werden direkt zum Ziel umgeleitet. Betrachten Sie als Beispiel folgenden URL-Verweis: reference:url,vil.nai.com/vil/content/v_157489.htm; Der vollständige Verweis lautet: http://url,vil.nai.com/vil/content/v_157489.htm Abbildung 9.21: Ein Beispiel der Datei reference.config 296 9 Signaturgestützte Erkennung mit Snort und Suricata Mit anderen Verweistypen können Sie diese Funktion sogar noch nutzbringender anwenden. Betrachten Sie beispielsweise die folgende Regel zur Entdeckung eines versuchten NTPDX-Überlaufs: alert udp $EXTERNAL_NET any ->$HOME_NET 123 (msg:"GPL EXPLOIT ntpdx overflow attempt"; dsize:>128; reference:bugtraq,2540; reference: cve,2001-0414; classtype:attempted-admin; sid:2100312; rev:7;) Hier werden zwei Verweise angegeben, bugtraq und cve. In der Datei reference.config aus Abb. 9.21 können Sie erkennen, dass diese beiden Typen besondere URL-Präfixe verwenden, die ein rasches Nachschlagen der Daten erlauben: config reference: bugtraq http://www.securityfocus.com/bid/ config reference: cve http://cve.mitre.org/cgi-bin/cvename.cgi?name= Mit dieser Konfiguration ergeben sich für SID 2100312 letztendlich folgende Verweise: •• http://www.securityfocus.com/bid/2540 •• http://cve.mitre.org/cgi-bin/cvename.cgi?name=2001-0414 Die Möglichkeit, nicht nur den Typ und den Wert des Verweises anzugeben, kann zu einer starken Verkürzung der Regel beitragen, sodass sie sich leichter bearbeiten und verwalten lässt. Mit selbst gestalteten Verweistypen gewinnen Sie sehr viel Flexibilität für die Aufnahme von Kontextinformationen in Ihre Regeln. Priorität (priority): Mit dieser Option können Sie explizit eine Priorität für die Regel angeben, was Analytikern dabei hilft, ihre Zeit bei der Untersuchung von Alarmen besser einzuteilen. Als Werte sind beliebige Integerzahlen möglich, allerdings werden in den meisten öffentlichen Regelsätzen nur die Werte 1 bis 10 verwendet, wobei 1 für die höchste und 10 für die niedrigste Priorität steht. Für diese Option verwenden Sie folgende Syntax: priority:<Wert>; Wenn Sie die Regel einer Klasse zuordnen, erhält sie normalerweise die in classification. config angegebene Standardpriorität. Haben Sie allerdings mit priority ausdrücklich eine Priorität vergeben, verwendet Snort diesen Wert. Klassifizierung (classtype): Mit der Klassifizierungsoption können Sie Regeln auf der Grundlage der Art von Aktivität, die erkannt werden soll, in Kategorien einteilen. Die folgende Regel zeigt, wie Sie diese Option einsetzen: 9.6 IDS-Regeln 297 alert tcp $HOME_NET any ->$EXTERNAL_NET $HTTP_PORTS (msg:"ET CURRENT_ EVENTS Potential Fast Flux Rogue Antivirus (Setup_245.exe)"; flow: established,to_server; content:"GET"; nocase; http_method; content:"/ Setup_"; nocase; http_uri; content:".exe"; nocase; http_uri; pcre:"/\/Setup_\d+\.exe$/Ui"; reference:url,www.malwareurl.com/list ing.php?domain=antivirus-live21.com; classtype:trojan-activity; sid:2012392; rev:3;) Die Klassifizierung geben Sie mit der folgenden Syntax an: classtype:<Klassenname>; Sowohl Snort als auch Suricata beziehen die Klassennamen aus der Datei classification. config. Name und Pfad dieser Datei lassen sich in snort.conf und suricata.yaml einstellen. In Security Onion befindet sie sich in /etc/nsm/<Sensorname>/classification.org. Einträge in dieser Datei müssen das folgende Format aufweisen: config classification: <Klassenname>,<Beschreibung>,<Standardpriorität> Der Klassenname ist die Bezeichnung, die auch in der Regel verwendet wird. Sie sollte kurz sein und darf keine Leerzeichen enthalten. Die Beschreibung dagegen kann länger ausfallen. Sie dient dazu, nähere Angaben zu der Klasse zu machen. Die Standardpriorität gilt für alle Regeln der Klasse. Im Lieferumfang sowohl von Snort als auch von Suricata sind bereits einige Klassen enthalten. Wenn Sie Regeln von öffentlichen Quellen wie Sourcefire VRT oder Emerging ­Threats herunterladen, ist darin auch eine classification.config-Datei mit allen in den Regeln verwendeten Klassen enthalten. Abb. 9.22 zeigt als Beispiel die Datei classification. config von Security Onion. Im Allgemeinen sollten Sie alle Regeln in irgendeine Form von Klassen einteilen. Wenn Sie eine Methode einsetzen, um sich stets über neu erstellte und veränderte Regeln auf dem Laufenden zu halten, haben Sie wahrscheinlich schon irgendeine Form von Klassifizierung aufgestellt, die Sie auf Ihre IDS-Regeln anwenden können. Sollten Sie dagegen erst mit dem Aufbau einer signaturgestützten Erkennung beginnen, bieten die in Snort und Suricata vorhandenen Klassentypen einen guten Ausgangspunkt. 298 9 Signaturgestützte Erkennung mit Snort und Suricata Abbildung 9.22: Ein Beispiel der Datei classification.config Inhaltsuntersuchung Die einfachste Maßnahme, die Sie im Optionsabschnitt einer IDS-Regel angeben können, ist eine einfache Suche im Inhalt. Mit dem Schlüsselwort content können Sie die IDSEngine anweisen, den Inhalt der Anwendungsschicht (die Payload) nach Paketen mit den angegebenen Daten zu durchsuchen. In Kapitel 13 werden wir uns ausführlicher damit beschäftigen, wie Sie der Engine mitteilen, wo genau die Payload im Paket beginnt. Die gesuchten Daten können als Text, als Binärdaten im Hexadezimalformat oder als eine Mischung aus beidem angegeben werden. Nehmen wir beispielsweise an, Sie wollen den Inhalt eines Pakets nach dem String »evilliveshere« durchsuchen. Dazu geben Sie folgende Option an: content:"evilliveshere"; 9.6 IDS-Regeln 299 Sie können in einer Regel auch mehrere Suchbegriffe angeben. Wie praktisch das ist, werden Sie noch sehen, wenn wir uns weiter hinten mit Inhaltsmodifikatoren und der Suche nach Inhalten an bestimmten Stellen beschäftigen. content:"evillives"; content:"here"; Mit dem Ausrufungszeichen können Sie auch Suchbegriffe ausschließen. Beispielsweise können Sie die folgende Option bei der Erfassung von Anmeldeversuchen einsetzen, um alle außer denen für das Benutzerkonto anonymous zu berücksichtigen: content:"USER"; content:!"anonymous"; Sie können auch nach Binärdaten suchen, indem Sie sie als Hexadezimalzeichen in Betragsstrichen ausdrücken. Um etwa Paketdaten auf das Vorhandensein von JPEG-Dateien zu überprüfen, können wir wie folgt nach dem Vorkommen der »magischen Zahlen« solcher Dateien suchen: content:"|FF D8|" Bei der Inhaltssuche lassen sich String- und Binärdaten auch kombinieren. Im folgenden Beispiel suchen wir nach drei Doppelpunkten, gefolgt vom Text »evilishere« und drei NULL-Bytes: content:"|3A 3A 3A|evilliveshere|00 00 00|"; Bei Inhaltsvergleichen wird stets auf die Groß- und Kleinschreibung geachtet. Inhalte werden an beliebigen Stellen im Paket gefunden. Vorsicht Wenn Sie Inhaltsregeln aufstellen, müssen Sie reservierte Zeichen wie das Semikolon, den umgekehrten Schrägstrich (Backslash) und Anführungszeichen maskieren oder in Hexadezimalform angeben. Modifikatoren für die Inhaltsuntersuchung Es gibt verschiedene Modifikatoren, die Sie hinter dem Suchbegriff angeben können, um zu steuern, wie die IDS-Engine nach Übereinstimmungen in den Netzwerkdaten forscht. Damit können Sie die Genauigkeit von Inhaltssuchen erhöhen und auch die Leistung des Erkennungsprozesses steigern, da Sie der Engine mitteilen, an welcher Stelle sie suchen soll, anstatt sie die komplette Payload sämtlicher Pakete durchforsten zu lassen. 300 9 Signaturgestützte Erkennung mit Snort und Suricata Im Folgenden sehen wir uns einige wichtige Modifikatoren an. Nocase: Normalerweise wird bei der Inhaltssuche zwischen Groß- und Kleinschreibung unterschieden, sodass beispielsweise kein Alarm ausgelöst wird, wenn Sie nach dem Text root suchen, das Paket aber den String ROOT enthält. Um diese Unterscheidung aufzuheben, geben Sie wie folgt den Modifikator nocase an: content:"root"; nocase; Dadurch wird das Wort »root« in jeglicher Schreibweise gefunden. Offset und depth: Mit dem Modifikator offset wird an einer bestimmten Stelle in der Payload des Pakets gesucht, wobei diese Position vom ersten Byte der Payload an gezählt wird. Beachten Sie dabei, dass dieses erste Byte nicht als Byte 1, sondern als Byte 0 gezählt wird. Bei der Angabe offset:0 untersucht die Erkennungsengine daher die Inhalte am Anfang der Payload, bei offset:1 die Inhalte ab dem zweiten Byte. Betrachten Sie als Beispiel das folgende FTP-Paket: 14:51:44.824713 IP 172.16.16.139.57517>67.205.2.30.21: Flags [P.], seq 1:15, ack 27, win 16421, length 14 0x0000: 4510 0036 efe4 4000 4006 4847 ac10 108b E..6..@.@.HG.... 0x0010: 43cd 021e e0ad 0015 0bcb 6f30 fcb2 e53c C.........o0. . .< 0x0020: 5018 4025 2efb 0000 5553 4552 2073 616e P.@%....USER.san 0x0030: 6465 7273 0d0a ders.. Wenn wir eine Regel schreiben wollen, um jeden Versuch eines bestimmten Benutzers zu erkennen, sich mit seinem Benutzernamen an diesem externen FTP-Server anzuwenden, können wir zunächst einmal Folgendes schreiben: alert tcp $HOME_NET any ->67.205.2.30 21 (msg:"Suspicious FTP Login"; content:"sanders"; sid:5000000; rev:1;) Diese Regel löst bei dem gegebenen Paket sicherlich einen Alarm aus, verursacht aber auch viele Fehlalarme. Beispielsweise gibt es auch dann Alarm, wenn sich jemand mit einem anderen Konto an dem FTP-Server anmeldet und dann zu einem Ordner namens sanders wechselt. Um die Suche in dieser Regel einzuengen, geben wir die Position an, ab der der Benutzername in der Payload des Pakets auftauchen soll. Das erste Byte der Payload ist in unserem Fall 0x55, wohingegen das erste Zeichen des Benutzernamens erst beim Offset 5 (0x73) auftritt. (Nicht vergessen, wir beginnen beim Zählen mit null!) Damit können wir die Regel so umschreiben, dass erst ab dieser Position nach dem Benutzernamen gesucht wird: 9.6 IDS-Regeln 301 alert tcp $HOME_NET any ->67.205.2.30 21 (msg:"Suspicious FTP Login" content:"sanders"; offset:5; sid:5000000; rev:1;) Bei dieser neuen Version gibt es nicht nur deutlich weniger Fehlalarme, sie wird auch schneller ausgeführt, da die IDS-Engine weniger Bytes untersuchen muss. Mit dem Modifikator offset können Sie der IDS-Engine nur mitteilen, wo sie mit der Suche nach einem bestimmten Inhalte beginnen soll. Um anzugeben, wo die Suche zu enden hat, verwenden Sie den Modifikator depth. Die Endposition, die Sie dabei angeben, wird ab dem ersten Payloadbyte gezählt, das untersucht wird. Wenn Sie depth ohne offset verwenden, erfolgt die Zählung ab dem ersten Byte der Payload, anderenfalls ab der in offset genannten Position. Damit können wir unsere Snort-Regel für die FTP-Anmeldung noch effizienter gestalten. In der folgenden Version schränken wir die Tiefe auf sieben Bytes ein, also die Länge des Strings, den wir finden wollen. Mit den Modifikatoren offset und depth geben wir damit genau den Bereich an, in dem der gesuchte Text stehen muss. alert tcp $HOME_NET any ->67.205.2.30 21 (msg:"Suspicious FTP Login" content:"sanders"; offset:5; depth:7; sid:5000000; rev:1;) Distance und within: Wie wir bereits gesehen haben, können Regeln auch mehrere Inhaltssuchen enthalten. Dabei ist es natürlich äußerst praktisch, angeben zu können, in welcher Position die gesuchten Inhalte relativ zueinander stehen sollen. Eine Möglichkeit dazu bietet der Modifikator distance, mit dem Sie die Entfernung vom Ende der ersten Übereinstimmung bis zum Beginn des Bereichs angeben können, in dem nach dem zweiten Inhalt gesucht werden soll. Ein Beispiel dafür finden Sie in der folgenden Regel: alert tcp $HOME_NET 1024: ->$EXTERNAL_NET 1024: (msg:"ET P2P Ares Server Connection"; flow:established,to_server; dsize:<70; content:"r|be|bloop|00|dV"; content:"Ares|00 0a|"; distance:16; reference:url,aresgalaxy.sourceforge.net; reference:url,doc.emergingthreats.net/bin/view/Main/2008591; classtype:policyviolation; sid:2008591; rev:3;) Mit dieser Regel werden Aktivitäten im Zusammenhang mit dem Filesharing-Netzwerk Ares aufgedeckt. 1. content:"r|be|bloop|00|dV"; Findet den gesuchten Inhalt an beliebigen Stellen in der Payload. 2. content:"Ares|00 0a|"; distance:16; Sucht mindestens 16 Byte hinter der vorherigen Übereinstimmung nach dem angegebenen Wert. 302 9 Signaturgestützte Erkennung mit Snort und Suricata Diese Regel löst bei der Untersuchung der folgenden Payload einen Alarm aus: 0x0000: 72be 626c 6f6f 7000 6456 0000 0000 0000 r.bloop.dV....... 0x0010: 0000 0000 0000 0000 0000 0000 0000 0000 ................. 0x0020: 4172 6573 000a Ares.. In der folgenden Payload dagegen wird keine Übereinstimmung gefunden, da der zweite Inhalt nicht mindestens 16 Bytes von dem ersten Treffer entfernt ist. Bericht von der Front Ein weit verbreiteter Irrglaube besteht darin, dass Snort oder Suricata die Inhalte in der Reihenfolge suchen, in der sie in der Regel angegeben sind. Wenn es in der Regel beispielsweise heißt: content:eins; content:zwei;, dann gehen viele davon aus, dass die Engine nach Vorkommen dieser Texte in der angegebenen Reihenfolge sucht. Tatsächlich aber findet die Regel nicht nur eine Übereinstimmung in einer Payload mit dem Inhalt einszwei, sondern auch mit zweieins. Um gezielt nach Inhalten in einer bestimmten Reihenfolge zu suchen, können Sie den Modifikator distance mit dem Wert 0 angeben. Dadurch teilen Sie der IDS-Engine mit, dass der zweite Inhalt hinter dem ersten stehen muss, dass der genaue Abstand aber keine Rolle spielt. Wenn wir nach content:eins; content:zwei; distance:0; suchen, finden wir daher nur einszwei, aber nicht zweieins. Ein weiterer Modifikator, der eine Beziehung zwischen mehreren gesuchten Inhalten vorschreibt, ist within. Damit geben Sie die Anzahl der Bytes vom Ende der ersten Übereinstimmung an, innerhalb derer sich die zweite befinden muss. Ein Beispiel dafür sehen Sie in folgender Regel: alert tcp $HOME_NET any ->$EXTERNAL_NET 3724 (msg:"ET GAMES World of Warcraft connection"; flow:established,to_server; content:"|00|"; depth:1; content:"|25 00|WoW|00|"; distance:1; within:7; reference: url,doc.emergingthreats.net/bin/view/Main/2002138; classtype:policyviolation; sid:2002138; rev:9;) Mit dieser Regel werden Verbindungen mit dem Onlinespiel »World of Warcraft« aufgespürt, indem nach zwei bestimmten Inhalten in der richtigen Reihenfolge gesucht wird: 1. content:"|00|"; depth:1; Findet den gesuchten Inhalt im ersten oder zweiten Byte der Payload. 2. content:"|25 00|WoW|00|"; distance:1; within:7; Sucht im Bereich von einem bis sieben Byte hinter der vorherigen Übereinstimmung nach dem zweiten Inhalt. 9.6 IDS-Regeln 303 Diese Regel löst bei folgender Payload einen Alarm aus: 0x0000: 0000 2500 576f 5700 0000 0000 0000 0000 ...WoW........... 0x0010: 0000 0000 0000 0000 0000 0000 0000 0000 ................. Bei der folgenden Payload dagegen erfolgt kein Alarm, da der zweite Inhalt außerhalb des von distance und within angegebenen Bereichs liegt: 0x0000: 0000 0000 0000 0000 2500 576f 5700 0000 ..........WoW.... 0x0010: 0000 0000 0000 0000 0000 0000 0000 0000 ................. HTTP-Inhaltsmodifikatoren: Am häufigsten werden Sie Regeln zur Untersuchung von HTTP-Datenverkehr schreiben, da dieses Protokoll ausgiebig für legitimen Datenverkehr genutzt wird und Angreifer oft versuchen, schädliche Aktivitäten darin zu verstecken. Mit den bis jetzt besprochenen Inhaltsmodifikatoren können wir zwar verdächtige Aktionen in HTTP-Datenverkehr erfolgreich aufspüren, allerdings ist diese Vorgehensweise ein bisschen mühselig. Betrachen Sie beispielsweise das folgende HTTP-Paket: 11:23:39.483578 IP 172.16.16.139.64581>67.205.2.30.80: Flags [P.], seq 1:806, ack 1, win 16384, length 805 0x0000: 4500 034d 532b 4000 4006 e1f9 ac10 108b E..MS+@.@....... 0x0010: 43cd 021e fc45 0050 2b1e 34a5 9140 5480 C....E.P+.4..@T. 0x0020: 5018 4000 5334 0000 4745 5420 2f20 4854 P.@.S4..GET./.HT 0x0030: 5450 2f31 2e31 0d0a 486f 7374 3a20 7777 TP/1.1..Host:.ww 0x0040: 772e 6170 706c 6965 646e 736d 2e63 6f6d w.appliednsm.com 0x0050: 0d0a 436f 6e6e 6563 7469 6f6e 3a20 6b65 ..Connection:.ke 0x0060: 6570 2d61 6c69 7665 0d0a 4163 6365 7074 ep-alive..Accept 0x0070: 3a20 7465 7874 2f68 746d 6c2c 6170 706c :.text/html,appl 0x0080: 6963 6174 696f 6e2f 7868 746d 6c2b 786d ication/xhtml+xm 0x0090: 6c2c 6170 706c 6963 6174 696f 6e2f 786d l,application/xm 0x00a0: 6c3b713d302e392c2a2f2a3b713d302el;q=0.9,*/*;q=0. 0x00b0: 380d 0a55 7365 722d 4167 656e 743a 204d 8..User-Agent:.M 0x00c0: 6f7a 696c 6c61 2f35 2e30 2028 4d61 6369 ozilla/5.0.(Maci 0x00d0: 6e74 6f73 683b 2049 6e74 656c 204d 6163 ntosh;.Intel.Mac 0x00e0: 204f 5320 5820 3130 5f38 5f34 2920 4170 .OS.X.10_8_4).Ap 0x00f0: 706c 6557 6562 4b69 742f 3533 372e 3336 pleWebKit/537.36 0x0100: 2028 4b48 544d 4c2c 206c 696b 6520 4765 .(KHTML,.like.Ge 0x0110: 636b 6f29 2043 6872 6f6d 652f 3238 2e30 cko).Chrome/28.0 0x0120: 2e31 3530 302e 3935 2053 6166 6172 692f .1500.95.Safari/ 0x0130: 3533 372e 3336 0d0a 4163 6365 7074 2d45 537.36..Accept-E 0x0140: 6e63 6f64 696e 673a 2067 7a69 702c 6465 ncoding:.gzip,de 0x0150: 666c 6174 652c 7364 6368 0d0a 4163 6365 flate,sdch..Acce 0x0160: 7074 2d4c 616e 6775 6167 653a 2065 6e2d pt-Language:.en0x0170: 5553 2c65 6e3b 713d 302e 380d 0a43 6f6f US,en;q=0.8.. 304 9 Signaturgestützte Erkennung mit Snort und Suricata Wenn wir die Domäne appliednsm.com für schädlich halten, können wir eine IDS-Regel schreiben, die erkennt, wenn Benutzer versuchen, diese Website in ihren Browsern aufzusuchen. Mit den Optionen, die wir bisher kennengelernt haben, würde die Regel wie folgt aussehen: alert tcp $HOME_NET any ->$EXTERNAL_NET any (msg:"Evil Domain www.appliednsm. com"; content:"GET "; offset:0; depth:4; content:"Host|3a 20|www.appliednsm. com"; distance:0; sid:5000000; rev:1;) Dabei geschieht Folgendes: 1. content:"GET "; offset:0; depth:4; Sucht den angegebenen Inhalt im Bereich zwischen dem Anfang der Payload und dem vierten Byte. 2. content:"Host|3a 20|www.appliednsm.com"; distance:0; Sucht den angegebenen Inhalt hinter der ersten Übereinstimmung. Das funktioniert zwar, aber es gibt eine bessere Methode. Sowohl Snort als auch Suricata können den HTTP-Stream wieder zusammensetzen und bieten einige Regelmodifikatoren, mit denen sich für diese Art von Datenverkehr viel effizientere Regeln schreiben lassen. Unsere vorherige Regel können wir mit den Modifikatoren http_method und http_uri wie folgt umschreiben: alert tcp $HOME_NET any ->$EXTERNAL_NET any (msg:"Evil Domain www.appliednsm. com"; content:"GET"; http_method; content:"www.appliednsm.com"; http_uri; sid:5000000; rev:1;) Diese Regel bewirkt genau das Gleiche wie die vorherige Version, lässt sich aber viel leichter schreiben und erfüllt ihre Aufgabe auf effizientere Weise. Außer den beiden hier verwenden HTTP-Modifikatoren gibt es mehrere andere. Die gebräuchlichsten sind in Tabelle 9.1 aufgeführt. Tabelle 9.1: HTTP-Regelmodifikatoren HTTP-Modifikator Beschreibung http_client_body Inhalt im Rumpf einer HTTP-Clientanforderung http_cookie Inhalt im HTTP-Headerfeld »Cookie« http_header Inhalt irgendwo im Header einer HTTP-Anforderung oder -Antwort http_method Die vom Client verwendete HTTP-Methode (GET, POST usw.) 9.6 IDS-Regeln 305 HTTP-Modifikator Beschreibung http_uri Inhalt im URI der HTTP-Clientanforderung http_stat_code Inhalt im HTTP-Statusfeld der Serverantwort http_stat_message Inhalt in der HTTP-Statusmeldung der Serverantwort http_encode In der HTTP-Transaktion verwendete Kodierung Perl-kompatible reguläre Ausdrücke (PCRE): Es kann Situationen geben, in denen es nicht möglich ist, mit den von der IDS-Engine bereitgestellten Konstrukten die passenden Regeln zu schreiben. In solchen Fällen können Sie Perl-kompatible reguläre Ausdrücke verwenden. Sie sind sehr vielseitig, und ihre Syntax erlaubt es, nach allen möglichen Arten von Inhalten zu suchen, die Sie finden müssen. Solche regulären Ausdrücke können sehr einfach sein, etwa wie in der Beispielregel, die Kreditkartennummern erkennt: alert ip any any ->any any (msg:"ET POLICY SSN Detected in Clear Text (dashed)"; pcre:"/ ([0-6]\d\d|7[0-256]\d|73[0-3]|77[0-2])-\d{2}-\d{4} /"; reference:url,doc.emergingthreats.net/2001328; classtype:policy-violation; sid:2001328; rev:13;) Sie können jedoch auch beliebig kompliziert werden wie in der folgenden Regel, die schädliche Java-Abfragen nach dynamischen DNS-Domänen erkennt: alert tcp $HOME_NET any ->$EXTERNAL_NET $HTTP_PORTS (msg:"ET CURRENT _EVENTS SUSPICIOUS Java Request to ChangeIP Dynamic DNS Domain"; flow:to_ server,established; content:" Java/1."; http_header; pcre:"/^Host\x3a\ x20[Ë„\r\n]+\.(?:m(?:y(?:p(?:op3\.(?:net|org)|icture\.info)|n(?:etav\. (?:net|org)|umber\.org)|(?:secondarydns|lftv|03)\.com|d(?:ad\.info|dns\. com)|ftp\.(?:info|name)|www\.biz|z\.info)|(?:r(?:b(?:asic|onus)|(?:slov|fac) e)|efound)\.com|oneyhome\.biz)|d(?:yn(?:amic(?:dns\.(?:(?:org|co|me)\. uk|biz)|-dns\.net)|dns\.pro|ssl\.com)|ns(?:(?:-(?:stuff|dns)|0[45]|et|rd)\. com|[12]\.us)|dns\.(?:m(?:e\.uk|obi|s)|info|name|us)|(?:smtp|umb1)\.com|hcp\. biz)|(?:j(?:u(?:ngleheart|stdied)|etos|kub)|y(?:ou(?:dontcare|rtrap)|gto)|4 (?:mydomain|dq|pu)|q(?:high|poe)|2(?:waky|5u)|z(?:yns|zux)|vizvaz|1dumb)\. com|s(?:e(?:(?:llclassics|rveusers?|ndsmtp)\.com|x(?:idude\. com|xxy\.biz))|quirly\.info|sl443\.org|ixth\.biz)|o(?:n(?:mypc\. (?:info|biz|net|org|us)|edumb\.com)|(?:(?:urhobb|cr)y|rganiccrap|tzo)\. com)|f(?:ree(?:(?:ddns|tcp)\.com|www\.(?:info|biz))|a(?:qserv|rtit)\. com|tp(?:server|1)\.biz)|a(?:(?:(?:lmostm|cmeto)y|mericanunfinished)\. com|uthorizeddns\.(?:net|org|us))|n(?:s(?:0(?:1\.(?:info|biz|us)|2\. (?:info|biz|us))|[123]\.name)|inth\.biz)|c(?:hangeip\. (?:n(?:ame|et)|org)|leansite\.(?:info|biz|us)|ompress\. to)|i(?:(?:t(?:emdb|saol)|nstanthq|sasecret|kwb)\.com|ownyour\. 306 9 Signaturgestützte Erkennung mit Snort und Suricata (?:biz|org))|p(?:ort(?:relay\.com|25\.biz)|canywhere\.net|roxydns\. com)|g(?:r8(?:domain|name)\.biz|ettrials\.com|ot-game\.org)|l(?:flink(?:up\. (?:com|net|org)|\.com)|ongmusic\.com)|t(?:o(?:ythieves\.com|h\. info)|rickip\.(?:net|org))|x(?:x(?:xy\.(?:info|biz)|uz\.com)|24hr\. com)|w(?:ww(?:host|1)\.biz|ikaba\.com|ha\.la)|e(?:(?:smtp|dns)\.biz|zua\. com|pac\.to)|(?:rebatesrule|3-a)\.net|https443\.(?:net|org)|bigmoney\.biz)(\ x3a\d{1,5})?\r$/Hmi”; classtype:bad-unknown; sid:2016581; rev:1;) Wie Sie in diesen Regelbeispielen sehen, können Sie einen solchen regulären Ausdruck mit folgender Syntax in eine Regel einfügen: pcre:<regulärer Ausdruck>; Das Schreiben von regulären Ausdrücken können wir in diesem Buch nicht erklären. Es gibt jedoch eine Reihe von Online-Tutorials, die Ihnen den Start erleichtern. Wenn Sie nach einem ausführlicheren Lehrbuch suchen, kann ich Ihnen je nach Kenntnisstand »Einstieg in reguläre Ausdrücke« von Michael Fitzgerald und »Reguläre Ausdrücke« von Jeffrey E. F. Friedl empfehlen. Kommunikationsfluss Sowohl in Snort als auch in Suricata können Sie Regeln schreiben, die den Kommunikationsfluss des Netzwerkverkehrs über das Protokoll TCP berücksichtigen. Da bereits im Regelheader die Quell- und Zieladressen und -ports angegeben sind, mag das redundant erscheinen, aber das ist nicht der Fall. Die Informationen im Header besagen, in welche Richtung der Datenverkehr verläuft (eingehend oder ausgehend), aber sie geben nicht zwangsläufig an, wer für welchen Teil dieser Kommunikation verantwortlich ist. Um zu verstehen, wie die Flussoptionen funktionieren und warum sie so wichtig sind, müssen wir uns vor Augen führen, wie eine TCP-Sitzung abläuft. In einer solchen Sitzung kommuniziert ein Client mit einem Server. Der Client löst die Kommunikation aus, indem er ein SYN-Paket an den Port sendet, an dem der Server lauscht. Darauf antwortet der Server mit einem SYN/ACK-Paket. Wenn der Client dieses Paket empfangt, antwortet er wiederum mit einem ACK-Paket. Damit ist der Drei-Wege-Handshake abgeschlossen, sodass der Client und der Server miteinander kommunizieren können, bis einer der beiden die Verbindung abbricht – entweder abrupt durch ein RST-Paket oder auf sauberere Weise durch eine Folge von FIN-Paketen, was als »TCP-Teardown« bezeichnet wird. In Kapitel 13 sehen wir uns diesen Vorgang noch genauer an, aber der hier geschilderte Ablauf bildet die Grundlage einer TCP-Sitzung. Flussregeloptionen bestehen selbst aus mehreren Optionen, die in drei Kategorien fallen: Zustandsoptionen, Richtungsoptionen und Streamoptionen. Angegeben werden sie im folgenden Format, wobei eine Option erforderlich ist und die restlichen nach Belieben hinzugefügt werden können: 9.6 IDS-Regeln 307 flow: <Option>,<Option>,<Option>; Die beiden möglichen Zustandsoptionen sind established und stateless. Bei established werden nur Übereinstimmungen gefunden, wenn eine TCP-Sitzung eingerichtet ist, bei stateless erfolgt die Suche unabhängig vom Vorhandensein einer solchen Verbindung. Es gibt vier Richtungsoptionen: •• •• •• •• to_server: Datenverkehr vom Client zum Server from_server: Datenverkehr vom Server zum Client to_client: Datenverkehr vom Server zum Client from_cleint: Datenverkehr vom Client zum Server Hinweis für Analytiker Ist Ihnen aufgefallen, dass die beiden Optionen to_server und from_client sowie die Optionen to_client und from_server jeweils identisch sind? Keine Angst, Sie haben sich nicht verlesen, und dies sind auch keine Druckfehler. Diese Optionen sind tatsächlich paarweise identisch. Die unterschiedlichen Varianten gibt es, um Regeln verständlicher zu gestalten. Die beiden letzten Optionen sind no_stream und only_stream. Damit wird angegeben, ob sich die gesuchten Daten in einem wieder zusammengesetzten Stream oder in einem einzelnen Paket befinden. Als Beispiel für die Verwendung von Flussoptionen sehen wir uns die folgende Regel an: alert tcp $HOME_NET any ->$EXTERNAL_NET 5222 (msg:"GPL CHAT MISC Jabber/ Google Talk Outgoing Traffic"; flow:to_server,established; content:"<stream"; nocase; reference:url,www.google.com/talk/; classtype:policy-violation; sid:100000230; rev:2;) Mit dieser Regel wird eine Authentifizierung an einem Chatserver für Jabber oder Google Talk erkannt. Die Option zur Inhaltssuche ist sehr einfach gehalten, aber davor wird noch die Option flow:to_server,established verwendet. Dies sorgt dafür, dass nur fertig aufgebaute TCP-Sitzungen auf Übereinstimmung mit dieser Regel überprüft werden, was die Leistung von Snort bzw. Suricata steigert. Außerdem wird die Genauigkeit der Regel erhöht, da nur Datenverkehr zu dem in der TCP-Sitzung definierten Server erkannt wird. Nicht bei allen Regeln lässt sich die Genauigkeit durch Flussoptionen steigern, allerdings erhöhen die Flussstatusoptionen oft die Leistung. Daher verwende ich sie, wann immer es möglich ist. 308 9 Signaturgestützte Erkennung mit Snort und Suricata Protokollheaderoptionen Snort und Suricata können auch Werte in den Headern der untersuchten Pakete erkennen, darunter fast alle Werte in den Headern der Protokolle ICMP, IP, TCP und UDP. Ich werde hier nicht alle möglichen Werte nennen, da Sie sie auch in der Dokumentation zu Snort bzw. Suricata nachschlagen können, sondern gebe nur einige der Elemente an, die ich häufig nutze: •• TTL: Sucht nach Übereinstimmungen mit dem angegebenen TTL-Wert. Hier kann entweder der genaue Wert genannt werden (mit =) oder ein Vergleich (mit den relationalen Operatoren >, >=, < oder <=). Das ist nützlich, um bestimmte Arten von Betriebssystemen anhand ihres ursprünglichen TTL-Werts zu erkennen. •• dsize: Sucht nach Paketen mit einer Payload der angegebenen Größe. Hier kann entweder der genaue Wert genannt werden (mit =) oder ein Vergleich (mit den relationalen Operatoren >, >=, < oder <=). Das ist nützlich, um die Genauigkeit von Inhaltssuchen zu erhöhen. •• itype: Sucht nach dem ICMP-Typ des angegebenen Werts. •• icode: Sucht nach dem ICMP-Code des angegebenen Werts. •• ip_proto: Sucht nach dem angegebenen IP-Protokoll. Hier können Sie entweder den Protokollnamen (IGMP, GRE usw.) oder die Nummer nennen. 9.6.2 Optimierung von Regeln In Kapitel 7 haben wir uns Techniken angesehen, um die Effektivität von Signaturen mithilfe von Messgrößen wie der Rate von Fehlalarmen und der Genauigkeit zu bestimmen. Wenn die Effektivität nicht ausreicht, können verschiedene Methoden angewandt werden, um sie zu steigern. Manche Methoden verbessern auch die Leistung. Im folgenden sehen wir uns einige empfehlenswerte Vorgehensweisen an, um IDS-Regeln zu optimieren. Ereignisfilterung Manche Regeln lösen von Natur aus eine extrem große Zahl von Alarmen aus. Ein Beispiel dafür ist eine Regel, die eine bestimmte Art von Denial-of-Service-Angriff erkennt. Es ist wichtig, solche Angriffe zu bemerken, aber wenn die Regel bei jedem gesendeten DoSPaket eine Übereinstimmung findet und Sie Tausende dieser Pakete pro Sekunde erhalten, dann werden auch Tausende von Alarmen pro Sekunde ausgelöst, was letzten Endes nicht nur die IDS-Engine, sondern auch die Analytiker überfordert. Die Optionen zur Ereignisfilterung in Snort und Suricata erlauben Ihnen, in Ihren Regeln Schwellenwerte anzugeben, um eine solche explosionsartige Vermehrung von Alarmen zu verhindern. Ereignisfilter werden nicht als Option in die Regel selbst aufgenommen, sondern in die Datei threshold.conf geschrieben. Name und Speicherort dieser Datei lassen sich in snort. conf bzw. suricata.yaml nach Bedarf anpassen. In Security Onion finden Sie diese Datei in /etc/nsm/<Sensorname>/threshold.conf. 9.6 IDS-Regeln 309 Hinweis für Analytiker Früher wurden Ereignisfilter als Schwellenwertoptionen bezeichnet und in die Regel selbst aufgenommen. Zur Zeit der Abfassung dieses Buches wird diese Methode von Snort und Suricata immer noch unterstützt, und es gibt auch noch eine Menge öffentlich verfügbarer Regeln in diesem Format. Die Syntax der beiden Varianten ist identisch. Da in diesem Buch Regeln aus öffentlichen Quellen verwendet werden, kann es sein, dass einige der Beispielregeln noch die alten Schwellenwertoptionen enthalten. Es wird jedoch empfohlen, die neue Methode anzuwenden und Ereignisfilter in die Datei threshold.conf zu schreiben. Es gibt drei Arten von Ereignisfiltern: •• Grenzwert (limit): Während des mit seconds angegebenen Zeitraums werden Alarme nur für die ersten Übereinstimmungen bis zu der in count angegebenen Anzahl ausgelöst. Alle darüber hinausgehenden Alarme werden für den Rest dieses Zeitraums ignoriert. •• Schwellenwert (threshold): Während des mit seconds angegebenen Zeitraums wird nur bei jeder n-ten Übereinstimmung ein Alarm ausgelöst. Der Wert von n ist in count angegeben. •• Beides (both): Löst nach der in count angegebenen Anzahl von Übereinstimmungen im Zeitraum seconds einen einzigen Alarm aus und ignoriert alle weiteren Übereinstimmungen, die in dem Zeitraum noch auftreten. Für Ereignisfilter gilt folgende Syntax: event_filter gen_id<Wert>, sig_id<Wert>, type<limit|threshold|both>, track<by_ src|by_dst>, count<Wert>, seconds<Wert> Dabei werden die folgenden Bestandteile verwendet: •• gen_id: Gibt die Generator-ID der Regel an. •• sig_id: Gibt die Signatur-ID der Regel an. •• type <limit|threshold|both>: Gibt den Typ des anzuwendenden Ereignisfilters nach der vorstehenden Beschreibung an. •• track <by_src|by_dst>: Gibt an, ob die Regelübereinstimmungen nach eindeutiger Quell- oder eindeutiger Zieladresse gezählt werden. •• count: Die Anzahl der Regelübereinstimmungen im angegebenen Zeitraum, die als Grenz- oder Schwellenwert für den Filter herangezogen wird. •• seconds: Der Zeitraum in Sekunden, in dem die Regelübereinstimmungen gezählt werden. 310 9 Signaturgestützte Erkennung mit Snort und Suricata Die folgende Regel zeigt ein Beispiel für die Verwendung von Ereignisfiltern: alert tcp $HOME_NET any ->!$WSUS_SERVERS $HTTP_PORTS (msg:"ET POLICY Windows Update in Progress"; flow:established,to_server; content:"WindowsUpdate-Agent"; http_header; content:"Host|3a|"; http_header; nocase; within:20;pcre:"/User-Agent\x3a[^\n]+Windows-Update-Agent/ i";reference:url,windowsupdate.microsoft.com; reference:url,doc. emergingthreats.net/2002949; classtype:policy-violation; sid:2002949; rev:8;) Mit dieser Regel werden Geräte aufgespürt, die Windows-Aktualisierungen von nicht zugelassenen Updateservern herunterladen. Dabei wird nach einem bestimmten String für den Benutzer-Agent gesucht. Wenn ein Windows-Computer Aktualisierungen bezieht, erscheint dieser String in mehreren Paketen, was dazu führt, dass ein einziger Host eine erhebliche Nummer von Alarmen hervorruft. Bei mehreren Hosts, die dieses Verhalten zeigen, kann die Anzahl der Alarme die Analytiker rasch überfordern. Damit ist diese Regel ein idealer Kandidat für einen Ereignisfilter. Der folgende Filter schafft Abhilfe: event filter gen_id 1,sig_id 2002949,type limit,track by_src,count 1, seconds 300 Dieser Filter zählt alle Ereignisse für eine Quelladresse innerhalb eines Zeitraums von 300 Sekunden. Da es sich um einen Filter vom Typ limit handelt und der Wert von count auf 1 gesetzt ist, wird pro Host nur ein Alarm alle 300 Sekunden ausgelöst. Eine weitere großartige Anwendung von Ereignisfiltern besteht bei Regeln im Zusammenhang mit Scans, die Unmengen von Paketen erzeugen. Wenn für jedes der Pakete, das die Kriterien in der Regel erfüllt, ein Alarm ausgelöst würde, könnten sich die Analytiker vor Alarmen nicht mehr retten. Um Abhilfe zu schaffen, können Sie einen Ereignisfilter einsetzen, sodass die Analytiker von dem Scan informiert werden, ohne ihre Analysekonsole mit Meldungen zu überfluten. Alarme unterdrücken Ich habe schon mehrfach erlebt, dass ein Analytiker viel Arbeit in eine neue Regel gesteckt hat, nur um dann festzustellen, dass ein oder zwei Hosts in seinem Netzwerk Datenverkehr einer Form hervorrufen, die zu einer Menge von Fehlalarmen führt. Das kann ziemlich frustrierend sein und schließlich dazu führen, dass der Analytiker die Regel komplett aufgibt. Das ist aber nicht nötig, denn für solche Fälle gibt es in Snort und Suricata eine Funktion zur Unterdrückung von Alarmen. Damit können Sie eine Regel und eine IPAdresse (bzw. eine Gruppe von IP-Adressen aus einer Variable) angeben, sodass Alarme aufgrund dieser Hosts und dieser Regel unterdrückt werden. 9.6 IDS-Regeln 311 Auch die Einträge dafür werden in der Datei threshold.conf vorgenommen, und zwar im folgenden Format: suppress gen_id<Wert>,sig_id<Wert>,track<by_src|by_dst>,ip<Wert> Dabei werden folgende Optionen verwendet: •• gen_id: Gibt die Generator-ID der Regel an. •• sig_id: Gibt die Signatur-ID der Regel an. •• track <by_src|by_dst>: Gibt an, ob die Alarme aufgrund von Datenverkehr von einer Quell- oder zu einer Zieladresse unterdrückt werden sollen. Diese Angabe ist optional. •• ip<Wert>: Die IP-Adresse, von der Alarme aufgrund der angegebenen Regel unterdrückt werden sollen. Der folgende Eintrag unterdrückt alle Alarme, die ansonsten nach Regel SID 5000000 aufgrund von Datenverkehr von der IP-Quelladresse 192.168.1.100 ausgelöst würden: suppress gen_id 1, sig_id 5000000, track by_src, ip 192.168.1.100 Die Unterdrückung von Alarmen ist eine nützliche Vorgehensweise, um einzelne Hosts, die bei einer bestimmten Regel Fehlalarme auslösen, von dieser Regel auszuschließen. Das sollte Ihre erste Maßnahme ein, bevor Sie die ganze Regel entfernen. Erkennungsfilter In Snort und Suricata können Sie auch Erkennungsfilter einsetzen. Damit legen Sie einen Schwellenwert für die Anzahl der Regelübereinstimmungen fest, die in einem bestimmten Zeitraum auftreten müssen, bevor ein Alarm ausgelöst wird. Erkennungsfilter können für die Quell- und die Zieladresse des Datenverkehrs angewendet werden. Die Erkennungsfilteroption wird im folgenden Format direkt in der Regel angegeben: detection_filter: track<by_src|by_dst>, count<Wert>,seconds<Wert>; Dabei werden folgende Optionen verwendet: •• track <by_src|by_dst>: Gibt an, ob die Regelübereinstimmungen für eine eindeutige Quell- oder eine eindeutige Zieladresse gezählt werden sollen. •• count: Die Anzahl der Regelübereinstimmungen im angegebenen Zeitraum, ab der ein Alarm ausgelöst wird. •• seconds: Der Zeitraum in Sekunden, in dem Regelübereinstimmungen der angegebenen Menge auftreten müssen, damit ein Alarm ausgelöst wird. 312 9 Signaturgestützte Erkennung mit Snort und Suricata Die folgende Regel zeigt ein Beispiel für die Verwendung von Erkennungsfiltern: alert tcp $EXTERNAL_NET any ->$HTTP_SERVERS $HTTP_PORTS (msg:"ET SCAN Sqlmap SQL Injection Scan"; flow:to_server,established; content:"User-Agent|3a| sqlmap"; fast_pattern:only; http_header; detection_filter:track by_dst, count 4, seconds 20; reference:url,sqlmap.sourceforge.net; reference:url,doc. emergingthreats.net/2008538; classtype:attempted-recon; sid:2008538; rev:8;) Diese Regel dient dazu, Scans durch das Tool Sqlmap aufzudecken, das zum Aufspüren von Anfälligkeiten für SQL-Injektionsangriffe und zu deren Ausnutzung eingesetzt wird. Hier wird nach Übereinstimmungen mit dem von Sqlmap verwendeten Benutzer-Agent gesucht. Da Scans durch Sqlmap normalerweise sehr umfangreich sind, deutet es nicht auf einen Scanangriff hin, wenn dieser Benutzer-Agent nur ein- oder zweimal in Erscheinung tritt. Daher könnte es zu einer erheblichen Menge von Fehlalarmen führen, wenn bei jeder Übereinstimmung ein Alarm ausgelöst würde. Daher enthält die Regel den folgenden Erkennungsfilter: detection_filter:track by_dst, count 4, seconds 20; Bevor die Erkennungsengine aufgrund dieser Regel einen Alarm auslöst, muss also erst der angegebene Schwellenwert überschritten sein. Dazu zählt die Engine die Anzahl der Regelübereinstimmungen für die Zieladresse, und wenn im Zeitraum von 20 Sekunden mehr als vier solcher Übereinstimmungen auftreten, erfolgt ein Alarm. Ereignisfilter eignen sich für viele verschiedene Situationen. Im Allgemeinen werden sie angewendet, wenn ein geringes Vorkommen der gesuchten Inhalte noch nichts Schlechtes bedeutet, ein massives Auftreten aber auf ein Problem hindeutet. Beispielsweise kann es häufig vorkommen, dass ein Benutzer sich an einem Webdienst anzumelden versucht und ein oder zwei Fehlschläge erleidet, weil er das Passwort falsch eingegeben hat. Wenn jedoch innerhalb weniger Minuten mehrere hundert Anmeldeversuche an einem Webdienst erfolgen, dann deutet das auf den Versuch hin, das Passwort mit einem Brute-Force-Angriff zu erraten, was eine weitergehende Untersuchung dringend erforderlich macht. Unerwünschten Datenverkehr ausschließen Nach einem weit verbreiteten Irrtum senkt jede Option, die Sie einer Regel hinzufügen, deren Leistung. In Wirklichkeit ist das Gegenteil der Fall: Wenn Sie eine IDS-Regel um Optionen ergänzen, die die Menge des von der Engine zu durchsuchenden Datenverkehrs verringern, dann steigern Sie die Leistung der Regel. Daher sollten Sie Ihr Möglichstes tun, um solche Optionen hinzuzufügen. Dazu bieten sich unter anderem folgende Maßnahmen an: 9.6 IDS-Regeln 313 •• Verwenden Sie nach Möglichkeit Protokollheaderoptionen. Die Erkennungsengine schaut sich erst die Header und dann die Payload des Pakets an. Daher können Sie wertvolle Verarbeitungszyklen einsparen, wenn Sie Pakete schon vor der Inhaltsuntersuchung ausschließen. •• Setzen Sie das Schlüsselwort any im Regelheader nicht verschwenderisch ein. Wenn Sie die Regel auf einen einzelnen Host oder eine Gruppe von Hosts einschränken können, verringert das auch die Menge an Datenverkehr, den die IDS-Engine verarbeiten muss. •• Bezeichnen Sie immer möglichst genau die Stelle, an der der gesuchte Inhalt zu finden sein soll. Wenn Sie beispielsweise wissen, dass der Inhaltsstring, nach dem Sie Ausschau halten, immer an derselben Position in der Payload auftritt, dann nutzen Sie die Optionen offset und depth, damit die Engine nicht den kompletten Inhalt des Pakets absucht. •• Schränken Sie die Suche auf Pakete einer bestimmten Größe ein. Wenn Sie zwar nicht die genaue Position des gesuchten Inhalts kennen, aber wissen, dass er immer in Paketen einer bestimmten Größe auftritt, dann können Sie die Option dsize nutzen, damit die Engine nur Pakete mit diesem Umfang untersucht, was die Leistung steigert. •• Verwenden Sie immer Flussoptionen, wenn es möglich ist. Wenn der gesuchte Datenverkehr nur in eingerichteten Verbindungen zum Server auftritt, dann kann sie jeglichen anderen Datenverkehr von der Verarbeitung ausschließen. Das kann zu einer erheblichen Leistungssteigerung führen. •• Wählen Sie im Regelheader möglichst genau das Protokoll aus. Wenn Sie TCP oder UDP statt einfach nur IP angeben, wird die Anzahl der Pakete, die die Erkennungs­ engine verarbeiten muss, erheblich reduziert. Regeln für Schwachstellen schreiben Oft ist es zum Schutz gegen die Ausnutzung eines Dienstes am einfachsten, Regeln zu schrei­ben, die gezielt bestimmte Arten von Exploits erkennen. Allerdings bleiben bei dieser Vorgehensweise viele Angriffe unbemerkt. Die Regel spürt zwar den Exploit auf, für den sie geschrieben wurde, übersieht aber andere Exploits, die dieselbe Schwachstelle ausnutzen. Daher ist es besser, die Regeln auf die Schwachstellen abzustimmen. Stellen Sie sich beispielsweise eine Schwachstelle vor, die durch einen Pufferüberflauf im Eingabefeld einer Netzwerkanwendung ausgenutzt werden kann. Es wäre ganz einfach, eine Regel zu schreiben, die die öffentlich verfügbare Version dieses Exploits erkennt – aber für einen Angreifer wäre es ebenso einfach, den Exploitstring zu ändern und eine andere Auffüllung, anderen Shellcode oder eine andere Payload zu verwenden. Anstatt nach einem String des Exploits zu suchen, sollte Ihre Regel darauf achten, ob das von der Anwendung übermittelte Eingabefeld eine außerordentlich große Zahl von Zeichen enthält. Eine solche Regel lässt sich zwar schwerer schreiben und wird einige Fehlalarme zur Folge haben, kann die Ausnutzung des angreifbaren Dienstes aber viel besser erkennen. Diese Vorgehensweise erfordert mehr Arbeit, erzielt aber bessere Ergebnisse und verringert die Gefahr, dass Ihnen schädliche Aktivitäten durch die Lappen gehen. 314 9 Signaturgestützte Erkennung mit Snort und Suricata PCRE und Inhaltssuche kombinieren Perl-kompatible reguläre Ausdrücke (PCRE) steigern die Flexibilität von IDS-Regeln zwar ins Unermessliche, erhöhen aber auch die Belastung des Systems. Eine Vorgehensweise, um diese Belastung zu verringern, besteht darin, Regeln mit solchen regulären Ausdrücken und Regeln mit Inhaltssuche zu kombinieren. Die Erkennungsengine sucht erst nach einer inhaltlichen Übereinstimmung, damit nur der Datenverkehr, der diese Bedingung erfüllt, der weitergehenden PCRE-Untersuchung unterzogen wird. Betrachten Sie beispielsweise folgende Regel: alert tcp $EXTERNAL_NET any ->$HOME_NET any (msg:"ET TROJAN IRC potential reptile commands"; flow:established,from_server; content:"PRIVMSG|20|"; depth:8; content:"|3a|"; within:30; pcre:"/\. ((testdlls|threads|nsp|speed|uptime|installed|secure|sec|unsecure|unsec| process|ps|rand|exploitftpd|eftpd|flusharp|farp|flushdns|fdn s|resolve|dns|pstore|pst|sysinfo|si|netinfo|ni|driveinfo|di| currentip)\s*[\r\n]|(iestart|ies|login|l|mirccmd|system|file\ s+(cat|exists|e|del|rm|rmdir|move|copy|attrib)|down|dl\dx|update|reg\ s+(query|delete|write))\s+\w+|(banner|ban|advscan|asc|scanall|sa|ntscan|nts)\ s*[\n\r])/i"; reference:url,doc.emergingthreats.net/2002363; classtype:trojanactivity; sid:2002363; rev:15;) Diese Regel erkennt die Gegenwart des Malware-Stamms »Reptile«, wenn dieser versucht, Befehle über IRC auszuführen. Sie enthält zwar einen sehr CPU-intensiven regulären Ausdruck, aber auch zwei Inhaltssuchen: 1. content:"PRIVMSG|20|"; depth:8; 2. content:"|3a|"; within:30; Damit wird dafür gesorgt, dass die IDS-Engine nur solche Pakete auf Übereinstimmung mit dem regulären Ausdruck untersucht, bei denen bereits festgestellt wurde, dass sie zum IRC-Datenverkehr gehören. Schnelle Mustersuche Wenn eine Regel mehrere Inhaltssuchen umfasst, versuchen Snort und Suricata, als Erstes den spezifischsten String zu finden, sodass sie die Verarbeitung abbrechen können, wenn sie dabei keine Übereinstimmung finden. Standardmäßig wird daher als Erstes nach dem längsten String gesucht, weil die Engine davon ausgeht, dass dies der spezifischste ist. Diese Vorgehensweise zeigt zwar gewöhnlich die erwünschte Wirkung, bewährt sich aber nicht in allen Fällen. Daher gibt es in Snort und Suricata einen Modifikator für die schnelle Mustersuche. Angegeben wird er für kürzere Suchstrings, damit die Erkennungsengine als Erstes versucht, eine Übereinstimmung damit zu finden. 9.6 IDS-Regeln 315 Die folgende Regel gibt ein Beispiel für die Verwendung dieses Modifikators: alert tcp $EXTERNAL_NET any ->$HOME_NET $HTTP_PORTS (msg:"ET SCAN Nessus User Agent"; flow: established,to_server; content:"User-Agent|3a|"; http_header; nocase; content:"Nessus"; http_header; fast_pattern; nocase; pcre:"/^UserAgent\:[^\n]+Nessus/Hmi"; threshold: type limit, track by_src,count 1, seconds 60; reference:url,www.nessus.org; reference:url,doc.emergingthreats. net/2002664; classtype:attempted-recon; sid:2002664; rev:12;) Diese Regel enthält zwei Inhaltssuchen: 1. content:"User-Agent|3a|"; http_header; nocase; 2. content:"Nessus"; http_header; fast_pattern; nocase User-Agent|3a| ist zwar der längste String, aber sicherlich nicht der exklusivste, da er auch im Standardheader von HTTP-Clientanforderungen zu finden ist. Daher ist es sinnvoll, zuerst nach Nessus zu suchen, obwohl dieser String kürzer ist. Daher ist bei dieser Option der Modifikator fast_pattern angegeben. Hinweis für Analytiker Der Modifikator für die schnelle Mustersuche kann in einer Regel immer nur einmal eingesetzt werden. Darüber hinaus ist es nicht möglich, ihn mit den HTTP-Inhaltsmodifikatoren http_cookie, http_raw_uri, http_raw_header, http_ raw_cookie, http_method, http_stat_code, http_stat_msg zu kombinieren. Regeln manuell testen Nachdem Sie eine Regel geschrieben haben, müssen Sie sie gründlich testen. Die Überprüfung der Regelsyntax haben wir uns bereits angesehen, aber das ist nur ein Schritt des gesamten Vorgangs. Sie müssen sich auch vergewissern, das die Regel den Datenverkehr entdeckt, den sie finden soll, aber keinen anderen. Angriffe oder andere schädliche Aktivitäten nachzustellen, kann sehr viel Zeit erfordern, aber zum Glück gibt es einige alternative Vorgehensweisen. Wenn Analytiker eine Regel auf der Grundlage eines früheren Vorfalls schreiben und noch über eine Aufzeichnung der betreffenden Pakete verfügen, können Sie diese an der Überwachungsschnittstelle eines Sensors wiedereinspielen, um auszuprobieren, ob dabei ein Alarm ausgelöst wird. (Bei neuen Regeln sollte das vorzugsweise auf einem Testrechner mit der IDS-Engine geschehen.) Eine gute Möglichkeit, erfasste Pakete live an einer Schnittstelle einzuspielen, bietet Tcpreplay. Ein Beispiel dafür sehen Sie in Abb. 9.23. Mehr über Tcpreplay erfahren Sie auf http://tcpreplay.synfin.net/wiki/tcpreplay. 316 9 Signaturgestützte Erkennung mit Snort und Suricata Abbildung 9.23: Wiedereinspielen einer PCAP-Datei an einer Schnittstelle mithilfe von Tcpreplay Falls Sie keine Datei mit zuvor erfassten Daten für die Aktivität haben, für die die Regel da ist, können Sie Scapy einsetzen, um manuell Datenverkehr zu generieren. Scapy ist eine vielseitige Python-Bibliothek, mit der sie Pakete erzeugen und empfangen können. Dieses Werkzeug ist für Analytiker wirklich äußerst wertvoll, allerdings werden wir es in diesem Buch nicht im Einzelnen behandeln. Das folgende Beispiel zeigt ein sehr einfaches Python-Skript, das Scapy nutzt, um ein TCP-Paket mit der Payload AppliedNSM über Port 80 an den Host 192.168.1.200 zu senden.: ip=IP() ip.dst="192.168.1.200" ip.src="192.168.1.100" tcp=TCP() tcp.dport=80 tcp.sport=1234 payload="AppliedNSM" send(ip/tcp/payload) Mehr über Scapy erfahren Sie auf http://www.secdev.org/projects/scapy/. 9.7 Snort- und Suricata-Alarme anzeigen Nachdem Sie die IDS-Engine Ihrer Wahl auf einem Sensor eingerichtet und IDS-Regeln erstellt oder heruntergeladen haben, können Sie sich zurücklehnen und darauf warten, dass Alarm ausgelöst wird. Es ist zwar möglich, diese Alarme direkt auf dem Sensor und in den von Snort bzw. Suricata erstellten Dateien zu lesen, aber meistens wird ein grafisches Tool eines Drittanbieters verwendet, um diesen Vorgang zu erleichtern. Zur Anzeige 9.7 Snort- und Suricata-Alarme anzeigen 317 der von Snort und Suricata generierten Alarme gibt es verschiedene Mechanismen. Im Folgenden sehen wir uns zwei der beliebtesten kostenlosen Open-Source-Schnittstellen zur Alarmverwaltung an, nämlich Snorby und Sguil. Mit diesen Tools werden wir auch im weiteren Verlauf dieses Buches arbeiten. 9.7.1 Snorby Snorby ist eine relativ neue Alarmverwaltungskonsole. Sie wurde in Rugy on Rails geschrieben und läuft im Webbrowser. Der Autor dieser Software, Dustin Weber, hat inzwischen das Unternehmen Threat Stack gegründet, das Snorby als Open-SourceAnwendung weiterentwickelt. Snorby soll Analytikern eine Möglichkeit geben, Alarme auf eine Weise zu untersuchen, die zwar einfach und übersichtlich ist, aber alles bietet, was für eine wirkungsvolle Analyse erforderlich ist. Eine Online-Demo von Snorby finden Sie auf http://demo.snorby.org. Für den Zugriff auf diese Demo geben Sie den Benutzernamen demo@snorby.org und das Passwort snorby an. Wenn Sie Security Onion verwenden, können Sie auch einfach auf das Snorby-Symbol auf dem Desktop klicken oder https://<IP-Adresse von Security Onion>:444/ aufsuchen. Abb. 9.24 zeigt das Dashboard von Snorby. Abbildung 9.24: Das Dashboard von Snorby. Weitere Informationen über Snorby erhalten Sie auf http://www.snorby.org. 318 9 Signaturgestützte Erkennung mit Snort und Suricata 9.7.2 Sguil Viele Jahre lang war Sguil die Alarmverwaltungskonsole Nr. 1 für NSM-Analytiker. Im Gegensatz zu Snorby handelt es sich bei Sguil um eine Desktop-Anwendung, die mit einer zentralen Datenquelle verbunden ist. Diese Software wurde von Bamm Visscher geschrieben und wird als kostenlose Open-Source-Anwendung weiterentwickelt. Sie ist standardmäßig in Security Onion installiert und kann über das Sguil-Symbol auf dem Desktop aufgerufen werden. In Abb. 9.25 sehen Sie das Hauptfenster von Sguil. Abbildung 9.25: Das Hauptfenster von Sguil Weitere Informationen über Sguil erhalten Sie auf http://sguil.sourceforge.net/. 9.8 Zusammenfassung In diesem Kapitel haben wir ausführlich die signaturgestützte Erkennung mit Snort und Suricata besprochen. Wir haben uns die Funktionsweise beider IDS-Engines angesehen, ihre Unterschiede aufgezeigt und uns angesehen, wie Sie Erkennungsregeln dafür schreiben können. Die signaturgestützte Erkennung war lange Zeit das Rückgrat der Intrusion Detection und des Network Security Monitoring. Sie reicht zwar nicht als alleinige Lösung aus, ist aber eine wichtige Komponente einer jeden NSM-Umgebung. Im Abschnitt über die Analyse werden wir Methoden kennenlernen, um die von Snort und Suricata generierten Alarme einzusehen und zu untersuchen. 10 Bro Beim Network Security Monitoring geht es darum, Netzwerkdaten als Kontext für die Erkennung und Analyse zu sammeln. Die meisten NSM-Systeme schließen die drei Hauptquellen ein (IDS-Alarme, Sitzungsdaten und FPC-Daten), aber wie Sie in diesem Buch schon gesehen haben, sind das nicht die einzigen Datenquellen, die Sie nutzen können. Eine besonders reichhaltige Quelle ist Bro. Bro wird häufig als IDS bezeichnet, doch wie Sie in diesem Kapitel sehen werden, wird ihm dieser Begriff nicht gerecht. Stellen Sie sich Bro lieber als Entwicklungsplattform für NSM-Anwendungen vor. Es bringt wesentliche vorgefertigte Funktionen zum Dekodieren und Protokollieren von Netzwerkverkehr, aber auch ein ereignisgestütztes Entwicklungsmodell mit, mit dem Sie gezielt nach Transaktionen einer bestimmten Art Ausschau halten und eigene Skripts bereitstellen können, die bei einem solchen Ereignis ausgeführt werden sollen. In diesem Kapitel sehen wir uns an, wie Sie die eingebauten Protokolle von Bro verwenden, um die Aktivitäten in Ihrem Netzwerk aufzuspüren, an denen Sie interessiert sind. Außerdem betrachten wir einige Beispiele der Bro-Programmierung, um einige der wichtigsten und nützlichsten Funktionen vorzuführen. 320 10 Bro Vorsicht Die Beispiele in diesem Kapitel wurden mit Bro 2.2 geschrieben, das zur Zeitpunkt der Abfassung dieses Buches noch im Beta-Stadium war. Daher ist Bro 2.2 in Security Onion nicht standardmäßig installiert. Wenn Sie die Beispiele nachvollziehen wollen, können Sie Bro 2.2 Beta nach der Anleitung auf http://www. appliednsm.com/bro-22-on-seconion/ installieren. 10.1 Grundprinzipien von Bro Im Gegensatz zu einem weit verbreiteten Irrglauben ist Bro kein IDS, auch wenn es manchmal so bezeichnet wird. In Wirklichkeit handelt es sich bei Bro um eine Skriptplattform für die Arbeit mit Netzwerkverkehr. Wie Sie in den Beispielen in diesem Kapitel sehen werden, weist die Skriptsprache von Bro (die verwirrenderweise auch Bro heißt) äußerst nützliche Merkmale für die Protokollanalyse auf (beispielsweise sind IP-Adressen und Ports native Datentypen). Außerdem bietet Bro eine Menge vorgefertigter Funk­ tionen für grundlegende Analyseaufgaben, darunter Protokolldekodierung, Transaktionsprotokollierung und Benachrichtigungen über einige gängige Sicherheitsereignisse. Allerdings macht sich Bro tatsächlich auch sehr gut als IDS-Plattform, weshalb wir es in diesem Buch behandeln. Bro ist anders als signaturgestützte IDS wie Snort und Suricata und ergänzt sie. Die Regelsprache von Snort ist zwar gut geeignet, um bestimmte Bytes im Netzwerkverkehr zu finden (wobei es viele Aufgaben gibt, für die wirklich nicht mehr als das erforderlich ist), aber Bro ist oft die beste Möglichkeit, wenn es um kompliziertere Dinge geht, etwa um Protokolle höherer Ebenen, die Arbeit über mehrere Netzwerkflüsse hinweg oder die Verwendung eines maßgeschneiderten Algorithmus, um irgendwelche Aspekte des zu untersuchenden Netzwerkverkehrs zu berechnen. Eine der Stärken von Bro besteht darin, dass es alle gängigen Internetprotokolle und sogar einige der weniger gebräuchlichen kennt. Es kann diese Protokolle im Netzwerkverkehr auch dann erkennen, wenn sie nicht über die Standardports abgewickelt werden. Diese Funktion wird dynamische Protokollerkennung genannt (Dynamic Protocol Detection, DPD). Zu den Anwendungs- und Tunnelprotokollen, die Bro unterstützt, gehören u. a. die folgenden: •• •• •• •• •• DHCP DNS FTP HTTP IRC 10.1 Grundprinzipien von Bro 321 •• •• •• •• •• •• •• •• POP3 SMTP SOCKS SSH SSL SYSLOG Teredo GTPv1 Wenn Bro Netzwerkverkehr über ein Anwendungsprotokoll sieht, das es kennt, hält es die Einzelheiten der betreffenden Transaktion in einer Datei fest. Die Art und Weise dieser Aufzeichnung können Sie im Einzelnen einstellen, aber das ist noch nicht alles. Wenn Bro den Datenverkehr verarbeitet und dekodiert, stellt es einen Mechanismus bereit, mit dessen Hilfe Sie eigenen Code zur Verarbeitung der Transaktionen in diesem Datenverkehr schreiben können. Die Aktionen, die das Protokoll ausführt, werden von Bro als eine Folge von Ereignissen betrachtet, für die Sie Ereignishandler in Bro-Code schreiben können. Wenn das Ereignis, für das Sie einen Handler registriert haben, im Netzwerkverkehr auftritt, ruft Bro Ihren Code dafür auf. In diesen Handlern können Sie praktisch alles tun, was Sie wollen, und Sie können so viele Handler vorhalten, wie Sie wollen. Es ist sogar möglich, mehrere Handler für ein und dasselbe Ereignis einzurichten, etwa wenn Sie ein Protokoll auf verschiedene Arten von Verhalten untersuchen. Der folgende Bro-Beispielcode zeigt einen sehr einfachen Handler für das Ereignis http_ request. Bro generiert dieses Ereignis, wenn ein HTTP-Client eine Anforderung an einen Server stellt. Der Code gibt den vom Client angeforderten URL an der Konsole aus (Standardausgabe). Natürlich wäre diese Vorgehensweise in der Produktion nicht sehr sinnvoll. Weiter hinten in diesem Kapitel sehen wir uns einige praxisnahe Beispiele an, aber hier geht es nur darum zu zeigen, dass Sie lediglich den Code in ein Skript aufnehmen müssen, das in Bro geladen wird (wie das geschieht, wird ebenfalls weiter hinten erklärt). Dadurch wird der Ereignishandler registriert und der Code von Bro aufgerufen, sobald eine HTTPAnforderung auftritt. # # Dies ist ein Beispiel-Ereignishandler für HTTP-Anforderungen # event http_request(c: connection, method: string, orig_uri: string, unescaped_uri: string, version: string) { print fmt("HTTP request found for %s", orig_uri); } 322 10 Bro 10.2 # ausführen Die einfachste Möglichkeit zur Verwendung von Bro besteht darin, es an der Befehlszeile auszuführen und es eine PCAP-Datei nach seiner Standardkonfiguration verarbeiten zu lassen. Dazu verwenden Sie folgenden Befehl: bro -C -r file.pcap Das Argument -r file.pcap weist Bro an, die Pakete in der Datei file.pcap zu lesen. Mit der Option -C wird die interne Prüfsummenverifizierung von Bro ausgeschaltet. Jedes IP-Paket verfügt über eine Prüfsumme, mit der es möglich ist festzustellen, ob es korrekt empfangen wurde. Dies ist für eine ordnungsgemäße Übertragung im Netzwerk unverzichtbar, und jeder Host überprüft standardmäßig die Prüfsummen. Immer mehr Netzwerkkarten weisen jedoch eine Funktion namens »TCP Checksum Offloading« auf, bei der diese Überprüfung von der Hardware der Netzwerkkarte durchgeführt wird, wodurch die CPU die Verarbeitungszyklen dafür einsparen kann. Bei Geschwindigkeiten im Bereich von Gigabit pro Sekunde kann das einen großen Unterschied ausmachen. Wenn die Pakete das Betriebssystem erreichen, wo sie von Libpcap (oder einem anderen Treiber zur Paketerfassung) gelesen werden können, kann es deswegen jedoch vorkommen, dass Prüfsummenwerte fehlen oder inkorrekt sind. In der Standardeinstellung ignoriert Bro Pakete mit ungültigen Prüfsummen, doch mit der Option -C können Sie es zwingen, den Prüfsummentest zu überspringen und sämtliche Pakete zu verarbeiten. Das sollten Sie praktisch immer tun, insbesondere, wenn Sie PCAP-Dateien von Systemen empfangen, bei denen Sie sich nicht sicher sind, ob das Checksum Offloading aktiviert ist. Wenn Sie die Netzwerkschnittstellen Ihres Laborsystems mit dem Setupskript von Security Onion automatisch konfiguriert haben, dann ist die Offloading-Funktion an der Überwachungsschnittstelle ausgeschaltet. Bei den meisten anderen Systemen ist sie aber standardmäßig aktiviert. 10.3 Bro-Protokolle Bro ist standardmäßig so eingerichtet, dass es eine ausführliche Protokollierung vornimmt. In dieser Phase sucht es gar nicht einmal besonders nach schädlichen Dingen (wie ein IDS es tun würde), sondern erstellt lediglich sehr detaillierte Protokolle über das, was es sieht. Abb. 10.1 zeigt ein einfaches Beispiel dafür, wie Bro eine einzelne PCAP-Datei verarbeitet. Zu Anfang ist das Verzeichnis leer, aber als Ergebnis der Untersuchung der Datei erstellt Bro mehrere Protokolldateien und ein neues Verzeichnis. Abbildung 10.1: Bei der Verarbeitung einer PCAP-Datei erstellt Bro Protokolldateien 10.3 Bro-Protokolle 323 Aus den Namen der Protokolldateien können Sie schließen, dass Bro in der PCAP-Datei DNS-, FTP-, HTTP- und SSL-Datenverkehr gefunden hat. Die Inhalte der restlichen Dateien sind weniger offensichtlich. Conn.log enthält eine Aufzeichnung der Netzwerkverbindungen (Flüsse) und files.log eine Aufzeichnung aller übertragenen Dateien (hier über HTTP oder FTP, einschließlich aller HTML-Bilder und sonstigen eingebetteten Medien, aus denen sich der Webdatenverkehr zusammensetzt). In packet_filter.log dagegen ist lediglich der BPF-Filter zu finden, den Bro verwendet (der Standardfilter ist ip or not ip, was letzten Endes heißt: »alle Pakete«). In weird.log zeichnet Bro ungewöhnliche Ereignisse aller Protokolle auf, wobei allerdings die Vorstellung von Bro, was »ungewöhnlich« ist, nicht unbedingt mit Ihrer übereinstimmen muss. Schließlich haben wir noch das Verzeichnis extract_files, das zurzeit noch leer ist. Darüber werden wir weiter hinten noch sprechen. Wenn Sie eine dieser Protokolldateien öffnen, stellen Sie fest, dass es sich um eine tabulatorgetrennte Textdatei handelt. Die ersten Zeilen enthalten interne Bro-Metadaten, die die Felder und deren Datentypen beschreiben, die Erstellungszeit der Datei angeben und einige weitere Informationen, die aber nicht besonders nützlich sind. Um sich mit einem neuen Typ von Bro-Protokolldatei vertraut zu machen, mit dem Sie zuvor noch nichts zu tun hatten, ist es jedoch hilfreich, die als fields und types gekennzeichneten Zeilen zu studieren. Auf die Metadaten folgen dann die eigentlichen Protokolle, wobei jede Zeile ein Protokoll darstellt. In Abb. 10.2 sehen Sie einen Teil der Datei http.log. Er zeigt einige der HTTP-Transaktionen, die Bro in der PCAP-Datei erkannt hat. Abbildung 10.2: Ausschnitt aus der Datei http.log Dies ist nur ein Ausschnitt, und zwar in beiden Richtungen. Erstens gibt es zu viele Einträge, um alle in einem Fenster darzustellen, weshalb hier nur der Anfang der Datei zu sehen ist. Vor allem aber sind die einzelnen Einträge sehr lang und gehen über den rechten Rand des Fensters hinaus. Aufgrund dieser Länge ist es sehr schwer, eine Protokolldatei in einem druckfähigen Format zu zeigen. Tabelle 10.1 gibt einen Überblick über einige der wichtigsten Felder, die gewöhnlich in http.log zu finden sind. Beachten Sie, dass es nicht nur möglich, sondern auch üblich ist, diese Standardprotokolldateien in Abhängigkeit von den Skripten, die Sie in Ihrer Bro-Instanz ausführen, um zusätzliche Felder zu erweitern. 324 10 Bro Tabelle 10.1: Felder in http.log Feld Beschreibung ts Zeitstempel des Ereignisses uid Eindeutige ID für den Fluss, der die betreffende Transaktion enthält id.orig_h Quellhost id.orig_p Quellport id.resp_h Zielhost id.resp_p Zielport trans_depth Position der Transaktion in der HTTP-Pipeline method HTTP-Verb für die Transaktion host Wert des HTTP-Headers für den Host uri Pfad der Anforderung referrer Wert des HTTP-Headers für den Referrer user_agent Wert des HTTP-Headers für den Benutzer-Agenten request_body_len Länge des Anforderungsrumpfes response_body_len Länge des Antwortrumpfes status-code Numerischer HTTP-Antwortstatus status_msg Für Menschen lesbare HTTP-Statusmeldung filename Name der heruntergeladenen Datei nach Angabe des Servers username Benutzername der einfachen HTTP-Authentifizierung password Passwort der einfachen HTTP-Authentifizierung orig_fuids Liste der eindeutigen Datei-IDs in der Anforderung (siehe files.log) orig_mime_types MIME-Typen der Anforderungsobjekte resp_fuids Liste der eindeutigen Datei-IDs in der Antwort resp_mime_types MIME-Typen der Antwortobjekte 10.3 Bro-Protokolle 325 Bericht von der Front Wenn Sie andere Paket- oder Flussanalysewerkzeuge wie Tcpdump, Wireshark oder Snort gewohnt sind, fragen Sie sich wahrscheinlich, wo die IP-Adressen und Ports von Quelle (»source«) und Ziel (»destination«) in Bro zu finden sind. Sie sind da, aber Bro nennt sie Urheber (»originator«) und Antwortender (»responder«). Die Felder für die Quell-IP-Adressen und -Ports tragen daher die Bezeichnungen orig_h und orig_p, und diejenigen für die Zieladressen und -ports die Bezeichnungen resp_h und resp_p. Allerdings werde ich in diesem Kapitel wie auch im ganzen Rest dieses Buches die üblichen Begriffe »Quelle« und »Ziel« verwenden. Wenn Ihnen das alles ein bisschen zu viel für eine Protokolldatei erscheint, dann haben Sie damit Recht. Um die Antwort auf eine bestimmte Frage zu finden, brauchen Sie praktisch nie alle über 25 Felder. Meistens ist es viel bequemer, einfach die Felder zu entnehmen, an denen Sie wirklich interessiert sind. Zum Glück gibt es dafür einen praktischen BroBefehl, nämlich bro-cut. Die einfachste Möglichkeit, diesen Befehl zu verwenden, besteht darin, im Terminal eine Protokolldatei mit cat auflisten zu lassen und das Ergebnis mit dem Pipe-Symbol an bro-cut zu übergeben. Dabei können Sie genau die Felder angeben, die Sie haben wollen (siehe Abb. 10.3). Abbildung 10.3: Einfache Ausgabe von bro-cut Hier haben wir angegeben, dass wir nur die Felder ts, uid, method und hosts sehen wollen. Nützliche Optionen für bro-cut sind unter anderem -C (um alle Metadaten der Protokolldatei einzuschließen, ohne sie einzeln aufführen zu müssen) und -u (um Zeitstempel im UTC-Format wiederzugeben). Letzteres sehen Sie in Abb. 10.4. 326 10 Bro Abbildung 10.4: Ausgabe von bro-cut mit Zeitstempeln in einem für Menschen lesbaren Format Bis jetzt haben wir uns nur mit einer der Protokolldateien beschäftigt. Es gibt aber noch viele andere, und sie sind alle miteinander verknüpft. Beispielsweise gehören alle in http. log aufgeführten HTTP-Transaktionen zu Netzwerkflüssen in der Datei conn.log, wobei viele dieser Flüsse wiederum mit DNS-Lookups für die Zielhosts in der Datei dns.log verknüpft sind. Wenn Sie sich die letzten Screenshots genauer ansehen, finden Sie darin überall dasFeld uid. Bro nutzt an verschiedenen Stellen diese eindeutigen Bezeichner, um verwandte Protokolleinträge aus unterschiedlichen Dateien miteinander zu verknüpfen. Daher sollten Sie bei der Untersuchung von Bro-Protokollen dieses Feld einschließen, um schnell in den anderen Protokolldateien nachschlagen zu können. Nehmen wir beispielsweise an, Sie wollen mehr über die HTTP-Transaktion erfahren, die in der ersten Zeile von Abb. 10.4 aufgeführt ist. In der zweiten Spalte ist der eindeutige Bezeichner für den Netzwerkfluss angegeben, der diese Transaktion enthält. Wenn Sie in allen Protokolldateien nach diesem String suchen, finden Sie mehrere verschiedene Arten von Protokolleinträgen (siehe Abb. 10.5). Die Datei http.log zeigt, dass mit dem betreffenden Fluss zwei HTTP-Transaktionen verknüpft sind. Das ist das ganz normal, da HTTP häufig mehrere Transaktionen über eine einzige Netzwerkverbindung sendet, um nicht ständig TCP-Sitzungen aufbauen und wieder beenden zu müssen. Laut der Datei files.log wurden bei diesen Transaktionen eine Textdatei und ein GIF-Bild abgerufen. Wenn Sie mehr über die Netzwerksitzung selbst in Erfahrung bringen wollen, finden Sie sie in conn.log. Viele Bro-Protokolle enthalten mehr als nur ein ID-Feld. So gibt es in den HTTP-Protokollen nicht nur das Feld uid mit dem Bezeichner der jeweiligen Verbindung, sondern auch das Feld resp_fuids mit einem Verweis auf eine Liste der IDs von Dateien, die in der Transaktion heruntergeladen wurden. Anhand dieser IDs können Sie Transaktionen miteinander verknüpfen und zwischen verschiedenen Arten von Transaktionen wechseln, während Sie die Protokolle untersuchen. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 327 Abbildung 10.5: Zusammengehörige Bro-Protokolldateien aufgrund der Transaktions-ID finden 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen Bis jetzt haben wir uns nur mit den Protokolldateien beschäftigt, aber Bro ist mehr als nur eine Protokollierungsplattform, sondern eine Allzweck-Programmiersprache, bei der der Schwerpunkt bewusst auf die Verarbeitung von Netzwerkverkehr gelegt wurde. Die Protokollierung ist nur ein Nebenprodukt der ausgiebigen Zerlegung und Normalisierung, die Bro zur Vorbereitung der Daten für die von Ihnen geschriebenen Programme vornimmt. Gehen wir nun also zum interessanten Teil über und schreiben wir mithilfe von Bro ein Tool, das uns bei der Erfassung, Erkennung und Analyse helfen kann. Im weiteren Verlauf dieses Kapitels werden wir noch oft genug erwähnen, wie großartig Bro ist, allerdings bietet sich hier die Gelegenheit, etwas anzusprechen, was die Bezeichnung »großartig« leider nicht verdient, nämlich die Dokumentation von Bro. Im letzten Jahr hat es zwar einige Verbesserungen gegeben, aber das Bro-Team konzentriert sich fast ausschließlich auf die Arbeit an der Plattform selbst und erübrigt kaum Zeit, um die Verwendung zu dokumentieren, außer in Form von Beispielen. Das gilt in besonderem Maße für die Programmiersprache Bro. Es gibt zwar eine rudimentäre Dokumentation (darunter eine Erklärung der integrierten Datentypen und eine knappe Übersicht der im Lieferumfang inbegriffenen Ereignisse und Funktionen), aber kein umfassendes Tutorial für angehende Brogrammierer. Die Skripterstellung mit Bro erlernen die meisten dadurch, dass sie vorhandenen Code studieren. Dazu können Sie die umfassende Sammlung von Skripten verwenden, die zusammen mit Bro geliefert wird (zu finden in /opt/bro/share/bro und den Unterverzeichnissen von Security Onion), aber auch Code von den Mailinglisten oder von Codesharing-Websites wie GitHub herunterladen. Um Sie darauf vorzubereiten, gehen wir in den Beispielen in diesem Kapitel auf die gleiche Weise vor. Anstatt alles, was Sie mit Bro anstellen können, von A bis Z aufzulisten, untersuchen wir den Code einiger nützlicher Skripte und stellen dabei die wichtigen Prinzipien von Bro vor, die sich in dem Code zeigen. Beim Durcharbeiten dieses Kapitels kann es hilfreich sein, in der Online-Dokumentation auf http://www.bro.org/documentation/­index. html nachzuschlagen. Diese Vorgehensweise entspricht auch der Art und Weise, wie Sie 328 10 Bro später eigenständig lernen werden: Sie finden neue, interessante Einzelheiten in vorhandenem Bro-Code und versuchen herauszufinden, wie sie funktionieren. 10.4.1 Dateien extrahieren Eine gängige Aufgabe beim Network Security Monitoring besteht darin, die in einer Sitzung übertragenen Dateien zu extrahieren. Es gibt zwar Werkzeuge, um Dateien aus einer PCAP-Datei zu entnehmen (z. B. Tcpxtract), aber sie arbeiten gewöhnlich auf Byteebene ohne Kenntnis des zugrunde liegenden Protokolls. Wenn Sie beispielsweise den Beginn einer PDF-Datei erkennen, können Sie gewöhnlich die nächsten paar tausend Byte abschöpfen und auf der Festplatte speichern, aber das stellt nur eine Annäherung der Datei dar, die tatsächlich übertragen wurde. Es kann nötig sein, manuell nachzuarbeiten, um die Datei zu bekommen, die Sie haben wollten. Bro dagegen kennt die Protokolle, die es dekodiert, und das macht einen großen Unterschied aus. In unserem ersten Beispiel sehen wir uns eine Methode an, mit Bro Dateien aus erfassten Paketen zu entnehmen. Dazu entwickeln wir zunächst ein Tool, das von der Befehlszeile aus für eine einzelne PCAP-Datei aufgerufen wird, und zeigen dann, wie Sie dieses Werkzeug in die Bro-Instanz in Security Onion aufnehmen, sodass es ständig läuft und den Netzwerkverkehr live verarbeitet. Als Erstes erstellen wir einen einfachen Prototyp. Mit dem so genannten File Analysis Framework verfügt Bro über einen eingebauten Mechanismus, um die Dateien, die über die Verbindung übertragen werden, im laufenden Betrieb zu analysieren. Eine der möglichen Arten von »Analyse«, die dieses Framework beherrscht, besteht darin, die Datei auf die Festplatte zu schreiben. Sie müssen Bro nur anweisen, dies für jede Datei zu tun, an der Sie interessiert sind. Zum Glück lässt sich das viel einfacher erledigen, als es klingt. Erstellen Sie die Datei extract-files.bro mit folgendem Code als Inhalt: # Wenn Bro eine Datei findet, die (über ein ihm bekanntes Protokoll) # übertragen wird, wird eine einfache Meldung in die Standardausgabe # geschrieben und Bro angewiesen, die Datei auf der Festplatte zu speichern. event file_new(f: fa_file) { local fuid=f$id; local fsource=f$source; local ftype=f$mime_type; local fname=fmt("extract-%s-%s", fsource, fuid); print fmt("*** Found %s in %s. Saved as %s. File ID is %s", ftype, fsource, fname, fuid); Files::add_analyzer(f, Files::ANALYZER_EXTRACT, [$extract_filename=fname]); } 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 329 Dieses Skript erstellt einen Handler für das Ereignis file_new, das Bro jedes Mal generiert, wenn es den Beginn einer neuen Dateiübertragung erkennt, und zwar unabhängig vom verwendeten Protokoll. Der einzige Parameter, den Bro dabei übergibt, ist f. Er ist vom Typ fa_file, einem vom Framework definierten Datensatztyp. Beachten Sie, dass in Bro ein Dollarzeichen verwendet wird, um auf die Felder in dem Datensatz zu verweisen. Damit greift das Skript auf die Felder id, source und mime_type zu, um eine kurze Meldung über die einzelnen gefundenen Dateien zusammenzustellen und auszugeben. Anschließend hängt es den Dateiextraktionsanalysator an den Stream an. Diese Komponente ist es, die Bro anweist, die Datei auf der Festplatte zu speichern. Das war es auch schon! Nachdem ANALYZER_EXTRACT an die Datei angehängt worden ist, kümmert sich Bro um den ganzen Rest. Jetzt müssen Sie dieses Skript nur noch an einer PCAP-Datei ausführen. Bro-Skripte werden auf ähnliche Weise ausgeführt wie Bro selbst, aber hier müssen wir nur den Namen der Skriptdatei am Ende der Befehlszeile angeben. Es ist sogar möglich, mehrere BroSkripte auszuführen, indem wir sie alle in ein und derselben Befehlszeile angeben. Hier allerdings ist das nicht nötig. Der erforderliche Befehl lautet wie folgt: bro –C –r ../pcaps/bro-sample-traffic.pcap ../scripts/extract-files.bro Abb. 10.6 zeigt die Ausführung dieses Skripts. Jede Zeile enthält die ID der gerade verarbeiteten Datei. Das ermöglicht es Ihnen, weitere Informationen in den entsprechenden Protokolleinträgen in files.log nachzuschlagen. Abbildung 10.6: Ausgabe eines einfachen Dateiextraktors Nachdem Sie das Skript ausgeführt haben, stehen Ihnen die gleichen Protokolldateien zur Verfügung, die Bro auch in den vorherigen Beispielen angelegt hat. Alles sieht genauso aus wie in den früheren Versuchen, doch diesmal befinden sich Dateien im Unterverzeichnis extract_files, wie Sie in Abb. 10.7 sehen. 330 10 Bro Abbildung 10.7: Die extrahierten Dateien 10.4.2 Selektive Dateiextraktion In der Beispielausgabe können Sie sehen, dass in der von mir verwendeten PCAP-Datei sehr viele GIF- und auch einige HTML-Dateien enthalten waren. Sie stammen aus dem gewöhnlichen Webdatenverkehr und sind eigentlich nicht das, was man sich unter »heruntergeladenen Dateien« vorstellt. Was tun, wenn Sie an diesen Dateitypen nicht interessiert sind, sondern beispielsweise nur ausführbare Windows-Dateien entnehmen wollen? Kein Problem! Wie Sie in unserem vorherigen Codebeispiele sehen konnten, kennt Bro den MIME-Typ der einzelnen Dateien. Dabei findet es diesen Typ durch Untersuchung der Datei heraus, anstatt sich auf das zu verlassen, was das Übertragungsprotokoll angibt. Bericht von der Front MIME steht für Multipurpose Internet Mail Extensions. MIME wird für E-Mails (und inzwischen auch für HTTP und andere Protokolle) verwendet, um eine einzige Nachricht aus mehreren Teilen zusammenzusetzen. Wenn Sie eine E-Mail mit einem Anhang erhalten, dann handelt es sich dabei um eine MIME-Nachricht. Das wahrscheinlich am häufigsten genutzte Merkmal der MIME-Spezifikation ist die Verwendung von Typen, um zu beschreiben, welche Art von Inhalt die einzelnen Teile der Nachricht haben. Sogar viele Nicht-MIME-Anwendungen nutzen MIME-Typen, um die Daten zu beschreiben, die sie verarbeiten. In HTTP wird für bestimmte Arten von Transaktionen, bei denen mehrere Datenabschnitte auf einmal gesendet werden (z. B. die Übermittlung von Formularen mit der Methode POST), eine MIME-Formatierung verwendet. HTTP nutzt zwar nicht das komplette MIME-Format, doch fast alles in HTTP wird mit einem MIME-Typ gekennzeichnet. Zu den am häufigsten auftretenden Werten gehören text/html, text/plain und image/gif. Es gibt viele andere, aber die Liste ist zu lang, um sie alle hier aufzuführen. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 331 Wir können unser bisheriges Skript nun so verfeinern, dass es zunächst den MIME-Typ einer Datei überprüft und auf dieser Grundlage entscheidet, ob der Extraktionsanalysator angehängt werden soll oder nicht. #!/usr/bin/env bro # Wenn Bro eine Datei findet, die (über ein ihm bekanntes Protokoll) # übertragen wird, wird eine einfache Meldung in die Standardausgabe # geschrieben und Bro angewiesen, die Datei auf der Festplatte zu speichern. event file_new(f: fa_file) { # Prüft, ob in dem Datensatz ein Wert für den MIME-Typ angegeben ist if (f?$mime_type) { # Prüft, ob es einer der Typen ist, für die wir uns interessieren if(f$mime_type == "application/x-dosexec" || f$mime_type == "application/x-executable") { local ftype=f$mime_type; local fuid=f$id; local fsource=f$source; local fname=fmt("extract-%s-%s", fsource, fuid); print fmt("*** Found %s in %s. Saved as %s. File ID is %s", ftype, fsource, fname, fuid); Files::add_analyzer(f, Files::ANALYZER_EXTRACT, [$extract_filename=fname]); } } } Diese Version ähnelt der ersten, enthält aber eine zusätzliche if-Anweisung, um zu prüfen, ob in dem Dateidatensatz ein MIME-Typ angegeben ist (f?$mime_type). Wenn ja, wird der MIME-Typ untersucht und auf dieser Grundlage entschieden, ob der Extraktionsanalyser angewendet wird. Abb. 10.8 zeigt die Ausgabe dieses Skripts. Hier wurden alle Bilder und HTML-Inhalte übergangen und nur die ausführbaren Dateien verarbeitet. Abbildung 10.8: Extraktion ausschließlich von ausführbaren Windows-Dateien Sehen wir uns nun einen kleinen Trick an, mit dem wir Bro-Code noch auf eine andere Weise ausführen können. Bis jetzt haben wir ausdrücklich den Befehl bro gegeben und dahinter das gewünschte Skript aufgeführt. Die erste Zeile unseres neuen Skripts beginn aber mit dem Unix-typischen »Shebang«-Symbol #!. Das bedeutet, dass es sich hierbei 332 10 Bro um ein zwar in Bro geschriebenes, aber trotzdem eigenständiges Programm handelt, dass Sie ebenso an der Befehlszeile ausführen können wie ein Skript in einer anderen Sprache. Dazu müssen Sie noch die Berechtigungen des Skripts ändern, sodass es ausführbar wird: chmod 755 extract-exe-files.bro Jetzt können Sie dieses Skript wie jeden anderen Befehl ausführen (siehe Abb. 10.9), wobei es sich genauso verhält wie zuvor: Es legt Protokolldateien an und schreibt die extrahierten Dateien auf die Festplatte. Dies ist nur eine andere und häufig bequemere Möglichkeit, den Code auszuführen, vor allem, wenn Sie Ihr Tool anderen Analytikern zur Verfügung stellen, die mit Bro selbst nicht vertraut sind. Abbildung 10.9: Aufruf des Skripts als Befehl 10.4.3 Dateien aus laufendem Netzwerkverkehr entnehmen Nachdem wir unser Skript als eigenständiges Tool verbessert haben, wollen wir uns als Nächstes ansehen, wie wir es kontinuierlich in der Bro-Instanz von Security Onion ausführen. Das wäre praktisch, um jegliche Dateien eines bestimmten Typs zu extrahieren, sobald sie über das Netzwerk übertragen werden, anstatt im Nachhinein PCAP-Dateien danach zu durchsuchen. Wenn Sie erst einmal ein funktionierendes Bro-Skript haben, ist es gewöhnlich nicht mehr sehr schwierig, es kontinuierlich ausführen zu lassen. Wird Bro von Security Onion im Sensormodus ausgeführt, so bezieht es seine Konfiguration standardmäßig aus /opt/bro/ share/bro/site/local.bro, wobei wir den Begriff »Konfiguration« hier im weitesten Sinne verwenden. Local.bro ist ein Skript, das Bro beim Start lädt und ausführt. Die im Liefer­ umfang von Security Onion enthaltene Standardversion dieser Datei lädt weitere BroSkripts nach, die einige nützliche Funktionen ausführen und z. B Scans erkennen, die im Netzwerk ausgeführte Anwendungen protokollieren, GeoIP-Lookups zu den Aufzeichnen bestimmter Übertragungsprotokolle hinzufügen usw. Da local.bro die »lokale« Konfiguration von Bro darstellt, müssen Sie darin auch Ihre eigenen Anpassungen hinzufügen. Die einfachste Möglichkeit, den Dateiextraktionscode zu Bro hinzuzufügen, besteht darin, ihn vollständig ans Ende der Datei local.bro zu kopieren, wie Sie in Abb. 10.10 sehen. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 333 Abbildung 10.10: Hinzufügen des Dateiextraktionscodes zu local.bro Wenn Sie Änderungen an local.bro vornehmen, müssen Sie anschließend drei einfache Schritte ausführen, um die laufende Bro-Instanz darauf aufmerksam zu machen. Bei jedem dieser Schritte verwenden Sie das Bro-Steuerprogramm broctl. Die Befehle für die einzelnen Schritte lauten wie folgt: 1. broctl check Damit führen Sie eine schnelle Syntax- und Konsistenzüberprüfung der gesamten Konfiguration durch, um sich zu vergewissern, dass Sie nicht versehentlich etwas beschädigt haben. 2. broctl install Hiermit werden die Konfigurationsänderungen in Kraft gesetzt oder »installiert«. 3. broctl restart Dieser Befehl startet Bro neu, damit die Änderungen gelesen werden. Abb. 10.11 zeigt diese Befehle und deren Ausgabe. 334 10 Bro Abbildung 10.11: Inkraftsetzen von Änderungen mit broctl Wenn Ihr neuer Code eine Weile läuft, werfen Sie einen Blick in das Bro-Protokollverzeichnis /nsm/bro/logs/current und untersuchen Sie die Datei files.log, um sich anzusehen, ob und wenn ja welche Dateien extrahiert worden sind. Im Feld analyzers können Sie erkennen, auf welche Dateien der Analysator EXTRACT angewandt wurde (siehe Abb. 10.12). Abbildung 10.12: Eine Datei wurde extrahiert! Nach der Stringausgabe der extrahierten Binärdatei zu urteilen, handelt es sich hierbei um eine Kopie des Windows-SSH-Clients PuTTY. Ein Neustart von Bro führt übrigens dazu, dass alle zurzeit in /nsm/bro/logs/current befindlichen Protokolle archiviert werden und ein neuer Satz angelegt wird. Das geschieht auch automatisch jede Nacht (um 0.00 Uhr GMT in der Standardkonfiguration von Security Onion). Wenn Sie die Beispiele durcharbeiten, sollten Sie daher nicht überrascht sein, wenn einige Ihrer alten Protokolle nach einem Neustart von Bro oder von Security Onion oder nach gewisser Zeit einfach von selbst scheinbar verschwinden. Die Protokolle sind nach wie vor vorhanden, allerdings hat Bro sie in ein Unterverzeichnis von /nsm/bro/logs verschoben. Der Name dieses Unterverzeichnisses spiegelt das Datum wider. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 335 10.4.4 Bro-Code verpacken Wir haben Bro jetzt so eingerichtet, dass es ausführbare Dateien im laufenden Betreib aus dem Netzwerkstream entnimmt, was eine äußerst nützliche Funktion ist. Diese Dateien können anschließend auf Anzeichen von Schadlogik untersucht oder für eine statistische Analyse zusammengestellt werden. Es ist auch möglich, Informationen über diese Dateien zur weiteren Analyse wieder in Bro zurückzuleiten. Das funktioniert zwar alles sehr gut, aber wir können noch etwas mehr tun, nämlich unseren Code in eine eigene Datei packen. Wenn Sie ständig neuen Code direkt in local.bro hineinschreiben, macht das die Handhabung im Laufe der Zeit immer schwerer. Um Ihre Skripte an andere Bro-Benutzer weiterzugeben, müssten Sie außerdem Unmengen von Änderungen durchkämmen, die gar nichts damit zu tun haben, und sorgfältig darauf achten, dass Sie nur die Zeilen entnehmen, die Sie wirklich weitergeben wollen. Nach einer Weile dürfte sich das zu einem Verwaltungsalbtraum auswachsen. Wenn Sie sich den Rest von local.bro ansehen (also den Teil, den wir nicht bearbeitet haben), werden Sie feststellen, dass dieses Skript nichts anderes macht, als andere Skripte zu laden, die in eigenen Dateien gespeichert sind. Genau das können wir auch mit unserem Code tun! Das ist sogar äußerst einfach. Schneiden Sie dazu den gesamten Code Ihres Skripts in local.bro aus, fügen Sie ihn in eine neue Datei namens extract-interesting-files.bro ein und stellen Sie diese Datei dann in das Verzeichnis /opt/bro/share/bro/site. Da es sich dabei um den Standardladepfad von Bro handelt, können wir einfach die folgende Anweisung in local.bro schreiben, damit unser Skript wie zuvor ausgeführt wird: @load extract-interesting-files Wenn Sie nun mit broctl die Konfiguration überprüfen und installieren und die BroInstanz neu starten, funktioniert alles wie zuvor, aber der Code lässt sich jetzt viel einfacher finden, verwalten und weitergeben. 10.4.5 Konfigurationsoptionen hinzufügen Unser Code ist jetzt auf eine viel sauberere Weise gespeichert, aber es stellt sich immer noch das Problem, dass wir das Skript bearbeiten müssen, wenn wir andere Dateitypen extrahieren wollen. Das erschwert es, die Übersicht über Änderungen an der Funktion zu behalten, und kann sogar dazu führen, dass sich Fehler einschleichen. Für die endgültige Version fügen wir unserem Skript den Konfigurationsparameter ­interesting_types hinzu, den wir auf die Strings für die MIME-Typen setzen, an denen wir interessiert sind. Wenn Bro eine Datei mit einem dieser MIME-Typen sieht, schreibt es sie auf die Festplatte. Diesen Parameter richten wir so ein, das wir seinen Inhalt mit einem anderen Skript ändern können, ohne die Skriptdatei für unser Programm bearbeiten zu müssen. 336 10 Bro Die neue Version der Datei extract-interesting-files.bro sieht damit wie folgt aus: # # Ein Modul, um Dateien des gewünschten MIME-Typs zu finden und auf die # Festplatte zu schreiben # module ExtractFiles; export { const interesting_types: set[string]=[ "application/x-dosexec", "application/x-executable" ] &redef; } event file_new(f: fa_file) { # Prüft, ob in dem Datensatz ein Wert für den MIME-Typ angegeben ist if (f?$mime_type) { # Prüft, ob es einer der Typen ist, für die wir uns interessieren if(f$mime_type in interesting_types) { local ftype=f$mime_type; local fuid=f$id; local fsource=f$source; local fname=fmt("extract-%s-%s", fsource, fuid); print fmt("*** Found %s in %s. Saved as %s. File ID is %s", ftype, fsource, fname, fuid); Files::add_analyzer(f, Files::ANALYZER_EXTRACT, [$extract_filename=fname]); } } } Schon auf den ersten Blick fällt auf, dass wir diesen Code jetzt als »Modul« namens ­ExtractFiles deklarieren. In Bro werden Module praktisch genauso angewandt wie in anderen Sprachen: Sie stellen einen neuen Namensraum für Funktionen und Variablen zur Verfügung, der vom Hauptnamensraum getrennt ist, um Namenskonflikte zu vermeiden. Standardmäßig sind diese Namen privat und gelten nur in dem Modul. Um sie in anderen Namensräumen verfügbar zu machen, müssen wir für diese Variablen und Konstanten die Exportdirektive verwenden. Hier exportieren wir jedoch nur einen Namen, nämlich die Konstante interesting_types, die als Stringmenge definiert ist. Eine Menge (set) ist in Bro eine ungeordnete Zusammenstellung von Elementen des angegebenen Typs. Sie können Elemente zu einer Menge hinzufügen und entfernen, und Sie können prüfen, ob ein gegebenes Element zu der Menge 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 337 gehört oder nicht. Das einzig Ungewöhnliche hier besteht darin, dass interesting_type zwar eine »Konstante« ist, am Ende der Deklaration aber trotzdem &redef steht. Damit können Sie die Inhalt der Konstante ändern, wozu Sie allerdings die besondere Anweisung redef einsetzen müssen. Dadurch verhindert Bro, dass Sie aufgrund eines Bugs im Code oder eines anderen Fehlers versehentlich einen wichtigen Konfigurationsparameter ändern. Wie wir eine solche Änderung bewusst wahrnehmen, sehen wir uns in Kürze an. Als letzte Änderung an unserem Code ersetzen wir die Bedingung, die prüft, ob der vorliegende MIME-Typ einer derjenigen ist, für die wir uns interessieren. Bislang hatten wir die gewünschten Typen hartkodiert: if(f$mime_type =="application/x-dosexec" || f$mime_type =="application/x-executable") { Das haben wir jetzt dadurch vereinfacht, dass nur noch geprüft wird, ob der vorliegende MIME-Typ ein Element der Menge interesting_type ist: if(f$mime_type in interesting_types) { Da wir local.bro bereits die entsprechende @load-Anweisung hinzugefügt haben, sind wir schon so gut wie startbereit. Zuvor wollen wir uns jedoch noch ansehen, wie Sie neue zu extrahierende Datentypen hinzufügen. In Security Onion besteht die Bro-Datenbank der bekannten MIME-Typen aus Textdateien im Verzeichnis /opt/bro/share/magic. In Abb. 10.13 sehen Sie, wie Sie local.bro ändern müssen, um weitere MIME-Typen (hier GIF und HTML) zu den »interessanten Typen« hinzuzufügen: Mit dem Schlüsselwort redef werden zwei neue Werte in die »konstante« Menge aufgenommen. (Da wir vom Haupt­namensraum aus vorgehen, müssen wir die Menge als ExtractFiles::interesting_types ansprechen.) Abbildung 10.13: Ändern der Konfigurationsdatei, um weitere zu extrahierende MIME-Typen hinzuzufügen 338 10 Bro Verwenden Sie broctl, um die neue Konfiguration zu überprüfen und zu installieren und die Bro-Instanz neu zu starten. Wenn Sie nun HTTP-Datenverkehr überwachen, können Sie erkennen, dass sehr schnell eine Menge Dateien extrahiert werden (siehe Abb. 10.14). Abbildung 10.14: Extrahierte GIF- und HTML-Dateien 10.4.6 Darknet-Überwachung mit Bro Dateien zu extrahieren ist zwar für viele Zwecke sehr nützlich, aber unsere bisherige Vorgehensweise wirft natürlich die wichtige Frage auf: »Wie bekomme ich Bro dazu, mich zu informieren, wenn irgendetwas Bemerkenswertes geschieht?« Die Antwort darauf gibt das folgende Beispiel, in dem Bro nach einer bestimmten Art von Ereignis Ausschau hält und uns darüber informiert, wenn dieses Ereignis tatsächlich auftritt. In diesem Beispiel schreiben wir mithilfe von Bro einen Darknet-Detektor. Ein Darknet ist ein Subnetz (oder, technisch gesehen, auch eine einzelne IP-Adresse), das in Ihrer Organisation nicht genutzt wird und mit dem andere Hosts aus keinem legitimen Grund kommunizieren sollten. Nehmen wir an, Ihrer Organisation ist ein /16-Netzwerk zugeordnet. Darin kann es mehrere unbenutzte /24-Netzwerke geben. Wenn Sie sich einige davon schnappen und dafür sorgen, dass sie auch in Zukunft nicht zugewiesen werden, dann haben sie damit ein Darknet aufgebaut. Darknets können sehr nützlich sein, um interne Scans und Aufklärungsvorgänge zu erkennen, die ein Wurm oder eine unautorisierte Person in Ihrem Netzwerk vornimmt. Zwar sind sie nicht hundertprozentig zuverlässig, da ein legitimer Benutzer versehentlich eine IP-Adresse aus dem Darknet eingeben oder ein legitimer Server aufgrund einer Fehlkonfiguration darauf verweisen kann, aber sie können als ein sehr nützliches Frühwarnsystem dienen. Es lohnt sich daher, sich die Zeit zu nehmen, ein solches Netz einzurichten und zu beobachten. Erstellen Sie dazu als Erstes die Datei /opt/bro/share/bro/site/darknets.bro und fügen Sie folgenden Code darin ein: 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 339 # # Mit diesem Modul geben Sie eine Menge mit unbenutzen Netzwerkblöcken oder # Adressen in Ihrem internen Netzwerk an. Wenn Bro Datenverkehr zu oder von # diesen Blöcken erkennt, gibt es eine Benachrichtigung aus. # @load base/frameworks/notice module Darknets; export { # Erstellt einen Benachrichtigungstyp für die Protokollierung redef enum Notice::Type+= { Darknet_Traffic }; # Ihre Darknets. Diese Menge ist zu Anfang leer. Fügen Sie # Netzwerkblöcke in local.bro hinzu. HINWEIS: Sie können auch einzelne # Hosts in Form von /32-Subnetzen angeben. const darknets: set[subnet]={} &redef; } # Vergleicht jede neue potenzielle Verbindung (erfolgreich oder nicht, # TCP/UDP/IP) mit der Darknet-Menge event new_connection(c:connection) { local darknet_conn=cat(c$id$orig_h, c$id$resp_h, c$id$resp_p); if(c$id$orig_h in darknets) { NOTICE([$note=Darknet_Traffic, $msg=”Traffic detected FROM darknet”, $conn=c, $identifier=darknet_conn]); } if(c$id$resp_h in darknets) { NOTICE([$note=Darknet_Traffic, $msg=”Traffic detected TO darknet”, $conn=c, $identifier=darknet_conn]); } } Dieser Code enthält einige neue Elemente, die wir uns etwas näher ansehen wollen, bevor wir fortfahren. Zu Anfang des Codes wird das Modul base/frameworks/notice geladen. Dabei handelt es sich um die Implementierung des Benachrichtigungsframeworks von Bro, einem Satz von Hooks, mit denen Sie eigene Arten von Benachrichtigungen erstellen und Benachrichtigungen anderer Module verwalten können. Bevor wir auf irgendetwas verweisen können, das mit diesem Framework zu tun hat, müssen wir dieses natürlich erst in Bro laden. 340 10 Bro Bericht von der Front In der Praxis müssen Sie das Framework notice wahrscheinlich gar nicht ausdrücklich laden, da es als Teil des Standardframeworks praktisch immer schon geladen ist. Wenn Sie den Code jedoch in besonderen Tools oder nicht standardmäßigen Bro-Instanzen wiederverwenden oder an andere Bro-Benutzer weitergeben wollen, können Sie sich nicht darauf verlassen, dass das Framework schon geladen ist. Daher ist es eine gute Vorgehensweise, alles ausdrücklich zu laden, was Sie brauchen. Wenn es schon geladen ist, richtet diese Anweisung keinen Schaden an. Danach erstellen wir die neue Menge darknets. Sie enthält Elemente vom Typ subnet, einem eingebauten Bro-Datentyp zur Speicherung von CIDR-Blöcken, die im Code als Literalwerte im Format x.x.x.x/y angegeben werden. Zu Anfang ist diese Menge leer, sodass das Skript in diesem Zustand nichts tun könnte. Allerdings ist diese Vorgehensweise sinnvoll, da wir die Darknets nicht im Voraus kennen. Wir werden sie später in local.bro angeben. Als Nächstes stellen wir einen Handler für das Ereignis new_connection bereit, das Bro generiert, wenn es beginnt, eine neue Verbindung zu beobachten. Die Generierung dieses Ereignisses bedeutet nicht, dass der Verbindungsversuch erfolgreich war, da es viel zu früh erstellt wird, um das erkennen zu können. Aus dem Ereignis kann lediglich geschlossen werden, dass versucht wurde, eine neue Verbindung aufzubauen. Bericht von der Front Bro überwacht Verbindungen aller Transportprotokolle, die es kennt. Für den Aufbau einer Sitzung nutzt TCP das eigene Prinzip des Drei-Wege-Handshakes, worauf Bro für die Erkennung zurückgreift. Bei verbindungslosen Protokollen wie UDP und ICMP behandelt Bro jegliche Kommunikation zwischen zwei spezifischen Endpunkten als »Verbindung«, bis eine bestimmte Zeitspanne ohne Kommunikation abgelaufen ist. Wenn das der Fall ist, wird die Verbindung »beendet«. Eine spätere Kommunikation zwischen denselben Endpunkten wird als neue Verbindung aufgefasst. Der einzige Parameter des Ereignisses new_connection ist c, ein Datensatz des Typs c­ onnection. Verbindungsdatensätze sind ein Sammelbecken für die Daten, die Bro bei Verbindungen im Auge behält. Neben grundlegenden Informationen wie den IP-Adressen und Ports von Quelle und Ziel, dem Verbindungsstatus und der Verbindungs-ID in Bro werden in nicht standardmäßigen oder vom Benutzer geschriebenen Skripten auch zusätzliche Daten darin gespeichert, etwa Geotagging-Informationen, Dateihashes usw. Zu den Daten, die Sie am häufigsten aus diesen Datensätzen lesen werden, gehören die IP-Adressen und Ports von Quelle und Ziel der Verbindung. Bro speichert sie als Teil des Datensatzes id, der ein Bestandteil des Typ connection ist und selbst den Typ conn_id aufweist. Tabelle 10.2 zeigt den Aufbau von conn_id-Datensätzen. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 341 Tabelle 10.2: Aufbau des Datensatztyps conn_id Feld Beschreibung orig_h IP-Adresse der Verbindungsquelle (des Clients) orig_p Portnummer und Protokoll der Quelle resp_h IP-Adresse des Verbindungsziels (des Servers) resp_p Portnummer und Protokoll des Ziels Der native Datentyp von Bro für Ports besteht übrigens aus zwei Teilen, einem für die Portnummer und einem für das Protokoll. Beispielsweise können Sie einer Variable mit dem folgenden Code den normalen SMTP-Port zuweisen: smtp_port=25/tcp In unserem Beispiel jedoch sind wir nur an der IP-Adresse von Quelle und Ziel und am Zielport interessiert, worauf wir in der verschachtelten Datenstruktur über c$id$orig_h, c$id$resp_h bzw. c$id$resp_p zugreifen. Unser Ereignishandler ruft als Erstes die Funktion cat() auf, die die Stringdarstellungen ihrer Argumente zu einem einzigen String zusammensetzt und diesen zurückgibt. In diesem Fall bauen wir damit einen String aus der Quell- und Zieladresse und dem Zielport zusammen. Das ist eine einfache Möglichkeit, eine ID für die Verbindung anzulegen. Warum das wichtig ist, werden wir in Kürze besprechen. Zunächst einmal weisen wir diesen Wert der Variable darknet_conn zu. Als Nächstes untersuchen wir die IP-Quelladresse (und später in einem fast identischen Codeabschnitt auch die IP-Zieladresse), um zu sehen, ob sie zu einem unserer Darknets gehört: if(c$id$orig_h in darknets) { NOTICE([$note=Darknet_Traffic, $msg="Traffic detected FROM darknet", $conn=c, $identifier=darknet_conn]); } Dieser Code besagt: »Wenn die IP-Quelladresse ein Element der Menge darknets ist, dann erstelle eine Benachrichtigung.« Eine Benachrichtigung ist ein Eintrag in der Datei notices. log. Dies ist die übliche Art und Weise, in der Bro zusätzliche Aufmerksamkeit auf etwas lenkt. In Bro gibt es auch Alarme, die in die Datei alarms.log eingetragen werden und nach einem Zeitplan per E-Mail gesendet werden. Benachrichtigungen können ebenfalls per E-Mail oder als Pagernachricht verschickt werden, um schnell die Aufmerksamkeit auf ein Ereignis zu ziehen, aber das wollen wir in diesem Beispiel nicht tun. 342 10 Bro In unserem Code rufen wir die Funktion NOTICE auf, die als einziges Argument einen Datensatz mit allen Informationen für die Benachrichtigung entgegennimmt. Sie können zwar auch eine Variable für den Benachrichtigungsdatensatz erstellen, doch die übliche Vorgehensweise besteht darin, im Code mit dem Konstrukt [$field1=value1,­$field2= value2,...,$fieldN=valueN] einen impliziten Datensatz aufzubauen. Das ist auch die Methode, der wir in diesem Beispiel folgen. Jede Benachrichtigung ist von einem bestimmten Typ. Dabei handelt es sich um einen der Werte in einer besonderen Menge, die von den verschiedenen in Bro geladenen Modulen definiert werden. Die Werte selbst sind dabei nicht von Bedeutung; sie dienen lediglich dazu, die Benachrichtigungstypen voneinander zu unterscheiden. Sie müssen lediglich die Namen kennen, sodass Sie sie als Wert des Feldes $note im Benachrichtigungsdatensatz übergeben können. Jedes Modul, das eigene Benachrichtigungen erstellt, definiert auch Typen dafür. Unser Code definiert den Typ Darknet_Traffic: # Erstellt einen Benachrichtigungstyp für die Protokollierung redef enum Notice::Type+= { Darknet_Traffic }; Im Feld $msg enthält jede Benachrichtigung auch eine für Menschen lesbare Meldung. In unserem Code haben wir einen Benachrichtigungstyp mit zwei verschiedenen möglichen Meldungen definiert, je nachdem, ob der Datenverkehr in das Darknet hinein- oder aus ihm herausgeht. Als Nächstes fügen wir im Feld $conn des Benachrichtigungsdatensatzes Informationen über die aktuelle Netzwerkverbindung hinzu. Da Bro jetzt weiß, mit welcher Verbindung die Benachrichtigung verknüpft ist, kann es die Verbindungs-ID in der Datei notice.log korrekt aufzeichnen. Dadurch entstehen die Verknüpfungen zu der Datei conn.log, die wir weiter vorn in diesem Kapitel gesehen haben. Als Letztes fügt unser Code die zuvor erstellte ID als $identifier hinzu. Das ist wichtig, um mit diesem Skript Benachrichtigungen erzeugen zu können. Unterdrücken von Benachrichtigungen Stellen Sie sich vor, dass ein System in Ihrem Netzwerk falsch konfiguriert ist, sodass es versucht, einen Druckerdienst auf einem Host zu erreichen, den es für einen Druckserver hält, bei dem es sich in Wirklichkeit aber um eine unbenutzte Adresse in einem Ihrer Darknets handelt. Die von diesem fehlkonfigurierten Host übermittelten Druckaufträge werden niemals ausgeführt, aber das System übermittelt sie immer wieder, prüft den Druckerstatus, übermittelt sie erneut usw. Das kann ziemlich lange so weitergehen, bis irgendjemand den Fehler bemerkt und den Druckauftrag manuell löscht. Es kann sein, dass Sie auf solche Vorgänge aufmerksam gemacht werden möchten, aber Sie möchten bestimmt nicht für jede einzelne Netzwerkverbindung, die im Rahmen dieser fehlerhaften Druckerkommunikation aufgebaut wird, eine Benachrichtigung erhalten. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 343 Dieses Problem löst Bro durch die Unterdrückung von Nachrichten. Es ist intelligent genug, um zu erkennen, dass es bereits eine Benachrichtigung über ein bestimmtes Ereignis gesendet hat, und um identische Benachrichtigungen eine Weile zurückzuhalten. Dazu untersucht es den Benachrichtigungstyp (Darknet_Traffic) und den eindeutigen Bezeichner, den Ihr Code bereitstellt. Aus diesem Grund mussten wir den Wert darknet_conn anlegen. Darknet_conn erstellt aus der Quell- und Zieladresse und dem Zielport einen »eindeutigen« Bezeichner für die Verbindung. In Wirklichkeit ist dieser Bezeichner nicht so eindeutig, da der Quellport nicht angegeben ist, aber das haben wir absichtlich so gemacht. Wiederholte Verbindungen zum selben Dienst kommen gewöhnlich von verschiedenen Quellportnummern, weshalb die Angabe des Quellports den Bezeichner zu spezifisch gemacht und dazu geführt hätte, dass mehr Benachrichtigungen generiert werden. Wenn wir wissen, dass 10.0.2.15 über Port 80 mit 192.168.1.1 kommuniziert hat, gehen wir stillschweigend davon aus, dass wir weitere dieser Kommunikationsversuche während der nächsten Minuten ignorieren können. Anhand der ersten Benachrichtigung können wir schließlich die vollständige Liste der Verbindungen in conn.log nachschlagen, falls wir sie brauchen sollten. Das Standardintervall für die Unterdrückung beträgt eine Stunde, sodass Sie für ein und dasselbe Ereignis nicht mehr als 24 Benachrichtigungen pro Tag erhalten. Sie können diesen Wert jedoch nach Bedarf erhöhen oder verringern. Wenn Sie das Standardintervall für alle Benachrichtigungen ändern wollen, fügen Sie local.bro folgenden Code hinzu: # Ändert das Standardintervall für die Unterdrückung von Benachrichtigungen # für sämtliche Benachrichtigungstypen redef Notice::default_suppression_interval=30 min; Bro verfügt außerdem über den integrierten Datentyp interval, den Sie auf eine beliebige Zahl von Mikrosekunden (usec), Millisekunden (msec), Sekunden (sec), Minuten (min), Stunden (hr) oder Tage (day) setzen können. Das macht es einfacher, die Zeitintervalle für diese Art von Aufgaben festzulegen. Sie können auch unterschiedliche Werte für die einzelnen Benachrichtigungstypen angeben. Wenn Sie beispielsweise den oben genannten kürzeren Wert für die meisten Typen verwenden, für Darknet_Traffic aber ein längeres Intervall vorgeben wollen, fügen Sie local.bro noch folgende Zeile hinzu: Notice::type_suppression_intervals[Darknet_Traffic]=2 hour; Wenn Sie mit Bro selbst und dem Einsatz von Bro in Ihrer Umgebung besser vertraut sind, werden Sie wahrscheinlich irgendwann dazu übergehen, diese Unterdrückungswerte für Ihren Bedarf zu optimieren. 344 10 Bro Das Skript testen und einsetzen Nachdem wir unseren Code als darknets.bro im richtigen Verzeichnis installiert haben, müssen wir ihn von local.bro aus laden und ihm eine Liste unserer Darknets zuführen. Wie das geschieht, sehen Sie in Abb. 10.15. Abbildung 10.15: Angabe der Darknets in local.bro In diesem Beispiel habe ich den gesamten Bereich von 10.0.4.0 bis 10.0.4.255 sowie die einzelne IP-Adresse 192.168.1.100 als Darknet angegeben. In meinem Labornetzwerk ist keiner dieser Bereiche in Benutzung, aber in der Praxis müssen Sie die Liste natürlich an die Gegebenheiten in Ihrem Netzwerk anpassen. Mit einer schnellen Runde broctl check/install/restart laden wir den Darknet-Code in unsere laufende Bro-Instanz. Da es sich um »dunkle« Netzwerke handelt, sollten wir im Idealfall keinerlei Datenverkehr darin erkennen. Da Bro erst dann Protokolldateien anlegt, wenn es etwas zum Hineinschreiben hat, ist auch die Datei notice.log noch nicht sofort vorhanden. Das ist völlig normal so. Zum Testen müssen wir Datenverkehr zu einem unserer Darknets generieren. Als Erstes habe ich es mit einfachem ICMP-Datenverkehr versucht. Dazu habe ich mit dem Befehl ping einige Pakete an eine beliebige IP-Adresse in dem als Darknet definierten Bereich 10.0.4.0/24 geschickt (siehe Abb. 10.16). Da es diesen Host in meinem Netzwerk nicht gibt, erhalte ich keine Antworten, aber Bro ist das egal. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 345 In Abb. 10.16 können Sie erkennen, dass Bro eine Benachrichtigung vom Typ Darknets::Darknet_Traffic aufgezeichnet hat, sodass wir sie mit Grep oder einem ähnlichen Tool leicht finden können. Die Ausgabe besagt auch, dass Datenverkehr zum Darknet entdeckt wurde (»Traffic detected TO darknet«). Wir wissen also, dass wir es mit einer eingehenden Verbindung zu dem Darknet zu tun haben. Abbildung 10.16: Durch ICMP-Datenverkehr ausgelöste Benachrichtigungen vom Typ Darknet_Traffic Für einen weiteren Test versuchen wir einige TCP-Verbindungen zu der Adresse 192.168.1.100 aufzubauen, die wir zuvor als einzelnen »dunklen« Host eingerichtet haben. Dazu habe ich Verbindungen zu den Ports 80/tcp (HTTP) und 515/udp (UnixDruckspooler) verwendet. Die Benachrichtigungen zu diesen Aktivitäten sehen Sie in Abb. 10.17. Abbildung 10.17: Benachrichtigungen vom Typ Darknet_Traffic für einen dunklen Host In Abb. 10.17 können Sie erkennen, dass Bro eine Reihe von Darknet_Traffic-Benachrichtigungen über Verbindungsversuche zu Port 80 auf 192.168.1.100 und eine Benachrichtigung über Datenverkehr zu und von Port 515 aufgezeichnet hat. Daraus können wir schließen, dass der Host nicht auf die HTTP-Anforderungen reagiert hat, aber am Druckspoolerport lauscht, was bedeuten kann, dass jemand seinen Drucker falsch konfiguriert hat. 346 10 Bro 10.4.7 Das Darknet-Skript erweitern Mit ein klein wenig zusätzlicher Arbeit können wir unser Darknet-Modul für andere Verwendungszwecke anpassen. Wenn beispielsweise Active-Directory-Server laut Ihrer Sicherheitsrichtlinie in einem eigenen besonderen Subnetz untergebracht sein müssen und die Hosts in diesen Subnetzen keinen Zugriff auf das Internet haben dürfen, dann ersetzen Sie in dem Code die Liste der Darknets durch eine Liste der Serversubnetze. Da in dieser Situation aber immer noch eine Menge Datenverkehr zwischen dem AD-Subnetz und dem Rest Ihres internen Netzwerks zu erwarten ist, können Sie nicht einfach bei jedem Ereignis einen Alarm auslösen. Sie können das Modul aber in einer Bro-Instanz ausführen, die nur Datenverkehr vom und zum Internet sieht und daher keinen AD-Datenverkehr wahrnehmen sollte. Eine andere Möglichkeit besteht darin, die Logik des Handlers für new_connection so zu ändern, dass es sich bei der anderen Seite der Verbindung nicht um ein gültiges lokales Subnetz handelt (z. B. indem Sie eine Menge mit Elementen vom Typ subnet verwenden). Auf ähnliche Weise können Sie auch nicht autorisierte Verbindungen zwischen Ihrer DMZ und sensiblen Teilen des internen Netzwerks erkennen (»He, wieso kommuniziert die DMZ da mit dem Computer des Geschäftsführers?«). Es ist auch möglich, die Liste der Subnetze durch eine Liste zugelassener Ports zu ersetzen und damit Verbindungen auf die Verwendung ungewöhnlicher, laut Ihren Richtlinien nicht erlaubter Dienste zu überwachen. Es gibt praktisch unbegrenzte Möglichkeiten, dieses einfache Beispiel an die Bedürfnisse in Ihrem Netzwerk anzupassen, was die Leistungsfähigkeit und Vielseitigkeit veranschaulicht, die das Framework Bro zum Erkennen schädlicher Vorgänge im Netzwerk bietet. 10.4.8 Die Standardverarbeitung von Benachrichtigungen aufheben Wir haben Bro so eingerichtet, dass wir alarmiert werden, wenn irgendetwas versucht, mit einem unserer Darknets zu kommunizieren. Allerdings macht unser Skript keine genauen Angaben darüber, was da mit dem Darknet kommuniziert. Ich habe zuvor gesagt, dass es für die anderen Hosts in Ihrem Netzwerk keinen legitimen Grund geben sollte, mit einem Darknet zu kommunizieren, aber es gibt einige Ausnahmen von dieser Regel, beispielweise die interne Netzwerkzuordnung. Eine Organisation muss manchmal überprüfen, was sich in ihrem Netzwerk befindet, sei es um neue Geräte zu entdecken, die verwaltet werden müssen, oder um sicherzustellen, dass keine unautorisierten Geräte hinzugefügt wurden. Es kann daher sein, dass die Netzwerkingenieure diesen Überprüfungsvorgang regelmäßig durchführen. Auch viele Pakete zum Aufspüren von Schwachstellen bieten diese Funktion an. Es gibt also tatsächlich einige Hosts, die versuchen, mit unseren Darknets zu kommunizieren, wenn auch nur, um sich zu vergewissern, dass die Darknetz tatsächlich noch »dunkel« sind. Wegen solcher legitimen Aktivitäten wollen wir nicht alarmiert werden, aber im jetzigen Zustand erstellt unser Skript Benachrichtigungen für eine ganze Menge dieser Vorgänge. Sehen wir uns nun an, wie wir dieses Problem beheben können. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 347 Dazu gibt es eine Reihe von Möglichkeiten. Wenn wir nur die Techniken nutzen wollen, die wir bereits kennen, können wir in dem Darknet-Modul eine weitere Menge von Adressen für unsere autorisierten Netzwerkscanner anlegen und im Handler für new_connection Code hinzufügen, der vor dem Generieren einer Benachrichtigung überprüft, ob die Kommunikation mit einem Element dieser Menge erfolgt. Das funktioniert sehr gut und stellt eine sinnvolle Erweiterung des Skripts dar. Da wir den ursprünglichen Darknet-Code komplett selbst geschrieben haben, ist dies wahrscheinlich auch die beste Vorgehensweise. Da wir die betreffenden Techniken aber schon alle kennen, wollen wir hier noch eine andere Methode ausprobieren. Nehmen wir daher an, wir hätten den ursprünglichen Darknet-Code von einem anderen Bro-Benutzer bekommen. In diesem Fall wäre es nicht sinnvoll, den Code direkt zu bearbeiten, da wir dann unseren lokalen Patch jedes Mal erneut anwenden und testen müssten, wenn wir eine neue Version des Moduls bekommen. Zum Glück gibt es aber eine andere Möglichkeit: Wir können die Benachrichtigungen von Bro abfangen, bevor sie auf die Festplatte geschrieben werden, sie untersuchen und dann entscheiden, ob wir sie aufzeichnen oder verwerfen lassen oder irgendeine andere Maßnahme ergreifen wollen. Den neuen Code könnten wir in eine eigene Datei packen, wie wir es bei den anderen Beispielen getan haben. Wenn wir ihn direkt in local.bro aufnehmen, bleiben der Code, der das Darknets-Modul lädt, und der Code, der den Umgang mit den Benachrichtigungen ändert, zusammen, was zumindest in diesem Fall die Wartung übersichtlicher und einfacher macht. Das Ende von local.bro mit dem bereits vorhandenen Darknet-Code und den neuen Ergänzungen sieht dann wie folgt aus: # Zeichnet Benachrichtigungen über Datenverkehr von und zu unbenutzten # Subnetzen auf @load darknets.bro redef Darknets::darknets=[ 10.0.4.0/24, 192.168.1.100/32 ]; # Dies sind unsere legitimen Netzwerkscanner, die mit unseren Darknets # kommunizieren dürfen, ohne dass eine Benachrichtigung aufgezeichnet wird. const allowed_darknet_talkers: set[addr]={ 10.0.2.15 }; # Verarbeitet alle Benachrichtigungen mit hoher Priorität und sucht nach # Benachrichtigungen vom Typ Darknets::Darknet_Traffic. Wenn darin die IP# Quell- oder Zieladresse zu einem Element von allowed_darknet_talker gehört, 348 10 Bro # werden alle Aktionen von der Benachrichtigung entfernt, sodass Bro weder # die Benachrichtigung noch einen Alarm aufzeichnet und auch keine E-Mail # oder Pagermeldung sendet. hook Notice::policy(n: Notice::Info) &priority=5 { if(n$note == Darknets::Darknet_Traffic &&(n$conn$id$orig_h in allowed_darknet_talkers || n$conn$id$resp_h in allowed_darknet_talkers)) { # Weist die leere Menge zu und entfernt damit alle Aktionen n$actions=set(); } } Zu Anfang des neuen Codes wird die neue Konstante allowed_darknet_talkers als Menge von IP-Adressen definiert. (Wenn Sie sehr viele Netzwerkscanner oder sonstige zulässige IP-Adressen haben, können Sie stattdessen auch eine Menge von Subnetzen angeben). Ich habe hier als einziges Element der Menge die IP-Adresse meines Scansystems hinzugefügt (10.0.2.15). Als Nächstes deklarieren wir eine neue Art von Funktion, nämlich einen sogenannten Hook. Hooks ähneln Ereignishandlern darin, dass Bro sie aufruft, wenn es Datenverkehr verarbeitet und seine Aufgaben erledigt. Der Hauptunterschied besteht darin, dass sich Ereignisse auf Geschehnisse im Netzwerkverkehr beziehen, während Hooks aufgerufen werden, wenn Bro seine eigenen internen Prozesse ausführt. In diesem Fall erstellt Bro eine neue Benachrichtigung und ruft den Hook Notice::policy auf, um eine lokale Verarbeitung durchzuführen, was die normale Handhabung der Benachrichtigung durch Bro (also die Umsetzung der Benachrichtigungsrichtlinie) ändert. Der Hook nimmt ein einziges Argument entgegen, nämlich n, einen Datensatz vom Typ Notice::Info mit allen Informationen, die Bro über die Benachrichtigung hat. Ein bemerkenswerter Aspekt der Hookdeklaration ist die Verwendung des Schlüsselworts &priority, um der Ausführung der Hookfunktion den Prioritätswert 5 zuzuweisen. Da es für jedes Ereignis mehrere Ereignishandler und für jeden Hook mehrere Hookfunktionen gibt, können Sie in Bro die Reihenfolge festlegen, in der sie aufgerufen werden. Gültige Prioritätswerte sind Integerzahlen von 0 (Standard) bis 5, wobei Hooks und Ereignishandler mit höheren Prioritätswerten vor denen mit niedrigeren Werten aufgerufen werden. Mit &priority=5 sorgen wir also dafür, dass Bro unsere Hookfunktion vor irgendeiner anderen Form von Verarbeitung der Benachrichtigung ausführt, sodass wir eine Gelegenheit haben, die Verarbeitung frühzeitig abzubrechen. Als Erstes muss unser Hook entscheiden, ob die Benachrichtigung verarbeitet werden soll oder nicht. Bro kann viele verschiedene Arten von Benachrichtigungen erstellen, aber wir sind hier nur an denen vom Typ Darknets::Darknet_Traffic interessiert, und das auch nur, wenn eine der beiden IP-Adressen ein Element der Menge allowed_darknet_ talkers ist. In dem ursprünglichen Code für das Modul Darknets haben wir schon gesehen, 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 349 dass wir die Quell- und Zieladressen der fraglichen Verbindung über den Datensatztyp conn_id zugänglich sind. Der Typ Notice::Info enthält einen conn_id-Datensatz mit einem Verweis auf die ursprüngliche Verbindung, deretwegen die Benachrichtigung generiert wurde. Zugriff darauf erhalten wir über n$conn. Daher steht n$conn$id$orig_h für die IP-Adresse des Clients und n$conn$id$resp_h für die des Servers. Die ganze Verarbeitung steht in einer einfachen if-Anweisung am Anfang des Hooks, um sicherzustellen, dass alle Anforderungen erfüllt werden. Wenn nicht, machen wir einfach gar nichts, sodass Bro die Benachrichtigung ganz normal aufzeichnet. Sind die Bedingungen dagegen wahr, verarbeitet Bro den Rumpf des Hooks. Er enthält eine einzige Zeile, die der Variable n$actions die leere Menge zuweist: # Weist die leere Menge zu und entfernt damit alle Aktionen n$actions=set(); Hierzu sind einige Erklärungen erforderlich. Um zu entscheiden, was es mit einer Benachrichtigung tun soll, schaut sich Bro die Liste der zugewiesenen Aktionen an. Diese Liste ist lediglich eine Aufzählung von Typwerten, wobei vier zur Auswahl stehen. Eine Aufstellung und Erklärung dieser Typen finden Sie in Tabelle 10.3. Tabelle 10.3: Bro-Aktionen für Benachrichtigungn Aktion Beschreibung Notice::ACTION_LOG Schreibt die Benachrichtigung in die Datei notice.log. Notice::ACTION_ALARM Schreibt die Benachrichtigung in die Datei alarm.log. Diese Datei wird stündlich per E-Mail an die in der Variable Notice::mail_dest angegebene Adresse gesandt. Notice::ACTION_EMAIL Sendet die Benachrichtigung sofort per E-Mail an die in der Variable Notice::mail_dest angegebene Adresse. Notice::ACTION_PAGE Sendet die Benachrichtigung sofort an die in der Variable Notice::mail_page_dest angegebene Adresse. Dabei handelt es sich normalerweise an ein E-Mail-zu-SMSGateway. Es kann aber auch eine E-Mail-Adresse sein. Der Hook Notice::policy dient dazu, Ihnen eine Möglichkeit zu geben, die Menge der Standardaktionen für eine Benachrichtigung zu ändern, bevor Bro damit beginnt, diese Aktionen auszuführen. In unserem Code weisen wir die leere Menge zu und entfernen dadurch sämtliche Aktionen, womit wir Bro letzten Endes mitteilen: »Mach nichts mit dieser Benachrichtigung.« Nun ist es an der Zeit, den neuen Code auszuprobieren. Wie Sie bereits wissen, legt Bro nach einem Neustart ein frisches, leeres Protokollverzeichnis an, sodass sich keine Benachrichtigungen darin befinden. Zum Testen pingen wir von unserem Scanhost aus eines der 350 10 Bro Darknets an (erfolglos) und stellen eine Verbindung zu dem Druckerport des angegebenen dunklen Hosts her (erfolgreich). Wenn Sie sich die Protokolldateien ansehen, finden Sie aber immer noch keine Benachrichtigungen (siehe Abb. 10.18). Das zeigt, dass unser Hook funktioniert, sodass keine Benachrichtigungen mehr über Datenverkehr von zugelassenen internen Scangeräten generiert werden. Abbildung 10.18: Die Kommunikation von zugelassenen Geräten ruft keine Benachrichtigungen hervor E-Mail-Benachrichtigungen zu Darknet-Ereignissen erstellen Wie bei den anderen Beispielen in diesem Kapitel können Sie auch den Code, der die Protokollierung von Benachrichtigungen des Typs Darknets::Darknet_Traffic deaktiviert, für andere Zwecke umgestalten. Wenn es keine autorisierten Netzwerkscanner in Ihrer Organisation gibt, kann es sein, dass Sie sofort über Ereignisse in Darknets benachrichtigt werden wollen. Dazu können Sie den Code so ändern, dass die Benachrichtigung nicht nur protokolliert, sondern auch per E-Mail gesendet wird. Dazu nehmen Sie lediglich die Überprüfung von n$conn$id$orig_h und n$conn$id$resp_h aus der if-Anweisung heraus und ersetzen die folgenden Zeilen: # Weist die leere Menge zu und entfernt damit alle Aktionen n$actions=set(); durch diesen Code: # Fügt zusätzlich zu der bereits zugewiesenen Standardaktion # Notice::ACTION_LOG die Aktion Notice::ACTION_EMAIL hinzu, sodass die # Benachrichtigung sofort per E-Mail verschickt wird. add n$actions[Notice::ACTION_EMAIL]; Die E-Mail-Adresse müssen Sie als Wert von Notice::mail_dest in der Datei local.bro angeben: 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 351 redef Notice::mail_dest="admin@appliednsm.com"; Nach dem Neustart von Bro erhalten Sie jedes Mal E-Mail-Alarme, wenn ein System versucht, mit einem Ihrer Darknets zu kommunizieren. 10.4.9 Benachrichtigungen unterbinden, E-Mails senden und Alarme auslösen – auf die einfache Weise Im letzten Abschnitt haben wir gesehen, wie wir uns in die Benachrichtigungsverarbeitung von Bro einklinken können, um detaillierte Änderungen daran vorzunehmen und zu entscheiden, wie mit einzelnen Benachrichtigungen umgegangen werden soll. Eine solche chirurgische Präzision ist zwar oft wünschenswert, aber in anderen Fällen braucht man eher einen Vorschlaghammer. Für die zuvor gezeigten Maßnahmen gibt es in Bro auch ein bequemes Schnellverfahren: Sie können einfach bestimmten Konstanten einen neuen Wert zuweisen, um die Richtlinie zur Verarbeitung von Benachrichtigungen für sämtliche Ereignisse eines Typs zu ändern. Nehmen wir an, dass es in Ihrem Netzwerk einen einzigen SSH-Server gibt und dass dieser Server mit dem Internet verbunden ist. Es gibt einen legitimen geschäftlichen Zweck zur Verwendung dieses Servers (die sichere Dateiübertragung für Ihre Geschäftspartner), aber da er vom Internet aus direkt zugänglich ist und den SSH-Standardport benutzt, ist er natürlich ein beliebtes Ziel für Versuche, das Passwort zu erraten. Wenn Sie die SSHUnterstützung von Bro einschalten, wird jedes Mal beim Auftreten einer solchen Aktivität die Benachrichtigung SSH::Password_Guessing protokolliert. Es kann jedoch gut sein, dass Sie dabei Hunderte dieser Benachrichtigungen pro Tag erhalten. Da Sie ohnehin nichts tun können, um diese Arten von Angriffen zu unterbinden, sind diese Benachrichtigungen nur störend. Die SSH-Unterstützung für Bro komplett auszuschalten, ist auch nicht gerade das, was Sie wollen, aber zum Glück gibt es noch eine andere Lösung. Sie besteht darin, den Benachrichtigungstyp SSH::Passwort_Guessing der Liste der Typen hinzuzufügen, die nie protokolliert werden sollen. Bro führt weiterhin eine Überwachung auf solche Vorfälle durch (es kann schließlich sein, dass andere Arten von Benachrichtigungen wissen müssen, ob versucht wird, das Passwort zu erraten), aber die Benachrichtigungen darüber werden Ihnen nie angezeigt. Dazu fügen Sie einfach Folgendes zu local.bro hinzu: # Verhindert die Erstellung von Benachrichtigungen über Versuche, das SSH# Passwort zu erraten redef Notice::ignored_types+= { SSH::Password_Guessing }; Nach dem Neustart von Bro erscheinen keine Benachrichtigungen über Passwortrateversuche mehr in den Protokollen. Das betrifft alle Benachrichtigungen dieser Art von sämtlichen Hosts. Wenn Sie also Benachrichtigungen von einem Host sehen wollen, von einem anderen dagegen nicht, ist dies nicht der richtige Mechanismus. Da wir in unserem 352 10 Bro Beispiel jedoch ohnehin nur einen einzigen SSH-Server haben, ist diese Vorgehensweise ideal für unsere Zwecke geeignet. Auf der anderen Seite kann es auch sein, dass Sie bestimmte Arten von Benachrichtigungen zu Alarmen (Alarmdaten) oder E-Mail-Alarmen hochstufen möchten. Neben wir an, Sie haben mindestens einen mit dem Internet verbundenen Webserver und machen sich Sorgen über SQL-Injektionsangriffe. Wenn Sie das Skript detect-sqli laden (was meistens standardmäßig geladen wird), kann Bro SQL-Injektionsversuche erkennen und erstellt jedes Mal eine Benachrichtigung vom Typ HTTP::SQL_Injection_Attacker, wenn ein Host einen solchen Angriff auf einen Ihrer Server durchführt. (Außerdem erstellt es eine Benachrichtigung vom Typ HTTP::SQL_Injection_Victim für den Zielserver, aber das wollen wir vorläufig ignorieren.) Das Problem ist nur, dass diese Benachrichtigungen zusammen mit allem anderen in die Datei notice.log geschrieben werden. Es wäre besser, wenn sie in alerts.log aufgenommen würden, da Sie automatisch jede Stunde eine Übersicht über diese Datei per E-Mail erhalten. Das können Sie mit folgendem Code in local.bro erreichen: # Alarm bei allen Versuchen von SQL-Injektionsangriffen redef Notice::alarmed_types+= { HTTP::SQL_Injection_Attacker }; Sie können sogar noch weitergehen und sich wie folgt sofort per E-Mail über diese Vorfälle informieren lassen: # Sendet bei allen Versuchen von SQL-Injektionsangriffen sofort eine E-Mail redef Notice::emailed_types+= { HTTP::SQL_Injection_Attacker }; Damit das funktioniert, müssen Sie in beiden Fällen natürlich die Variable Notice::mail_ dest definiert haben, da Bro sonst nicht weiß, wohin es die Benachrichtigungen senden soll. 10.4.10 Den Bro-Protokollen neue Felder hinzufügen In unserem letzten Beispiel kommen wir wieder zu dem Thema vom Anfang dieses Kapitels zurück, nämlich zur Protokollierung. Wie wir bereits gesehen haben, leistet Bro hervorragende Arbeit, um unterschiedliche Arten von Transaktionen festzuhalten, allerdings reichen die Möglichkeiten von Bro manchmal trotzdem nicht aus, etwa wenn Sie für bestimmte Transaktionen zusätzliche Informationen aufzeichnen wollen oder wenn Sie für einige Ereignisse zusätzlichen Kontext benötigen. Es ist ganz einfach und eine gängige Vorgehensweise, den Bro-Protokollen neue Felder hinzuzufügen. Nehmen wir an, Ihre Organisation ist daran interessiert, woher ihr Internet-Datenverkehr stammt bzw. wohin er geht. Eine einfache Möglichkeit, das herauszufinden, besteht darin, Bro die Ländercodes für alle Netzwerkverbindungen abzurufen (sowohl Quell- als auch Zielcodes) und in neue Felder der Datei conn.log zu schreiben. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 353 Erstellen Sie dazu als Erstes die Datei conn-geoip.bro und kopieren Sie folgenden Code hinein: redef record Conn::Info+= { orig_cc: string &optional &log; resp_cc: string &optional &log; }; event connection_state_remove (c: connection) { local client_geo_data=lookup_location(c$id$orig_h); local server_geo_data=lookup_location(c$id$resp_h); if(client_geo_data?$country_code) { c$conn$orig_cc=client_geo_data$country_code; } if(server_geo_data?$country_code) { c$conn$resp_cc=server_geo_data$country_code; } } Hier fügt das Skript zu Anfang dem Datensatz Conn::Info zwei Felder hinzu, in dem Bro Informationen über jede von ihm wahrgenommene Verbindung festhält. Gewöhnlich werden darin Angaben wie der Zeitstempel der Verbindung, ein eindeutiger Bezeichner, die Endpunkte, das Anwendungsschichtprotokoll usw. festgehalten. Die beiden Felder, die wir hinzufügen, heißen orig_cc und resp_cc und dienen dazu, die Ländercodes der Endpunkte zu speichern. Bei beiden neuen Feldern sind zwei Optionen angegeben, die nicht Teil des Datensatzes selbst sind, sondern Bro anweisen, wie es unter verschiedenen Umständen mit diesen Feldern umgehen soll. Mit &log weisen wir Bro an, den Wert des Feldes in die Protokolldatei zu schreiben, wenn es den Eintrag in conn.log vornimmt. Ohne diese Option würden die Daten zwar von Bro abgerufen werden, aber nie in der Protokolldatei auftauchen. Die Option &optional besagt, dass es kein Problem darstellt, wenn dieses Feld keinen Wert hat (etwa wenn es sich bei einem der Endpunkte um eine RFC-1918-Adresse ohne geografische Bindung handelt). Wenn das der Fall ist, schreibt Bro einfach einen Strich in das Feld, was bei allen Feldern in allen Protokollen das Standardverhalten für fehlende Werte ist. Sie können statt &optional auch &default="None" schreiben (oder mit &default irgendeinen anderen Wunschstring angeben), um in einer solchen Situation einen anderen Wert in das Protokoll schreiben zu lassen, aber da der Bindestrich überall sonst als Standardersatzwert verwendet wird, bleiben wir der Einheitlichkeit halber dabei. Als Nächstes schreiben wir einen einfachen Handler für das Ereignis connecton_state_ remove, das Bro generiert, bevor es eine aktive Verbindung aus seiner Statustabelle entfernt und das Protokoll auf die Festplatte schreibt. Darin verwenden wir die im Lieferumfang von Bro enthaltene Funktion lokkup_location(). Sie nimmt eine IP-Adresse als 354 10 Bro Argument entgegen und gibt einen Datensatz vom Typ geo_location zurück, der wie folgt definiert ist: type geo_location: record { country_code: string; region: string; city: string; latitude: double; longitude: double; } Unser Skript stellt zwei Anforderungen zum Abrufen des Standorts, jeweils eine für jede Seite der Verbindung, wobei die IP-Adressen aus dem Datensatz mit der Verbindungs-ID bezogen werden: local client_geo_data=lookup_location(c$id$orig_h); local server_geo_data=lookup_location(c$id$resp_h); Danach prüft es, ob die Rückgabewerte den Ländercode enthalten. Wenn ja, wird dieser Code dem entsprechenden Feld in dem neu definierten Datensatz mit Informationen über die Verbindung hinzugefügt. Anderenfalls geschieht nichts. if(client_geo_data?$country_code) { c$conn$orig_cc=client_geo_data$country_code; } Das war es auch schon! Da wir für die beiden neuen Felder im Datensatz Conn::Info die Option &log angegeben haben, werden die entsprechenden Werte in die Datei conn.log geschrieben. Der Handler connecton_state_remove muss die Werte nur noch abrufen und in den Datensatz einfügen. Um den Rest kümmert sich Bro. Damit sind wir bereit, unser Skript einzusetzen. Sie wissen bereits, wie Sie es Ihrer laufenden Bro-Instanz hinzufügen können, um es kontinuierlich ausführen zu lassen. Zur Veranschaulichung testen wir es hier aber wieder an der Befehlszeile für eine PCAP-Datei. In Abb. 10.19 sehen Sie das hintere Ende des Verbindungsprotokolls mit den IP-Adressen und Standortdaten für die einzelnen Endpunkte. 10.4 Eigene Erkennungswerkzeuge mit Bro erstellen 355 Abbildung 10.19: Verbindungsprotokolle mit GeoIP-Informationen Achtung Für dieses Beispiel ist eine sehr wichtige Voraussetzung erforderlich, die wir noch nicht besprochen haben, nämlich die GeoIP-Datenbank. Bro kennt nicht alle möglichen IP-Adressen und Ländercodes, sondern greift dafür auf die GeoIPLiteDatenbank von MaxMind zurück (http://www.maxmind.com). In Security Onion ist diese Datenbank standardmäßig installiert, aber auf einem anderen System müssen Sie sie möglicherweise nachinstallieren. Glücklicherweise ist GeoLite als installierbares Paket für die meisten Linux- und *BSD-Plattformen erhältlich. MaxMind stellt auch andere Datenbanken mit ausführlicheren Informationen zur Verfügung. Die GeoIPLite-Standarddatenbank enthält nur die Ländercodes und das auch nur für IPv4-Adressen. Damit kann Bro in der Struktur geo_­ location keine anderen Felder als nur die für die Ländercodes ausfüllen. In anderen MaxMind-Datenbanken werden jedoch auch die Städte und die geografische Länge und Breite angegeben, und zwar sowohl für IPv4 als auch für IPv6. Wenn Sie ausführlichere Ortsangaben benötigen oder sehr oft mit IPv6-fähigen Hosts zu tun haben, schauen Sie sich auf http://dev.maxmind.com/geoip/legacy/geolite/ die Anleitungen zum Herunterladen und Installieren dieser zusätzlichen Datenbanken an. Wenn Sie diese erweiterten Datenbanken nicht installieren, funktioniert die Standortsuche nach wie vor, allerdings werden die meisten Werte in der Struktur geo_location dann nicht ausgefüllt. Wenn Bro vergeblich versucht, diese Datenbanken zu öffnen, können auch Warnungen wie die in Abb. 10.19 angezeigt werden, die Sie aber getrost ignorieren können. 356 10 Bro 10.5 Zuammenfassung Zu Anfang dieses Kapitels haben Sie einen Überblick über die Grundprinzipien von Bro und die Protokolldateien bekommen und dann eine praktische Einführung in die Programmierung in Bro erhalten. Dabei haben wir einige einfache, aber sehr nützliche Aufgaben ausgeführt, z. B. den Abruf von Dateien und die Überwachung von Darknets. Es wurden auch einige Techniken vorgestellt, die Sie immer wieder für die Arbeit in Bro brauchen werden, z. B. der Umgang mit Benachrichtigungen und Alarmen, die Optimierung der Konfiguration und der Protokollierungseinstellungen sowie das Schreiben eigener Module. Dabei haben wir jedoch nur an der Oberfläche gekratzt, denn wie sehr man sich auch bemüht, ist es doch nicht möglich, Bro mit einem einzigen Kapitel gerecht zu werden. Bro hätte ein eigenes Buch verdient, aber in Ermangelung dessen sollten Sie sich vorläufig auf der Website http://bro.org umsehen, insbesondere in den E-Mail-Listen. Die Bro-Community ist sehr aktiv und wächst rasch, und viele andere Bro-Benutzer sind bereit, Ihre Fragen zu beantworten, Skripte zu veröffentlichen und neue Möglichkeiten auszukundschaften, was mit der Plattform alles angestellt werden kann. Um zeitnah Hilfe zu erhalten, können Sie sich auch den Freenode-IRC-Kanal #bro ansehen, wo fast immer irgendwelche Leute anwesend sind, die Ihre Fragen beantworten oder einfach mit Ihnen über die tollen neuen Sachen reden, die sie gerade mit Bro machen. Nach der Meinung der Autoren dieses Buches und vieler anderer NSM-Experten ist Bro die Zukunft der effizienten NSM-Erkennung. 11 Anomaliegestützte Erkennung anhand von statistischen Daten Die Grundlage des Network Security Monitorings besteht darin, Daten zu erfassen, um eine Erkennung und Analyse daran ausführen zu können. Da hierbei so viele Daten gesammelt werden, ist es möglich, statistische Daten daraus zu gewinnen, und auch, diese zur Erkennung und Analyse heranzuziehen. In diesem Kapitel sehen wir uns die Möglichkeiten an, Statistiken für eine Echtzeit- und eine rückblickende Erkennung aufzustellen. Statistische Daten werden aus der Erfassung, Gliederung, Analyse, Interpretation und Darstellung der vorhandenen Daten abgeleitet.1 Angesichts der ungeheuren Menge von Daten, mit denen NSM-Teams zu arbeiten haben, spielen statistische Daten eine große Rolle bei der Erkennung und Analyse – von der Analyse des Datenverkehrs, der von einem bestimmten gegnerischem Host ausgeht, bis zu Aufdeckung des gesamten Sichtfelds eines neuen Sensors. In den Produkten der großen Marken auf dem Gebiet des NSM werden statistische Daten oft in Form von ineinander verschachtelten Dashboards anzeigt. Das wird teilweise als Argument genutzt, um die Wände in den Büros Ihrer Organisation mit 70"-Plasmabildschirmen zu tapezieren und die Vorgesetzten der Vorgesetzten zu beeindrucken. Auf die richtige Weise eingesetzt, bieten diese Daten jedoch tatsächlich einen großen Nutzen. 1 Dodge, Y. (2006), The Oxford Dictionary of Statistical Terms, OUP. ISBN 0-19-920613-9 358 11 Anomaliegestützte Erkennung anhand von statistischen Daten 11.1 Kommunikationsintensive Hosts mit SiLK finden Ein einfaches Beispiel für statistische Daten ist die Liste der kommunikationsintensivsten Hosts in Ihrem Netzwerk, also der Geräte, die die umfangreichste Kommunikation im überwachten Netzwerksegment hervorrufen. Anhand dieser Statistik kann ein NSMTeam beispielsweise Geräte finden, von denen ein verdächtig umfangreicher Datenverkehr zu externen Hosts ausgeht, oder Computer aufspüren, die mit Malware verseucht sind und deshalb Verbindungen zu sehr vielen verdächtigen externen IP-Adressen aufbauen. Damit können Dinge erkannt werden, die sich mit Signaturen nicht feststellen lassen, da es sich um echte Netzwerkanomalien handelt. Ohne die richtigen Werkzeuge und ohne Zugriff auf Netzwerkdaten kann es schwierig sein, eine solche Liste aufzustellen. Mit Analysewerkzeugen für Sitzungsdaten wie SiLK und Argus wird diese Aufgabe jedoch ganz einfach. In Kapitel 4 haben wir uns bereits verschiedene Möglichkeiten angesehen, Sitzungsdaten zu erfassen und auf einfache Weise zu untersuchen. Dabei haben wir auch SiLK besprochen, ein Werkzeug zur effizienten Erfassung, Speicherung und Analyse von Flussdaten. SiLK umfasst verschiedene nützliche Tools, um Statistiken und Messwerte zu erstellen. Dabei muss der Benutzer die Quelldaten angeben und dann die gewünschten Tools zum Anzeigen, Sortieren, Zählen, Gruppieren und Kombinieren dieser Daten auswählen. Um die Liste der kommunikationsintensivsten Hosts aufzustellen, verwenden wir im Folgenden die Tools Rwstats und Rwcounts. SiLK wird oft benutzt, um Flussdaten direkt anzuzeigen, aber mit Rwstats können Sie die Sitzungsdaten auf eine Weise nutzen, die Ihnen ein besseres Verständnis der Umgebung gibt. In allen Umgebungen, die ich kenne und in denen SiLK verwendet wird, ist Rwstats das am häufigsten genutzte Werkzeug, um statistische Daten zu gewinnen. Wie immer bei derVerwendung von SiLK empfehle ich Ihnen, als Erstes einen RwfilterBefehl zu verwenden, um die Datenmenge zu überprüfen, die Sie zur Gewinnung der Statistiken verwenden wollen. Dazu reicht es im Allgemeinen, den passenden Filter zusammenzustellen und das Ergebnis an Rwcut zu leiten, um es auszugeben, sodass Sie sich vergewissern können, dass Sie tatsächlich mit der gewünschten Datenmenge arbeiten. Wenn Sie sich mit Rwfilter und der Weiterleitung der Ergebnisse eines Rwtools an ein anderes nicht auskennen, sollten Sie noch einmal in Kapitel 4 nachschlagen. In den meisten der folgenden Beispiele verwenden wir einfache Rwfilter-Abfragen, sodass Sie sie mit einer Standardbereitstellung von SiLK nachvollziehen können. Für Rwstats müssen Sie lediglich drei Dinge angeben: einen Eingabeparameter, einen Satz von Feldern, für die Statistiken erstellt werden sollen, und eine Beendigungsbedingung, um die Ergebnisse einzugrenzen. Bei dem Eingabeparameter kann es sich um einen Dateinamen handeln, den Sie an der Befehlszeile angeben. Meistens jedoch werden als Daten die Ergebnisse eins Rwfilter-Befehls von der Standardeingabe gelesen. Diese Eingabe sollte direkt vom Rwfilter ohne Zwischenverarbeitung durch Rwcut stammen. 11.1 Kommunikationsintensive Hosts mit SiLK finden 359 Die Felder, die Sie angeben, bilden einen benutzerdefinierten Schlüssel, anhand dessen die SiLK-Flussdatensätze gruppiert werden. Daten, die mit dem Schlüssel übereinstimmen, werden in einzelnen Behältern für jede Übereinstimmung gespeichert. Anhand der Größe dieser Behälter (ob in Bytes, Datensätzen, Paketen oder Anzahl unterschiedlicher Kommunikationsdatensätze) wird dann eine Liste erstellt und nach Größe geordnet, standardmäßig absteigend, aber auf Wunsch des Benutzers auch aufsteigend. Die Beendigungsbedingung begrenzt die Ergebnisse und kann als absoluter Wert angegeben werden (»gib 20 Behälter aus«), als Schwellenwert (»gib nur die Bins mit einer Byteanzahl kleiner 400 aus«) oder als Prozentsatz der angegebenen Gesamtgröße (»gib nur Behälter aus, die mindestens 10 % aller Pakete enthalten«). Der erste Schritt, um unsere Liste der kommunikationsintensivsten Hosts aufzustellen, besteht darin, einen geeigneten Rwfilter-Befehl zusammenzustellen, der uns die zu untersuchenden Daten liefert. Mit einem Pipe-Symbol übergeben wir diese Daten an Rwstats. Der Befehl sieht wie folgt aus: rwfilter --start-date=2013/08/26:14 --any-address=102.123.0.0/16 --type=all --pass=stdout | rwstats --top --count=20 --fields=sip,dip --value=bytes Dieser Filter erfasst alle Flussdatensätze, die von 14 bis 15 Uhr am 26. August 2013 gesammelt wurden, wobei nur Datenverkehr im IP-Adressbereich 102.123.0.0/16 berücksichtigt wird. Diese Daten werden von Rwstats übergeben, das daraus die Liste der 20 (--count=20) Kombinationen aus Quell- und Ziel-IP-Adressen (--fields=sip,dip) mit dem größten Verkehrsaufkommen nach Anzahl der Bytes (--value=bytes) aufstellt. Das gleiche Ergebnis erhalten wir, wenn wir die Ergebnisse des Rwfilter-Befehls in eine Datei schreiben und diese Datei von Rwstats untersuchen lassen. Wenn wir diese Datei test.rwf nennen, lauten die beiden dazu erforderlichen Befehle wie folgt: rwfilter --start-date=2013/08/26:14 --any-address=102.123.0.0/16 --type=all --pass=stdout>test.rwf rwstats test.rwf --top --count=20 --fields=sip,dip --value=bytes Das Ergebnis dieser Befehle sehen Sie in Abb. 11.1. 360 11 Anomaliegestützte Erkennung anhand von statistischen Daten Abbildung 11.1: Von Rwstats aufgestellte Statistik der kommunikationsintensivsten Hosts In den in Abbildung 11.1 gezeigten Daten können Sie mehrere äußerst aktive Geräte im lokalen Netzwerk erkennen. Geräte, bei denen dies nicht zu erwarten gewesen wäre, sollten Sie einer genaueren Untersuchung unterziehen. Beispielsweise ist Host 102.123.222.245 für eine sehr große Menge von Datenverkehr verantwortlich. Um uns diese Kommunikation näher anzusehen, können wir weitere Statistiken aufstellen. Wenn Sie denselben Befehl noch einmal ausführen, dabei aber den CIDR-Bereich in der Rwfilter-Anweisung durch die IP-Adresse des geschwätzigen Hosts ersetzen, können Sie erkennen, welche Geräte, mit denen er kommuniziert, für diese Mengen von Datenverkehr verantwortlich sind. rwfilter --start-date=2013/08/26:14 --any-address=102.123.222.245 --type=all --pass=stdout | rwstats --top --count=5 --fields=sip,dip --value=bytes Die Statistiken, die diese Abfrage hervorruft, sehen Sie in Abb. 11.2. 11.1 Kommunikationsintensive Hosts mit SiLK finden 361 Abbildung 11.2: Die bedeutendsten Kommunikationspartner eines einzelnen Hosts Damit können Sie herausfinden, wer für ein abnorm hohes Maß an Datenverkehr verantwortlich ist. Um auch zu erfahren, um was es bei der Kommunikation zwischen den Geräten geht, ändern wir die Suchkriterien und forschen nach den verwendeten Diensten: rwfilter --start-date=2013/08/26:14 --any-address=102.123.222.245 --type=all --pass=stdout | rwstats --top --count=5 --fields=sip,sport,dip --value=bytes Die Datenmenge, auf die dieser Befehl angewendet wird, ist unverändert geblieben, allerdings ziehen wir hier das Quellportfeld als zusätzliches Kriterium für die Statistiken heran. Das Ergebnis sehen Sie in Abb. 11.3. Abbildung 11.3: Statistiken für die Nutzung von Diensten Die Vorgänge stehen offenbar in Verbindung mit einer Art SSH-Verbindung, aber bevor wir den Benutzer befragen oder andere Datenquellen zur Bestätigung heranziehen, wollen wir weitere Statistiken aufstellen, um auch zu klären, wann die Kommunikation stattfindet. Dazu wenden wir uns vorübergehend von Rwstats ab und nutzen Rwcount, ein weiteres Tool im Analysepaket SiLK, das eine Übersicht über die zeitliche Abfolge der SiLK-Flussdatensätze geben kann. Um das zu tun, zählt es die Datensätze im Eingabestream und sortiert die Angaben über die Anzahl der Bytes und Pakete in Behältern, die Zeitabschnitte darstellen. Wenn Sie einen Rwfilter-Befehl direkt an Rwcount weiterleiten, erhalten Sie eine Tabelle, die angibt, wie Datensätze, Bytes und Pakete jeweils in Abschnitten von 30 s übertragen wurden. Mit der Option --bin-size können Sie die Größe dieser Zeitabschnitte ändern. In unserem Beispiel verwenden wir folgenden Befehl: rwfilter --start-date=2013/08/26:14 --any-address=102.123.222.245 --sport=22 --type=all --pass=stdout | rwcount --bin-size=600 362 11 Anomaliegestützte Erkennung anhand von statistischen Daten Da wir herausfinden wollen, wann Datenverkehr über Port 22 aufgetreten ist, verwenden wir im Rwfilter-Filter befehl die Option --sport=22. Außerdem haben wir Rwstats durch Rwcount ersetzt, um herauszufinden, in welchen Zeitabschnitten die Daten übertragen wurden. Weiter hinten in diesem Kapitel werden wir uns noch ausführlicher mit Rwcount beschäftigen. Hier verwenden wir nur eine einzige Option, nämlich --bin-size, um den Datenverkehr in Abschnitte von 10 Minuten (600 s) gruppieren zu lassen. Die Ergebnisse dieses Befehls sehen Sie in Abb. 11.4. Abbildung 11.4: Ergebnisse von Rwcount mit Angaben darüber, wann die Kommunikation stattgefunden hat Die Datenübertragung scheint im Zeitverlauf relativ konstant zu erfolgen, was darauf hindeutet, dass der SSH-Tunnel genutzt wurde, um eine große Menge von Daten zu übertragen. Daber kann es sich um eine schädliche Aktivität wie das Herausschmuggeln von Daten handeln, aber auch die legitime Nutzung des SCP-Tools, um Daten zur Sicherung auf ein anderes System zu übertragen. Um das unterscheiden zu können, müssten Sie weitere Datenquellen analysieren. Die Statistiken, die wir bis jetzt aufgestellt haben, geben den Analytikern aber schon eine gute Vorstellung davon, wo sie als Nächstes nachforschen sollten. 11.2 Diensterkennung mit SiLK Mit Rwstats können Sie auch schützenswerte Elemente in Ihrem eigenen lokalen Netzwerk aufspüren. Wenn ein neuer Server im Produktionsnetzwerk platziert wird, sollte das Sicherheitsteam eigentlich darüber informiert werden, sodass es ihn schützen kann, doch in der Praxis erhalten Analytiker solche Informationen nur selten zeitnah. Sofern sich diese Server aber in dem Netzwerkbereich befinden, den Sie schützen sollen, können Sie einen Mechanismus vorhalten, um ihre Gegenwart aufzuspüren. Dadurch können Sie sich nicht nur über die eigenen Geräte auf dem Laufenden halten, sondern auch unautorisierte und gegnerische Server finden, die von eigenen Benutzern oder Angreifern bereitgestellt wurden. 11.2 Diensterkennung mit SiLK 363 Mit Rwstats können wir diese Server relativ leicht entdecken. Im folgenden Beispiel versuchen wir, bedeutende Server ausfindig zu machen, die regelmäßig mit Geräten außerhalb des lokalen Netzwerks kommunizieren. Dazu erstellen wir zunächst einen Rwfilter, um die Datenmenge zusammenzustellen, auf deren Grundlage Sie die Statistiken anlegen wollen. Im Idealfall sollten Sie diese Abfrage regelmäßig ausführen und ihre Ergebnisse untersuchen, um Schadserver zu entdecken, die nur vorübergehend bereitgestellt und dann wieder abgeschaltet werden. Im folgenden Beispiel arbeiten wir mit einer von Rwfilter bereitgestellten Datei, die wir an Rwstats übergeben, anstatt kontinuierlich eine Datenmenge zusammenzustellen und weiterzuleiten. Der Filter legt eine Datenmenge mit dem gesamten Datenverkehr für einen gegebenen Zeitraum an und schreibt sie in die Datei sample.rw. rwfilter --start-date=2013/08/28:00 --end-date=2013/08/28:23 --type=all --protocol=0- --pass=sample.rw Als Nächstes müssen wir überlegen, was für Statisken wir überhaupt haben wollen. Um das zu bestimmen, ist es immer sinnvoll, eine Frage zu stellen, die Sie anschließend in die Rwstats-Syntax übersetzen. In diesem Fall könnten wir uns fragen: »Welche lokalen Geräte kommunizieren am meisten über die üblichen Serverports 1 bis 1024?« Auf diese Frage kann es jedoch mehrere Antworten geben. Die Grenze, die Sie ziehen, um zu definieren, was »am meisten« ist, kann eine entscheidende Rolle dabei spielen, ob Sie die Ergebnisse bekommen, die Sie haben wollen. Formulieren wir unsere Frage daher etwas konkreter: »Welche 20 lokalen Geräte kommunizieren über die Ports 1 bis 1024 zu den meisten unterschiedlichen IP-Zieladressen außerhalb des lokalen Netzwerks?« Übersetzt in die Form eines Rwstats-Befehls, sieht diese Frage wie folgt aus: rwfilter sample.rw --type=out,outweb --sport=1-1024 --pass=stdout | rwstats --fields=sip,sport --count=20 --value=dip-distinct Das Ergebnis dieser Abfrage sehen Sie in Abb. 11.5. 364 11 Anomaliegestützte Erkennung anhand von statistischen Daten Abbildung 11.5: Kommunikationsintensivste Server Diese Abfrage gibt die IP-Quelladressen und Ports (--fields=sip,sport) der 20 lokalen Server (--count=20) zurück, die mit den meisten verschiedenen externen Geräten kommuniziert haben (--value=dip-distinct). Die Datenmenge, an der diese Abfrage ausgeführt wird, ist durch die Anwendung eines Rwfilters auf die Daten in der bereits generierten Datei sample.rw noch weiter eingeschränkt worden und umfasst nur noch den ausgehenden Datenverkehr über die Ports 1 bis 1024 (--type=out,outweb --sport=1-1024). Damit bekommen wir schon eine gewisse Vorstellen von dem, was wir wissen wollen, aber was ist mit Serverdatenverkehr, der keine Kommunikation mit externen Hosts einschließt? Wenn Ihr Flusskollektor (ein Sensor oder Router) so aufgestellt ist, dass er auch Datenverkehr zwischen internen Geräten erfasst, können Sie diesen mit der zusätzlichen Angabe int2int bei der Option --type ebenfalls einbeziehen. Um die Qualität der Daten zu verbessern und uns bessere Voraussetzungen zum Anlegen statistischer Daten zu verschaffen, können wir die Datenmenge außerdem auf die IP-Quelladressen aus den Netzwerkbereichen einschränken, für deren Schutz wir verantwortlich sind. Dabei handelt es sich gewöhnlich um die Werte, die in der SiLK-Datei sensor.conf als interne IP-Adressblöcke definiert sind. Die beste Möglichkeit dazu besteht darin, eine Menge zu erstellen, die aus diesen Blöcken besteht. Die Rwtools von SiLK verwenden Mengendateien, um auf Gruppen von IP-Adressen zu verweisen. Um eine solche Datei anzulegen, stellen Sie einfach alle IP-Adressen (einschließlich CIDR-Bereiche) in eine Textdatei und wandeln diese mit dem Befehl rwsetbuild um: rwsetbuild local.txt local.set 11.2 Diensterkennung mit SiLK 365 Dieser Befehl gibt die Liste der in local.txt definierten IP-Adressblöcke in Form der Mengendatei local.set aus. Damit können wir nun folgenden Befehl verwenden, um die Daten zu bekommen, die wir haben wollen: rwfilter sample.rw --sipset=local.set --type=int2int,out,outweb --sport=1-1024 --pass=stdout | rwstats --fields=sip,sport --count=20 --value=dip-distinct Mit der Option --sipset im Rwfilter-Befehl schränken wir die Daten auf die IP-Quelladressen aus dem Netzwerk ein, für dessen Schutz wir verantwortlich sind. Mit nur kleinen Änderungen können Sie diese Befehle mit erstaunlicher Genauigkeit an Ihre Umgebung anpassen. Stellen Sie sich vor, Sie untersuchen die Top-20-Liste, die bei unserer bisherigen Abfrage herauskommt, und kommen dabei zu dem Schluss, dass Sie sich lieber alle Server ansehen sollten, die mit mindestens zehn verschiedenen Geräten kommunizieren. Dazu müssen Sie einfach die Angabe --count=20 in --threshold=10 ändern. Die Ergebnisse können Sie noch weiter verändern, indem Sie den Portbereich eingrenzen oder eine neue Mengendatei anlegen. Beachten Sie, dass wir uns hier auf die Suche nach Diensten konzentrieren. Durch die Angabe von --fields=sip,sport werden die kommunikationsintensivsten Kombinationen aus Quelladresse und Quellport angezeigt. Um ganz allgemein die Server zu finden, die mit den meisten verschiedenen IP-Zieladressen kommunizieren, müssen Sie das Feldkriterium sport aus dem RwstatsBefehl entfernen, sodass sämtliche Verbindungen des Geräts berücksichtigt werden: rwfilter sample.rw --sipset=local.set --type=all --sport=1-1024 --pass=stdout| rwstats --fields=sip --count=20 --value=dip-distinct Wenn wir auf die Ergebnisse dieser Abfrage weitere Rwstats-Befehle anwenden, um (wie in den früheren Beispielen) gezielt einzelne Adressen zu untersuchen, erhalten Sie eingehendere Information über die Dienste, die auf den Geräten in der Liste ausgeführt werden. Um sich beispielsweise die meistgenutzten Dienste auf 192.168.1.21 anzusehen, können Sie nach einzelnen Quellports mit mindestens zehn verschiedenen ausgehenden Verbindungen suchen. Geben Sie dazu die IP-Adresse in Rwfilter an und verwenden Sie in dem Rwstats-Befehl den Schwellenwertparameter: rwfilter sample.rw --saddress=192.168.1.21 --type=all --pass=stdout|rwstats --fields=sport --threshold=10 --value=dip-distinct Das Ergebnis dieses Befehls sehen Sie in Abb. 11.6. 366 11 Anomaliegestützte Erkennung anhand von statistischen Daten Abbildung 11.6: Weitergehende Suche nach den Diensten auf einem bestimmten Gerät In ihrem hervorragenden Artikel »Network Profiling Using Flow« beschreiben Austin Whisnant und Sid Faber, wie Sie Netzwerkelemente auf diese Weise mithilfe von Sitzungsdaten aufspüren können.2 Darin erklären sie ausführlich, wie Sie die verschiedenen SiLK-Tools nutzen müssen – hauptsächlich Rwstats –, um ein Netzwerkprofil der wichtigen Elemente und Server aufzustellen. Die Autoren bieten sogar einige Skripte an, um diesen Erkennungsvorgang zu automatisieren. Dabei wird mit Rwfilter eine Stichprobe der Daten erstellt (wie in unseren vorherigen Beisielen die Datei sample.rw). Wenn Sie den Anleitungen aus diesem Aufsatz folgen, können Sie ein genaues Modell der Netzwerk­ elemente aufstellen und Datenmengen anlegen, die für weitere SiLK-Abfragen praktisch sind. Das ist nützlich, um Informationen über das eigene Netzwerk zu gewinnen (was wir in Kapitel 14 ausführlicher besprechen werden) und um Bedrohungen zu erkennen. Dieser Artikel stellt eine hervorragende Ergänzung zu diesem Kapitel dar. Die Beispielbefehle, die Whisnant und Faber bringen, sind so aufgebaut, dass Sie wirklich mit hoher Genauigkeit die relevanten Daten sehen. Um Ihnen einige Beispiele dieser Genauigkeit zu geben, habe ich einige der Abfrageanweisungen aus »Network Profiling Using Flow« in Einzeiler übersetzt. Probieren Sie sie aus, um ausführliche Informationen über die in Ihrem Netzwerk bereitgestellten Dienste zu bekommen: Webserver rwfilter sample.rw --type=outweb --sport=80,443,8080 --protocol=6 --packets=4- --ack-flag=1 --pass=stdout|rwstats --fields=sip --percentage=1 --bytes --no-titles|cut -f 1 -d "|"|rwsetbuild>web_servers.set ; echo Potential Web Servers:;rwfilter sample.rw --type=outweb --sport=80,443,8080 --protocol=6 --packets=4- --ack-flag=1 --sipset=web_servers.set --pass=stdout|rwuniq --fields=sip,sport --bytes --sort-output E-Mail-Server echo Potential SMTP servers ;rwfilter sample.rw --type=out --sport=25,465,110,995,143,993 --protocol=6 --packets=4- --ackflag=1 --pass=stdout|rwset --sip-file=smtpservers.set ;rwfilter sample.rw --type=out --sport=25,465,110,995,143,993 --sipset=smtpservers.set --protocol=6 --packets=4- --ack-flag=1 --pass=stdout|rwuniq --fields=sip --bytes --sort-output 2 http://www.sei.cmu.edu/reports/12tr006.pdf 11.2 Diensterkennung mit SiLK 367 DNS-Server echo DNS Servers: ;rwfilter sample.rw --type=out --sport=53 --protocol=17 --pass=stdout|rwstats --fields=sip --percentage=1 --packets --no-titles|cut -f 1 -d "|"| rwsetbuild>dns_servers.set ;rwsetcat dns_servers.set VPN-Server echo Potential VPNs: ;rwfilter sample.rw --type=out --protocol=47,50,51 --pass=stdout|rwuniq --fields=sip --no-titles|cut -f 1 -d "|" |rwsetbuild>vpn. set ;rwfilter sample.rw --type=out --sipset=vpn.set --pass=stdout|rwuniq --fields=sip,protocol --bytes --sort-output FTP-Server echo -e "\nPotential FTP Servers"; rwfilter sample.rw --type=out --protocol=6 --packets=4- --ack-flag=1 --sport=21 --pass=stdout|rwstats --fields=sip --percentage=1 --bytes --no-titles|cut -f 1 -d "|"|rwsetbuild> ftpservers.set ;rwsetcat ftpservers.set ; echo FTP Servers making active connections: ;rwfilter sample.rw --type=out --sipset=ftpservers.set --sport=20 --flags-initial=S/SAFR --pass=stdout|rwuniq --fields=sip SSH-Server echo -e "\nPotential SSH Servers"; rwfilter sample.rw --type=out --protocol=6 --packets=4- --ack-flag=1 --sport=22 --pass=stdout|rwstats --fields=sip --percentage=1 --bytes --no-titles|cut -f 1 -d "|"|rwsetbuild> ssh_servers.set ;rwsetcat ssh_servers.set TELNET-Server echo -e "\nPotential Telnet Servers"; rwfilter sample.rw --type=out --protocol=6 --packets=4- --ack-flag=1 --sport=23 --pass=stdout| rwstats --fields=sip --percentage=1 --bytes --no-titles|cut -f 1 -d "|"|rwsetbuild>telnet_servers.set ;rwsetcat telnet_servers.set Übrige Server echo Leftover Servers: ;rwfilter sample.rw --type=out --sport=1-19,24,26-52,54-499,501-1023 --pass=stdout|rwstats --fields=sport --percentage=1 368 11 Anomaliegestützte Erkennung anhand von statistischen Daten Zur Erkennung würden diese Befehle regelmäßig ausgeführt und die Ergebnisse eines Durchlaufs mit denen des vorherigen verglichen. Wenn dabei ein neues Servergerät auftaucht, sollte es untersucht werden. 11.3 Weitere Erkennungsmöglichkeiten mithilfe von Statistiken In den meisten Organisationen kommt der Großteil der Berichte über Zwischenfälle aufgrund der kontinuierlichen Analyse und der Analyse der Alarmdaten zustande. Wenn ein neuer Alarm generiert wird, kann es sinnvoll sein, aus den Sitzungsdaten Statistiken aufzubreiten, um das Vorhandensein ähnlicher Indikatoren auf anderen Hosts zu erkennen. Betrachten Sie als Beispiel den Alarm aus Abb. 11.7. Abbildung 11.7: Ein von Snort ausgelöster ZeuS-Alarm Dieser Alarm wurde ausgelöst, weil es Beweise für die Kommunikation eines Geräts gab, das bekanntermaßen mit der Steuerung des ZeuS-Botnetzes zu tun hat. Auf den ersten Blick sieht es so aus, als umfasse diese Kommunikation nur NTP-Datenverkehr, da sie mit dem Protokoll UDP über Port 123 abgewickelt wurde. Ohne Zugriff auf die Payload der Pakete (was bei einer rückblickenden Analyse der Fall sein kann) besteht die Gefahr, dass ein Analytiker diesen Zwischenfall nicht weiter beachtet, da es keine unmittelbaren Indikatoren einer tatsächlich erfolgten Infizierung gibt. 11.3 Weitere Erkennungsmöglichkeiten mithilfe von Statistiken 369 Es besteht zwar die Möglichkeit, dass die eigentliche Kommunikation durch die Verwendung des NTP-Standardports verschleiert wird, aber ohne zusätzliche Informationen lässt sich das nicht verifizieren. Um weitere Einzelheiten in Erfahrung zu bringen, müssen wir die weitere Kommunikation mit dem Host untersuchen. Dazu ermitteln wir, ob der Host noch mit anderen verdächtigen »NTP-Servern« kommuniziert. In diese Abfrage nehmen wir auch das Feld für den Ländercode auf, da wir (bei einer in den USA heimischen Organisation) erwarten, dass unsere Geräte nur mit NTP-Servern in den USA in Verbindung treten. Das führt uns zu folgendem Befehl: rwfilter --start-date=2013/09/02 --end-date=2013/09/02 --anyaddress=192.168.1.17 --aport=123 --proto=17 --type=all --pass=stdout | rwstats --top --fields=dip,dcc,dport --count=20 Hier verwenden wir Rwstats, um die Geräte anzuzeigen, mit denen 192.168.1.17 über Port 123 kommuniziert. Das Ergebnis sehen Sie in Abb. 11.8, wobei einige IP-Adressen anonymisiert wurden. Abbildung 11.8: Der interne Host kommuniziert über Port 123 mit mehreren anderen Hosts Wie Sie sehen, kommuniziert der fragliche interne Host mit mehreren externen Hosts über Port 123. Die Anzahl der Datensätze für die einzelnen Hosts und der enorme Umfang der Kommunikation deuten darauf hin, dass hier etwas nicht mit rechten Dingen zugeht. Normalerweise synchronisiert ein Host seine NTP-Einstellungen nur mit einem oder wenigen leicht identifizierbaren Hosts. Die feindselige Natur dieses Datenverkehrs wird außerdem durch das Vorhandensein von Kommunikationspartnern außerhalb der USA bestätigt, die von Hosts und Netzwerken in den USA nicht zur NTP-Synchronisierung herangezogen werden. 370 11 Anomaliegestützte Erkennung anhand von statistischen Daten Damit liegt ein Zwischenfall vor, der weiter behandelt werden muss. Außerdem haben wir einen interessanten Indikator gewonnen, mit dem wir mehr entdecken können, als unsere IDS-Regeln zu bieten haben. Wie immer aber müssen wir uns erst überlegen, was wir eigentlich wollen, bevor wir uns Hals über Kopf auf die Daten stürzen. Bei diesem Ereignis haben wir nach allen Sitzungsdaten gesucht, bei denen 192.168.1.17 die Quelladresse war und die Kommunikation über den UDP-Port 123 stattfand. Der übermäßige Umfang des UDP-Datenverkehrs über Port 123 zu so vielen externen Hosts hast uns zu der Schlussfolgerung gebracht, dass etwas Schädliches vor sich geht. Damit können wir einen Filter erstellen, der für alle lokalen Adressen nach diesen verdächtigen Merkmalen sucht: rwfilter --start-date=2013/09/02 --end-date=2013/09/02 --not-dipset=local.set --dport=123 --proto=17 --type=all --pass=stdout | rwstats --top --fields=sip --count=20 --value=dip-distinct Der Filter in diesem Befehl besagt, dass der gesamte nicht für das lokale Netzwerk bestimmte, über das Protokoll UDP abgewickelte und an Port 123 gerichtete Datenverkehr vom 2.9.2013 untersucht werden soll. Die damit ausgewählten Daten werden an Rwstats gesendet, das Statistiken für die 20 lokalen IP-Adressen, die mit den meisten verschiedenen Zieladressen kommunizieren (siehe Abb. 11.9). Abbildung 11.9: Mehrere Geräte mit ähnlichen Kommunikationsmustern Den Filter können wir noch weiter einengen, indem wir nur nach Datensätzen suchen, bei denen die UDP-123-Kommunikation zu Hosts außerhalb der USA geht, was einer der Aspekte ist, die ursprünglich unseren Verdacht erregten. Die folgende Abfrage baut auf der vorherigen auf, übergibt die Ausgabe des ersten Rwfilters aber an einen zweiten, 11.4 Statistiken mit Gnuplot grafisch darstellen 371 der alle Datensätze mit dem Zielcode us ausschließt (--fail), sodass wir nur Daten über Verbindungen in andere Länder sehen. rwfilter --start-date=2013/09/02 --end-date=2013/09/02 --not-dipset=local.set --dport=123 --proto=17 --type=all --pass=stdout | rwfilter --input-pipe=stdin --dcc=us --fail=stdout | rwstats --top --fields=sip --count=20 --value=dip-distinct Eine weitergehende Untersuchung der Ergebnisse kann zur Entdeckung von Schadlogik auf den Systemen führen, die ein ähnliches Verhalten an den Tag legen wie der Host, für den der ursprüngliche IDS-Alarm ausgelöst wurde. Ein IDS kann einige Vorkommnisse einer bestimmten schädlichen Aktivität erkennen, aber nicht alle, und um diese Lücke zu schließen, eigenen sich statistische Daten. Das hier gezeigte Beispiel stammt übrigens aus einer wahren Untersuchung, bei der die Analyse schließlich neun weitere infizierte Hosts ans Tageslicht brachte, die das IDS übersehen hatte. 11.4 Statistiken mit Gnuplot grafisch darstellen Die grafische Darstellung von Statistiken kann zu wichtigen Einsichten führen, die sich aus den rohen Zahlen nicht so leicht ablesen lassen. Dafür bieten sich insbesondere Durchsatzstatistiken an. Die Möglichkeit, den Durchsatz an einer Sensorschnittstelle oder zwischen zwei Hosts zu ermitteln und grafisch darzustellen, ist äußerst nützlich für verschiedene Formen der Erkennung, insbesondere auf der Grundlage von Anomalien. Dabei wird ein Alarm ausgelöst, wenn ein Gerät einen erheblich größeren Umfang an Datenverkehr generiert oder empfängt als üblich. Damit lassen sich beispielsweise das Herausschmuggeln von internen Daten, der Missbrauch eines internen Hosts zur Bereitstellung von Malware über das Internet oder ein eingehender Denial-of-Service-Angriff aufspüren. Durchsatzdiagramme helfen Analytikern, ihre Abfragen auf einen kleineren Zeitraum umzuschränken, was die Analyse beschleunigt. Eines der nützlicheren Tools, um zu ermitteln, in welchen Zeiträumen bestimmte Daten jeweils aufgetreten sind und um entsprechende Statistiken zu generieren, ist Rwcount. Wir haben es schon weiter vorn eingesetzt, um den Zeitraum zu bestimmen, in dem eine bestimmte Aktivität auftrat. Darüber hinaus können Sie sich damit auch eine Vorstellung davon machen, wie viele Daten in einzelnen Kommunikationssequenzen übertragen werden. Die einfachste Anwendung besteht darin, herauszufinden, wie viele Daten pro Tag durch überwachte Netzwerksegmente laufen. Wie bei fast allen SiLK-Abfragen beginnen wir auch hier mit einem Rwfilter, um die Verarbeitung auf den Zeitraum einzuschränken, an dem wir interessiert sind. Dann übergeben wir diese Datenmenge an Rwcount, das die Daten in Behälter für einzelne Zeiträume mit einer bestimmten, vom Benutzer in Sekunden festgelegten Länge sortiert. Um beispielsweise zu ermitteln, wie viele Datensätze, Bytes und Pakete in jeder einzelnen Minute (--bin-size=60) einer gegebenen Stunde übertragen werden, geben Sie folgenden Befehl: 372 11 Anomaliegestützte Erkennung anhand von statistischen Daten rwfilter --start-date=2013/09/02:14 --proto=0- --pass=stdout --type=all | rwcount --bin-size=60 Den Rwfilter können Sie nach Bedarf ändern, um die Datenmenge festzulegen, die Sie zur Untersuchung der Durchsatzzahlen heranziehen möchten. Die Tabellen, die dieser Befehl ausgibt, sind schon an sich nützlich, aber wenn wir die Daten grafisch darstellen, wird es leichter, Erkenntnisse daraus zu gewinnen. Schauen wir uns dazu noch einmal das Beispiel aus dem letzten Abschnitt mit dem verdächtigen NTP-Datenverkehr an. Wenn wir die in Abb. 11.9 gezeigten Ergebnisse mit dem zuvor genannten Rwcount-Befehl genauer untersuchen, können wir mehrere externe IP-Adressen aus dem Bereich 204.2.134.0/24 erkennen, die ebenfalls NTP-Clientkommunikation anfordern, was auf schädliche Geräte hinweist, die zur Verwendung von nicht lokalen NTP-Servern konfiguriert sind. Die Verteilung des Datenverkehrs im Tagesverlauf zeigt, dass die Menge der übertragenen Daten pro Minute gleichbleibend ist (siehe Abb. 11.10). In der üblichen Tabellenform hilft uns diese Angabe nicht weiter, um den Datenverkehr zu erklären. Abbildung 11.10: Rwcount zeigt die gleichmäßige Verteilung der Daten über die Zeit Um uns das Gesamtbild anzusehen, müssen wir die Daten großmaßstäblich grafisch darstellen. Da SiLK keine Möglichkeiten dazu mitbringt, leiten wir die Ergebnisse der SiLK-Abfrage zur Ausgabe an Gnuplot (http://www.gnuplot.info/) weiter, eine portable, befehlszeilengesteuerte Diagrammanwendung. Es handelt sich dabei nicht gerade um ein intuitiv zu bedienendes Programm für die grafische Darstellung, aber wenn Sie erst einmal die richtige Konfiguration haben, um vorhandene Daten zu lesen, lassen sich leicht Skripte für die Zusammenarbeit mit anderen Tools schreiben. Um die gewonnenen Daten besser nutzen zu können, wollen wir ein Diagramm zeichnen, das die Menge der Byte pro Stunde für Sitzungsdaten mit IP-Adressen aus dem Bereich 204.2.134.0/24 darstellt. Dazu verwenden wir den gleichen Rwcount-Befehl wie zuvor, allerdings mit einer Intervalllänge von 3600, sodass die Ergebnisse pro Stunde angezeigt werden. Die Ausgabe dieses Rwcount-Befehls durchläuft daraufhin einige Aufbereitungsvorgänge in der Befehlszeile. Dadurch wird eine CSV-Datei erstellt, die nur die Zeitstempel und die damit verbundenen Bytewerte enthält. Insgesamt sieht unser Befehl wie folgt aus: 11.4 Statistiken mit Gnuplot grafisch darstellen 373 rwfilter --start-date=2013/09/02 --any-address=204.2.134.0/24 --proto=0--pass=stdout --type=all | rwcount --bin-size=3600 –delimited=, --no-titles| cut -d "," -f1,3>hourly.csv Damit ergeben sich Daten wie die folgenden: 2013/09/02T13:00:00,146847.07 2013/09/02T14:00:00,38546884.51 2013/09/02T15:00:00,1420679.53 2013/09/02T16:00:00,19317394.19 2013/09/02T17:00:00,16165505.44 2013/09/02T18:00:00,14211784.42 2013/09/02T19:00:00,14724860.35 2013/09/02T20:00:00,26819890.91 2013/09/02T21:00:00,29361327.78 2013/09/02T22:00:00,15644357.97 2013/09/02T23:00:00,10523834.82 Als Nächstes müssen wir Gnuplot mitteilen, wie es diese Statistiken grafisch darstellen soll. Dazu schreiben wir ein Gnuplot-Skript. Ähnlich wie ein BASH-Skript wird es zeilenweise gelesen, es verwendet allerdings Gnuplot-Parameter und ruft in der ersten Zeile auch Gnuplot als Interpreter auf. Das Skript für unser Beispiel sieht wie folgt aus: #! /usr/bin/gnuplot set terminal postscript enhanced color solid set output "hourly.ps" set title "Traffic for 204.2.134.0/24 (09/02/2013)" set xlabel "Time (UTC)" set ylabel "Bytes" set datafile separator "," set timefmt '%Y/%m/%dT%H:%M:%S' set xdata time plot 'hourly.csv' using 1:2 with lines title "Bytes" Wenn das Postscript-Bildformat für Ihre Zwecke nicht geeignet ist, können Sie das Bild in Linux auch mit folgendem Befehl ins JPG-Format umwandeln: convert hourly.ps hourly.jpg Schließlich haben Sie ein fertiges Gnuplot-Durchsatzdiagramm (siehe Abb. 11.11). 374 11 Anomaliegestützte Erkennung anhand von statistischen Daten Traffic for 204.2.134.0/24 (09/02/2013) 4e+07 Bytes 3.5e+07 3e+07 Bytes 2.5e+07 2e+07 1.5e+07 1e+07 5e+06 0 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00 Time (UTC) Abbildung 11.11: Das Durchsatzdiagramm in Gnuplot Mit einem BASH-Skript können Sie automatisch Daten zu einem gegebenen Datum und einem gegebenen Host abrufen und daraus ein Gnuplot-Diagramm erstellen lassen. Das kann beispielsweise wie folgt aussehen: #!/bin/bash #traffic.plotter echo "Enter Date: (Example:2013/09/02)" read theday echo "Enter Host: (Example:192.168.5.0/24)" read thehost if [ echo exit fi if [ echo exit fi -z "theday" ]; then "You forgot to enter the date." -z "thehost" ]; then "You forgot to enter a host to examine." rm hourly.csv rm hourly.ps rm hourly.jpg 11.5 Statistiken mit Google Charts grafisch darstellen 375 rwfilter --start-date=$theday --any-address=$thehost --proto=0- --pass=stdout --type=all -- | rwcount --bin-size=3600 --delimited=, --no-titles| cut -d "," -f1,3>hourly.csv gnuplot<< EOF set terminal postscript enhanced color solid set output "hourly.ps" set title "Traffic for $thehost ($theday)" set xlabel "Time (UTC)" set ylabel "Bytes" set datafile separator "," set timefmt '%Y/%m/%dT%H:%M:%S' set xdata time plot 'hourly.csv' using 1:2 with lines title "Bytes" EOF convert hourly.ps hourly.jpg exit Mit diesem Skript können Sie das Durchsatzdiagramm für die Bytes pro Stunde für jede gewünschte IP-Adresse oder jeden IP-Adressbereich erstellen lassen. Es lässt sich ziemlich leicht an die Erfordernisse Ihrer Umgebung anpassen. 11.5 Statistiken mit Google Charts grafisch darstellen Eine weitere Möglichkeit, Durchsatzdaten und andere Statistiken grafisch darzustellen, bietet die API von Google Charts (https://developers.google.com/chart/). Google bietet eine breite Palette von Diagrammen an, um praktisch alle Arten von Daten, die Sie sich vorstellen können, interaktiv und auf verständliche Weise darzustellen. Die meisten mithilfe dieser API generierten Diagramme funktionieren in allen Browsern, und die Nutzung der API ist vollständig kostenlos. Der größte Unterschied zwischen Google Charts und Gnuplot ist die Menge von Anwendungsbeispielen. Gnuplot wird schon seit 1986 entwickelt und kann praktisch alles tun, was Sie wünschen, sofern Sie sich mit der Sprache auskennen. Da Gnuplot seit so langer Zeit das Diagrammwerkzeug Nr. 1 ist, gibt es eine unüberschaubare Menge von Beispielen dafür, wie Sie das erreichen können, was Sie sich vorstellen. Google Charts dagegen ist noch relativ neu, weshalb es weniger Anwendungsbeisiele gibt. Zum Glück nimmt es jedoch rasch an Beliebtheit zu und bietet schon fertige Lösungen für viele häufig nachgefragte Arten der Darstellung. Um den Einstieg zu erleichtern, hat Google den Google Charts Workshop eröffnet, in dem die Benutzer nach vorhandenen Beispielen suchen und sie bearbeiten können, um sie mit ihren Daten auszuprobieren, bevor sie sich selbst die Mühe 376 11 Anomaliegestützte Erkennung anhand von statistischen Daten machen, ein Diagramm zu programmieren. Das Wort »programmieren« verwenden wir im Zusammenhang mit Google Charts jedoch sehr frei, da die Syntax ziemlich einfach ist. In diesem Abschnitt sehen wir uns ein einfaches Beispiel an, bei dem wir die von Rwcount gelieferten Daten in eine HTML-Datei übernehmen, die die API von Google Charts nutzt. Die meisten modernen Browser können die Ergebnisse anzeigen, ohne dafür irgendwelche Add-Ons oder Erweiterungen zu brauchen. Für unser Beispiel verwenden wir die gleichen Daten, wie wir auch schon mit Gnuplot dargestellt haben, und erstellen daraus ein Liniendiagramm. Wenn Sie sich die API von Google Charts für solche Diagramme ansehen, wird Ihnen als Erstes auffallen, dass die Daten nicht in Form einer normalen CSV-Datei übernommen werden. Stattdessen nimmt die API Datentabellen im JavaScript- und im Objektliteralformat (OL) an. Es gibt verschiedene Tools und Bibliotheken, um diese Formate zu erzeugen, aber der Einfachheit halber konvertieren wir unsere CSV-Ausgabe mit ein bisschen Befehlszeilenzauberei in eine OL-Datentabelle. Im vorherigen Beispiel haben wir eine kleine CSV-Datei mit nur elf Datenpunkten verwendet. Neben diesen Daten brauchen wir Spaltenköpfe, um die Namen der unabhängigen und der abhängigen Variable für jeden Datenpunkt zu definieren. Das heißt, wir müssen am Anfang unserer CSV-Datei die Zeile Data,Bytes hinzufügen, um die beiden Spalten zu benennen: Date,Bytes 2013/09/02T13:00:00,146847.07 2013/09/02T14:00:00,38546884.51 2013/09/02T15:00:00,1420679.53 2013/09/02T16:00:00,19317394.19 2013/09/02T17:00:00,16165505.44 2013/09/02T18:00:00,14211784.42 2013/09/02T19:00:00,14724860.35 2013/09/02T20:00:00,26819890.91 2013/09/02T21:00:00,29361327.78 2013/09/02T22:00:00,15644357.97 2013/09/02T23:00:00,10523834.82 Jetzt können wir diese CSV-Datei durch Sed-Ersetzungsbefehle ins OL-Datentabellenformat umwandeln: cat hourly.csv | sed "s/\(.*\),\(.*\)/['\1', \2],/g"|sed '$s/,$//'| sed "s/, \([A-Za-z].*\)],/, '\1'],/g" Dadurch sehen die Daten wie folgt aus und sind damit bereit, der API zugeführt zu werden: 11.5 Statistiken mit Google Charts grafisch darstellen 377 ['Date', 'Bytes'], ['2013/09/02T13:00:00', ['2013/09/02T14:00:00', ['2013/09/02T15:00:00', [‘2013/09/02T16:00:00’, [‘2013/09/02T17:00:00’, [‘2013/09/02T18:00:00’, [‘2013/09/02T19:00:00’, [‘2013/09/02T20:00:00’, [‘2013/09/02T21:00:00’, [‘2013/09/02T22:00:00’, [‘2013/09/02T23:00:00’, 146847.07], 38546884.51], 1420679.53], 19317394.19], 16165505.44], 14211784.42], 14724860.35], 26819890.91], 29361327.78], 15644357.97], 10523834.82] Diese Daten können wir jetzt in eine HTML-Datei einfügen, die die API aufruft. Die einfachste Möglichkeit dazu besteht darin, den Beispielcode zu nutzen, der in der GoogleDokumentation über Liniendiagramme angegeben ist. Damit erhalten wir folgenden Code: <html> <head> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("visualization", "1", {packages:["corechart"]}); google.setOnLoadCallback(drawChart); function drawChart() { var data=google.visualization.arrayToDataTable([ ['Date', 'Bytes'], ['2013/09/02 T13:00:00', 146847.07], ['2013/09/02 T14:00:00', 38546884.51], ['2013/09/02 T15:00:00', 1420679.53], ['2013/09/02 T16:00:00', 19317394.19], ['2013/09/02 T17:00:00', 16165505.44], ['2013/09/02 T18:00:00', 14211784.42], ['2013/09/02 T19:00:00', 14724860.35], ['2013/09/02 T20:00:00', 26819890.91], ['2013/09/02 T21:00:00', 29361327.78], ['2013/09/02 T22:00:00', 15644357.97], ['2013/09/02 T23:00:00', 10523834.82] ]); var options={ title: 'Traffic for 204.2.134.0-255' }; 378 11 Anomaliegestützte Erkennung anhand von statistischen Daten var chart=new google.visualization.LineChart(document. getElementById(‘chart_div’)); chart.draw(data, options); } </script> </head> <body> <div id=”chart_div” style=”width: 900px; height: 500px;”> </div> </body> </html> Abb. 11.12 zeigt, wie das resultierende Diagramm im Browser aussieht, einschließlich Mouseover-Text. Traffic for 204.2.134.0-24 40,000,000 Bytes 30,000,000 20,000,000 10,000,000 0 0 0 0 0 0 0 0 0 0 0 0 0:0 :00:0 :00:0 :00:0 :00:0 :00:0 :00:0 :00:0 :00:0 :00:0 0:0 6 5 0 3:0 14:0 7 3 2 1 8 9 1 1 2 1 1 2 2 2 1 1 T T T T T T T T T T T /02 /02 /02 /02 /02 /02 /02 /02 /02 /02 /02 /09 /09 /09 /09 3/09 /09 /09 /09 /09 /09 /09 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 20 20 20 20 20 20 20 20 20 20 20 Abbildung 11.12: Das Durchsatzdiagramm in Google Charts Ebenso wie die grafische Darstellung in Gnuplot können wir auch die grafische Darstellung in Google Charts mit einem Skript automatisieren. Die im folgenden gezeigte Methode dafür ist der Kürze halber noch roh und unfertig gehalten, funktioniert aber mit ein bisschen zusätzlicher Benutzerinteraktion. Hier haben wir in einem Arbeitsverzeichnis das Unterverzeichnis googlecharts angelegt. Darin erstellen wir eine Reihe von Vorlagen, in die wir Daten einfügen können. Die erste dieser Vorlagen heißt linechart.html: 11.5 Statistiken mit Google Charts grafisch darstellen 379 <html> <head> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("visualization", "1", {packages:["corechart"]}); google.setOnLoadCallback(drawChart); function drawChart() { var data=google.visualization.arrayToDataTable([ dataplaceholder ]); var options={ title: 'titleplaceholder' }; var chart=new google.visualization.LineChart(document. getElementById(‘chart_div’)); chart.draw(data, options); } </script> </head> <body> <div id=”chart_div” style=”width: 900px; height: 500px;”></div> </body> </html> In der Vorlage linechart.html gibt es zwei Platzhalter, einen für die Datentabelle (dataplaceholder) und einen für den Titel des Diagramms (titleplaceholder). Im eigentlichen Arbeitsverzeichnis erstellen wir nun unser Hilfsprogramm zur grafischen Darstellung mit dem Namen plotter.sh. Dieses BASH-Skript nimmt vom Benutzer Rwfilter- und Rwcount-Befehle entgegen und gibt Diagramme aus. Dazu wandelt es die Ausgabe dieser Befehle in das OL-Datentabellenformat um und stellt sie in eine temporäre Datei, mit deren Inhalt sie wiederum den Datenplatzhalter in der Vorlage googlecharts/ linechart.html ersetzt. Da es in der Vorlage auch einen Titelplatzhalter gibt, enthält das Skript eine Variable, in der wir einen Wert für den Titel angeben können. ## NACH BEDARF BEARBEITEN ################################# title=’Traffic for 204.2.134.0-255’ rwfilter --start-date=2013/09/02 T1 --any-address=204.2.134.0/24 --type=all --proto=0- --pass=stdout | rwcount --bin-size=300 --delimited=, |\cut -d “,” -f1,3 |\ ############################################# 380 11 Anomaliegestützte Erkennung anhand von statistischen Daten sed "s/\(.*\),\(.*\)/['\1', \2],/g"|sed '$s/,$//'| sed "s/, \([A-Za-z].*\)],/, '\1'],/g">temp.test sed '/dataplaceholder/{ s/dataplaceholder//g r temp.test }' googlechart/linechart.html | sed "s/titleplaceholder/${title}/g" rm temp.test } linechart Wenn Sie plotter.sh ausführen, fügt das Skript die passenden Daten in die Vorlage linechart. html ein. Dieses Skript ist noch einfach und roh, aber Sie können es erweitern, um auf schnelle Weise Google-Charts-Diagramme zur Erkennung und Analyse zu generieren. 11.6 Statistiken mit Afterglow grafisch darstellen Nur allzu leicht kann man sich so tief in die Daten verstricken, dass es äußerst schwierig wird, anderen zu vermitteln, was sie bedeuten. Manchmal kann man nur erkennen, was wirklich vor sich geht, wenn man einen Schritt zurücktritt. Das Perl-Tool Afterglow hilft Ihnen dabei, Linkdiagramme aufzustellen. Solche Diagramme bieten eine grafische Darstellung der Beziehung, die »Elemente in Listen« zueinander haben. Afterglow nimmt eine zwei- oder dreispaltige CSV-Datei entgegen und gibt entweder eine DOT-Datei in einer Grafiksprache, wie sie für die Graphviz-Bibliothek erforderlich ist, oder eine GDF-Datei zurück, die von Gephi verarbeitet werden kann. Beachten Sie, dass Afterglow Ausgabedaten generiert, die zum Erstellen von Linkdiagrammen genutzt werden können, wobei die eigentliche Erstellung dieser Diagramme Drittanbietertools überlassen bleibt, beispielsweise Graphviz, das wir im Folgenden nutzen werden. Im Internet gibt es zahlreiche Beispiele dafür, wie Afterglow Beziehungen in verschiedenen Arten von Datenmengen finden kann. Die Beispiele auf der Hauptwebseite von Afterglow beziehen sich auf PCAP und Sendmail. Bevor Sie anfangen, mit Afterglow zu arbeiten, sollten Sie http://afterglow.sourceforge.net aufsuchen, um das Benutzerhandbuch zu lesen und sich eine Vorstellung von den verfügbaren Funktionen zu machen. Im Grunde genommen brauchen Sie lediglich eine CSVDatei mit Ihren Daten, die Sie auf die richtige Weise an Afterglow übergeben müssen, um im Handumdrehen das Diagramm zu bekommen. Laden Sie Afterglow herunter und platzieren Sie es in einem Arbeitsverzeichnis. Um das folgende Beispiel nachvollziehen zu können, brauchen Sie auch Zugriff auf die SiLK-Tools. Nach dem Herunterladen und Entpacken von Afterglow, müssen Sie unter Umständen (je nachdem, was auf Ihrem System vorhanden ist) noch ein Perl-Modul installieren. Wenn ja, führen Sie folgenden Befehl aus: 11.6 Statistiken mit Afterglow grafisch darstellen 381 sudo /usr/bin/perl -MCPAN -e'install Text::CSV' Zur grafischen Darstellung verwenden wir die Werkzeuge von Graphviz, das Sie mit dem Paketverwaltungsprogramm Ihrer Linux-Distribution installieren können. Graphviz ist eine Open-Source-Visualisierungssoftware von AT&T Research, die zahlreiche Hilfsprogramme für verschiedene Arten von Linkdiagrammen enthält. Die Dokumentation der einzelnen Graphviz-Tools finden Sie auf http://www.graphviz.org/Documentation.php. Um Graphviz in Security Onion zu installieren, verwenden Sie APT: sudo apt-get install graphviz An dieser Stelle sollten Sie sich im Arbeitsverzeichnis von Afterglow befinden. Für ­A fterglow benötigen Sie eine Konfigurationsdatei, allerdings ist die Beispielkonfiguration sample.properties im Lieferumfang enthalten. Sie sollten dieser Datei die Zeile xlabels = 0 hinzufügen, damit Beschriftungen korrekt angezeigt werden. Denken Sie bei der Zusammenstellung der Daten an die beiden »Modi«, die ich zuvor erwähnt habe, nämlich zwei- und dreispaltig. Im Zweispaltenmodus haben Sie nur eine Quelle (IP-Quelladresse) und ein Ziel (IP-Zieladresse). Wenn eine dritte Spalte zur Verfügung steht, lautet die Anordnung »Quelle«, »Ereignis«, »Ziel«. Um ein Linkdiagramm zu erstellen, legen wir als Erstes mithilfe von SiLK eine CSV-Datei mit den Daten an, die innerhalb einer Stunde im Netzwerk übertragen werden. Das zu untersuchende Netzwerk sei in unserem Beispiel 184.201.190.0/24. Um die zusätzliche Datenaufbereitung so gering wie möglich zu halten, fügen wir schon im Rwcut-Befehl einige ergänzende Optionen hinzu: rwfilter --start-date=2013/09/06:15 --saddress=184.201.190.0/24 --type=all --pass=stdout | rwcut --fields=sip,dip --no-titles --delimited=, | sort -u>test.data Führen Sie diesen Befehl aus und überprüfen Sie, ob die Datei test.data in jeder Zeile eine Kombination aus Quell- und Ziel-IP-Adresse enthält. Damit haben Sie den schwierigen Teil schon abgeschlossen. Um daraus das Linkdiagramm zu erstellen, haben Sie zwei Möglichkeiten. Die erste besteht darin, die Daten an Afterglow zu übergeben und mit dem Argument -w eine DOT-Datei zu erstellen, die von Graphviz-Tools wie Neato verarbeitet werden kann. Sie können die Ausgabe von Afterglow aber auch direkt an Neato übergeben. Da Sie Afterglow wahrscheinlich ausschließlich verwenden werden, um Daten an eine Grafikanwendung Ihrer Wahl zu übergeben, verwenden wir in unserem Beispiel die zweite Möglichkeit. Um das Diagramm zu erstellen, führen Sie folgenden Befehl aus: cat test.data | perl afterglow.pl -e 5 -c sample.properties -t | neato -Tgif -o test.gif 382 11 Anomaliegestützte Erkennung anhand von statistischen Daten Das Argument -e bestimmt, wie »groß« das Diagramm sein wird. Mit -c geben Sie die zu verwendende Konfigurationsdatei an, wobei wir hier die im Lieferumfang enthaltene Beispieldatei nehmen, und -t bedeutet, dass wir den Zweispaltenmodus nutzen. Die Daten werden schließlich an Neato übergeben, wobei das Argument -T dafür sorgt, dass eine GIFDatei erstellt wird und wir mit -o den Dateinamen angeben können. Die resultierende Datei test.gif sehen Sie in Abb. 11.13. Abbildung 11.13: Ein aus Flussdaten erstelltes Linkdiagramm Wenn Sie das Beispiel nachvollzogen haben, sehen Sie ein ähnliches Diagramm wie in der Abbildung, allerdings möglicherweise mit anderen Farben. Welche Farben Afterglow für die Darstellung nimmt, wird in der Konfigurationsdatei festgelegt, wobei laut 11.6 Statistiken mit Afterglow grafisch darstellen 383 sample.properties bestimmte Farben für RFC-1918-Adressen verwendet werden. Wenn Sie keinen dieser Bereiche verwenden (wie in unserem Beispiel), erscheinen die Quellknoten in Rot. Schauen Sie sich die Beispielkonfiguration genau an, da es wahrscheinlich sinnvoll sein wird, die Farbzuordnung für Ihre lokalen Bereiche zu ändern. Denken Sie daran, dass von den in der Konfiguration genannten Farben jeweils die erste passende genommen wird. Wenn Sie beispielsweise die folgende Konfiguration verwenden, werden alle Quellknoten blau dargestellt, da die erste Anweisung stets als true aufgefasst wird und daher die erste Übereinstimmung liefert: color.source="blue" color.source="greenyellow" if ($fields[0]=_/Ë„192\.168\.1\..*/); color.source="lightyellow4" if ($fields[0]=_/Ë„172\.16\..*/); Damit haben wir einige hübsche Daten. Im nächsten Beispiel wollen wir einige nützliche Daten erstellen. Dazu wollen wir uns die von unserem lokalen Adressbereich ausgehenden Verbindungen außerhalb der Geschäftsstunden ansehen. Dabei verwenden wir den Dreispaltenmodus und schreiben eine eigene Konfigurationsdatei, die uns in die Lage versetzt, verschiedene Anomalien optisch zu erkennen. Wir erwarten nicht, dass Benutzer außerhalb der Geschäftsstunden im Internet unterwegs sind, und abgesehen von gelegentlichen Antworten auf eingehende Verbindungen von externen Hosts sollte auch keine umfangreiche ausgehende Serverkommunikation auftreten. Wie immer müssen wir uns auch hier erst einmal eine Vorstellung davon machen, was wir als Datenmenge für die weitere Verarbeitung verwenden wollen. Anhand des Diagramms wollen wir verschiedene Dinge sichtbar machen. Daher erkläre ich Ihnen die einzelnen Spalten, während wir die Konfiguration durchgehen. Außerdem zeige ich Ihnen, wie Sie den ganzen Vorgang zum Erstellen des Diagramms zu einem einzeiligen Befehl zusammenfassen. Als Erstes legen wir die Konfigurationsdatei an. Damit die Diagrammbeschriftungen nicht verloren gehen, beginnen wir darin mit der Zeile xlabels=0. Wir wollen ein Linkdiagramm erstellen, das uns eine gute Vorstellung davon gibt, wie die lokalen Geräte mit der Welt außerhalb des internen Netzwerks kommunizieren. Dabei gehen wir davon aus, dass alle lokalen Adressen »gut« sind, weshalb wir color.source auf green setzen. Um Anomalien sofort erkennen zu können, erhalten die Zielknoten ihre Farbe jeweils aufgrund bestimmter Bedingungen. Um den Unterschied zwischen normalen Serverantworten und unerwarteten Antworten über Ports mit hoher Nummer sichtbar zu machen, wollen wir jede Art von Kommunikation über einen Quellport größer als 1024 kennzeichnen. Dazu verwenden wir die Anweisung color.target="orange" if ($fields[1]>1024), damit Afterglow alle Knoten der dritten Spalte (Zielknoten), bei denen der Wert in der zweiten Spalte (Ereignisknoten) größer als 1024 ist, in Orange darstellt. Der Verweis auf die Spalten in der CSV-Datei erfolgt am besten mithilfe von Feldangaben, wobei Feld 0 die erste Spalte ist, Feld 1 die zweite usw. Außerdem wollen wir uns ansehen, welche ausländischen Geräte nach Geschäftsschluss Antworten von unseren Servern empfangen. Dabei sind wir besonders an Geräten in China interessiert. Da es sich dabei durchaus auch um legitime Verbindungen handeln kann, fär- 384 11 Anomaliegestützte Erkennung anhand von statistischen Daten ben wir die chinesischen Knoten mit color.target="yello" if ($fields[3]=~/cn/) gelb. Mit dem Verweis auf das dritte Feld beziehen wir Informationen aus der vierten Spalte der CSV-Datei. Sie wird zwar nicht für Knoten verwendet, enthält aber Verweise zu anderen Knoten in derselben Zeile. Daher bedeutet der Befehl, dass wir den Knoten in der dritten Spalte gelb färben, wenn im Text der viertel Spalte derselben Zeile irgendwo cn steht. Wenn ein Knoten beide Bedingungen erfüllt, wollen wir besonders stark auf ihn aufmerksam gemacht werden. Sollten also lokale Geräte über nicht standardmäßige Ports mit Adressen in China kommunizieren, stellen wir die entsprechenden Zielknoten rot dar. Dazu müssen wir die Bedingung angeben, dass der Quellport größer 1024 ist UND die vierte Spalte derselben Zeile den Text cn enthält. Diese UND-Verknüpfung erreichen wir mit der Anweisung color. target="red" if (grep($fields[1]>1024,$fields[3]=_/cn/)). Wie bereits erwähnt, kommt es auf die Reihenfolge der Konfigurationszeilen an. Ich empfehle Ihnen, sie von der strengsten zur lockersten Bedingung zu ordnen. Unsere Konfigurationsdatei (nennen wir sie config.properties) sieht insgesamt wie folgt aus: ## Platziert alle Beschriftungen auf den Knoten xlabels=0 ## Färbt alle Quellknoten (Adressen in der ersten Spalte) grün color.source="green" ## Färbt Zielknoten rot, bei denen der Quellport größer 1024 ist und die ## vierte Spalte "cn" enthält color.target="red" if (grep($fields[1]>1024,$fields[3]=_/cn/)) ## Färbt Zielknoten gelb, bei denen die vierte Spalte "cn" enthält color.target="yellow" if ($fields[3]=_/cn/) ## Färbt Zielknoten rot, bei denen der Quellport größer 1024 ist color.target="orange" if ($fields[1]>1024) ## Färbt Zielknoten blau, wenn keine der Bedingungen erfüllt ist color.target="blue" ## Färbt Ereignisknoten der zweiten Spalte weiß color.event="white" ## Färbt Verbindugnslinien schwarz und gibt ihnen die Dicke "1" color.edge="black" size.edge=1; Um die erforderlichen Daten für dieses Diagramm zu generieren, verwenden wir den folgenden Befehl: rwfilter --start-date=2013/09/06:15 --saddress=184.201.190.0/24 --type=out,outweb --pass=stdout |\rwcut --fields=sip,sport,dip,dcc --no-titles --delimited=,|\ sort -u|perl afterglow.pl -e 5 -c config.properties -v |\neato -Tgif -o test.gif 11.6 Statistiken mit Afterglow grafisch darstellen 385 Mit den Optionen out und outweb im Argument type des Rwfilter-Befehls sorgen wir dafür, dass nur ausgehender Datenverkehr berücksichtigt wird. Um die vier Spalten zu erstellen, die wir benötigen, verwenden wir das Argument --fields=sip,sport,dip,dcc. Die Ausgabe dieses Befehls wird direkt an Afterglow und Neato geleitet, um das Diagramm test.gif zu erstellen, das Sie in Abb. 11.14 sehen. Abbildung 11.14: Benutzerdefiniertes Linkdiagramm für ausgehende Verbindungen Die Vielseitigkeit von Afterglow ermöglicht es Ihnen, verschiedene Arten von Link­ diagrammen zu erstellen. Solche Diagramme sind in Situationen nützlich, in denen Sie die Beziehungen zwischen Elementen untersuchen müssen. Diese Beispiele sollten Ihnen einen Vorgeschmack auf die Möglichkeiten geben, die sich Ihnen bieten, und Sie in die Lage versetzen, Linkdiagramme mit der für Ihre Zwecke geeigneten Gestaltung zu erstellen. 386 11 Anomaliegestützte Erkennung anhand von statistischen Daten 11.7 Zusammenfassung Den Fluss der Daten in Ihrer Umgebung im Bezug zu den Benutzern und dem Netzwerk als Ganzem zu verstehen, stellt eine große Herausforderung dar. Es gibt jedoch eine Reihe von statistischen Daten, die Sie aufstellen können, um Ihr Wissen über das Datennetzwerk und die darin auftretende Kommunikation stets auf dem neuesten Stand der Entwicklung Ihrer Organisation zu halten. Die Kernfrage dieses Kapitels lautete, wie Sie aus den Daten, die Sie haben, noch brauchbarere Daten gewinnen, die es Ihnen erlauben, sich einen Überblick zu verschaffen. Dieser Überblick besteht manchmal darin, Listen aufzustellen, die große Datenmengen in allgemeinere Kategorien fassen. Manchmal ist der Überblick aber auch nur einfach ein Überblick im Sinne des Wortes. In diesem Kapitel haben Sie zwar nicht gelernt, wie Sie Statistiken oder grafische Darstellungen für alle Situationen erstellen können, denen Sie bei den Erkennungs- und Analyseaufgaben des NSM begegnen mögen, aber wir hoffen, dass wir Ihnen damit über die erste Hürde zum Erlernen dieser Werkzeuge hinweggeholfen und ein Samenkorn gelegt haben, sodass Sie selbst nützliche Statistiken für Ihre Umgebung aufstellen können. 12 Frühwarn-Honeypots zur Erkennung Ein Honeypot ist eine Sicherheitseinrichtung, die eigens dazu da ist, sondiert, angegriffen und geknackt zu werden. In der Praxis wird dafür gewöhnlich ein System oder eine Software verwendet, die ein anderes System oder einen Dienst nachahmt, aber absichtlich Schwachstellen aufweist. Dieses System wird so platziert, dass Angreifer es finden und eindringen können. In Wirklichkeit jedoch enthält dieser Honeypot keine echten Daten von irgendeinem Wert und ist von den anderen Netzwerkgeräten getrennt. Mit den ausführlichen Protokollinformationen, die auf dem Honeypot erfasst wurden, können ­Sicherheitsteams herausfinden, welche Werkzeuge, Taktiken und Prozeduren die Angreifer einsetzen. In Produktionsnetzwerken sind nur selten Honeypots zu finden, da es widersinnig erscheint, in einer solchen Umgebung ein System bereitzustellen, das zum Einbruch einlädt. Tatsächlich werden Honeypots meistens in Forschungs- und Lehrumgebungen eingesetzt. Einige Organisationen, die sehr erfahren in NSM sind, sehen Honeypots jedoch als eine Erkennungsmaßnahme an. In diesem Kapitel sehen wir uns an, was Frühwarn-Honeypots sind und welche verschiedenen Arten von Honeypots Sie für NSM einsetzen können. Außerdem beschäftigen wir uns damit, wie Sie Frühwarn-Honeypots platzieren, wie Sie die Protokollierung darauf durchführen und wie Sie sie bestmöglich einsetzen. Des Weiteren stellen wir einige beliebte Softwarelösungen für Honeypots vor. 388 12 Frühwarn-Honeypots zur Erkennung Zuvor aber möchte ich klarstellen, dass einige der Verteidigungsmöglichkeiten, die ich in diesem Kapitel vorstelle, sehr umstritten sind. Manche Organisationen verzichten aus rechtlichen Gründen auf die Verwendung von Honeypots, worauf ich hier nicht weiter eingehen werde; das besprechen Sie lieber mit Ihrem Anwalt. Anderen Organisationen ist nicht klar, wie sie ihre Umgebung so absichern sollen, dass ein Angreifer, der einen Honeypot geknackt hat, diesen »Erfolg« nicht auf unerwartete Weise ausnutzen kann. Andere sehen keinen betrieblichen Wert in einem Honeypot. Ganz unabhängig von Ihrer Haltung gegenüber Honeypots muss ich aber betonen, dass deren Einrichtung für Zwecke des NSM sehr arbeitsintensiv ist und sich gewöhnlich nur für Sicherheitsorganisationen eignet, die eine Überwachung rund um die Uhr durchführen können. 12.1 Frühwarn-Honeypots Ein Frühwarn-Honeypot ahmt ein Produktionssystem nach und wird auf eine Weise bereitgestellt, dass es zur frühzeitigen Erkennung eines Netzwerkeinbruchs beitragen kann. Es gibt zwei verschiedene Arten dieser Honeypots, nämlich angreifbare und nicht angreifbare. Ein angreifbarer Frühwarn-Honeypot enthält zwar Software, die einen echten Dienst nachahmt, aber auch eine Schwachstelle. Wenn ein Angreifer diese Schwachstelle ausnutzt, erhält er gewöhnlich begrenzten Zugriff auf eine simulierte Umgebung, die ihn glauben machen soll, dass er mit dem echten System arbeitet. Währenddessen schreibt die Honeypot-Software ausführliche Protokolle, um die Methoden des Angreifers für den Einbruch in den gefälschten Dienst und seine Aktionen in der simulierten Umgebung festzuhalten. Dies kann mit anderen Formen der Erkennung kombiniert werden, z. B. IDS-Signaturen, sodass Analytiker den Honeypot als Informationsquelle für die Erkennung nutzen können. Ein nicht angreifbarer Frühwarn-Honeypot stellt die gleichen legitimen Dienste bereit wie das Produktionssystem, das er zu sein vorgibt, ist aber nicht dafür ausgelegt, von einem Angreifer ausgenutzt zu werden. Der einzige Unterschied zwischen dem Honeypot und dem echten Produktionssystem besteht darin, das die legitimen Systeme im Netzwerk nicht mit dem Honeypot kommunizieren. Jeder Verbindungsversuch mit diesem System ist daher verdächtig. Der Angreifer bekommt zwar keinen Zugriff auf das System, doch wenn er versucht, sich daran anzumelden, es zu scannen oder auf irgendeine andere Weise damit zu kommunizieren, wird von dem in der Umgebung vorhandenen signatur-, anomalie- oder statistikgestützten Erkennungsmechanismus ein Alarm ausgelöst. Das ähnelt dem Prinzip unserem Darknet-Beispiel aus Kapitel 10. Da keine dieser beiden Arten von Honeypots einen Dienst bietet, der einen Nutzen für den wirklichen Betrieb hätte, gibt es keinen legitimen Grund, Kontakt damit aufzunehmen. Die ausführliche Protokollierung und die ausnahmslose Alarmierung wären bei 12.2 Arten von Honeypots 389 einem Produktionssystem nicht möglich, da dadurch zu viele Fehlalarme auftreten würden, aber auf einem System, mit dem niemand kommunizieren sollte, bilden sie eine hervorragende Lösung. Beachten Sie jedoch, dass ein Frühwarn-Honeypot nicht dazu geeignet ist, Angreifer zu erkennen, die erst anfangen, sich Zugriff zu dem Netzwerk zu verschaffen. Was der Honeypot bemerkt, sind die Aktionen von Angreifern, die bereits einen Fuß in der Tür haben und versuchen, ihren Zugriff zu erweitern. Wie raffiniert die Angreifer auch immer sein mögen, sie werden stets den Weg des geringsten Widerstands gehen und sich nur so weit tarnen, wie es erforderlich ist. Das Überhandnehmen von Social Engineering und gezielten Phishingangriffen hat die Verteidigung des Perimeternetzwerks und die Erkennung von Übergriffen an dieser Grenze erschwert. 12.2 Arten von Honeypots Honeypots werden nach dem Grad an Interaktion eingeteilt, die sie bieten, und gewöhnlich als Honeypots mit geringer oder hoher Interaktion bezeichnet. Um den erforderlichen Grad an Interaktion für Ihre Honeypot-Bereitstellung zu bestimmen, müssen Sie die Ziele Ihrer Organisation, die zu schützenden Werte und die zu imitierenden Dienste berücksichtigen. Honeypots mit geringer Interaktion werden gewöhnlich in Form von Software bereitgestellt und dienen dazu, einen oder mehrere Dienste zu simulieren. Welchen Grad an Interaktion sie bieten, hängt einerseits von der Software selbst ab, aber auch davon, welchen Dienst sie nachahmen. Die Honeypot-Software Kippo beispielsweise, die den SSH-Dienst imitiert, erlaubt einem Angreifer, sich an dem Dienst anzumelden und sogar ein gefälschtes Dateisystem zu durchsuchen, aber nicht, auf die echten Komponenten des zugrunde liegenden Betriebssystems zuzugreifen. Honeypots mit hoher Interaktion dagegen spiegeln gewöhnlich ein echtes Produktionssystem wider. Sie verleiten Angreifer dazu, das Betriebssystem zu knacken, und stellen ihm für diesen Fall auch ausgiebigen Zugriff darauf bereit. Allerdings findet auf dem ­Honeypot auch eine detaillierte Betriebs- und Dateisystemprotokollierung und eine Überwachung anhand eines erschöpfenden Satzes von IDS-Regeln statt. Honeypots mit hoher Interaktion werden oft als virtuelle Maschinen bereitgestellt, sodass sie sich relativ leicht auf einen sauberen Zustand zurücksetzen lassen. Bei der Einrichtung eines Honeypots mit hoher Interaktion müssen Sie besondere Maßnahmen treffen, um zu verhindern, dass der Angreifer das System als Ausgangspunkt für Angriffe auf andere Systeme nutzt. Es muss den Angreifern möglich sein, in das System einzudringen und darauf einige Aktivitäten durchzuführen, ohne es aber so weit zu übernehmen, dass sie damit legitime Systeme im Netzwerk angreifen können. 390 12 Frühwarn-Honeypots zur Erkennung Achtung Manche Honeypots werden als Lösungen mit »mittlerer Interaktion« angeboten, also als Mittelding zwischen denen mit geringer und mit hoher Interaktion. Das gilt beispielsweise für Kippo, da die Software zwar einerseits einen Dienst simuliert, andererseits aber auch ein gefälschtes Dateisystem, mit dem ein Angreifer tatsächlich in Interaktion treten kann. Das steht im Gegensatz zu Einrichtungen wie etwa Tom’s Honeypot, bei dem es sich um einen echten Honeypot mit geringer Interaktion handelt, da er mithilfe von Software einen Dienst simuliert, aber keine gefälschte Umgebung vorspiegelt, mit der ein Angreifer nach dem Einbruch interagieren könnte. Die Bezeichnung »Honeypot mit mittlerer Interaktion« mag in manchen Fällen zwar angebracht sein, doch in diesem Buch werden wir sie unter die Honeypots mit geringer Interaktion rechnen, da es sich gewöhnlich um Anwendungen handelt, die auf einem anderen System laufen, anstatt ein eigenes Betriebssystem mitzubringen. Honeypots mit hoher Interaktion sind nützlich, um Informationen über raffinierte Gegner zu bekommen. Sie erfordern allerdings ein hohes Maß an Arbeit und Sorgfalt für die Einrichtung sowie eine ständige, lückenlose Überwachung. Dagegen lassen sich Honeypots mit geringer Interaktion im Allgemeinen leichter einrichten und betreiben. Außerdem stellen sie aufgrund ihrer Einfachheit das geringste Risiko für die Umgebung dar. Da wir sie im Rahmen der NSM für die Erkennung einsetzen wollen, sind für unsere Zwecke Honeypots mit geringer Interaktion am besten geeignet, weshalb wir uns in diesem Buch darauf konzentrieren werden. 12.3 Architektur von Frühwarn-Honeypots Wie alle anderen Aspekte des NSM muss auch die Bereitstellung von Frühwarn-Honeypots sorgfältig geplant und auf die Bedrohungen zugeschnitten sein, denen die Organisation ausgesetzt ist (siehe auch die Erörterung des Applied Collection Framework in Kapitel 2). Die Planung der Bereitstellung von Honeypot-Systemen umfasst drei Schritte: 1. Die zu simulierenden Geräte und Dienste bestimmen 2. Die Platzierung der Honeypots bestimmen 3. Alarmierung und Protokollierung entwickeln Sehen wir uns diese drei Phasen nun im Einzelnen an. 12.3 Architektur von Frühwarn-Honeypots 391 12.3.1 Phase 1: Die zu simulierenden Geräte und Dienste bestimmen Die Risikoanalyse, die Sie bei der Planung der NSM-Erfassung vorgenommen haben, sollte Ihnen schon eine Vorstellung davon vermittelt haben, welche Netzwerkelemente hohe Priorität genießen. Das sind auch die Hauptkandidaten für die Systeme, deren Dienste auf einem Honeypot simuliert werden sollten. Wenn in den Honeypot eingebrochen wird, erfolgt ein Alarm, der ein frühes Warnzeichen dafür ist, dass ähnliche Dienste hoher Priorität als Nächstes angegriffen werden könnten – oder dass dies schlimmstenfalls schon geschehen ist. Dazu ist es am besten, Honeypotsoftware bereitzustellen, die die von den kritischen Systemen bereitgestellten Dienste simuliert. In der Praxis gibt es natürlich keine Software, die in der Lage ist, jeden von Ihrer Organisation als kritisch eingestuften Dienst zu simulieren, aber es gibt Lösungen, die eine Menge der gängigeren Dienste imitieren. Betrachten wir als Beispiel eine Umgebung, in der es sich bei den wichtigsten Netzwerk­ elementen um eine Gruppe von Windows-Servern handelt, die nicht extern zugänglich sind und eine proprietäre interne Anwendung für die Finanzbuchhaltung bereitstellen. Diese Windows-Server gehören zu einer Domäne und werden über das Protokoll RDP (Remote Desktop Protocol) verwaltet. Es könnte ziemlich schwierig sein, die interne Anwendung als Honeypot zu simulieren, aber der RDP-Dienst ist ein idealer Kandidat dafür. Das Produkt Tom’s Honeypot, das wir später noch ausführlicher besprechen werden, kann einen RDP-Server nachahmen und löst einen Alarm aus, wenn jemand auch nur versucht, sich an diesem Server anzumelden. Auf den echten RDP-Servern wäre es nicht möglich, alle RDP-Anmeldeversuche zu protokollieren und zu untersuchen, aber die von dem RDP-Honeypot ausgelösten Alarme zu überprüfen ist sicherlich eine lösbare Aufgabe. Schließlich sollte niemand jemals versuchen, sich an diesem System anzumelden, da es nicht mit dem Internet verbunden ist. Betrachten wir als zweites Beispiel eine Organisation, die mehrere Linux-Server für die Back-End-Datenbanken ihrer öffentlichen E-Commerce-Website unterhält. Diese Server sind öffentlich nicht zugänglich, und die einzigen Dienste, die sie intern ausführen, sind SSH für die Serververwaltung und MySQL für die Datenbanken. Beide lassen sich als Honeypots simulieren, SSH beispielsweise mit Kippo und MySQL mit Tom’s Honeypot. Auch hier gilt wieder, dass niemand einen legitimen Grund hat, sich jemals an diesen Systemen anzumelden, weshalb jeglicher Zugriff darauf einen Alarm auslösen und als Warnung betrachtet werden sollte, dass es wahrscheinlich einen Einbruch gegeben hat und ein Angriff auf die kritischen Systeme bevorstehen mag. 12.3.2 Phase 2: Die Platzierung der Honeypots bestimmen Nachdem Sie bestimmt haben, welche Dienste Sie simulieren wollen, müssen Sie die Honeypotsysteme in Ihrem Netzwerk platzieren. Auf den ersten Blick scheint dazu nicht mehr erforderlich zu sein, als die Honeypotanwendung auf einem Host bereitzustellen und mit dem Netzwerk zu verbinden, aber es gibt noch einige Überlegungen, die Sie zuvor anstellen müssen. 392 12 Frühwarn-Honeypots zur Erkennung Erstens müssen Sie den Honeypot in demselben Netzwerksegment bereitstellen wie die Elemente, die er simuliert. Steht er in einem anderen Segment, dann ist ein Einbruch in den Honeypot kein Indiz dafür, dass sich ein Angreifer Zugang zu dem Segment verschafft hat, das Sie schützen wollen. Betrachten Sie zur Veranschaulichung Abb. 12.1. Darin sind mehrere Netzwerksegmente zu sehen. Das am stärksten bedrohte Segment ist in diesem Fall das Forschungssegment. Neben den echten Servern in diesem Segment stellen wir die zugehörigen Honeypotsysteme bereit: für die Linux-Dateiserver ein SSHHoneypot, für die Windows-Anwendungsserver einen RDP-Honeypot und für die Webserver einen HTTP-Honeypot. Der wichtigste Zweck der Honeypotsysteme besteht darin, einen Alarm auszulösen und Daten zu protokollieren, wenn jemand versucht, auf sie oder auf ihre Dienste zuzugreifen. Daher müssen wir dafür sorgen, dass Daten vom Honeypot zu einem NSM-Sensor oder einem Protokollierungsgerät übertragen werden können. In Abb. 12.1 ist Sensor B für die Erkennung in dem genannten Netzwerksegment verantwortlich, indem er die Daten analysiert, die in dieses Segment ein- und aus ihm herausgehen. Sie müssen jedoch nicht nur dafür sorgen, dass der Honeypot seine Rolle vollständig erfüllen kann, sondern müssen auch die Kommunikation begrenzen, an der er teilnehmen kann. Der Honeypot sollte zwar in der Lage sein, auf dieselben Arten von Anforderungen zu antworten wie das echte Element, das er nachahmt, allerdings muss verhindert werden, dass er irgendeine Kommunikation mit anderen Hosts auslöst. Das können Sie durch strenge Firewallregeln auf dem vorgeschalteten Router erreichen. In Abb. 12.1 ist das der Router des Forschungsnetzwerks. 12.3 Architektur von Frühwarn-Honeypots 393 Abbildung 12.1: Platzierung von Frühwarn-Honeypots in der Nähe schützenswerter Elemente 12.3.3 Phase 3: Alarmierung und Protokollierung entwickeln Der letzte Schritt bei der Bereitstellung von Frühwarn-Honeypots besteht darin, die Protokollierung und Alarmierung zu entwickeln, mit der Analytiker informiert werden, wenn ein Angreifer mit einem Honeypotsystem interagiert. Als Erstes müssen Sie sich klarmachen, welche Fähigkeiten die von Ihnen verwendete Honey­potsoftware mitbringt. Manche Software kann Daten generieren, die sich als Alarmdaten nutzen lassen, beispielsweise MySQL-Datenbankeinträge oder Syslog-­ Ereignisse. Wenn das nicht möglich ist, können Sie versuchen, die Honeypotsoftware mit einem anderen Erkennungsmechanismus zu kombinieren, um einen Alarm auszulösen. Um die beste Möglichkeit zu finden, Alarme hervorzurufen, ohne dafür die Honeypotsoftware selbst zu nutzen, müssen Sie überlegen, wo sich der NSM-Sensor relativ zu dem Honeypotsystem befindet. In Abb. 12.1 ist der Sensor dem kritischen Netzwerksegment mit dem Honeypot unmittelbar vorgeschaltet. Wenn ein Angreifer von einem anderen internen Netzwerksegment aus auf die Honeypots zugreift, können Sie den Erkennungsmechanismus auf diesem Sensor nutzen – sei es Snort, Suricata, Bro oder ein statistisches Werkzeug –, um Alarm auszulösen. 394 12 Frühwarn-Honeypots zur Erkennung Da jede Interaktion mit dem Honeypot unnormal ist, können Sie Alarme auf der Grundlage der gewöhnlichen Kommunikationssequenzen erstellen, die bei der Verwendung des simulierten Dienstes auftreten. In der Situation von Abb. 12.1 sind beispielsweise IDSSignaturen für folgende Ereignisse angebracht: 1. SSH-Honeypot: Übertragung eines SSH-Serverbanners erkannt 2. RDP-Honeypot: RDP-Anmeldung erkannt 3. HTTP-Honeypot: GET-, POST- oder ähnliche HTTP-Anforderung erkannt Wenn ein Angreifer ein System innerhalb des kritischen Netzwerksystems in seine Gewalt gebracht hat und von dort aus auf das Honeypotsystem zugreift, kann der Sensor die entsprechenden Aktionen wahrscheinlich nicht erkennen, da sie die Sensorgrenzen nicht überschreiten können. Um auch in solchen Fällen Alarmdaten zu generieren, können sie auf dem Honeypothost selbst einen hostgestützten Erkennungsmechanismus einrichten. Dieser Mechanismus kann ein Bestandteil der Honeypotsoftware sein, aber auch eine Drittanbieterlösung wie OSSEC für die hostgestützte Erkennung oder sogar ein selbst geschriebenes Skript. In unserem Beispiel würde dieser Mechanismus seine Meldungen direkt an Sensor B oder an ein anderes vorgeschaltetes System senden, das Protokolldaten erfasst. Wenn ein Alarm ausgelöst wurde, müssen die Analytiker die Möglichkeit haben, die von dem Honeypotsystem erstellen Protokolle zu untersuchen, um herauszufinden, was der Angreifer mit dem System angestellt hat. Wie detailliert diese Protokolle sind, hängt gewöhnlich von der Honeypotsoftware ab. Sie sollten allerdings in jedem Fall dafür sorgen, dass die Protokollierung so ausführlich wie möglich erfolgt. Da es bei der Verwendung von Frühwarn-Honeypots kaum Fehlalarme geben dürfte, werden auch weniger Protokolle geschrieben, sodass keine Gefahr besteht, die Speicherkapazität zu sprengen oder eine nicht mehr handhabbare Flut von Protokolldaten zu erzeugen. Jegliche Aktivitäten, die auf dem Honeypot stattfinden, sind verdächtig, da kein legitimer Benutzer jemals versuchen sollte, damit zu kommunizieren. Gelegentliche Fehlalarme sind trotzdem möglich. Sie stehen gewöhnlich im Zusammenhang mit automatischen Netzwerkerkennungsdiensten und legitimen internen Scans. In dieser Phase der Honeypotbereitstellung sollten Sie auch dafür sorgen, dass solche Fehlalarme ausgeschlossen werden, indem Sie die IP-Adressen der Honeypots aus den Scandiensten herausnehmen oder die Erkennungsmechanismen für die Honeypots anpassen. 12.4 Honeypotplattformen Es gibt verschiedene frei erhältliche Honeypotsysteme mit geringer Interaktion. Im restlichen Teil dieses Kapitels werden wir uns einige davon ansehen, die als FrühwarnHoneypots für NSM geeignet sind. 12.4 Honeypotplattformen 395 12.4.1 Honeyd Wenn jemand die Geschichte der Honeypotsoftware aufs Tapet bringt, beginnt die Erörterung gewöhnlich mit Honeyd. Es wurde vor mehr als zehn Jahren von Niels Provos entwickelt und bietet die Möglichkeit, Hosts in Form von Honeypots mit geringer Interaktion zu simulieren. Viele Jahre lang war Honeyd der De-facto-Standard für diese Art von Honeypot, und viele andere moderne Honeypotlösungen machen Anleihen an seine Funktionsweise. Es wurde zwar schon einige Zeit lang nicht mehr aktualisiert, ist aber immer noch sehr brauchbar und kann als Frühwarnsystem gute Dienste leisten. Es gibt mehrere Honeyd-Versionen für Windows, doch das ursprüngliche Honeyd lief ausschließlich auf Unix-Betriebssystemen. Das ist auch die Version, mit der wir uns hier beschäftigen wollen. Honeyd ist so vielseitig, weil es mit einer einfachen Konfigurationsdatei in der Lage ist, viele verschiedene Arten von Systemen und Diensten zu simulieren. Eine einzige ­Honeyd-Instanz kann Dutzende, Hunderte und sogar Tausende von Honeypotsystemen erzeugen. Darüber hinaus nutzt es auch die Fingerabdruckinformationen des Betriebssystems, um dessen Merkmale bis zu denen der dritten und vierten Schicht vorzuspiegeln. Wenn ein Angreifer versucht, das Betriebssystem des Geräts zu ermitteln, werden ihm die meisten automatischen Sondierungswerkzeuge das Betriebssystem nennen, das Sie in der Honeyd-Konfigurationsdatei angegeben haben, selbst wenn das Gerät, auf dem der Honeypot läuft, über ein ganz anderes Betriebssystem verfügt. Die beste Möglichkeit, die Funktionsweise von Honeyd vorzuführen, ist ein praktisches Beispiel. Um Honeyd zu installieren, können Sie es aus dem Quelltext erstellen. Sie können auch mit dem folgenden Befehl einen Paketmanager wie APT verwenden: apt-get install honeyd Um Honeyd auszuführen, müssen wir eine Konfigurationsdatei erstellen. Die mitgelieferte Standardkonfigurationsdatei /etc/honeypot/honeyd.conf enthält einige Beispiele dafür, wie eine solche Datei aufgebaut ist. Wir werden jedoch eine eigene Konfigurationsdatei schreiben, die einfacher ist, und darauf weiter aufbauen. In diesem Beispiel richten wir einen Honeypot ein, der ein Gerät mit Windows Server 2003 und nur den typischen Windows-Ports (135, 139 und 445) vorspiegelt. Dazu müssen wir zunächst einige Standardeinstellungen für Honeyd einrichten: create default set default default tcp action block set default default udp action block set default default icmp action block Diese vier Zeilen weisen Honeyd an, sämtliche eingehende Kommunikation zu blockieren, sofern nichts anderes angegeben ist. Das können Sie sich wie die Standardblockierregel einer Firewall vorstellen. 396 12 Frühwarn-Honeypots zur Erkennung Danach erstellen wir mit dem Befehl create einen Honeypot und geben dessen Namen an, hier ansm_winserver_1: create ansm_winserver_1 Da wir ein Gerät mit Windows Server 2003 simulieren wollen, verwenden wir den Befehl set mit der entsprechenden personality-Option: set ansm_winserver_1 personality "Microsoft Windows Server 2003 Standard Edition" Die Merkmale dieser »Persönlichkeit« stammen aus der Fingerabdruckdatenbank, die von dem weit verbreiteten Port- und Schwachstellenscanner Nmap verwendet wird. Für diese Fingerabdrücke verwendet die Standardinstallation von Honeyd die Datei /etc/honeypot/ nmap.prints, allerdings ist sie alles andere als auf dem neuesten Stand. Wenn Sie die »Persönlichkeit« eines modernen Betriebssystems brauchen, das in der Standarddatei nmap. prints nicht aufgeführt ist, dann können Sie aus der aktuellen Nmap-Fingerabdruckdatenbank auf https://svn.nmap.org/nmap/nmap-os-db einen eigenen Eintrag erstellen. Denken Sie daran, dass die Fingerabdrücke für neuere Versionen von Nmap einige Anpassungen erfordern können, bevor sie in Honeyd korrekt funktionieren. Als Nächstes müssen wir festlegen, welche Ports geöffnet sein sollen. In diesem Fall sollen es die drei Ports sein, die auf ein Windows-System hindeuten, nämlich die TCP-Ports 135, 139 und 445. add ansm_winserver_1 tcp port 135 open add ansm_winserver_1 tcp port 139 open add ansm_winserver_1 tcp port 445 open Der letzte Schritt besteht darin, unserem Honeypot eine MAC- und eine IP-Adresse zu geben, sodass er im Netzwerk kommunizieren kann. Das geschieht mit den Befehlen set und bind: set ansm_winserver_1 ethernet "d3:ad:b3:3f:11:11" bind 172.16.16.202 ansm_winserver_1 Damit haben wir alles zusammen, was wir brauchen, um diesen einfachen Honeypot ans Laufen zu bekommen. Wenn Sie die zuvor angegebenen Konfigurationszeilen in einer Datei namens ansm.conf gespeichert haben, können Sie Honeyd nun mit dem folgenden Befehl ausführen: sudo honeyd –d –f /etc/honeypot/ansm.conf 12.4 Honeypotplattformen 397 Der Schalter -d sorgt dafür, dass Honeyd nicht als Daemon ausgeführt wird, sodass wir die Ausgabe auf dem Bildschirm sehen können. Mit -f geben wir den Speicherort unserer Konfigurationsdatei an. Jetzt können wir Honeyd testen, indem wir einen Portscan an dem Honeypot durchführen. Die Ausgabe dieses Scans sehen Sie in Abb. 12.2. Abbildung 12.2: Der Portscan zeigt die offenen Ports des Honeypots Natürlich hat Honeyd diesen Scanvorgang ausführlich protokolliert. Diese Protokolle werden standardmäßig im Syslog-Format unter /var/log/syslog gespeichert, was es sehr einfach macht, sie an Drittanbieterwerkzeuge wie ELSA oder Logstash zu übergeben. Die Protokollausgabe zu dem Scanvorgang sehen Sie in Abb. 12.3. Abbildung 12.3: Syslog-Protokollausgabe von Honeyd über den Scanvorgang Bis jetzt ist der Funktionsumfang unseres Honeypots noch stark eingeschränkt. Ein Angreifer kann zwar den Host scannen und offene Ports finden (das Ergebnis eines TCPDrei-Wege-Handshakes), aber sonst nichts auf dem Host anstellen. Wenn Sie wirklich nur einen Windows-Host simulieren wollen, der keinerlei Dienste außer denen eines Domänencontrollers oder Dateiservers bereitstellt, reicht der bisherige Funktionsumfang völlig aus. Da niemand jemals mit diesem System kommunizieren sollte, können Sie es im Sichtfeld eines IDS-Sensors platzieren, der über folgende Regel verfügt: 398 12 Frühwarn-Honeypots zur Erkennung alert ip !$TRUSTED_MS_HOSTS any ->$MS_HONEYPOT_SERVERS [135,139,445] (msg:"Attempted Communication with Windows Honeypot on MS Ports"; sid:5000000; rev:1;) Mithilfe dieser Regel werden alle TCP- und UDP-Kommunikationsversuche mit diesem Honeypot erkannt (vorausgesetzt, dass er in die Variable $MS_HONEYPOT_SERVERS aufgenommen ist), außer von den zulässigen Systemen in der Variable $TRUSTED_MS_HOSTS. Mit dieser Variable können Sie Kommunikationsversuche von Geräten wie Domänen­controllern und Aktualisierungs- und Verwaltungsservern wie WSUS und SMS ausschließen. Um für die Situation gewappnet zu sein, dass ein System im selben Netzwerksegment versucht, mit dem Honeypot zu kommunizieren, sollten Sie auch einen Erkennungs­ mechanismus vorsehen, der Alarmdaten von dem Honeypotserver selbst generiert. Da Honeyd Protokolle im Syslog-Format schreibt, können Sie dazu einfach die Syslog-Daten auf einen anderen Host übertragen, der daraus Alarme erzeugen kann. Sie können auch ein Host-IDS wie OSSEC einsetzen. Die jetzige Konfiguration ist ideal geeignet, um einfache Dienste nachzuahmen, aber damit ist der Funktionsumfang von Honeyd noch nicht erschöpft. Es kann viel anspruchsvollere Dienste imitieren, indem es Skripte aufruft, die an bestimmte offene Ports gebunden sind. Um ein Beispiel zu geben, wollen wir unseren Windows 2003-Honeypot so ändern, dass er einen Webserver simuliert. Dazu fügen wir hinter der Angabe der offenen Ports folgende Zeile hinzu: add ansm_winserver_1 tcp port 80 "sh /usr/share/honeyd/scripts/win32/web.sh" Wenn ein Angreifer jetzt einen Portscan durchführt, stellt er fest, dass Port 80 geöffnet ist, was auf einen Webserver hindeutet. Greift derselbe Angreifer nun mit einem Browser auf das System zu, wird ihm sogar eine Webseite angezeigt. Sie ist in dem aufgerufenen Skript web.sh enthalten und kann so angepasst werden, dass sie der Webseite eines echten Webservers in Ihrer Umgebung ähnelt. Neben der üblichen Syslog-Protokollierung hält Honeyd bei dem Versuch des Angreifers, den falschen Webserver zu erreichen, auch den HTTP-Header der Clientanforderung fest (siehe Abb. 12.4). Abbildung 12.4: HTTP-Header der Clientanforderung bei dem Verbindungsversuch eines Angreifers auf dem Honeypot-Webserver 12.4 Honeypotplattformen 399 Mit einer Protokollierung in diesem Umfang können Sie ermitteln, welche Tools ein Angreifer verwendet, um zu versuchen, auf Ihre Infrastruktur zuzugreifen. In dem Beispiel aus Abb. 12.4 können Sie erkennen, dass der Browser Chrome (User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36) mit dem Zeichensatz für amerikanisches Englisch (Accept-Language: en-US,en;q=0.8) verwendet wurde. Um die Kommunikation mit diesem Frühwarn-Honeypot zu erkennen, können Sie folgende IDS-Regel verwenden: alert tcp any any ->$WEB_HONEYPOT_SERVERS 80 (msg:"HTTP GET Request to Web Honeypot"; content:"GET"; http_method; sid:5000000; rev:1;) Dadurch wird für jede HTTP-GET-Anforderung an diesen Host ein Alarm ausgelöst, sofern er in die Variable $WEB_HONEYPOT_SERVERS der verwendeten IDS-Engine aufgenommen ist. Sie können in den HTML-Code der Honeypot-Website auch einen Inhaltsstring einfügen und eine Regel erstellen, die genau diesen String erkennt. Honeyd bringt mehrere Skripte mit, die eine Vielzahl verschiedener Dienste auf ähnliche Weise simulieren, darunter SMTP, SNMP, Telnet, POP usw. Diese Skripte bieten unterschiedlich viel Interaktion, weshalb Sie sie gründlich testen sollten, um zu sehen, ob sie sich für Ihre Umgebung eignen. In diesem Abschnitt konnten wir natürlich nur an der Oberfläche von Honeyd kratzen. Neben dem, was wir hier gezeigt haben, kann Honeyd auch Angreifer zu einem anderen System umleiten und sich sogar als Routinggerät ausgeben. Es ist zwar nicht ganz so stabil wie einige der Honeypotlösungen, die auf die Simulation eines einzigen Dienstes spezialisiert sind, aber da es Dutzende von Honeypotsystemen erzeugen kann, ist es als Frühwarnsystem für die NSM-Erkennung äußerst nützlich. Wenn Sie mit Honeyd experimentieren möchten, sollten Sie sich die Dokumentation auf http://honeyd.org/ ansehen. 12.4.2 Der SSH-Honeypot Kippo Die nächste Plattform, die wir uns ansehen wollen, habe ich in diesem Kapitel schon einmal erwähnt, nämlich Kippo. Dieser Honeypot mit geringer Interaktion simuliert einen SSH-Server und soll Brute-Force-Angriffe erkennen und die Aktivitäten, die Angreifer in einer simulierten Shell-Umgebung ausführen, protokollieren. Da das Protokoll SSH häufig zur Verwaltung sowohl von Geräten mit Unix-artigen Betriebssystemen als auch von Netzwerkgeräten wie Switches und Router eingesetzt wird, gibt Kippo auch einen guten Frühwarn-Honeypot ab. Nachdem Angreifer im Netzwerk Fuß gefasst haben, versuchen sie oft, über den SSH-Dienst auf andere Geräte Zugriff zu erhalten. Dabei gibt es verschiedene Möglichkeiten: 1. Der Angreifer versucht mit einem Brute-Force- oder Wörterbuchangriff, Zugriff auf den SSH-Server zu erhalten. 400 12 Frühwarn-Honeypots zur Erkennung 2. Der Angreifer versucht, das Passwort eines Benutzers zu erraten, um Zugriff zu erhalten. 3. Der Angreifer meldet sich an dem Dienst mit Informationen an, die er auf andere Weise in Erfahrung gebracht hat. Die erste Vorgehensweise lässt sich erkennen, wenn der Angriff über eine Sensorgrenze hinweg erfolgt, sodass ein Alarm ausgelöst werden kann. Allerdings ist eine solche netzwerkgestützte Erkennung nicht möglich, wenn der Brute-Force-Angriff einem Gerät im selben Netzwerksegment gilt. Das Gleiche gilt für die zweite Vorgehensweise, wobei die geringere Menge der Authentifizierungsversuche die Erkennung noch weiter erschwert. Ein Brute-Force- oder Wörterbuchangriff ruft ein hohes Maß an Datenverkehr hervor, das sich leicht mithilfe einer IDS-Signatur oder eines statistischen Verfahrens aufspüren lässt, aber wenn ein Angreifer lediglich Passwörter für einen einzigen Benutzer zu erraten versucht, bleibt er dabei möglicherweise unter dem Schwellenwert für einen Alarm. Im dritten Fall ist eine herkömmliche netzwerkgestützte Erkennung praktisch unmöglich, da der Angreifer legitime Anmeldeinformationen nutzt, weshalb der Vorgang genauso aussieht wie bei der normalen Authentifizierung eines Benutzers. Eine solche Aktivität können wir nur mithilfe einer anomaliegestützten Erkennung wahrnehmen, wenn sich der Benutzer von einem System aus anmeldet, das er normalerweise nicht verwendet. Als Schutzmaßnahme gegen solche Arten von Angriffen können wir in dem Netzwerksegment, in dem sich die kritischen Elemente befinden, einen SSH-Honeypot wie Kippo bereitstellen. Da niemand einen Grund hat, sich jemals an diesem System anzumelden, sollte jeder Anmeldeversuch und jeder Netzwerkverkehr außer dem im Zusammenhang mit Standardbroadcasts und Updates einen Alarm auslösen. In dieser Situation aber können wir alle drei vorgenannten Aktivitäten erkennen. Unser Honeypot dient dann als Frühwarnsystem, das uns darüber informiert, dass jemand in unserem Netzwerk unzulässige Dinge tut. Ein zusätzliches Plus besteht darin, dass wir es dadurch mitbekommen, wenn ein Angreifer Anmeldeinformationen benutzt, die er sich auf andere Weise beschafft hat. In diesem Fall müssen wir vermuten, dass auch andere Dienste, auf die der betreffende Benutzer Zugriff hat, angegriffen worden sein können. Fehlalarme können eigentlich nur auftreten, wenn sich ein Administrator versehentlich an einem dieser Systeme anmeldet. Kippo können Sie von https://code.google.com/p/kippo/ herunterladen. Da es sich dabei um ein Python-Skript handelt, ist keine Kompilierung und keine Installation erforderlich. Um Kippo zu starten, führen Sie einfach die Datei start.sh im Kippo-Verzeichnis aus. Mithilfe der Datei kippo.cfg können Sie die Konfiguration von Kippo ausführlich an Ihre eigenen Bedürfnisse anpassen, aber für unsere Zwecke lassen wir die Standardkonfiguration unberührt. Bericht von der Front Wenn Sie Kippo in einer Produktionsumgebung bereitstellen, sollten Sie sich die Zeit nehmen, die Einstellungen zu ändern, an denen ein Angreifer das System als Honeypot erkennen könnte, also unter anderem den Hostnamen und den Inhalt des gefälschten Dateisystems. Am besten ist es, diese Aspekte möglichst ähnlich zu gestalten wie auf den Produktionssystemen. 12.4 Honeypotplattformen 401 Wenn Sie Kippo gestartet haben, können Sie eine Verbindung zu seiner gefälschten SSHUmgebung herstellen. In der Standardkonfiguration von Kippo wird der SSH-Dienst an Port 2222 bereitgestellt. Richten Sie Ihren Honeypot so ein, dass er den in Ihrem Unternehmen üblichen Port verwendet, etwa den Standardport 22. In der Grundeinstellung protokolliert Kippo jede versuchte Anmeldung an dem Dienst und hält dabei den Benutzernamen und das Passwort fest, die verwendet wurden. Gespeichert wird das Protokoll standardmäßig als log/kippo.log. Ein Beispiel für diese Datei zeigt Abb. 12.5. Abbildung 12.5: Protokollierung von Authentifizierungsversuchen in Kippo Sie können in Kippo ein Benutzerkonto und ein Passwort festlegen, mit dem sich ein Angreifer erfolgreich in dem simulierten Dateisystem anmelden kann. Angegeben sind diese Anmeldeinformationen in der Datei data/userdb.txt, wobei standardmäßig der Benutzer root und das Passwort 123456 verwendet werden. In dem gefälschten Dateisystem, das ein Angreifer mithilfe dieser Anmeldeinformationen erreicht, kann er nicht nur umsehen, sondern auch Dateien erstellen und löschen (siehe Abb. 12.6). Abbildung 12.6: Unterwegs im gefälschten Dateisystem von Kippo Selbstverständlich werden die Aktionen des Angreifers in dieser Umgebung gründlich protokolliert. Ein Beispiel für diese Aufzeichnungen sehen Sie in Abb. 12.7. 402 12 Frühwarn-Honeypots zur Erkennung Abbildung 12.7: Kippo-Protokolle der Aktionen eines Angreifers im Terminal In diesem Beispiel versucht der Angreifer, die Datei /etc/passwd mithilfe der Befehle scp und ftp zu dem Host zurückzusenden, vom dem aus er sich angemeldet hat. Da in dieser Umgebung weder ein SCP- noch ein FTP-Client zur Verfügung steht, meldet das System, dass die Befehle nicht gefunden werden können. Die Standarddatei kippo.log enthält keine ausführlichen Aufzeichnungen über diese Befehle, doch die Informationen können Sie im Ordner log/tty finden. Dort gibt es eine ausführliche binäre Protokolldatei der Aktionen, die in allen von der Software erzeugten Terminalsitzungen abliefen. Die Datei­ namen enthalten jeweils den Zeitstempel der Initialisierung der Sitzung. Allerdings lassen sich die Dateien nicht so einfach als Klartext einsehen, sondern müssen mit dem KippoHilfsprogramm playlog.py aus dem Ordner util/ geöffnet werden. Dieses Programm gibt die Aufzeichnung so wieder, als würden Sie dem Angreifer über die Schulter blicken und seine Terminalsitzung beobachten. Die Befehlseingaben werden in Echtzeit angezeigt, wobei jeder Tastendruck, jeder Rückschritt und jede Pause erfasst werden. Wenn Sie diese Ausgabe in Präsentationen vorführen, kann das sehr eindrucksvoll wirken. Abb. 12.8 zeigt die Ausgabe von playlog.py für den Angriff aus Abb. 12.7. Hier können Sie auch eine ausführlichere Ausgabe des Befehls id erkennen als in der Standardprotokolldatei kippo.log. Die zusätzlichen Interaktionsmöglichkeiten, die Kippo in seinem gefälschten Dateisystem bietet, sind sehr nützlich, um Informationen über die Motive oder Taktiken der Angreifer zu gewinnen. Sobald Angreifer Zugriff auf ein System erlangen, laden sie meistens als Erstes weitere Dateien von einer externen Website herunter, die ihnen dabei helfen sollen, die nächsten Ziele zu erreichen. Dabei kann es sich um Malware handeln, um Keylogger, Backdoors oder Rootkits. Wenn das in der Kippo-Umgebung geschieht, können Sie den Remotehost erkennen, von dem sie versuchen, die Daten herunterzuladen. Das ist eine sehr wertvolle Information, die Ihnen dabei helfen kann, Ihre Strategie für die Erfassung, Erkennung und Analyse zu gestalten. Abbildung 12.8: Wiedergabe eines Angriffs mit dem TTY-Protokoll von Kippo 12.4 Honeypotplattformen 403 Das eigene Protokollformat von Kippo lässt sich von anderen Tools leicht verarbeiten. Es bietet auch die Möglichkeit der Protokollierung in einer MySQL-Datenbank, was praktisch sein kann, um die Kippo-Daten in ein anderes Werkzeug zu übernehmen. Um die Erkennung zu verbessern, können Sie zusammen mit dem Honeypotserver noch IDSSignaturen und andere Mechanismen einsetzen. Das ist im Allgemeinen die bevorzugte Methode, um bei der Interaktion mit einem Honeypot Alarm auszulösen. Beispielsweise können Sie die folgenden Snort/Suricata-Regeln verwenden, um eine versuchte Authentifizierung an einem Honeypotsystem zu erkennen: alert tcp $HONEYPOT_SERVERS $SSH_PORTS ->any any (msg:"ET POLICY SSH Server Banner Detected on Expected Port – Honeypot System"; flow: from_ server,established; content:"SSH-"; offset: 0; depth: 4; byte_test: 1,>,48,0,relative; byte_test:1,<,51,0,relative; byte_test:1,=,46,1, relative; reference:url,doc.emergingthreats.net/2001973; classtype: misc-activity; sid:2001973; rev:8;) alert tcp any any <> $HONEYPOT_SERVERS $SSH_PORTS (msg:"ET POLICY SSH session in progress on Expected Port – Honeypot System"; threshold: type both, track by_src, count 2, seconds 300; reference:url,doc.emergingthreats. net/2001978; classtype:misc-activity; sid:2001978; rev:7;) Die erste dieser Regeln (SID 2001973) erkennt es, wenn das SSH-Serverbanner an einen Client gesendet wird, die zweite (SID 2001978) erkennt eine laufende SSH-Sitzung. Diese Regeln werden von Emerging Threats bereitgestellt, wobei ich sie ein wenig abgewandelt habe, um nur Datenverkehr zu Systemen zu berücksichtigen, die von der Variable $HONEYPOT_SERVERS abgedeckt sind. Damit die Regeln in dieser Form funktionieren, müssen Sie diese Variable natürlich auf Ihrem Sensor eingerichtet haben. Wenn Sie diese Regeln einsetzen, werden Sie alarmiert, sobald der Sensor erkennt, dass jemand mit dem SSH-Dienst auf Ihrem Honeypotsystem umgeht. Das Ausmaß dieses Vorgangs können Sie dann anhand der von Kippo erstellten Protokolldaten bestimmen. Denken Sie aber daran, dass diese Aktivitäten nur dann erkannt werden, wenn der Angriff auf Honeypot auf einem Weg erfolgt, den der Sensor überblicken kann. Um Ereignisse wahrzunehmen, die innerhalb des Netzwerksegments ablaufen, müssen Sie die Alarme von dem Honeypotsystem selbst hervorrufen lassen. Es gibt verschiedene Vorgehensweisen dazu. Beispielsweise können Sie die Kippo-Protokolle zu Syslog senden und eine Alarmierung bei bestimmten Ereignissen anrichten. Eine andere Möglichkeit besteht darin, ein Host-IDS wie OSSEC zu verwenden. Kippo bietet noch weitere Funktionen, die wir hier nicht alle beschreiben können. Außerdem gibt es eine Reihe zusätzlicher Hilfsprogramme und Drittanbietererweiterungen, die einen Blick wert sind. Mehr darüber erfahren Sie auf https://code.google.com/p/kippo. 404 12 Frühwarn-Honeypots zur Erkennung 12.4.3 Tom’s Honeypot Als Letztes sehen wir uns Tom’s Honeypot an, der von Tom Liston entwickelt wurde, dem Autor eines der ersten Produktionshoneypots, LaBrea Tar Pit. Es handelt sich dabei um einen Python-Honeypot mit geringer Interaktion, der einige wenige häufig angegriffene Dienste simuliert: •• •• •• •• •• Remote Desktop Protocol (RDP) (TCP/3389) Microsoft SQL Server (MSSQL) (TCP/1433, UDP/1434) Virtual Network Computer (VNC) (TCP/5900) RAdmin (Remote Administration) (TCP/4899) Session Initiation Protocol (SIP) (UDP/5060) Tom’s Honeypot lauscht an den angegebenen Ports auf Kommunikation mit diesen Diensten. Wenn ein Angreifer versucht, auf einen der Dienste zuzugreifen, wird in die Datei tomshoneypot.log ein Alarm eingetragen. Da es sich bei Tom’s Honeypot um ein Python-Skript handelt, müssen Sie zu seiner Benutzung lediglich eine Voraussetzung installieren (das Python-Modul Twisted) und es dann in Python ausführen. Zur Installation dieser Voraussetzung in Security Onion verwenden Sie folgenden Befehl: sudo apt-gete install python-twisted Das Skript können Sie von http://labs.inguardians.com/tomshoneypot/ beziehen. Um es auszuführen, geben Sie folgenden Befehl: python tomshoneypot.py Standardmäßig sind alle verfügbaren Dienste eingeschaltet. Wenn Sie nur einen Teil der Dienste verwenden wollen, müssen Sie das Skript manuell bearbeiten und die entsprechenden Abschnitte auskommentieren: reactor.listenTCP(1433, fMSSQL, interface=interface) reactor.listenTCP(3389, fTS, interface=interface) reactor.listenTCP(5900, fVNC, interface=interface) reactor.listenTCP(22292, fDump, interface=interface) reactor.listenTCP(4899, fRAdmind, interface=interface) reactor.listenUDP(1434, uFakeMSSQL(), interface=interface) reactor.listenUDP(5060, uFakeSIP(), interface=interface) Wenn Sie einen bestimmten Dienst nicht ausführen wollen, stellen Sie der entsprechenden Zeile einfach ein amerikanisches Nummernzeichen (#) voran. Dadurch ignoriert 12.4 Honeypotplattformen 405 der Python-Interpreter die Zeile und verzichtet darauf, den Listener für den mit diesem Dienst verbundenen Port zu starten. Sehen wir uns ein Anwendungsbeispiel mit dem Dienst RDP an. Dieses Protokoll wird für die Remotedesktopverwaltung von Windows-Computern verwendet. Wenn Angreifer in einem Netzwerk Fuß gefasst haben, sehen sie sich gewöhnlich nach weiteren Zielen um, die sie angreifen können. Der RDP-Dienst verwendet normalerweise Port 3389, und wenn Angreifer diesen Port geöffnet sehen, versuchen Sie meistens, mithilfe eines RDPClients Verbindung damit aufzunehmen. Falls sie sich die Anmeldeinformationen eines Benutzers auf andere Weise beschafft haben, können sie mithilfe des RDP-Dienstes die Kontrolle über den Server übernehmen und damit beginnen, Daten zu rauben. Kennen sie die Anmeldeinformationen nicht, können sie den RDP-Sever trotzdem nutzen, um zu versuchen, das Passwort des Benutzers zu erraten, oder zumindest die Windows-Version in Erfahrung zu bringen, die auf dem Computer läuft. Bei Tom’s Honeypot läuft an Port 3389 ein gefälschter RDP-Server, der Angreifer dazu verleiten soll, Verbindung mit diesem Dienst aufzunehmen. Wenn ein Angreifer das versucht, führt der von ihm verwendete Computer einen vollständigen TCP-Handshake mit dem Honeypot durch und sendet eine RDP-Verbindungsanforderung, auf die der Honeypot jedoch nicht antwortet. Der Angreifer nimmt dann gewöhnlich an, dass dies aufgrund irgendwelcher Einschränkungen auf dem Host der Fall ist oder weil der Dienst ausgefallen ist. In Wirklichkeit liegt es natürlich daran, dass es gar keinen legitimen RDP-Dienst gibt, an dem man sich anmelden könnte. Anstatt einen RDP-Server bereitzustellen, protokolliert Tom’s Honeypot den versuchten Zugriff auf das gefälschte System. Ein Beispiel für ein solches Protokoll sehen Sie in Abb. 12.9. Abbildung 12.9: Ein Beispiel für ein Protokoll von Tom’s Honeypot über einen versuchten RDPZugriff Das hier gezeigte Protokoll enthält fünf Einträge, wobei vier davon das Feld Login enthalten. Tom’s Honeypot zeigt keinen Bildschirm für eine interaktive Anmeldung an, sondern nutzt die Tatsache, dass RDP-Clients versuchen, während der ersten Anmeldeanforderung 406 12 Frühwarn-Honeypots zur Erkennung ein Cookie zu übertragen. Dieses RDP-Cookie hat mit der eigentlichen Authentifizierung nichts zu tun, sondern enthält einen Benutzernamen, der zur Identifizierung in Terminaldiensten dient. Im ersten Protokolleintrag in Abb. 12.9 wird kein Ergebnis für dieses Feld angezeigt, da während dieses Verbindungsversuchs noch kein RDP-Cookie vorhanden war. In den folgenden vier Einträgen können Sie aber Werte dafür sehen. Der zweite und der dritte Eintrag zeigen zwei verschiedene IP-Adressen, von denen aus versucht wurde, Verbindung mit dem Honeypot aufzunehmen, wobei in den RDP-Cookies die Benutzernamen a und j verwendet wurden. Die beiden letzten Einträge zeigen zwei Anmeldeversuche von der IP-Adresse 192.0.2.234 mit dem Benutzernamen NCRACK_USER im RDP-Cookie. Bei Ncrack handelt es sich um ein Tool zum Knacken von Authentifizierungsmaßnahmen, das für den Angriff auf RDP-Server verwendet wird. Das zeigt, dass 192.0.2.234 versucht, nicht autorisierten Zugriff auf das Honeypotsystem zu erhalten. Die anderen gefälschten Dienste, die Tom’s Honeypot bereitstellt, funktionieren auf ähnliche Weise. Abb. 12.10 zeigt ein Beispiel der Protokolle für die Honeypotdienste MSSQL und SIP. Abbildung 12.10: Protokolle von Tom’s Honeypot für die Protokolle MSSQL und SIP In dieser Abbildung sehen Sie zwei Protokolle. Das erste zeigt die Daten über einen Angreifer, der versucht hat, über einen MS-SQL-Client (TCP-Port 1433) mit Tom’s Honeypot zu kommunizieren. Hier sind auch Informationen über den Client zu sehen, über den die Verbindung mit dem falschen MS-SQL-Dienst versucht wurde. Im zweiten Protokoll versucht jemand, über das Protokoll SIP (UDP-Port 5060) mit dem Honeypot zu kommunizieren, das gewöhnlich für VoIP-Dienste (Voice over IP) 12.4 Honeypotplattformen 407 verwendet wird. In diesem Fall wurde der Datenverkehr von dem Tool Sipvicious hervorgerufen, das zum Scannen, Auflisten und Untersuchen von SIP-Diensten verwendet wird. Tom’s Honeypot wird immer weiterentwickelt, und sehr wahrscheinlich sind neue Funktionen hinzugekommen, wenn Sie dieses Buch lesen. Um mehr über Tom’s Honeypot zu erfahren, sehen Sie sich auf der Projektwebsite auf http://labs.inguardians.com/tomshoneypot/ um. 12.4.4 Honeydocs Beim Konzipieren von Sicherheitsmaßnahmen konzentrieren wir uns meistens darauf, Systeme und Prozesse zu schützen. Das ist zwar alles gut und schön, aber meistens sind es gar nicht die Systeme und Prozesse, die geschützt werden müssen, sondern die Daten auf diesen Systemen. An dieser Stelle kommen Honeydocs ins Spiel. Dabei handelt es sich um eine besondere Form von »Honey-Technologie«. Anstatt ein legitimes System zu simulieren und den Zugriff darauf zu protokollieren, spiegeln Honeydocs legitime Dokumente vor und halten den Zugriff darauf fest. Üblicherweise werden Honeydocs neben den echten Dokumenten bereitgestellt. Sie enthalten gefälschte Daten und darüber hinaus versteckten Code, der auf einen Drittserver verweist. Wenn sich ein Angreifer Zugriff auf die geschützten Daten verschaffen konnte, wird er über kurz oder lang auch das Honeydoc öffnen, und dabei wird das System Verbindung mit dem Drittserver aufnehmen, der alle Einzelheiten über den Client aufzeichnet, der das Dokument geöffnet hat. Es gibt verschiedene Möglichkeiten, Honeydocs anzulegen. Am gebräuchlichsten ist die Methode, in ein Dokument Code aufzunehmen, der beim Öffnen des Dokuments eine HTTP-Anforderung auslöst. Diese Anforderungen können zwar blockiert oder unterlaufen werden, aber bei unerfahrenen oder hastigen Angreifern werden sie oft erfolgreich ausgeführt. Um ein Beispiel zu geben, wollen wir ein Honeydoc in Form eines Microsoft-Word-­ Dokuments erstellen. Am schnellsten geht das, indem wir ein reines Textdokument ohne jegliche Formatierung anlegen. Das können Sie am Terminal oder mit Programmen wie dem Windows-Editor oder TextEdit machen. Das Dokument solle eine Reihe falscher Daten enthalten, die für einen Angreifer interessant sein könnten, z. B. eine Liste angeblicher Benutzer und Passworthashes. Umgeben Sie die Daten anschließend mit den Tags <html> und </html>, um sie als Webinhalte auszuzeichnen. Im letzten Schritt bauen wir den Inhalt ein, der die Anforderung an unseren Webserver stellt. Dazu verwenden wir das HTML-Tag <img>, in dem wir aber nicht den URL eines Bildes angeben, sondern einen URL zu unserem Webserver mit einer laufenden Nummer: <img src="http://172.16.16.202/doc123456"> 408 12 Frühwarn-Honeypots zur Erkennung Beim praktischen Einsatz muss dieser URL auf eine öffentliche IP-Adresse oder einen Domänennamen verweisen. Es ist wichtig, eine laufende Nummer für jedes Honeydoc anzugeben, sodass wir die Übersicht über die von den einzelnen Dokumenten ausgelösten Anforderungen behalten. Das fertige Honeydoc sehen Sie in Abb. 12.11. Abbildung 12.11: Ein Honeydoc im rohen HTML-Format Der letzte Schritt besteht darin, das Dokument in einem geeigneten Format zu speichern, gewöhnlich als eine DOC- oder DOCX-Datei, die von Microsoft Word und ähnlichen Anwendungen verarbeitet werden kann. Wenn Sie das Dokument öffnen, versucht Wort, die in dem <img>-Tag angegebene Bilddatei zu öffnen und löst damit eine GET-Anforderung an den Webserver aus. In diesem Beispiel führt der Verweis zu einem Honeyd-Server, der die Ausgabe in Abb. 12.12 hervorruft. Abbildung 12.12: Honeyd-Protokollausgabe für den Zugriff auf das Honeydoc 12.4 Honeypotplattformen 409 Mithilfe dieser Protokolldaten können Sie nun einen Alarm generieren, mit dem die Analytiker auf den Zugriff auf das Honeydoc aufmerksam gemacht werden. Da die Honeydocs gewöhnlich neben den echten Dateien platziert werden, besteht immer die Gefahr, dass auch legitime Benutzer versehentlich darauf zugreifen, aber das sollte nicht allzu oft vorkommen. Bei Honeydocs sind Sie nicht auf Textdokumente beschränkt. Die gleiche Methode können Sie auch für andere Arten von Dateien anwenden, etwa für HTM-, PDF- oder sogar XLS-Dateien. Wenn Sie das Erstellen und Verfolgen von Honeydocs ausprobieren möchten, ohne selbst einen Webserver einzurichten, können Sie den Dienst Honeydocs.com nutzen. Sein Zweck besteht darin, das Erstellen von Honeydocs und die Verfolgung von Honeydoc-Kampagnen (oder »Stings«, wie sie dort genannt werden) zu automatisieren. Die kostenlose Registrierung bei Honeydocs.com ermöglicht es Ihnen, einen einzigen Sting zu erstellen, der mehrere Honeydocs enthalten kann. Gegen eine Gebühr können Sie auch mehrere Stings anlegen und den Honeydoc-Dienst nutzen, um E-Mail- oder SMS-Alarme auszulösen, wenn jemand auf eines der von Ihnen erstellten Honeydocs zugreift. Die Webschnittstelle dieses Dienstes sehen Sie in Abb. 12.13. Abbildung 12.13: Die Webschnittstelle von Honeydocs.com Ich habe schon verschiedene Arten von Honeydocs gesehen, die mit großem Erfolg für unterschiedliche Erkennungs- und Reaktionsaufgaben eingesetzt wurden. Ein Wort der Vorsicht ist jedoch angebracht: Honeydocs funktionieren nicht gerade heimlich, still und leise, und selbst ein relativ unerfahrener Angreifer wird es bemerken, wenn das Dokument versucht, mit einem externen Host zu kommunizieren. Das könnte den Drittserver wiederum Sondierungsversuchen des Angreifers aussetzen, weshalb Sie dafür sorgen müssen, dass er sicher und im Idealfall von Ihrem Firmennetzwerk getrennt ist. Er sollte auch nicht auf Ihre Organisation zurückzuführen sein. Im Idealfall sollte der Angreifer nicht einmal bemerken, dass das Honeydoc »nach Hause telefoniert«. Wenn er es doch mitbekommt, muss das Risiko so gering wie möglich gehalten werden. Wie bei allen anderen in diesem Kapitel besprochenen Technologien müssen Sie auch bei der Verwendung von Honeydocs große Sorgfalt walten lassen. 410 12 Frühwarn-Honeypots zur Erkennung 12.5 Zusammenfassung In diesem Kapitel haben wir die Verwendung von Frühwarn-Honeypots in einer NSMUmgebung behandelt. Dabei haben wir uns mit der Platzierung solcher Honeypots beschäftigt, uns Gedanken über Alarmierung und Protokollierung gemacht und uns einige Softwarelösungen dafür angesehen. Außerdem haben wir einen Blick auf Honeydocs und ihren Einsatz für die NSM-Erkennung geworfen. Honeypots werden gewöhnlich nur für Forschungszwecke verwendet, doch mit den hier beschriebenen Vorgehensweisen können Sie Frühwarn-Honeypots auch als äußerst nützlichen Erkennungsmechanismus im Kampf gegen Angreifer nutzen. Teil 3 Analyse 13 Paketanalyse In der Analysephase des Network Security Monitorings geht es darum, die Daten zu untersuchen, um zu ermitteln, ob ein Zwischenfall stattgefunden hat. Da sich die meisten von NSM-Tools erfassten Daten auf Netzwerkaktivitäten beziehen, gehören die Analyse und Interpretation von Paketdaten zu den wichtigen Fähigkeiten von Analytikern. In diesem ersten Kapitel des Teils über die Analyse werden wir uns daher aus dem Blickwinkel eines NSM-Analytikers mit der Paketanalyse beschäftigen. Dabei gehen wir davon aus, dass Sie gewisse Grundkenntnisse darin haben, wie Computer über das Netzwerk kommunizieren. Vorkenntnisse in Paketanalyse werden aber nicht vorausgesetzt. Wir schauen uns an, wie Sie Pakete mithilfe von »Paketmathematik« und Protokollheaderzuordnungen interpretieren und wie Sie sie filtern können. Zur Arbeit mit den Paketen verwenden wir Tcpdump und Wireshark. Der Hauptzweck dieses Kapitels besteht darin, Ihnen Grundkenntnisse über Pakete zu vermitteln und eine Orientierungshilfe zu bieten, um auch die Protokolle zu verstehen, die wir hier nicht behandeln. 414 13 Paketanalyse Weitere Informationen Dieses Buch ist zwar für Analytiker jeglichen Kenntnisstandes geschrieben, aber wir setzen trotzdem voraus, dass Sie eine Vorstellung davon haben, wie Netzwerkgeräte miteinander kommunizieren. Sie sollten Grundwissen über das OSIbzw. TCP/IP-Modell mitbringen und wissen, wie Kapselung funktioniert. Zur Auffrischung vor der Lektüre dieses Kapitels empfehle ich Ihnen mein Buch »Practical Packet Analysis«. Sie müssen es nicht komplett lesen; das erste Kapitel reicht aus, um den Stoff in diesem Kapitel zu verstehen. 13.1 Gestatten: das Paket! In einem Netzwerk – sei es ein kleines Heimnetzwerk, ein großes Unternehmensnetzwerk oder ein weltweites Netzwerk wie das Internet – kommunizieren mannigfaltige Geräte von verschiedenen Herstellern miteinander. Das funktioniert, solange sie die gleiche Sprache sprechen, also das gleiche Protokoll verwenden. Ein Netzwerkprotokoll ähnelt in gewisser Hinsicht einer menschlichen Sprache. Jede Sprache hat Regeln, die etwas bestimmen, wo Substantive platziert werden müssen, wie Verben konjugiert werden oder sogar wie Unterhaltungen formal begonnen und beendet werden. Protokolle übertragen dieses Prinzip auf die Kommunikation zwischen Netzwerkgeräten. Ein Gerät, das TCP/IP spricht, kann unabhängig vom Hersteller mit anderen Netzwerkgeräten kommunizieren, die ebenfalls TCP/IP beherrschen. Natürlich gibt es verschiedene Arten von Protokollen, sowohl einfache als auch komplizierte, und um eine normale Kommunikation im Netzwerk zu erlauben, ist eine Kombination vieler Protokolle erforderlich. Welches Protokoll bei einem Kommunikationsvorgang verwendet wird, lässt sich an den übertragenen Paketen erkennen, die den Vorgaben des jeweiligen Protokolls entsprechen müssen. Ein Paket ist dabei eine besonders formatierte Dateneinheit, die von einem Gerät über das Netzwerk zu einem anderen übertragen wird. Diese Pakete bilden die Grundbausteine der Kommunikation zwischen Computern und sind das A und O des Network Security Monitorings. Pakete werden aus Daten von mehreren Protokollen zusammengestellt. Beispielsweise sind mindestens vier Protokolle erforderlich, damit eine typische HTTP-GET-Anforderung auch tatsächlich von Ihrem Browser zum Webserver gelangt (HTTP, TCP, IP und Ethernet). Wenn Sie sich solche Pakete schon einmal angesehen haben, dann wahrscheinlich in einem ähnlichen Format wie dem in Abb. 13.1, mit dem Wireshark Informationen über Paketinhalte darstellt. 13.1 Gestatten: das Paket! 415 Abbildung 13.1: Ein Paket für eine einfache HTTP-GET-Anforderung in Wireshark Wireshark ist ein hervorragendes Werkzeug, um Pakete zu analysieren, aber um ihre Grundlagen zu verstehen, müssen wir ein viel einfacheres Tool einsetzen, nämlich Tcpdump (oder die Windows-Alternative Windump). Während Wireshark eine grafische ­Benutzeroberfläche hat und Ihnen viel Handarbeit bei der Zerlegung der Pakete abnimmt, müssen Sie bei Tcpdump viel mehr selbst tun, um die einzelnen Pakete zu interpretieren. Das mag sich eher nach einem Nachteil anhören, aber es zwingt Analytiker dazu, genauer über die Pakete nachzudenken, und verschafft ihnen ein grundlegendes Verständnis, das sich auch bei der Anwendung anderer Paketanalysewerkzeuge und sogar bei der Rohuntersuchung von Paketdaten als nützlich erweist. Nachdem Sie nun wissen, wie Wireshark das Paket für eine HTTP-GET-Anforderung zerlegt, wollen wir uns dasselbe Paket in Hexadezimalform ansehen. Eine solche Ausgabe können Sie mit folgendem Befehl erreichen: tcpdump -nnxr ansm-13-httpget.pcapng Tcpdump werden wir uns in diesem Kapitel noch genauer ansehen. Zunächst einmal beschäftigen wir uns aber mit dem Paket in Abb. 13.2. Wenn Sie noch keine Erfahrung damit haben, Pakete im rohen Hexformat zu untersuchen, dann wirkt die Ausgabe in Abb. 13.2 völlig unverständlich. Es jedoch gar nicht so schwer, die Daten zu lesen, wenn wir sie nach Protokollen gliedern. Bevor wir dazu kommen, müssen jedoch erst etwas grundlegende Paketmathematik lernen. 416 13 Paketanalyse Abbildung 13.2: Ein Paket für eine einfache HTTP-GET-Anforderung in Tcpdump 13.2 Paketmathematik Geht es Ihnen ebenso wie mir, dass es Ihnen bei einem Titel wie dem dieses Abschnitts eiskalt den Rücken herunterläuft? Aber keine Angst, Paketmathematik ist ganz einfach, und wenn Sie die einfache Addition und Multiplikation beherrschen, sollten Sie keine Schwierigkeiten haben. 13.2.1 Hexdarstellung von Bytes Wenn Sie Pakete mit Werkzeugen wie Tcpdump anzeigen lassen, sehen Sie die Paketdaten in einem Hexadezimalformat, das von der binären Darstellung der Bytes abgeleitet ist. Ein Byte besteht aus acht Bits, die jeweils 1 oder 0 sein können. Ein einzelnes Byte sieht daher beispielsweise wie folgt aus: 01000101. Um die Bytes besser lesbar zu machen, werden sie ins Hexformat konvertiert. Dazu wird ein Byte zunächst in zwei Hälften aufgeteilt, die sogenannten Nibbles (siehe Abb. 13.3). Die ersten vier Bits bilden dabei das höherwertige Nibble, da sie den höherwertigen Teil des Bytes darstellen, während die hinteren vier Bits das niederwertige Nibble bilden. Binärbyte 01000101 Höherwerges Nibble 0100 0101 Niederwerges Nibble Abbildung 13.3: Aufteilung eines Bytes in Nibbles Jedes Nibble des Bytes wird anschließend in eine Hexadezimalzahl umgewandelt, sodass wir ein zweistelliges Byte bekommen. Für Anfänger besteht die schnellste Möglichkeit, 13.2 Paketmathematik 417 den Hexwert eines Bytes zu berechnen, darin, zunächst die Dezimalwerte der einzelnen Nibbles zu bestimmen. Dies wird in Abb. 13.4 gezeigt. Binärbyte Höherwerges Nibble Niederwerges Nibble Dezimalwerte Abbildung 13.4: Berechnen des Dezimalwerts für jedes Nibble Jede Stelle im Binärwert steht für einen Wert, und dieser Wert wächst von rechts nach links. Daher wird die Stelle ganz rechts auch als die erste Stelle bezeichnet. Die einzelnen Stellen stehen für Vielfache von 2: die Stelle ganz rechts für 20, die nächste für 21, die darauf folgende für 22, dann 23 usw. Für die Berechnungen ist es am einfachsten, die dezimalen Entsprechungen dieser Werte zu verwenden, also 1, 2, 4, 8 usw. Wenn eine Stelle den Wert 1 hat, dann wird dieser Wert zur Summe addiert. In dem höherwertigen Nibble in Abb. 13.4 steht der Wert 1 nur an der dritten Stelle, weshalb wir die Summe 4 erhalten. In dem niederwertigen Nibble dagegen haben wir eine 1 sowohl an der ersten als auch der dritten Stelle, sodass sich insgesamt 5 ergibt (1 + 4). Das Byte lässt sich daher durch die Dezimalwerte 4 und 5 darstellen. Im Hexadezimalformat gibt es die Ziffern 0 bis F, wobei 0 bis 9 den gleichnamigen Dezimalziffern entsprechen und A bis F die dezimalen Werte 10 bis 15 haben. Damit werden die Dezimalwerte 4 und 5 im Hexadezimalformat ebenfalls als 4 und 5 ausgedrückt, sodass das Byte 01000101 die hexadezimale Darstellung 45 hat. Den kompletten Rechenvorgang sehen Sie in Abb. 13.5. Binärbyte Höherwerges Nibble Niederwerges Nibble Hexbyte Abbildung 13.5: Umwandlung eines Binärbytes ins Hexformat 418 13 Paketanalyse Üben wir das noch einmal an einem anderen Byte, nämlich dem aus Abb. 13.6. Binärbyte Höherwerges Nibble Niederwerges Nibble Hexbyte Abbildung 13.6: Umwandlung eines weiteren Binärbytes ins Hexformat Hier steht in dem höherwertigen Nibble eine 1 an erster, zweiter und dritter Stelle, was einen Gesamtwert von 6 ergibt (2 + 4). Das niederwertige Byte enthält eine 1 an der zweiten, dritten und vierten Stelle, womit wir den Dezimalwert 14 bekommen (2 + 4 + 8). Der Dezimalwert 6 ist auch im Hexadezimalformat 6, der Dezimalwert 14 dagegen wird zu E. Damit ergibt sich 6E als Hexadezimaldarstellung von 01101110. 13.2.2 Hexwerte ins Binär- und Dezimalformat umwandeln Wir haben jetzt beschrieben, wie Sie eine Binärzahl ins Hexformat umwandeln können, aber später müssen wir auch den umgekehrten Weg gehen, weshalb wir uns im Folgenden ansehen, wie Sie eine Hexzahl zunächst ins Binär- und dann ins Dezimalformat umwandeln. Dazu verwenden wir die Zahl aus unserem vorherigen Beispiel, also 0x6E. Ein zweistelliger Hexwert steht für ein Byte, also 8 Bits, und jede einzelne Stelle des Hexwerts steht für ein Nibble des Bytes, wobei E das niederwertige Nibble darstellt. Als Erstes wandeln wir daher die Hexziffern wieder in ihre binären Gegenstücke um. Dazu rechne ich die die einzelnen Stellen zunächst in Dezimalwerte um. Wie Sie bereits wissen, entspricht die hexadezimale 6 der dezimalen 6 und das E dem Dezimalwert 14. Anschließend rechnen wir diese Zahlen ins Binärformat um, indem wir Einsen in die entsprechenden Bitpositionen (auf der Grundlage von Zweierpotenzen) der einzelnen Nibbles stellen. Damit bekommen wir das höherwertige Nibble 0100 und das niederwertige Nibble 1110. Diese Nibbles kombinieren wir anschließend zu einem einzigen Byte und betrachten nun die Stellen im Gesamtbyte als Zweierpotenzen. Dann addieren wir die Werte der Stellen, deren Bitwert 1 ist, wodurch wir den Dezimalwert 110 erhalten. Den kompletten Vorgang sehen Sie in Abb. 13.7. 13.2 Paketmathematik 419 Hexbyte Höherwerges Nibble Niederwerges Nibble Dezimalwerte Abbildung 13.7: Umrechnung eines Hexadezimalwerts ins Binär- und ins Dezimalformat Weitere Informationen Zur schnellen Umwandlung vom Hex- ins ASCII- oder Dezimalformat können Sie die Tabellen in Anhang D zurate ziehen. Es gibt auch Onlinekonverter für diese Umrechnungen. 13.2.3 Bytes zählen Als Nächstes sehen wir uns an, wie Sie Bytes zählen, was Sie oft tun müssen, wenn Sie Bytes in Hexdarstellung untersuchen. Zählen ist zwar ganz einfach (scheuen Sie sich nicht, Ihre Finger und Zehen zu Hilfe zu nehmen), aber beim Zählen der Bytes in Paketen müssen Sie einige zusätzliche Umstände berücksichtigen. So sind wir es gewohnt, beim Zählen mit 1 zu beginnen, doch beim Zählen von Bytes müssen Sie mit 0 anfangen. Das liegt daran, dass wir beim Zählen den relativen Versatz vom Anfang angeben. Bericht von der Front Mit dem »Anfang«, zu dem wir beim Zählen den relativen Versatz angeben, ist normalerweise das Byte 0 des jeweiligen Protokollheaders gemeint, nicht das Byte 0 des Pakets. Schauen Sie sich dazu das Paket in Abb. 13.8 an. Es handelt sich dabei um ein einfaches IP-Paket, wobei wir die Bytes hier durch Leerzeichen getrennt haben, sodass sie leichter zu erkennen sind. Um herauszufinden, was dieses Paket tut, müssen wir die Werte in bestimmten Feldern dieses Pakets bestimmen. 420 13 Paketanalyse Das geht am besten dadurch, dass wir die einzelnen Felder den in dem Paket verwendeten Protokollen zuordnen. In Anhang C finden Sie mehrere Diagramme, die solche Protokollfeldzuordnungen zeigen und die Sie heranziehen können, um die Felder für die einzelnen Protokolle auseinanderzuhalten. Da wir schon wissen, dass es sich hier um ein IP-Paket handelt, wollen wir die Werte im IP-Header bestimmen. Zur Vereinfachung zeigt Abb. 13.9 den Aufbau dieses Headers. Abbildung 13.8: Ein einfaches IP-Paket im Hexformat Abbildung 13.9: Feldzuordnung für den IP-Header Um das Paket weiter zu zerlegen, wäre es gut zu wissen, welches eingebettete Protokoll auf diesem IP-Header aufsitzt. Das Zuordnungsdiagramm für IP-Pakete zeigt uns, dass diese Information in Byte 9 zu finden ist. Wenn Sie die Bytes in diesem Paket beginnend mit 1 zählten, kämen wir zu einem Feld mit dem Wert 40, aber das ist nicht der Wert für das Protokoll. Die Angabe »Byte 9« bedeutet »das Byte mit dem Versatz von 9«, also das neunte Byte hinter 0 oder kurz 0x9. Daher müssen wir beginnend mit 0 zählen und kommen 13.2 Paketmathematik 421 damit zu einem Feld, das den Wert 06 hat, was bedeutet, dass es sich bei dem eingebetteten Protokoll um TCP handelt. Den Zählvorgang sehen Sie in Abb. 13.10. Byte 0x9: Protokoll Abbildung 13.10: Das Protokoll im Header an der Position 0x9 Versuchen wir das mit einem weiteren Feld! Laut IP-Zuordnungsdiagramm befindet sich das TTL-Feld (Time to Live) acht Bytes von 0 entfernt. Wenn wir vom Paketanfang zählen und dabei mit 0 beginnen, kommen wir zu einem Feld mit dem Wert 40 (was dem Dezimalwert 64 entspricht). In dem Zuordnungsdiagramm finden Sie auch einige Felder, die weniger als ein Byte lang sind. So umfasst beispielsweise das Byte 0x0 zwei Felder, nämlich das für die IP-Version und das für die Länge des IP-Headers. Dabei nimmt dass Feld für die IP-Version das höherwertige Nibble des Bytes ein, das für die Headerlänge dagegen das niederwertige. Damit haben wir bei diesem Paket den Wert 4 für die IP-Version. Die Headerlänge wird als 5 angezeigt, aber dieses Feld ist mit Vorsicht zu genießen, denn es enthält einen berechneten Wert, der erst noch mit 4 multipliziert werden muss. Damit kommen wir zu einer Länge von 20 Byte für den IP-Header. Der maximal mögliche Wert für die Headerlänge ist übrigens 60, da der höchste Wert, der im Feld für die Headerlänge auftreten kann, F ist (was dem Dezimalwert 15 entspricht) und wir mit 15 x 4 auf 60 Byte kommen. Das Feld sehen Sie in Abb. 13.11. Byte 0x0: Headerlänge 5 x 4 = 20 Bytes Byte 0x0: IP-Version 4 = IPv4 Abbildung 13.11: Die Felder für die IP-Version und die Headerlänge an der Position 0x0 Als letztes Beispiel sehen wir uns zwei der Felder an, die mehr als ein Byte umspannen, nämlich die für die IP-Adressen von Quelle und Ziel, die jeweils vier Bytes lang sind und im IP-Header an der Position 0x12 bzw. 0x16 stehen. In unserem Beispielpaket wird als IP-Quelladresse ac 10 10 80 angegeben (dezimal 172.16.16.128) und als Zieladresse 43 cd 02 1e (67.205.2.30), wie Sie in Abb. 13.12 sehen. 422 13 Paketanalyse Bytes 0x12:4 - IP-Quelladresse 172.16.16.128 Bytes 0x16:4 - IP-Zieladresse 67.205.2.30 Abbildung 13.12: Felder für die Quell- und Zieladresse an 0x12 und 0x16 Beachten Sie die besondere Schreibweise, mit der in dieser Abbildung auf Felder mit mehreren Bytes Länge verwiesen wird. Die Angabe 6x16:4 bedeutet, dass das Feld mit Byte 16 beginnt und vier Bytes lang ist. Diese Schreibweise wird uns später beim Schreiben von Paketfiltern noch gute Dienste leisten. Damit haben wir genug Paketmathematik gelernt, um Pakete im Hexadezimalformat zerlegen zu können. Ich hoffe, die Sache war nicht zu kompliziert. 13.3 Pakete zerlegen Kehren wir nun zu dem Paket aus Abb. 13.2 zurück, um es in die einzelnen Protokolle zu zerlegen. Die Zusammenstellung eines Pakets beginnt mit den Daten der Anwendungsschicht. Danach werden nach und nach in absteigender Reihenfolge die Header der Protokolle tieferer Schichten hinzugefügt. Der letzte Protokollheader gehört demnach zur Sicherungsschicht, und das ist der Header, dem wir als Erstes begegnen. Das am weitesten verbreitete Protokoll der Sicherungsschicht ist Ethernet, aber wir wollen uns vergewissern, dass in unserem Beispiel auch tatsächlich dieses Protokoll verwendet wird. Dazu vergleichen wir den zu erwartenden Aufbau eines Ethernetheaders mit dem, was wir am Anfang des Pakets sehen. Das Format eines Ethernetheaders finden Sie in Anhang C, aber auch in Abb. 13.13. Die ersten sechs Bytes dieses Headers sind für die MAC-Zieladresse reserviert, die folgenden sechs Bytes (also beginnend mit 0x6) für die MAC-Quelladresse. Abb. 13.14 zeigt, dass diese Bytes in unserem Beispiel tatsächlich den MAC-Adressen von zwei Hosts entsprechen. Das einzige andere Feld im Ethernetheader ist das zwei Byte große Feld für den Typ an der Position 0x12, das uns sagt, was das Protokoll hinter dem Header erwartet. Hier hat das Typfeld den Hexwert 08 00, was bedeutet, dass als nächstes eingebettetes Protokoll IP erwartet wird. Die Länge eines Ethernetheaders beträgt stets 14 Byte, sodass wir genau wissen, dass es sich bei 00 um das letzte Byte dieses Headers handelt. 13.3 Pakete zerlegen 423 Bericht von der Front Ich habe den Ethernetheader in dieses Beispiel aufgenommen, obwohl er von Tcpdump standardmäßig nicht ausgegeben wird. Da in diesem Buch immer Ethernet verwendet wird, zeigen wir diesen Header in den folgenden Beispielen nicht mehr, sondern beginnen gleich mit den Protokollen der Vermittlungsschicht. Abbildung 13.13: Feldzuordnung für den Ethernetheader 424 13 Paketanalyse Ethernetheader Abbildung 13.14: Abgrenzung des Ethernetheaders Da uns der Ethernetheader freundlicherweise mitgeteilt hat, dass er als Nächstes einen IPHeader erwartet, können wir auf den nächsten Teil des Pakets unser Wissen über den Aufbau von IP-Paketen anwenden. Da wir das Paket nur in die einzelnen Protokolle zerlegen wollen, sind wir nicht an allen einzelnen Werten interessiert, sondern nur an denen, die wir brauchen, um die Länge des IP-Headers zu bestimmen und herauszufinden, welches Protokoll als Nächstes erwartet wird. Als Erstes müssen wir bestimmen, welche Version von IP hier verwendet wird. Wie wir bereits zuvor gelernt haben, steht die IP-Version im höherwertigen Nibble des Bytes 0x0. Hier haben wir es mit IPv4 zu tun. Da der IP-Header verschiedene optionale Werte enthalten kann, ist seine Länge variabel. Als Nächstes müssen wir daher die genaue Länge bestimmen. Wie Sie bereits wissen, befindet sich das Feld mit dieser Angabe im niederwertigen Nibble des Bytes 0x0, das hier den Wert 5 hat. Da es sich um einen berechneten Wert handelt, müssen wir ihn noch mit 4 multiplizieren, um die tatsächliche Länge des IP-Headers von 20 Byte zu bekommen. Die letzten beiden Bytes des IP-Headers sind damit 02 1e. Als letzte Maßnahme im IP-Header finden wir das Protokoll heraus, das als Nächstes folgt. Im IP-Header finden wir diese Information im Protokollfeld an der Position 0x9. Der Wert lautet 06, was für das Protokoll TCP steht (siehe Abb. 13.15). 13.3 Pakete zerlegen 425 Ethernetheader IP-Header Abbildung 13.15: Abgrenzung des IP-Headers Nachdem wir das Protokoll TCP erreicht haben, müssen wir überprüfen, ob irgendwelche Daten aus der Anwendungsschicht vorhanden sind. Dazu bestimmen wir die Länge TCP-Headers (siehe Abb. 13.16), die ebenso wie des IP-Headers von den verwendeten Optionen abhängt. Abbildung 13.16: Feldzuordnung für den TCP-Header 426 13 Paketanalyse Dazu untersuchen wir das TCP-Datenversatzfeld im höherwertigen Nibble des Bytes 0x12. Hier finden wir den Wert 5, den wir aber ebenfalls mit 4 multiplizieren müssen, um den tatsächlichen Wert zu erhalten. Die Länge des TCP-Headers beträgt also 20 Byte. 20 Bytes hinter dem Beginn des TCP-Headers sind immer noch Daten zu finden (siehe Abb. 13.17). Dabei handelt es sich um Daten der Anwendungsschicht. Leider hat TCP kein Feld, das uns angibt, welches Protokoll dieser Schicht als Nächstes erwartet wird. Wir können uns aber zumindest das Zielportfeld ansehen (sofern es sich um Datenverkehr vom Client zum Server handelt; anderenfalls müssten wir uns das Quellportfeld ansehen), das sich an der Position 0x2:2 des TCP-Headers befindet. Es hat den Wert 00 50, was dem Dezimalwert 80 entspricht. Da Port 80 gewöhnlich vom Protokoll HTTP verwendet wird, handelt es sich bei den noch folgenden Daten vermutlich um HTTP-Daten. Das können Sie überprüfen, indem Sie die Hexdaten mit der Protokollzuordnung für HTTP vergleichen oder indem Sie einfach alle Daten vom Ende des TCP-Headers bis zum Ende des Pakets in ASCII-Text umwandeln. Ethernetheader IP-Header TCP-Header Abbildung 13.17: Abgrenzung des TCP-Headers 13.3 Pakete zerlegen 427 Vorsicht Nur weil die Daten über einen Port übertragen werden, der gewöhnlich von einem bestimmten Dienst verwendet wird – wie Port 80 von HTTP oder Port 22 von SSH –, sollten Sie nicht davon ausgehen, dass diese Dienste auch tatsächlich für den Datenverkehr verantwortlich sind. Jeder Dienst kann für jeden beliebigen Port eingerichtet werden, und Angreifer nutzen dies oft aus taktischen Gründen aus. Beispielsweise führen sie häufig eigene Protokolle zur Steuerung anderer Computer über Port 80 aus. Dadurch gewinnen sie viele Vorteile, unter anderem die Möglichkeit, den Datenverkehr aus dem Netzwerk herauszubekommen, da ausgehender Datenverkehr über Port 80 von Firewalls fast immer zugelassen wird. Außerdem können sie ihren Datenverkehr dann in dem erratischen und unvorhersehbaren HTTP-Datenverkehr verstecken. Die Zerlegung des Pakets in die einzelnen Protokolle sehen Sie in Abb. 13.18. Ethernetheader IP-Header TCP-Header HTTP-Daten Abbildung 13.18: Zerlegung eines HTTP-Pakets in die einzelnen Protokolle Als Nächstes sehen wir uns einige Tools an, um Pakete anzuzeigen und weiter mit ihnen zu arbeiten. 428 13 Paketanalyse 13.4 Tcpdump für die NSM-Analyse Das Paketerfassungs- und Analysewerkzeug Tcpdump bildet den De-facto-Standard für die Paketanalyse an der Befehlszeile in Unix-Umgebungen. Es ist äußerst praktisch, da es Ihnen ohne viel Fisimatenten gleich die Daten zur Verfügung stellt. Damit ist es ideal dafür geeignet, einzelne Pakete oder ganze Kommunikationssequenzen zu untersuchen. Es liefert auch eine konsistente Ausgabe, sodass Sie die Paketdaten mithilfe von Skripten auf einfache Weise bearbeiten können. Tcpdump ist in einer großen Zahl von Betriebssystemdistributionen auf Unix-Basis enthalten, und wenn nicht, kann es leicht mit der Paketverwaltungssoftware des Betriebssystems installiert werden. In Security Onion ist Tcpdump im Lieferumfang enthalten. Der Nachteil von Tcpdump besteht darin, dass ihm aufgrund seiner Einfachheit einige der ausgefeilteren Analysefunktionen fehlen, die grafische Werkzeuge wie Wireshark bieten. Da ihm das Prinzip des Verbindungsstatus unbekannt ist, kann es Protokolle der Anwendungsschicht nicht interpretieren. Dieser Abschnitt soll keine ausführliche Anleitung zu allen Funktionen von Tcpdump bieten, sondern nur die nötigen Grundlagen vermitteln, die NSM-Analytiker benötigen, um die ersten Schritte zu unternehmen. Tcpdump kann Pakete direkt von einer Verbindung abgreifen. Wenn Sie Tcpdump einfach ohne Befehlszeilenargumente ausführen, erfasst es Pakete an der Netzwerkschnittstelle mit der niedrigsten Nummer und gibt für jedes eine einzeilige Übersicht im aktuellen Terminal aus. Um den Vorgang besser zu steuern, können Sie mit dem Argument -i die Schnittstelle angeben und mit -nn die Host- und Protokollnamensauflösung abschalten. Bericht von der Front Wenn Sie Pakete erfassen, sollten Sie so heimlich wie möglich vorgehen. Nicht etwa, weil Sie den Vorgang verschleiern wollen (es sei denn, Sie arbeiten als Penetrationstester), sondern um keinen zusätzlichen Datenverkehr hervorzurufen, den Sie wieder herausfiltern oder bei der Untersuchung eines Ereignisses durchforsten müssen. Daher verwende ich immer mindestens einen der -n-Schalter, um die DNS-Namensauflösung zu verhindern, die sonst zusätzliche Pakete erzeugen würde. Wenn Sie die erfassten Pakete für die spätere Analyse speichern möchten, können Sie mit dem Schalter -w den Namen einer Ausgabedatei angeben. Ein Befehl mit allen genannten Argumenten sieht beispielsweise wie folgt aus: sudo tcpdump -nni eth1 -w packets.pcap Um die Datei später zu lesen, geben Sie die Option -r und dahinter den Dateinamen an, wie Sie in Abb. 13.19 sehen. 13.4 Tcpdump für die NSM-Analyse 429 Abbildung 13.19: Pakete in Tcpdump aus einer Datei lesen Die Standardausgabe von Tcpdump macht einige grundlegende Angaben zu jedem einzelnen Paket. Wie die Ausgabe formatiert ist, hängt von dem verwendeten Protokoll ab. Am häufigsten sind die beiden folgenden Formate: TCP: [Zeitstempel] [Protokoll von Schicht 3] [IP-Quelladresse].[Quellport]>[IPZieladresse].[Zielport]: [TCP-Flags], [laufende TCP-Nummer], [TCPBestätigungsnummer], [TCP-Fenstergröße], [Länge der Daten] UDP: [Zeitstempel] [Protokoll von Schicht 3] [IP-Quelladresse].[Quellport]>[IPZieladresse].[Zielport]: [Protokoll von Schicht 4], [Länge der Daten] Sie können Tcpdump dazu bringen, in dieser Übersicht noch mehr Informationen anzuzeigen, indem Sie den Schalter -v angeben. Dabei können Sie bis zu drei v verwenden, um die Ausführlichkeit der Ausgabe immer weiter zu steigern. In Abb. 13.20 sehen Sie das gleiche Paket wie zuvor, aber diesmal angezeigt mit -vvv. Abbildung 13.20: Paketanzeige mit erhöhter Ausführlichkeit Die Daten sind zwar sehr nützlich, vermitteln uns aber kein Gesamtbild. Eine Möglichkeit, das vollständige Paket zu sehen, besteht darin, Tcpdump mit dem Schalter -x zu veranlassen, das Paket im Hexformat anzuzeigen. Das Ergebnis sehen Sie in Abb. 13.21. 430 13 Paketanalyse Abbildung 13.21: Anzeige der vollständigen Pakete im Hexformat Achtung In Beschreibungen von Tcmpdump wird oft das Argument -s für die »Snapshotlänge« (snaplen) erwähnt. Damit teilen Sie Tcpdump mit, wie viel von einem Paket erfasst werden soll. In älteren Versionen von Tcpdump werden standardmäßig nur die ersten 68 Bytes (eines IPv4-Pakets) erfasst. Wenn Sie das gesamte Paket haben wollen, müssen Sie daher entweder einen größeren Wert für die Snapshotlänge angeben oder den Wert 0, wodurch das gesamte Paket unabhängig von seiner Größe erfasst wird. Seit Tcpdump 4.0 beträgt die Standardsnapshotlänge jedoch 65.535 Bytes, sodass Sie den Befehl -s 0 normalerweise nicht mehr benötigen. Eine weitere Möglichkeit besteht darin, Pakete mit dem Argument -A im ASCII-Format anzuzeigen (siehe Abb. 13.22). 13.4 Tcpdump für die NSM-Analyse 431 Abbildung 13.22: Anzeige der vollständigen Pakete im ASCII-Format Ich bevorzuge das Argument -X, das die Pakete parallel im Hex- und im ASCII-Format anzeigt (siehe Abb. 13.23). Abbildung 13.23: Anzeige der vollständigen Pakete im ASCII- und im Hexformat Sie werden sehr oft mit umfangreichen PCAP-Dateien zu tun haben, sodass es notwendig sein wird, Filter einzusetzen, um nur die Daten auszuwählen, die Sie untersuchen möchten, und diejenigen zu verwerfen, die nichts zu der vorliegenden Überprüfung beitragen. Tcpdump verwendet das Berkeley-Paketfilterformat (BPF). Um einen Filter aufzurufen, geben Sie ihn am Ende des Befehls tcpdump an. Der Übersichtlichkeit halber sollten Sie die Namen der Filter in einfache Anführungszeichen stellen. Wenn wir beispielsweise nur Pakete mit dem TCP-Zielport 8080 sehen wollen, können wir folgenden Befehl geben: tcpdump -nnr packets.pcap 'tcp dst port 8080' 432 13 Paketanalyse Wir können auch das Argument -w nutzen, um eine neue Datei zu erstellen, die nur die gefilterten Pakete enthält: tcpdump –nnr packets.pcap 'tcp dst port 8080' –w packets_tcp8080.pcap Manchmal müssen Sie eine große Zahl von einzelnen Filtern verwenden. So etwas geschieht vor allem, wenn Analytiker den Datenverkehr für viele Hosts und Protokolle ausschließen, die mit der vorliegenden Untersuchung nichts zu tun haben. Dabei ist es nicht einfach, die Filteroptionen mittels Befehlszeilenargumenten zu bearbeiten. Für solche Fälle bietet Tcpdump das Argument -F, mit dem Sie eine Filterdatei angeben können, die die BPF-Argumente enthält. Vorsicht Eine Tcpdump-Filterdatei darf nur Filteranweisungen enthalten. Kommentare sind nicht zulässig. Da Kommentare aber sehr nützlich sind, um kompliziertere Filter zu verstehen, unterhalte ich zwei Filterdateien: eine kommentarlose für den Einsatz in der Produktion und eine kommentierte zum Nachschlagen. Der folgende Befehl gibt mit dem Argument -F eine Filterdatei an: tcpdump –nnr packets.pcap –F known_good_hosts.bpf Wie Sie eigene Filter erstellen, sehen wir uns weiter hinten in diesem Kapitel an. Die vorstehende Beschreibung von Tcpdump war natürlich alles andere als erschöpfend, aber sie hat alle wichtigen Arten der Verwendung abgedeckt, denen Analytiker in ihrer täglichen Arbeit begegnen. Um mehr über Tcpdump zu lernen, besuchen Sie http://www. tcpdump.org. Sie können auch die Handbuchseiten lesen, indem Sie auf einem System, auf dem Tcpdump installiert ist, den Befehl man tcpdump eingeben. 13.5 Tshark für die Paketanalyse Tshark ist als Alternative für die Befehlszeile mit der grafischen Paketanalyseanwendung Wireshark gebündelt. Es bietet einen Großteil des Funktionsumfangs von Tcpdump, kann darüber hinaus aber auch die Protokollzerlegungsfunktionen von Wireshark zugreifen, womit Sie eine zusätzliche automatische Analyse von Protokollen der Anwendungsschicht durchführen können. Außerdem können Sie die Anzeigefiltersyntax von Wireshark nutzen, die mehr Möglichkeiten bietet als Berkeley-Paketfilter. In manchen Fällen erweisen 13.5 Tshark für die Paketanalyse 433 sich diese Vorteile jedoch als Nachteile, da die zusätzliche Verarbeitung, die für diese Funktionen erforderlich ist, dafür sorgt, dass Tshark bei der Verarbeitung der Daten im Allgemeinen langsamer ist als Tcpdump. Wenn Sie ein System verwenden, auf dem Wireshark bereits installiert ist, wie das bei Security Onion der Fall ist, dann ist auch Tshark schon installiert und kann mit dem Befehl tshark aufgerufen werden. Um mit dem Programm Pakete zu erfassen, geben Sie diesen Befehl wie folgt: sudo tshark -i eth1 Dadurch wird für jedes erfasst Paket eine einzeilige Übersicht im aktuellen Terminalfenster angezeigt. Wenn Sie die Pakete zur späteren Analyse speichern wollen, können Sie mit dem Schalter -w eine Ausgabedatei angeben. Der folgende Beispielbefehl nutzt alle diese Argumente: sudo tshark –i eth1 –w packets.pcap Um die Datei zu lesen, geben Sie ihren Namen mit dem Schalter -r an, wie Sie in Abb. 13.24 sehen. Abbildung 13.24: Anzeige der erfassten Pakete in Tshark Die Formatierung der Ausgabe hängt von dem verwendeten Protokoll ab. Tshark bietet auch die Möglichkeit, Daten der Anwendungsschicht anzuzeigen, wie Sie an den Paketen 4 und 6 sehen. Das ist aufgrund der großen Menge von Protokollzerlegungsfunktionen möglich. Wenn Sie eine ausführlichere Ausgabe benötigen, die auch Informationen aus diesen Zerlegungsfunktionen einschließt, fügen Sie das Argument -V hinzu. Abb. 13.25 zeigt einen Teil einer solchen Ausgabe für ein einzelnes Paket. 434 13 Paketanalyse Abbildung 13.25: Ausführlichere Anzeige von Paketen Die Zeitstempel in der normalen Tshark-Ausgabe in Abb. 13.24 sehen ein bisschen eigenartig aus. Das Standardverhalten dieses Programms besteht darin, die Zeitstempel relativ zum Beginn der Paketerfassung anzuzeigen. Mit der Option -t können Sie jedoch alternative Darstellungsformen für die Zeitstempel wählen. Wollen Sie beispielsweise wie in Tcpdump das Datum und die Uhrzeit des Zeitpunkts sehen, an dem das Paket erfasst wurde, fügen Sie wie in Abb. 13.26 die Option -t ad hinzu. Abbildung 13.26: Anzeige von Paketen mit absoluter Datums- und Uhrzeitangabe Mit dieser Option können Sie auch als Delta angeben, also als die Zeit seit dem zuvor erfassten Paket. Dazu verwenden Sie das Argument -t d. Wenn Sie die rohen Paketdaten der Erfassungsdatei untersuchen möchten, können Sie Tshark mit dem Argument -x anweisen, die Pakete im Hex- und im ASCII-Format auszugeben, wie Sie in Abb. 13.27 sehen. 13.5 Tshark für die Paketanalyse 435 Abbildung 13.27: Anzeige von Paketen im Hex- und im ASCII-Format In Tshark können Sie Erfassungsfilter mit der gleichen BPF-Syntax wie in Tcpdump angeben, aber auch Anzeigefilter verwenden, die die Paketzerlegungsfunktionen von Wireshark nutzen. Der Hauptunterschied besteht darin, dass die Erfassungsfilter nur während der Erfassung der Pakete eingesetzt werden können, die Anzeigefilter dagegen auch beim Lesen der Pakete aus einer Datei. Um Erfassungsfilter zu nutzen, geben Sie sie hinter dem Argument -f an. Der folgende Beispielbefehl schränkt die Datenerfassung von Tshark auf UDP-Pakete mit dem Zielport 53 ein, also auf DNS-Datenverkehr: sudo tshark –I eth1 –f 'udp && dst port 53' Um dieselbe Filterung an bereits erfassten Daten vorzunehmen, können Sie beim Lesen der Datei mit dem Argument -R einen Anzeigefilter angeben: tshark –r packets.pcap –R 'udp && dst.port == 53' Die Anzeigefiltersyntax von Tshark und Wireshark sehen wir uns weiter hinten in diesem Kapitel noch genauer an. Ein weitere praktische Funktion von Tshark besteht darin, Statistiken aus den Paketdaten aufzustellen. Um das zu tun, geben Sie die Option -z und den Namen der gewünschten 436 13 Paketanalyse Statistik an. Auf der man-Seite von Tshark werden alle verfügbaren Statistikoptionen angezeigt. In dem folgenden Beispielbefehl verwenden wir die Option http,tree, um die in den erfassten Paketen gefundenen HTTP-Statuscodes und Anforderungsmethoden anzuzeigen. tshark –r packets.pcap –z http,tree Die Ausgabe dieses Befehls sehen Sie in Abb. 13.28. Abbildung 13.28: HTTP-Statistiken mit Tshark Zu den von mir am häufigsten verwendeten Statistikoptionen gehören die folgenden: •• io,phs: Zeigt die Hierarchie aller in der Erfassungsdatei gefundenen Protokolle an. •• http,tree: Zeigt Statistiken über die Arten von HTTP-Anforderungs- und -Antwortpaketen an. •• http_req,tree: Zeigt Statistiken über alle HTTP-Anforderungen an. •• smb,srt: Zeigt Statisiken über SMB-Befehle an. Das ist nützlich für die Analyse von Windows-SMB-Datenverkehr. Tshark ist äußerst vielseitig und ein nützliches Tool für NSM-Analytiker in Ergänzung zu Tcpdump. Wenn ich eine Analyse durchführe, beginne ich gewöhnlich mit Tcpdump, sodass ich die Pakete schnell aufgrund ihrer Attribute der Schichten 3 und 4 filtern kann. Wenn ich an der Befehlszeile weitere Einzelheiten über eine Kommunikationssequenz aus der Anwendungsschicht brauche oder einige einfache Statistiken aufstellen möchte, wende ich mich gewöhnlich an Tshark. Um mehr über dieses Programm zu erfahren, besuchen Sie http://www.wireshark.org. Um sich die Handbuchseiten anzusehen, rufen Sie auf einem System, auf dem Tshark installiert ist, man tshark auf. 13.6 Wireshark für die NSM-Analyse 437 13.6 Wireshark für die NSM-Analyse Befehlszeilenwerkzeuge für die Paketeanalyse sind zwar ideal für die grundlegende Arbeit mit Paketen geeignet, aber manche Analyseaufgaben lassen sich am besten mit einer grafischen Anwendung wie Wireshark erledigen. Sie wurde 1998 unter dem Projektnamen Ethereal von Gerald Combs entwickelt. 2006 wurde das Projekt in Wirehshark umbenannt, und dank der Hilfe von mehr als 500 Mitwirkenden ist es seit seiner Einführung stark gewachsen. Wireshark bildet die Messlatte für grafische Anwendungen zur Paketanalyse und ist in Security Onion vorinstalliert. Wenn Sie nicht Security Onion verwenden, richten Sie sich zur Installation von Wireshark nach der Anleitung für Ihre Plattform auf http://www.wireshark.org. Wireshark läuft auf Window-, Mac- und Linux-Systemen. In Security Onion können Sie es an der Befehlszeile starten, indem Sie einfach wireshark eingeben, oder auf dem Desktop, indem Sie unter der Überschrift Security Onion auf das Symbol Wireshark klicken. Wenn Sie Pakete nicht nur analysieren, sondern auch erfassen möchten, müssen Sie Wireshark mit erhöhten Rechten ausführen, wozu Sie den Befehl sudo wireshark verwenden müssen. Das Wireshark-Fenster zeigt zu Anfang keine brauchbaren Informationen an. Wir müssen erst einige Paketdaten erfassen, die wir uns ansehen können. 13.6.1 Pakete erfassen Um Pakete von einer Verbindung abzugreifen, wählen Sie im Hauptmenü Capture > Interfaces, wodurch alle Schnittstellen auf dem System angezeigt werden (siehe Abb. 13.29). Hier können Sie eine Sensor- oder eine andere Schnittstelle auswählen, an der Sie Pakete erfassen wollen. Klicken Sie auf die Schaltfläche Start neben der gewünschten Schnittstelle. Abbildung 13.29: Paketerfassung in Wireshark 438 13 Paketanalyse Vorsicht Seien Sie vorsichtig, wenn Sie mit Wireshark Pakete an einer gut ausgelasteten Sensorschnittstelle erfassen möchten. Wireshark ist zwar ein großartiges Werkzeug, es kann aber überfordert werden, wenn Sie ihm zu viele Daten auf einmal zuführen, da es versucht, alle Pakete in den Arbeitsspeicher zu laden. Daher ist es meistens besser, umfangreiche Datenmengen zunächst mit einem Befehlszeilenwerkzeug zu analysieren und dann die Daten herauszufiltern, die Sie für die weitergehende Untersuchung benötigen, und nur diese an Wireshark zu übergeben. Um die Paketerfassung abzuschließen, klicken Sie im Menü Capture auf Stop. Nun werden die zu analysierenden Daten angezeigt. In Abb. 13.30 haben wir einfach eine der vielen Paketerfassungsdateien geöffnet, die in Security Onion im Verzeichnis /opt/samples/ vorhanden sind. Abbildung 13.30: Paketanzeige in Wireshark Wie Sie in dem Bild erkennen können, ist Wireshark in drei Bereiche aufgeteilt. Der obere ist der Paketlistenbereich, in dem alle Pakete in Form in einer einzeiligen Übersicht aufgeführt sind, wobei die einzelnen Felder als Spalten dargestellt werden. Zu den Standardspalten gehören die Paketnummer, der Zeitstempel (standardmäßig bezogen auf den Beginn der Erfassung), Quell- und Zieladresse, Protokoll, Paketlänge und eine Spalte mit protokollspezifischen Informationen. Der mittlere Bereich zeigt detaillierte Angaben über die Datenfelder des Pakets, das in der Paketliste ausgewählt ist. Im unteren Bereich finden Sie die einzelnen Bytes, aus denen sich das Paket zusammensetzt, im Hex- und im ASCII-Format. Diese Anzeige entspricht derjenigen, die Sie in Tcpdump mit der Option -X erhalten. 13.6 Wireshark für die NSM-Analyse 439 Beachten Sie bei der Arbeit in diesen Fenstern, dass das, was Sie in einem Bereich tun, Auswirkungen darauf hat, was in den anderen Bereichen angezeigt wird. Wenn Sie auf ein Paket in der Paketliste klicken, werden in den beiden anderen Bereichen Daten zu diesem Paket angezeigt. Klicken Sie auf ein Feld im Bereich mit den Paketangaben, werden im Bytebereich die Bytes aus diesem Feld hervorgehoben. Dadurch behalten Sie besser die Übersicht, wenn Sie zwischen verschiedenen Paketen wechseln, und können die Eigenschaften der einzelnen Elemente schnell erkennen. Wireshark bringt viele nützliche Funktionen für die Paketanalyse mit – so viele, dass wir sie in diesem Kapitel unmöglich alle behandeln können. Wenn Sie eine ausführlichere Darstellung von Wireshark lesen möchten, empfehle ich Ihnen mein Buch Practical Packet Analysis oder das Buch Wireshark Network Analysis von Laura Chappell. Beide behandeln die Paketanalyse und die TCP/IP-Protokolle auf einer breiten Grundlage. Es gibt jedoch einige sehr praktische Funktionen, die wir uns im Folgenden kurz ansehen werden. 13.6.2 Das Format der Zeitanzeige ändern Ebenso wie Tshark zeigt Wireshark Pakete standardmäßig mit einem Zeitstempel an, der die Anzahl der Sekunden seit Beginn der Paketerfassung angibt. Das mag zwar in manchen Situationen sinnvoll sein, aber ich habe lieber eine absolute Zeitangabe. Sie können diese Einstellung im Hauptmenü unter View > Time Display Format > Date and Time of Day ändern. Wenn die Erfassungsdatei, mit der Sie arbeiten, nur Pakete eines einzigen Tages enthält, können Sie den Zeitstempel auch kompakter fassen, indem Sie stattdessen Time of Day wählen. Um das Format der Zeitanzeige nicht bei jedem Start von Wireshark ändern zu müssen, richten Sie wie folgt die Standardeinstellung ein: 1. Wählen Sie im Hauptmenü Edit > Preferences. 2. Wählen Sie die Überschrift Columns und das Feld Time. 3. Ändern Sie Field Type in Absolute Date and Time. Ein weiteres Zeitanzeigeformat, das in manchen Situationen nützlich sein kann, ist Seconds Since Previous Displayed Packet. Sie können es beispielsweise verwenden, wenn Sie eine einzelne Kommunikationssequenz analysieren und die Zeitabstände zwischen einzelnen Aktionen bestimmen wollen. Damit können Sie herausfinden, ob die Aktionen von einem Menschen oder einem Skript hervorgerufen wurden, denn die Aktionen eines Skripts erfolgen in präzisen Abständen, während das Handeln eines Menschen viel regelloser ist. Manchmal möchten Sie auch wissen, in welchem Zeitabstand zwei aufeinander folgende Ereignisse stattgefunden haben. Dazu können Sie in Wireshark ein einzelnes Paket als Bezugspunkt für die Zeitbestimmung auswählen. Rechtsklicken Sie auf das Paket und wählen Sie Set Time Reference. Wenn Sie dann das Zeitanzeigeformat auf Seconds Since Beginnung of Capture ändern, wird als Zeitangabe für die nachfolgenden Pakete 440 13 Paketanalyse die Anzahl der Sekunden seit der Erfassung des ausgewählten Pakets genannt. Sie können auch mehrere Pakete als Bezugspunkt für die Zeitangaben auswählen. 13.6.3 Übersicht über die Paketerfassung Wenn ich eine Paketerfassung in Wireshark lade, öffne ich als Erstes das Übersichtsfenster, indem ich im Hauptmenü Statistics > Summary wähle. In dem daraufhin eingeblendeten Fenster aus Abb. 13.31 finden Sie eine Menge Informationen und Statistiken über die Paket­ erfassung und die darin enthaltenen Daten. Abbildung 13.31: Übersichtsfenster in Wireshark Für Analytiker besonders wichtige Angaben in diesem Fenster sind: •• Format: Das Format der Datei. Wenn Sie hier sehen, dass Sie es mit einer PCAP-NGDatei zu tun haben, dann wissen Sie, dass Sie den Paketen Kommentare hinzufügen können. 13.6 Wireshark für die NSM-Analyse 441 •• Time: Dieser Abschnitt zeigt an, wann das erste und wann das letzte Paket erfasst wurde und wie viel Zeit dazwischen verstrichen ist. Das ist wichtig, um zu bestätigen, dass die Erfassung auch tatsächlich den gesamten Zeitraum abdeckt, den Sie für die vorliegende Untersuchung benötigen. •• Bytes: Die Menge der Daten in der Erfassungsdatei. Diese Angabe vermittelt Ihnen eine Vorstellung davon, wie viele Daten Sie sich ansehen. •• Avg. Packet Size: Die durchschnittliche Größe der Pakete in der Erfassungsdatei. In manchen Fällen können Sie damit die Zusammensetzung des Datenverkehrs abschätzen. Ein großer Durchschnittswert etwa deutet darauf hin, dass mehr Pakete Daten enthalten, wohingegen sich aus einem kleineren Durchschnittswert schließen lässt, dass mehr Steuer- und Befehlspakete auf Protokollebene vorhanden sind. Dies ist allerdings kein besonders zuverlässiger Indikator, da die durchschnittliche Paketgröße von vielen verschiedenen Faktoren abhängt. •• Avg. Bytes/sec und Avg. Mbit/sec: Die durchschnittliche Anzahl von Bytes bzw. Megabits pro Sekunde. Damit können Sie die Rate bestimmen, mit der die Kommunikation abläuft. 13.6.4 Protokollhierarchie Das Fenster mit der Protokollhierarchie können Sie über Statistics > Protocol Hierarchy im Hauptmenü auswählen. Es zeigt eine Übersicht über alle in der Erfassungsdatei gefundenen Protokolle zusammen mit statistischen Angaben darüber, wie viel Prozent des Datenverkehrs die einzelnen Protokolle ausmachen. Abbildung 13.32: Das Protokollhierarchiefenster von Wireshark 442 13 Paketanalyse Diese Statistik gehört ebenfalls zu den Dingen, die Sie sich gleich zu Anfang der Analyse einer Paketerfassungsdatei anschauen sollten. Aufgrund der knappen Darstellung können Sie sehr schnell unnormale oder unerwartete Protokolle aufspüren, die eine weitere Analyse erfordern, etwa wenn Sie SMB-Datenverkehr sehen, obwohl sich in dem betreffenden Netzwerksegment keine Windows- oder Samba-Hosts befinden. Es ist mit dieser Anzeige auch möglich, ungewöhnliche Anteile von Protokollen am Gesamtdatenverkehr zu erkennen. Wenn beispielsweise ein unerwartet hoher Prozentsatz von DNS- oder ICMP-Datenverkehr zu finden ist, sollten Sie die betreffenden Pakete genauer untersuchen. Sie können unmittelbar in diesem Fenster Anzeigefilter erstellen, indem Sie auf ein Protokoll rechtsklicken, Apply As Filter wählen und sich dann für eine Filteroption entscheiden. Mit Selected werden nur Pakete für das betreffende Protokoll angezeigt, mit Not Selected alle Pakete, die nicht zu dem Protokoll gehören. Es gibt noch weitere Optionen, mit denen Sie zusammengesetzte Anzeigefilter erstellen können. 13.6.5 Endpunkte und Konversationen In Wireshark wird ein Gerät, das über das Netzwerk kommuniziert, als Endpunkt bezeichnet, und die Kommunikation zwischen zwei Endpunkten als Konversation. Das Programm ermöglicht es Ihnen, Kommunikationsstatistiken für einzelne Endpunkte und für die Konversationen dazwischen anzuzeigen. Um die Endpunktstatistiken einzusehen, wählen Sie im Hauptmenü Statistics > Endpunkts. Daraufhin wird der Bildschirm aus Abb. 13.33 angezeigt. Abbildung 13.33: Das Endpunktfenster von Wireshark Der Zugriff auf die Konversationen erfolgt über Statistics > Conversations. Das Fenster dafür sehen Sie in Abb. 13.34. 13.6 Wireshark für die NSM-Analyse 443 Abbildung 13.34: Das Konversationsfenster von Wireshark Beide Fenster sind ähnlich aufgebaut und die einzelnen Endpunkte bzw. Konversationen jeweils in einer eigenen Zeile, wobei jeweils statistische Angaben zu den in beiden Richtungen übertragenen Paketen und Bytes gemacht werden. Am oberen Rand jedes Fensters finden Sie außerdem eine Reihe von Registerkarten für die verschiedenen Protokolle in den unterschiedlichen Schichten. Wireshark zerlegt Endpunkte und Konversationen nach den Protokollen und Adressen, die in den einzelnen Schichten verwendet werden. Dadurch kann ein einziger Ethernet-Endpunkt an mehrere IPv4-Endpunkte gebunden sein. Auch eine Konversation zwischen mehreren IP-Adressen kann in Wirklichkeit auf zwei physische Geräte mit jeweils einer einzigen Ethernet-MAC-Adresse beschränkt sein. Anhand der Fenster für Endpunkte und Konversationen können Sie bestimmen, wer die wichtigsten Akteure in einer Erfassungsdatei sind. Sie können herausfinden, welche Hosts die größte oder geringste Menge an Datenverkehr übermitteln oder erhalten, was Ihnen dabei hilft, den Umfang Ihrer Untersuchung einzugrenzen. Wie im Protokollhierarchiefenster können Sie unmittelbar Filter erstellen, indem Sie auf einen Endpunkt oder eine Konversation rechtsklicken. 13.6.6 Streams verfolgen Wir haben uns bereits angesehen, wie Wireshark Datenverkehr darstellt, der im Rahmen einer Konversation zwischen zwei Endpunkten auftritt. Meistens sind wir aber mehr an dem Inhalt der zwischen diesen Geräten übertragenen Daten interessiert als an einer Liste der Pakete, die bei dieser Kommunikation auftraten. Nachdem Sie einen Filter erstellt haben, der nur den Datenverkehr in einer gegebenen Konversation zeigt, können Sie die Streamverfolgungsmöglichkeiten von Wireshark nutzen, um sich die Anwendungsschichtdaten in diesen Paketen aus einem anderen Blickwinkel anzusehen. Hier können Sie das tun, indem Sie auf ein TCP-Paket rechtsklicken und Follow TCP Stream auswählen. 444 13 Paketanalyse Abbildung 13.35: Verfolgung eines TCP-Streams Abb. 13.35 zeigt die TCP-Streamausgabe für eine HTTP-Verbindung. Wie Sie sehen, hat Wireshark die Daten der Anwendungsschicht, die in den Paketen dieser Konversation enthalten sind, unter Ausschluss von Informationen aus den tieferen Schichten zusammengesetzt. Dadurch können Sie schnell erkennen, was in dieser HTTP-Transaktion vor sich geht. Diese Informationen können Sie in verschiedenen Formaten ausgeben. Wenn Sie wollen, können Sie auch nur die Kommunikation in einer Richtung anzeigen lassen. Wireshark bietet die gleichen Möglichkeiten auch für UDP- und SSL-Streams. Wie wertvoll die Streamverfolgung ist, hängt von dem verwendeten Protokoll der Anwendungsschicht ab. Verschlüsselte Streams wie in HTTPS- und SSH-Verbindungen haben naturgemäß keinen großen Wert für die Analyse. 13.6.7 E/A-Diagramm In dem Übersichtsdialogfeld von Wireshark, das wir uns schon zuvor angesehen haben, können Sie den durchschnittlichen Datendurchsatz einer Paketerfassung erkennen. Das ist zwar großartig, um den durchschnittlichen Gesamtdurchsatz zu bestimmen, aber um den Paketdurchsatz zu einem beliebigen Zeitpunkt zu ermitteln, müssen Sie in Wireshark ein E/A-Diagramm erstellen, in dem der Datendurchsatz im Zeitverlauf dargestellt wird (siehe Abb. 13.36). 13.6 Wireshark für die NSM-Analyse 445 Abbildung 13.36: Darstellung des Datendurchsatzes in einem E/A-Diagramm Abb. 13.36 zeigt einen einfachen Durchsatzgraphen für eine einzige Paketerfassung. Es gibt eine Linie für den Durchsatz aller Pakete in der Erfassungsdatei (Graph 1) und zwei weitere Linien für den Durchatz der Pakete, die mit den Anzeigefiltern übereinstimmen. Einer dieser Filter zeigt den gesamten HTTP-Datenverkehr in der Erfassung (Graph 3), der andere den Datenverkehr von einem bestimmten Host mit der IP-Adresse 74.125.103.164 (Graph 4). Vorsicht In der Druckversion dieses Buches können Sie die Linien in Abb. 13.36 schlecht unterscheiden, da Wireshark sie durch Farben kennzeichnet. Auf die Graph-3-Linie wurde sogar komplett verzichtet, da ihre Farbe im Schwarzweißdruck überhaupt nicht erkennbar ist. Die Einheiten und Abstände im E/A-Diagramm lassen sich ändern. Als Einheit bevorzuge ich Bytes/Tick, und ich passe die Darstellungsgröße der Einheiten an die Dimensionen der Daten an, die ich untersuche. E/A-Diagramme sind praktisch, um den von bestimmten Geräten oder Protokollen hervorgerufenen Datenverkehr zu untersuchen oder um Spitzen beim Datenverkehr im Zusammenhang mit bestimmten Arten der Kommunikation rasch zu erkennen. 446 13 Paketanalyse 13.6.8 Objekte exportieren Wireshark kann die Übertragung einzelner Dateien in bestimmten Protokollen erkennen. Dadurch können Sie diese Dateien auch aus der Erfassung exportieren, vorausgesetzt, dass in der Erfassung der komplette Datenstream für die Datei enthalten ist. Zum Zeitpunkt der Abfassung dieses Buches ermöglicht Wireshark den Export von Objekten aus HTTP-, SMB- und DICOM-Streams. Um diese Funktion auszuprobieren, gehen Sie folgendermaßen vor: 1. Starten Sie eine neue Paketerfassung in Wirehsark. Wählen Sie die Netzwerkschnittstelle des Geräts aus, auf dem Sie Wireshark ausführen. 2. Öffnen Sie Ihren Browser und besuchen Sie verschiedene Websites. 3. Halten Sie die Paketerfassung an. 4. Wählen Sie im Hauptmenü von Wireshark File > Export > Objects > HTTP. 5. In einer Liste werden die Dateien aufgeführt, die Wireshark in dem Kommunikationsstream erkannt hat (siehe Abb. 13.37). Klicken Sie auf das Objekt, das Sie exportieren möchten, und wählen Sie Save as. Anschließend können Sie den Speicherort für die Datei auswählen und einen Namen für sie angeben. Abbildung 13.37: Auswählen eines zu exportierenden HTTP-Objekts Um eine Datei aus einer Paketerfassung extrahieren zu können, müssen alle für die Übertragung der Datei verwendeten Pakete darin enthalten sein. 13.6 Wireshark für die NSM-Analyse 447 Diese Funktion von Wireshark ist ausgesprochen wertvoll. Es gibt zwar noch andere Möglichkeiten, Dateien aus Paketdatenstreams zu exportieren, z. B. das File Analysis Framework von Bro, aber es ist sehr bequem, diesen Vorgang direkt in Wireshark vorzunehmen. Ich nutze diese Funktion häufig, wenn ich eine verdächtige Datei in der Übertragung sehe. Seien Sie dabei aber vorsichtig, denn bei der Datei, die Sie exportieren, könnte es sich um eine Schaddatei handeln, die Ihr System mit irgendeiner Form von Malware infiziert oder sonstige Schäden anrichtet. 13.6.9 Benutzerdefinierte Spalten hinzufügen In der Standardinstallation zeigt Wirehshark im Paketlistenbereich sieben Spalten an – für die Paketnummer, den Zeitstempel, die Quelladresse, die Zieladresse, das Protokoll, die Länge und Informationen. Das sind sicherlich unverzichtbare Felder, aber für eine bessere Analyse ist es oft angebracht, weitere Spalten hinzuzufügen. Es gibt zwei Möglichkeiten, das zu tun, und im Folgenden führen wir anhand von drei neuen Spalten beide vor. Bei diesen Spalten handelt es sich um die für den Quell- und den Zielport sowie für die ­HTTP-Methode. Als Erstes kümmern wir uns um den Quell- und Zielport. Die Werte dafür werden zwar auch im Informationsfeld angezeigt, aber wenn sie in einer eigenen Spalte stehen, können Sie sie leichter erkennen und die Liste außerdem nach diesen Ports sortieren, was wiederum sehr praktisch ist, um die verschiedenen Streams zu identifizieren. Um diese Spalten hinzuzufügen, verwenden wir das Dialogfeld Preferences von Wireshark: 1. Wählen Sie im Hauptmenü von Wireshark Edit > Preferences. 2. Wählen Sie auf der linken Seite des Bildschirms die Option Columns. 3. Klicken Sie auf Add und wählen Sie im Dialogfeld Field Type die Option Source Port (unresolved) aus. 4. Doppelklicken Sie in den neu hinzugefügten Feld auf New Column und ersetzen Sie diesen Titel durch SPort. 5. Klicken Sie auf Add und wählen Sie die Option Dest Port (unresolved). 6. Doppelklicken Sie in dem neu hinzugefügten Feld auf New Column und ersetzen Sie diesen Titel durch DPort. 7. Ziehen Sie das Feld SPort hinter das Feld Source. 8. Ziehen Sie das Feld DPort hinter das Feld Destination. 9. Klicken Sie auf OK. 10. Der Bildschirm Columns sieht jetzt so aus wie in Abb. 13.38. 448 13 Paketanalyse Abbildung 13.38: Der Bildschirm Columns mit den neu hinzugefügten Feldern Als Nächstes fügen wir die Spalte für die HTTP-Methode hinzu. Das ist sicherlich kein Feld, dass ständig wertvollen Platz auf dem Bildschirm einnehmen sollte, aber bei der Analyse von HTTP-Datenverkehr ist es praktisch, da sie daran auf einen Blick zwischen Paketen mit den HTTP-Befehlen GET und POST unterschieden können. Anstatt die gleiche Methode anzuwenden wie zuvor, fügen wir es im Wireshark-Hauptfenster wie folgt hinzu: 1. Starten Sie eine neue Paketerfassung in Wireshark. Wählen Sie die Netzwerkschnittstelle des Geräts aus, auf dem Sie Wireshark ausführen. 2. Öffnen Sie Ihren Browser und besuchen Sie verschiedene Websites. 3. Halten Sie die Paketerfassung an. 4. Suchen Sie ein HTTP-Paket mit einer HTTP-Anforderungsmethode, also ein GET- oder POST-Paket. Das können Sie manuell oder mithilfe des Anzeigefilters http.request tun. 5. Markieren Sie das Paket in der Paketliste und erweitern Sie im Bereich mit den detaillierten Angaben zum Paket den Abschnitt mit den HTTP-Headerinformationen. Suchen Sie das Feld Request Method. 6. Rechtsklicken Sie auf das Feld Request Method und wählen Sie Apply as column. Die Spalte Request Method wird jetzt rechts neben der Spalte Info eingefügt. Wenn Sie ihre Position ändern wollen, können Sie mit der Maus an die gewünschte Stelle ziehen. Sie können auch den Namen und andere Eigenschaften der Spalte ändern, indem Sie darauf rechtsklicken und Edit column details wählen. Um eine Spalte wieder zu entfernen, rechtsklicken Sie auf den Spaltenkopf und wählen Remove column. Spalten, die Sie mit einer der hier vorgeführten Methoden hinzufügen, werden in das zurzeit verwendete Profil aufgenommen, sodass sie nach einem Neustart von Wireshark nach wie vor angezeigt werden. Spalten wie die für den Quell- und den Zielport verwende ich in fast allen Situationen. Andere Spalten, etwa für die HTTP-Anforderungsmethode, ergänze und entferne ich fallweise, je nachdem, welche Art von Datenverkehr ich untersuche. In 13.6 Wireshark für die NSM-Analyse 449 Wireshark können Sie praktisch alle Felder eines zerlegten Pakets zu einer Spalte machen, indem Sie darauf rechtsklicken und Apply as column wählen. Scheuen Sie sich nicht, diese Funktion zu nutzen! 13.6.10 Zerlegungsoptionen für Protokolle einrichten Das wahrscheinlich spannendste Merkmal von Wireshark ist die große Menge von Zerlegungsfunktionen für Protokolle. Dabei handelt es sich um Module, die Wireshark nutzt, um die einzelnen Protokolle zu zergliedern, um sie feldweise zu interpretieren. Dadurch wird es möglich, dass die Benutzer Filter auf der Grundlage von Protokollkriterien erstellen. Einige dieser Zerlegungsfunktionen verfügen über praktische Optionen, um die Vorgehensweise bei der Analyse zu ändern. Im Hauptmenü können Sie auf diese Zerlegungsoptionen zugreifen, indem Sie Edit > Preferences wählen und dann den Protokollheader erweitern. Die daraufhin angezeigte Liste zeigt alle in Wireshark geladenen Zerlegungsfunktionen. Wenn Sie auf eines der Protokolle klicken, sehen Sie die zugehörigen Optionen auf der rechten Seite des Fensters. Abb. 13.39 zeigt diese Optionen für TCP. Eine Untersuchung der Zerlegungsoptionen für gebräuchliche Protokolle ist eine gute Methode, um sich eine Vorstellung davon zu verschaffen, wie Wireshark die dargestellten Informationen gewinnt. Beispielsweise sehen Sie in Abb. 13.39, dass Wireshark für TCPVerbindungen standardmäßig relative statt absoluter Sequenznummern anzeigt. Wenn Sie das nicht wissen und dann versuchen, in einer anderen Anwendung nach einer bestimmten Sequenznummer zu suchen, werden Sie erschrocken feststellen, dass es diese Nummer dort nicht gibt. In einem solchen Fall können Sie die relative Nummerierung ausschalten, um die echten TCP-Sequenznummern zu erhalten. Wenn Sie viel Zeit mit der Untersuchung von Paketen zubringen, sollten Sie sich die Mühe machen, sich die Zerlegungsoptionen für die wichtigsten TCP/IP-Protokolle sowie andere Protokolle anzusehen, mit denen Sie regelmäßig arbeiten. Abbildung 13.39: Zerlegungsoptionen für TCP 450 13 Paketanalyse 13.6.11 Erfassungs- und Anzeigefilter In Wireshark können Sie Erfassungsfilter im BPF-Format sowie Anzeigefilter verwenden. Letztere gehorchen ihrer eigenen Syntax, die eigens für den Umgang mit den von den Zerlegungsfunktionen erstellten Feldern gedacht ist. BPF-Erfassungsfilter können Sie in Wireshark nur während der Datenerfassung anwenden. Dazu wählen Sie im Hauptmenü Capture > Options, doppelklicken auf die Schnittstelle, an der die Erfassung ablaufen soll, und geben den Filter im Bereich Capture Filter des Dialogfelds an (siehe Abb. 13.40). Klicken Sie dann auf OK. Wenn Sie anschließend auf dem vorherigen Bildschirm auf Start klicken, wird der Erfassungsfilter angewendet. Alle Pakete, die nicht mit dem Filter übereinstimmen, werden verworfen. Der Filter in diesem Beispiel lässt nur Pakete aus dem Quellnetzwerk 192.168.0.0/24 durch, die nicht über Port 80 übertragen werden. Achten Sie darauf, die Erfassungsfilter wieder zu entfernen, wenn Sie sie nicht mehr brauchen, da Sie sonst nicht alle Pakete erhalten, die Sie haben wollen. Abbildung 13.40: Angeben eines Paketfilters Anzeigefilter dagegen geben Sie direkt im Filterdialogfeld über dem Paketlistenbereich des Hauptfensters von Wireshark ein. Wenn Sie anschließend auf Apply klicken, werden nur die Pakete angezeigt, die mit dem Filter übereinstimmen. Brauchen Sie den Filter nicht mehr, klicken Sie einfach auf Clear. Die erweiterten Filteroptionen finden Sie, indem Sie den Ausdrucksfilter von Wireshark nutzen. Klicken Sie dazu auf die Schaltfläche Expression neben dem Dialogfeld für Anzeigefilter. 13.7 Paketfilter 451 Abbildung 13.41: Zusammenstellen von Anzeigefiltern mit dem Expression Builder In Abb. 13.41 ist eine Filterausdrucksopton für SMB2-SessionSetup-Anforderungen ausgewählt. In diesem Abschnitt haben Sie erfahren, wie Sie in Wireshark Erfassungs- und Anzeigefilter anwenden können. Im nächsten Abschnitt sehen wir uns an, wie Sie solche Filter für die Erfassung, Erkennung und Analyse erstellen. 13.7 Paketfilter Mithilfe von Erfassungs- und Anzeigefiltern geben Sie an, welche Pakete Sie sehen bzw. nicht sehen wollen. Bei der Analyse von Paketen werden Sie einen Großteil Ihrer Zeit damit verbringen, umfangreiche Datenmengen zu filtern, um sie auf handhabbare kleinere Abschnitte einzugrenzen, die für die Untersuchung von Wert sind. Daher ist es unverzichtbar, sich mit der Paketfilterung auszukennen und zu wissen, wie Sie sie in verschiedenen Situationen jeweils anwenden müssen. In diesem Abschnitt sehen wir uns zwei Formen der Paketfilterung an, nämlich Berkeley-Paketfilter (Erfassungsfilter) und Wireshark- bzw. Tshark-Anzeigefilter. 13.7.1 Berkeley-Paketfilter (BPF) BPF ist die am häufigsten verwendete Paketfiltersyntax. Sie wird in einer Reihe von Paketverarbeitungsanwendungen eingesetzt. Tcpdump nutzt sie ausschließlich, und in Wireshark und Tshark kann sie bei der Erfassung von Paketen im Netzwerk verwendet werden, um Datenverkehr auszuschließen, den Sie für die Erkennung und Analyse nicht 452 13 Paketanalyse benötigen (siehe Kapitel 4). BPF-Filter können auch bei der Analyse von Datenverkehr eingesetzt werden, der bereits von einem Sensor erfasst wurde. Aufbau von Berkeley-Paketfiltern Ein Filter, der mit der BPF-Syntax erstellt wurde, wird als Ausdruck bezeichnet. Diese Ausdrücke weisen einen bestimmten Aufbau auf: Sie bestehen aus einem oder mehr Primitiva, die durch Operatoren verbunden sind. Ein Primitivum ist eine einzelne Filteranweisung, die wiederum aus einem oder mehreren Qualifizierern gefolgt von einem ID-Wert in Form eines Namens oder einer Nummer besteht. Ein Beispiel für dieses Format sehen Sie in Abb. 13.42. Operator Wert Qu al ifi zie re Qu r al ifi zie re r Qu al ifi zie re r Qu al ifi zie re r Primitivum Primitivum Wert Abbildung 13.42: Der Aufbau eines BPF-Ausdrucks In diesem Beispiel besteht der Ausdruck aus den beiden Primitiva udp port 53 und dst host 192.0.2.2. Das erste Primitivum hat die Qualifizierer udp und port und den Wert 53. Es steht für jeglichen Datenverkehr zu oder von Port 53 über das Transportschichtprotokoll UDP. Das zweite Primitivum ist aus den Qualifizierern dst und host und dem Wert 192.0.2.2 aufgebaut und steht für Datenverkehr zu dem Host mit der genannten IP-­Adresse. Diese beiden Primitiva werden mit dem Verkettungsoperator && zu einem einzigen Ausdruck verkettet, der wahr ist, wenn ein Paket beide Bedingungen erfüllt. Einen Überblick über die drei verschiedenen Arten von BPF-Qualifizierern einschließlich Beispielen finden Sie in Tabelle 13.1. Wie Sie in Abb. 13.42 sehen, werden die Qualifizierer mit einem bestimmten Wert kombiniert. Dabei können Sie Primitiva mit nur einem einzigen Qualifizierer erstellen, z. B. host 192.0.2.2, was für jeglichen Datenverkehr zu oder von der genannten IP-Adresse steht, oder mehrere Qualifizierer verwenden wie in src host 192.0.2.2, was nur Datenverkehr bedeutet, der von dieser IP-Adresse ausgeht. 13.7 Paketfilter 453 Tabelle 13.1: BPF-Qualifizierer Qualifizierertyp Qualifizierer Typ Beschreibung Gibt an, worauf sich der Wert bezieht. »Wonach suchen Sie?« host Gibt einen Host anhand seiner IP-Adresse an. net Gibt ein Netzwerk in der CIDR-Schreibweise an. port Gibt einen Port an. Richtung Gibt die Übertragungsrichtung (zu oder von dem Wert) an. »In welche Richtung verläuft der Datenverkehr?« src Gibt an, dass der Wert die Quelle der Kommunikation ist. dst Gibt an, dass der Wert das Ziel der Kommunikation ist. Protokoll Gibt das verwendete Protokoll an. »Welches Protokoll wird verwendet?« ip Gibt IP als Protokoll an. tcp Gibt TCP als Protokoll an. udp Gibt UDP als Protokoll an. Zur Kombination der Primitiva können die drei in Tabelle 13.2 aufgeführten logischen Operatoren verwendet werden. Tabelle 13.2: Logische Operatoren für Berkeley-Paketfilter Operator Symbol Beschreibung Verkettung (AND) && Ist wahr, wenn beide Bedingungen wahr sind Disjunktion (OR) || Ist wahr, wenn eine oder beide Bedingungen wahr sind Negation (NOT) ! Ist wahr, wenn die Bedingung nicht erfüllt ist Tabelle 13.3 zeigt einige einfache Beispiele für BPF-Ausdrücke. 454 13 Paketanalyse Tabelle 13.3: Beispiele für BPF-Ausdrücke Ausdruck Bedeutung host 192.0.2.100 Datenverkehr zu oder von der angegebenen IPv4-Adresse dst host 2001:db8:85a3::8a2e:370:7334 Datenverkehr zu der angegebenen IPv6Adresse ether host 00:1a:a0:52:e2:a0 Datenverkehr zu der angegebenen MACAdresse port 53 Datenverkehr zu oder von Port 53 (DNS) tcp port 53 Datenverkehr zu oder von TCP-Port 53 (umfangreiche DNS-Antworten und Zonenübertragungen) !port 22 Jeglicher Datenverkehr, der nicht zu oder von Port 22 verläuft (SSH) icmp ICMP-Datenverkehr !ip6 Jeglicher Datenverkehr außer IPv6 Filter für einzelne Protokollfelder Mit der Syntax, die Sie bis jetzt kennengelernt haben, können Sie einige äußerst praktische Filter gestalten. Wenn Sie aber nur wenige bestimmte Protokollfelder untersuchen möchten, stoßen Sie damit an die Grenzen. Einer der größten Vorteile der BPF-Syntax besteht jedoch darin, dass Sie damit nach jedem beliebigen Feld in den Headern der TCP/ IP-Protokolle suchen können. Nehmen wir zum Beispiel an, Sie sind am TTL-Wert (Time to Live) im IPv4-Header interessiert, um den Datenverkehr auf der Grundlage der Betriebssystemarchitektur des Geräts zu filtern, von dem die Pakete ausgehen. Der TTL-Ausgangswert beträgt auf Windows-Geräten im Allgemeinen 128, auf Linux-Geräten dagegen 64. Das ist zwar kein hundertprozentig sicheres Kriterium, aber es erlaubt eine rudimentäre passive Betriebssystemerkennung anhand der Pakete. Dazu schreiben wir einen BPF-Ausdruck, der nach TTL-Werten größer als 64 sucht. Um diesen Filter zu erstellen, müssen wir wissen, an welchem Versatz das TTL-Feld im Header beginnt. In einem Protokollzuordnungsdiagramm können wir erkennen, dass der Anfang des Feldes bei 0x8 liegt (die Zählung beginnt bekanntlich bei 0). Damit können wir nun einen Filterausdruck schreiben, indem wir Tcpdump sagen, nach welchem Protokollheader es suchen soll, und dabei den Byteversatz, an dem der Wert zu finden ist, in eckigen Klammern angeben. Mit dem Größer-als-Operator > geben wir außerdem den gesuchten Wert an. Insgesamt sieht der BPF-Ausdruck also wie folgt aus: ip[8]>64 13.7 Paketfilter 455 Dieser Ausdruck weist Tcpdump (oder welche BPF-fähige Anwendung Sie auch immer nutzen) an, den Wert acht Bytes hinter 0 im TCP-Header zu lesen. Wenn der Wert dieses Feldes größer als 64 ist, liegt eine Übereinstimmung vor. Im folgenden Beispiel sind wir an einem Feld interessiert, das mehrere Bytes überspannt: Das Feld für die Fenstergröße im TCP-Header dient dazu, den Datenfluss zwischen zwei miteinander kommunizierenden Hosts zu steuern. Wenn einer der beiden Hosts mit Daten überflutet wird und sein Puffer voll ist, sendet er an den anderen Host ein Paket mit dem Fenstergrößenwert 0, um den Kommunikationspartner aufzufordern, die Datenübertragung vorerst einzustellen, damit er aufholen kann. Dadurch wird eine zuverlässige Datenübertragung sichergestellt. Um TCP-Pakete mit einem Fenstergrößenwert von 0 zu erkennen, erstellen wir einen Filter, der dieses Feld untersucht. Dazu gehen wir auf die gleiche Weise vor wie im vorigen Beispiel und bestimmen anhand eines Zuordnungsdiagramms, wo sich das Feld im TCP-Header befindet. In diesem Fall beginnt es bei Byte 0x14, allerdings ist es zwei Bytes lang. Das teilen wir Tcpdump dadurch mit, dass wir in den eckigen Klammern sowohl den Versatz als auch die Länge angeben, getrennt durch einen Doppelpunkt. Da ergibt folgenden Ausdruck: tcp[14:2]=0 Hiermit weisen wir Tcpdump an, sich den TCP-Header anzusehen und dabei die Folge der beiden Bytes zu untersuchen, die beim 14. Byte nach 0 beginnt. Hat dieses Feld den Wert 0, so liegt eine Übereinstimmung mit dem Filter vor. Damit wissen wir, wie wir mit Feldern umgehen, die länger als ein Byte sind. Was aber machen wir mit Feldern, deren Länge weniger als ein Byte beträgt? Das Protokoll TCP nutzt verschiedene Flags, um den Zweck eines Pakets anzugeben. Beispielsweise wird das Flag SYN für Pakete verwendet, die eine Verbindung einleiten, RST und FIN dagegen für Pakete, mit denen die Verbindung abrupt oder ordnungsgemäß beendet wird. Bei diesen Flags handelt es sich um 1-Bit-Felder innerhalb des Bytes 0x13 im TCPHeader. Zur Veranschaulichung, wie Sie Filter für Felder kleiner als ein Byte erstellen können, wollen wir einen Ausdruck für TCP-Pakete schreiben, bei denen nur das Flag RST aktiviert ist. Dazu sind mehrere Schritte erforderlich, da wir eine Bitmaske benötigen. Als Erstes müssen wir den gewünschten Wert im Paketheader finden. Das Flag RST befindet sich im Byte 0x13 des TCP-Header, und zwar an dritter Stelle (von rechts nach links gezählt). Um Tcpdump mitzuteilen, an welchem Bit in dem Feld wir interessiert sind, müssen wir eine Binärmaske erstellen. Da sich das gewünschte Bit an der dritten Stelle befindet, schreiben wir eine 1 in die dritte Stelle der Bitmaske und 0 in alle anderen. Damit bekommen wir den Binärwert 00000100. Diesen Wert müssen wir nun in seine hexadezimale Form übersetzen. Das ergibt 0x04. 456 13 Paketanalyse Jetzt können wir unseren Ausdruck schreiben, indem wir das Protokoll und den Byteversatz für 0x13 und hinter einem kaufmännischen Und-Zeichen (&) den Bitmaskenwert angeben: tcp[13] & 0x04 Als Letztes geben wir den Wert an, den das Feld haben soll. Da wir alle Pakete erfassen möchten, bei denen dieses Feld 1 ist, und eine 1 an der dritten Stelle eines Bytes den Wert 4 darstellt, verwenden wir einfach 4, um nach Übereinstimmungen zu suchen: tcp[13] & 0x04=4 Dieser Ausdruck steht für alle Pakete, bei denen nur das TCP-Flag RST gesetzt ist. Es gibt verschiedene Verwendungszwecke für BPF-Ausdrücke, die einzelne Protokollfelder untersuchen. Beispielsweise können Sie mit dem Ausdruck icmp[0] == 8 || icmp[0] == 0 nach ICMP-Echoanforderungen und -antworten suchen. Anhand der Beispiele in diesem Abschnitt sollten Sie in der Lage sein, Filterausdrücke für praktisch alle Protokollfelder zu schreiben, an denen Sie interessiert sind. Als Nächstes sehen wir uns Anzeigefilter an. 13.7.2 Anzeigefilter von Wireshark Sowohl in Wireshark als auch in Tshark können Sie Anzeigefilter verwenden. Sie unterscheiden sich von den Erfassungsfiltern, da sie die Protokollzerlegungsfunktionen der genannten Anwendungen nutzen, um Informationen über die einzelnen Protokollfelder zu gewinnen. Dadurch sind sie erheblich vielseitiger. Wireshark unterstützt ca. 1000 Protokolle und fast 141.000 Protokollfelder. In den Filterausdrücken, die Sie schreiben, können Sie all diese Felder verwenden. Im Gegensatz zu Erfassungsfiltern werden Anzeigefilter erst nach der Datenerfassung auf die Paketerfassung angewendet. Wie Anzeigefilter in Wireshark und Tshark verwendet werden, haben wir uns schon zuvor angesehen. Hier wollen wir uns nun genauer damit beschäftigen, wie diese Ausdrücke aufgebaut sind, und einige Beispiele dafür geben. Ein typischer Anzeigefilterausdruck besteht aus einem Feldnamen, einem Vergleichsoperator und einem Wert. Bei dem Feldnamen kann es sich um ein Protokoll, ein Feld in einem Protokoll oder ein Feld handeln, das eine Zerlegungsfunktion im Zusammenhang mit einem Protokoll liefert. Beispiele für solche Feldnamen sind beispiele das Protokoll icmp oder die Protokollfelder icmp.type und icmp.code. Eine vollständige Liste der Feldnamen finden Sie im Dialogfeld zum Erstellen von Ausdrücken für Anzeigefilter (beschrieben im Abschnitt 13.7 Paketfilter 457 über Wireshark in diesem Kapitel) und in der Hilfedatei von Wireshark. Einfach ausgedrückt: Jedes Feld, das Sie im Wireshark-Bereich mit Detailangaben zu einem Paket sehen, können Sie in einem Filterausdruck verwenden. Auf den Feldnamen folgt der Vergleichsoperator (manchmal auch relationaler Operator genannt), der festlegt, wie Wireshark die angegebenen Werte mit den Daten im Feld vergleichen soll. Die in Wireshark verwendbaren Vergleichsoperatoren sind in Tabelle 13.4 aufgeführt. Je nachdem, was Ihnen lieber ist, können Sie sowohl englische als auch C-artige Operatoren verwenden. Tabelle 13.4: Vergleichsoperatoren für Anzeigefilter Operator (englisch) Operator (C-artig) eq Beschreibung Beispiel == Übereinstimmende Werte sind gleich dem angegebenen Wert ip.addr == 192.168.1.155 ne != Übereinstimmende Werte sind ungleich dem angegebenen Wert ip.addr != 192.168.1.155 gt > Übereinstimmende Werte sind größer als der angegebene Wert tcp.port gt 1023 lt < Übereinstimmende Werte sind kleiner als der angegebene Wert tcp.port < 1024 ge >= Übereinstimmende Werte sind größer oder gleich dem angegebenen Wert udp.length >= 75 le <= Übereinstimmende Werte sind kleiner oder gleich dem angegebenen Wert udp.length le 75 Übereinstimmende Werte enthalten den angegebenen Wert in dem Feld smtp.req.parameter contains "FROM" contains Das letzte Element in einem Ausdruck ist der Wert, nach dem Sie in Relation zu dem Vergleichsoperator suchen. Tabelle 13.5 zeigt die verschiedenen Arten von Werten. 458 13 Paketanalyse Tabelle 13.5: Werttypen Werttyp Beschreibung Beispiel Integer (mit oder ohne Vorzeichen) Angegeben im Dezimal-, Oktal- oder Hexadezimalformat tcp.port == 443 Boolescher Wert Angegeben als 1 (wahr) oder 0 (falsch) tcp.flags.syn == 1 Angegeben als ASCII-Text http.request.uri == "http://www. appliednsm.com" String ip.proto == 0x06 ip.frags.mf == 0 smtp.req.parameter contains "FROM" Adresse Angegeben im entsprechenden Adressformat: IPv4, IPv6, MAC usw. ip.src == 192.168.1.155 ip.dst == 192.168.1.0/24 ether.dst == ff:ff:ff:ff:ff:ff Damit sind wir nun in der Lage, eigene Filter zu schreiben. Als erstes einfaches Beisiel wollen wir einen Filterausdruck aufstellen, um nur Pakete anzuzeigen, die das Protokoll IP verwenden. Dazu müssen wir lediglich den Protokollnamen angeben: ip Mit dem Schlüsselwort src können wir nach Übereinstimmungen mit einer bestimmten IP-Quelladresse suchen: ip.src == 192.168.1.155 Alternativ können wir auch nach Paketen mit einer bestimmten IP-Zieladresse forschen: ip.dst == 192.168.1.155 Wireshark enthält auch einige eigene Felder, die Werte aus verschiedenen anderen Feldern enthalten. Um beispielsweise Pakete zu finden, bei denen eine bestimmte IP-Adresse als Quelle oder als Ziel verwendet wird, verwenden wir folgenden Filter, der sowohl das Feld ip.src als auch ip.dst untersucht: ip.addr == 192.168.1.155 Mithilfe logischer Operatoren können mehrere Ausdrücke verknüpft werden. Eine Aufstellung dieser Operatoren sehen Sie in Tabelle 13.6. 13.7 Paketfilter 459 Tabelle 13.6: Logische Operatoren für Anzeigefilter Operator (englisch) Operator (C-artig) Beschreibung and && Ist wahr, wenn beide Bedingungen wahr sind or || Ist wahr, wenn eine oder beide Bedingungen wahr sind xor ^^ Ist wahr, wenn genau eine der beiden Bedingungen wahr ist not ! Ist wahr, wenn die Bedingung nicht erfüllt ist Damit können wir zwei Ausdrücke zu einem kombinierten Ausdruck verbinden. Der folgende Filter sucht nach Paketen, die von 192.168.1.155 ausgehen und nicht für Port 80 bestimmt sind: ip.src == 192.168.1.155 && !tcp.dstport == 80 Auch hier gilt wieder, dass Sie alles, was Sie in Wireshark im Bereich mit den Detailangaben zu einem Paket sehen, für Filterausdrücke verwenden können. Tabelle 13.7 zeigt einige weitere Beispiele für Anzeigefilterausdrücke. Tabelle 13.7: Beispiele für Anzeigefilterausdrücke Filterausdruck Beschreibung eth.addr !=<MAC-Adresse> Findet Pakete, die nicht zu oder von der angegebenen MAC-Adresse übertragen werden. ipv6 Findet IPv6-Pakete. ip.geoip.country == <Land> Findet Pakete zu oder von dem angegebenen Land. ip.ttl <= <Wert> Findet Pakete mit einem TTL-Wert kleiner oder gleich dem angegebenen Wert. Das kann für eine grobe Identifizierung des Betriebssystems verwendet werden. ip.checksum_bad == 1 Findet Pakete mit einer ungültigen IP-Prüfsumme. Wenn Sie die Angabe ip in diesem Ausdruck durch udp oder tcp ersetzen, können Sie ihn auch für Prüfsummen dieser Protokolle verwenden. Dieser Filter ist praktisch, um unvorsichtig gefälschte Pakete zu finden. tcp.stream == <Wert> Findet Pakete, die zu dem angegeben TCP-Stream gehören. Das ist nützlich, um die Suche auf bestimmte Transaktionen einzugrenzen. 460 13 Paketanalyse Filterausdruck Beschreibung tcp.flags.syn == 1 Findet Pakete, bei denen das Flag SYN gesetzt ist. Sie können syn auch durch die Abkürzungen für andere TCP-Flags ersetzen, um danach zu suchen. tcp.analysis.zero_window Findet Pakete mit der Angabe 0 für die TCP-Fenstergröße. Damit lassen sich Hosts aufspüren, deren Ressourcen erschöpft sind. http.request == 1 Findet HTTP-Anforderungspakete. http.request.uri == "<Wert>" Findet HTTP-Anforderungspakete mit dem angegebenen URI. http.response.code == <Wert> Findet HTTP-Antwortpakete mit dem angegebenen Code. http.user_agent == "Wert" Findet HTTP-Pakete mit dem angegebenen String für den Benutzeragenten. http.host == "Wert" Findet HTTP-Pakete mit dem angegebenen Hostwert. smtp.req.command == "<Wert>" Findet SMTP-Anforderungspakete mit dem angegebenen Befehl. smtp.rsp.code == <Wert> Findet SMTP-Antwortpakete mit dem angegebenen Code. smtp.message == "Wert" Findet Pakete mit der angegebenen SMTP-Nachricht. bootp.dhcp Findet DHCP-Pakete. !arp Findet alle Pakete, die keine ARP-Pakete sind. ssh.encrypted_packet Findet verschlüsselte SSH-Pakete. ssh.protocol == "<Wert>" Findet SSH-Pakete mit dem angegebenen Protokollwert. dns.qry.type == <Wert> Findet DNS-Abfragepakete des angegebenen Typs (A, MX, NS, SOA usw.). dns.resp.type == <Wert> Findet DNS-Antwortpakete des angegebenen Typs (A, MX, NS, SOA usw.). dns.qry.name == "<Wert>" Findet DNS-Abfragepakete mit dem angegebenen Namen. dns.resp.name == "<Wert>" Findet DNS-Antwortpakete mit dem angegebenen Namen. Nehmen Sie sich die Zeit, mit den Anzeigefilterausdrücken zu experimentieren und einige für Ihre Zwecke nützliche zu erstellen. Das Dialogfeld zum Erstellen von Ausdrücken in Wireshark kann Ihnen dabei Hilfestellung leisten. 13.8 Zusammenfassung 461 13.8 Zusammenfassung In diesem Kapitel haben wir die Grundlagen der Paketanalyse besprochen. Als Erstes haben Sie eine Einführung in Paketmathematik erhalten, um Pakete im Hexformat lesen zu können. Danach sind wir zu einer Beschreibung von Werkzeugen für die Paketanalyse übergegangen, nämlich der Befehlszeilentools Tcpdump und Tshark und der grafischen Anwendung Wireshark. Als Letztes haben wir uns mit dem Aufbau und der Syntax von Erfassungs- und Anzeigefiltern beschäftigt. Die Paketanalyse ist eine der wichtigsten Fähigkeiten für NSM-Analytiker, weshalb die Informationen in diesem Kapitel von unschätzbarem Wert sind. Wenn Sie diese Prinzipien beherrschen, können Sie sich mit den weiteren Quellen zur Paketanalyse beschäftigen, die am Anfang dieses Kapitels erwähnt wurden, um ein besseres Verständnis der Funktionsweise von Paketen und der TCP/IPProtokolle zu erwerben. 14 Aufklärung über Freund und Feind Die meisten Sicherheitsteams, die ein Network Security Monitoring durchführen, sind allgemein gesagt an zwei Arten von Informationen interessiert, nämlich an Informationen über eigene Elemente und über Bedrohungen. In diesem Kapitel sehen wir uns den herkömmlichen Zyklus der Informationsbeschaffung oder Aufklärung und die Methoden an, die dafür eingesetzt werden können. Denken Sie bei der Lektüre aber immer daran, dass bei der Aufklärung viele Faktoren eine Rolle spielen, von denen wir hier nur einen kleinen Teil behandeln können. 14.1 Der Aufklärungszyklus für NSM Aufklärung erfordert die koordinierten Anstrengungen mehrerer Beteiligter innerhalb der Organisation. Da es so viele bewegliche Teile gibt, ist es sinnvoll, dem Aufklärungsvorgang eine geordnete, wiederholbare Struktur zu geben. Die US-Regierung und militärische Aufklärungsorganisationen verwenden dabei seit Jahren eine Struktur, die als Aufklärungszyklus (Intelligence Cycle) bezeichnet wird. Dieser Zyklus kann in mehrere Schritte zerlegt werden, wobei jedoch je nach Quelle unterschiedlich viele Schritte angegeben werden. In diesem Buch verwenden wir ein Modell mit sechs Schritten: Definition der Anforderungen, Planung, Erfassung, Verar- 464 14 Aufklärung über Freund und Feind beitung, Analyse und Weitergabe. Diese Schritte bilden einen Zyklus, der sich ständig selbst speist, sodass die Ergebnisse in die Gestaltung der weiteren Aufklärung einfließen (siehe Abb. 14.1). Definion der Anforderungen Weitergabe Planung Analyse Erfassung Verarbeitung Abbildung 14.1: Der herkömmliche Aufklärungszyklus Im Folgenden wollen wir die einzelnen Schritte durchgehen, um zu zeigen, wie sich dieser Zyklus auf die Aufklärung über Freund und Feind im Rahmen des NSM anwenden lässt. 14.1.1 Definition der Anforderungen Die gesamte Aufklärung basiert auf definierten Anforderungen. Ein Film lässt sich nicht ohne Drehbuch herstellen, und ebenso können Sie keine Aufklärung durchführen, ohne die Anforderungen dafür klar definiert zu haben. Im Zusammenhang mit Informationssicherheit und NSM geht es bei diesen Anforderungen allgemein gesagt darum, welche Informationen Sie über die eigenen, zu schützenden Elemente und über Hosts benötigen, die eine mögliche Bedrohung dieser eigenen Elemente darstellen. Damit sind diese Anforderungen im Grunde genommen der Bedarf an Kontext und Informationen, mit deren Hilfe NSM-Analytiker Entscheidungen im Rahmen ihrer Untersuchungen treffen können. In dieser Phase geht es darum, die richtigen Fragen zu stellen, wobei es, je nachdem, ob es um kontinuierliche oder situationsbedingte Anforderungen geht, unterschiedliche Fragen gibt. Die Aufklärung über eigene Elemente ist ein kontinuierlicher Vorgang, weshalb dazu weit gefasste Fragen gestellt werden müssen, die auch bei wiederholter Anwendung nicht an Gültigkeit verlieren. 14.1 Der Aufklärungszyklus für NSM 465 Die folgenden Beispielfragen dienen dazu, eine Vergleichsgrundlage für die Kommunikation im eigenen Netzwerk aufzustellen: •• Welche normalen Kommunikationsmuster bestehen zwischen den eigenen Hosts? •• Welche normalen Kommunikationsmuster bestehen zwischen sensiblen eigenen Hosts und unbekannten externen Hosts? •• Welche Dienste werden den eigenen Hosts normalerweise bereitgestellt? •• In welchem Verhältnis stehen die ein- und die ausgehende Kommunikation bei eigenen Hosts normalerweise? Die Aufklärung über Bedrohungen dagegen ist situationsbedingt. Dabei werden oft spezifische Fragen gestellt, die eine einzige Information für die laufende Untersuchung liefern: •• Hat der gegebene gegnerische Host jemals zuvor mit eigenen Hosts kommuniziert, und wenn ja, in welchem Umfang? •• Ist der gegebene gegnerische Host bei einem Provider registriert, von dem schon zuvor feindliche Aktivitäten ausgegangen sind? •• Gibt es Ähnlichkeiten zwischen dem Datenverkehr, den der gegebene gegnerische Host hervorgerufen hat, und Tätigkeiten, die bekanntermaßen mit aktuellen Gegnern zusammenhängen? •• Steht der Zeitpunkt des gegebenen Ereignisses in Zusammenhang mit den Zielen einer bestimmten Organisation? Wenn Sie die richtigen Fragen gestellt haben, sind Sie in der Lage, das Puzzle zusammenzusetzen. In den späteren Abschnitten über die Aufklärung über Freund und Feind werden wir uns noch genauer mit den jeweiligen Anforderungen auseinandersetzen. 14.1.2 Planung Nachdem Sie die Anforderungen aufgestellt haben, müssen Sie die einzelnen folgenden Schritte des Aufklärungszyklus planen und Ressourcen dafür zuweisen, wobei beim NSM für die einzelnen Schritte unterschiedliche Arten von Ressourcen erforderlich sind. Das kann beispielsweise bedeuten, für die Erfassungsphase Analytiker der Ebene 3 (zur Klassifizierung von Analytikern siehe Kapitel 1) und Systemadministratoren für die Arbeit mit den Sensoren und Erfassungswerkzeugen abzustellen, für die Verarbeitungs- und Analysephase dagegen Analytiker der Ebenen 1 und 2. Welche Arten von Ressourcen den einzelnen Aufgaben zugewiesen werden müssen – menschliche sowie technische –, hängt natürlich sehr stark von Ihrer Umgebung und der Zusammensetzung Ihrer technischen Teams ab. In großen Organisation kann es sein, dass Sie ein eigenes Team nur für die Aufklärung haben, während in kleinen Organisationen möglicherweise Sie allein für sämtliche Aufgaben rund um die Aufklärung zuständig sind. 466 14 Aufklärung über Freund und Feind 14.1.3 Erfassung In der Erfassungsphase des Aufklärungszyklus geht es darum, die Daten zu sammeln, die gemäß den Anforderungen benötigt werden. Diese Daten werden in den weiteren Phasen verarbeitet, analysiert und weitergegeben. Es kann sein, dass Sie Ihren allgemeinen Erfassungsplan aufgrund des Bedarfs an Erfassung für die Aufklärung ändern müssen. Die Erfassung für die kontinuierliche interne Aufklärung kann auch Statistiken wie diejenigen aus Kapitel 11 und passive Echtzeitdaten umfassen, z. B. die Daten, die mit dem weiter hinten beschriebenen Tool PRADS ermittelt werden. Bei der situationsbedingten Aufklärung über Bedrohungen werden die Daten gewöhnlich aus vorhandenen NSM-Quellen wie FPC- oder Sitzungsdaten gewonnen. Dabei liegt der Schwerpunkt auf den Interaktionen eines möglicherweise gegnerischen Elements mit den vertrauenswürdigen Netzwerkelementen. Zusätzlich werden anhand öffentlich zugänglicher Quellen bekannte Informationen über möglicherweise gegnerische Elemente gewonnen. Das kann Angaben über die Provider einschließen, bei denen eine bestimmte IP-Adresse registriert ist, oder öffentlich bekannte Informationen über mysteriöse, verdächtige Dateien. Für ein effizientes Vorgehen müssen die Erfassungsprozesse für bestimmte Arten von Daten (FPC-, PSTR- und Sitzungsdaten usw.) gut dokumentiert und leicht zugänglich sein. 14.1.4 Verarbeitung Manche Arten von Daten müssen nach der Erfassung verarbeitet werden, bevor sie für die Analyse geeignet sind. Das kann sehr unterschiedliche Aufgaben umfassen. Eine grobe Form der Verarbeitung kann darin bestehen, die gesammelten Daten einfach nur auf die unmittelbar nützlichen Informationen einzudampfen, beispielsweise durch die Anwendung von Filtern auf eine PCAP-Datei, die die Datenmenge verringern, oder durch die Eingrenzung einer großen Menge von Protokolldateien auf diejenigen eines bestimmten Typs. Die detailliertere Verarbeitung kann es mit sich bringen, die Ausgabe eines Tools mithilfe von BASH-Befehlen so zu formatieren, dass sie besser lesbar wird. Organisationen, die eigene Tools oder Datenbanken für die Erfassung verwenden, können dazu auch Abfragen schreiben, um die Daten im gewünschten Format in die Datenbank einzufügen oder daraus abzurufen. Im Grunde genommen kann die Verarbeitung als eine Erweiterung der Erfassung angesehen werden, bei der die gesammelten Daten zurechtgestutzt und in eine für die Analyse geeignete Form gebracht werden. 14.2 Aufklärung über eigene Elemente 467 14.1.5 Analyse In der Analysephase werden die gesammelten und verarbeiteten Informationen untersucht, korreliert und in den erforderlichen Kontext gestellt, um sinnvoll genutzt werden zu können. An dieser Stelle werden die einzelnen Daten, zwischen denen es nur einen lockeren Zusammenhang gibt, zu einem sinnvollen Ganzen kombiniert, das zur Entscheidungsfindung herangezogen werden kann. Die Analytiker kombinieren in dieser Phase die Ausgaben verschiedener Werkzeuge und Datenquellen zu einem Host und zeichnen damit das Gesamtbild des betreffenden Hosts. Es stehen natürlich viel mehr Informationen über lokale Hosts zur Verfügung, weshalb dieses Gesamtbild auch Angaben über seine Tendenzen und üblichen Kommunikationspartner enthalten kann. Für die Analyse möglicherweise gegnerischer Hosts dagegen steht eine viel geringere Datenmenge zur Verfügung. Dabei müssen auch Informationen aus öffentlichen Quellen in die Analyse einfließen. 14.1.6 Weitergabe Die meisten Organisationen haben kein ausgewiesenes Aufklärungsteam, weshalb die NSM-Analytiker die Aufklärung für ihre Zwecke selbst durchführen müssen. Das kann ein großer Vorteil sein, da diejenigen, die die aus der Aufklärung gewonnenen Informationen nutzen, die gleichen Personen sind, die sie auch liefern (oder zumindest im selben Raum oder in derselben Abteilung sitzen). In der letzten Phase des Zyklus werden die Ergebnisse der Aufklärung an die Personen oder Gruppen weitergegeben, die die Anforderungen aufgestellt haben. In den meisten Fällen werden die Ergebnisse der Aufklärung ständig überprüft und verbessert. Die positiven und negativen Aspekte der Endergebnisse werden kritisch beleuchtet, und diese Kritik geht wiederum in die Definition der Anforderung und die Planung ein. Daher sprechen wir von einem Aufklärungszyklus statt von einer Aufklärungskette. Im restlichen Teil dieses Kapitels sehen wir uns die Aufklärung über Freund und Feind an und lernen Möglichkeiten kennen, die gewünschten Daten zu generieren und zu gewinnen. Auch wenn wir dabei nicht ausdrücklich auf die Struktur für die Aufklärung eingehen, lassen sich die im Folgenden beschriebenen Maßnahmen darin einfügen und an die Bedürfnisse praktisch aller Organisationen anpassen. 14.2 Aufklärung über eigene Elemente Um Ihr Netzwerk wirkungsvoll schützen zu können, müssen Sie wissen, was sich alles darin befindet und wie diese Elemente miteinander kommunizieren. Diese Aussage kann man gar nicht überbetonen. Wie simpel oder ausgefeilt ein Angriff auch immer sein mag, 468 14 Aufklärung über Freund und Feind wenn Sie die Rollen der Geräte in Ihrem Netzwerk nicht kennen und insbesondere nicht wissen, wo sich die kritischen Daten befinden, können Sie weder sicher feststellen, ob überhaupt ein Zwischenfall vorliegt, noch einen tatsächlichen Zwischenfall eindämmen oder Angreifer aus Ihrem Netzwerk vertreiben. Aus diesem Grund ist die Aufklärung über die eigenen Elemente so wichtig. In diesem Buch beschreiben wir die Aufklärung über eigene Elemente als kontinuierlich weiterentwickelten Vorgang, mit dem Analytiker Informationen über die Hosts gewinnen können, die sie schützen sollen. Zu diesen Informationen gehört alles, was die Analytiker für eine Untersuchung wissen müssen. Außerdem müssen diese Informationen jederzeit abgerufen werden können. Im Allgemeinen zieht ein Analytiker die Informationen über einen bestimmten Host zurate, wenn er einen Alarm in Bezug zu diesem Host untersucht, also wenn der Host das Opfer eines Angriffs geworden zu sein scheint. Es ist daher nicht unüblich, dass ein Analytiker während seiner Schicht auf solche Daten für verschiedene Hosts mehrfach zugreift. Außerdem können bei der Analyse von Aufklärungsergebnissen über eigene Elemente Anomalien entdeckt werden, die eine Untersuchung auslösen. Sehen wir uns nun einige Möglichkeiten an, aus den Netzwerkdaten Aufklärungsinformationen über eigene Hosts zu gewinnen. 14.2.1 Anamnese und physische Untersuchung von Netzwerkelementen Bei einem neuen Patienten führt ein Arzt erst eine Anamnese durch, um die Krankengeschichte in Erfahrung zu bringen, und dann eine körperliche Untersuchung. Dieses Prinzip lässt sich auch auf die Aufklärung über eigene Netzwerkelemente anwenden. Zur Anamnese gehören Fragen über aktuelle und frühere Krankheiten, die Auswirkungen auf die jetzige und zukünftige Gesundheit des Patienten haben können. Gewöhnlich wird auch die Krankengeschichte von unmittelbaren Familienangehörigen berücksichtigt, um Risikofaktoren für den Patienten erkennen und abschwächen zu können. Anstelle der Krankengeschichte steht bei einem Netzwerkelement der Verbindungsverlauf. Dazu gehören frühere Kommunikationstransaktionen mit anderen Hosts im und außerhalb des Netzwerks. Dabei werden jedoch nicht nur die Hosts betrachtet, die in diese Kommunikation verwickelt waren, sondern auch die von dem Host verwendeten Dienste, sowohl als Client als auch als Server. Wenn wir den Verbindungsverlauf kennen, haben wir eine gute Grundlage, um im Rahmen einer Untersuchung die Gültigkeit neuer Verbindungen einzuschätzen, die dieser Host eingeht. Bei einer ärztlichen Untersuchung wird die Gesundheit des Patienten ermittelt. Dazu werden neben demografischen Angaben des Patienten auch Größe, Gewicht, Blutdruck usw. bestimmt. Ergebnis dieser Untersuchung ist ein Gesamteindruck von der Gesundheit des Patienten. Oft werden solche Untersuchungen für bestimmte Zwecke durchgeführt, z. B. für Versicherungen oder um die Erlaubnis für einen Sport zu erhalten. 14.2 Aufklärung über eigene Elemente 469 Für die »ärztliche Untersuchung« unserer Netzwerkelemente müssen wir Kriterien aufstellen, anhand derer wir den »Gesundheits«-Zustand des Elements einschätzen können. Dazu können Dinge wie die IP-Adresse und der DNS-Name des Elements gehören, das VLAN, in dem es sich befindet, seine Rolle (Arbeitsstation, Webserver usw.), das Betriebssystem oder die physische Platzierung im Netzwerk. Das Ergebnis dieser Untersuchung ist sein Betriebszustand, anhand dessen wir dann im Rahmen einer Untersuchung seine Aktivitäten einschätzen können. Im Folgenden sehen wir uns einige Methoden an, um eine solche Anamnese und Untersuchung für Netzwerkelemente durchzuführen. Für den »Gesundheitscheck« können wir Werkzeuge wie Nmap heranziehen, die es uns ermöglichen, ein Netzwerkbestandsmodell aufzustellen. Die passive Erfassung von Echtzeitdaten über die Elemente mithilfe von PRADS dagegen dient dazu, die »Krankengeschichte« zu ermitteln. 14.2.2 Ein Bestandsmodell des Netzwerks aufstellen Ein Bestandsmodell ist, einfach gesagt, eine Liste aller Hosts in Ihrem Netzwerk mitsamt den zugehörigen wichtigen Informationen wie den IP-Adressen, DNS-Namen, allgemeinen Rollen (Server, Arbeitsstation, Router usw.), angebotenen Diensten (Webserver, SSHServer, Proxyserver usw.) und Betriebssystemen. Dies ist die grundlegendste Form von Informationen über die eigenen Elemente. Alle Sicherheitsteams müssen sich darum bemühen, eine solche Liste aufzustellen. Wie Sie sich vorstellen können, gibt es verschiedene Vorgehensweisen, um ein solches Bestandsmodell des Netzwerks aufzubauen. Viele Organisationen setzen ohnehin irgendeine Form von Bestandsverwaltungssoftware ein, die oft auch die erforderlichen Daten für dieses Modell liefern kann. Dies bildet dann auch oft die einfachste Möglichkeit, die Daten den Analytikern zur Verfügung zu stellen. Falls Ihre Organisation nicht über eine solche Software verfügt, bleibt Ihnen nichts anderes übrig, als selbst für die erforderlichen Daten zu sorgen. Nach meiner Erfahrung gibt es keine definitive Formel, um ein Bestandsmodell aufzustellen. Wenn Sie sich ein Dutzend Organisationen ansehen, werden Sie ein Dutzend Methoden finden, um ein solches Modell anzulegen, und ein weiteres Dutzend Methoden, um auf die Daten zuzugreifen und sie anzuzeigen. In diesem Abschnitt geht es nicht darum, Ihnen einen genauen Weg vorzuschreiben, auf dem Sie an die Daten kommen, da Sie diesen Weg unter Verwendung der in Ihrer Organisation genutzten Technologien selbst finden müssen. Hier sollen Sie lediglich eine Vorstellung davon bekommen, wie ein solches Bestandsmodell aussieht, und einige Anregungen dafür erhalten, wie Sie anfangen können, um die benötigten Daten bereitzustellen. 470 14 Aufklärung über Freund und Feind Vorsicht Eine Bestandsaufnahme ist selten zu 100 % genau. In riesigen Organisationen mit Millionen von Geräten ist es einfach nicht möglich, Bestandsmodelle zu unterhalten, die stets vollständig und aktuell sind. Wenn eine 100-%-Lösung nicht machbar ist, dann sollten Sie sich auch keine solche Lösung zum Ziel setzen. Es ist in solchen Situationen besser, eine 80-%-Lösung anzustreben, weil 80 % immer noch besser sind als 0 %. In jedem Fall aber sollten Sie Ihr Möglichstes tun, um ein Bestandsmodell der kritischen Geräte aufzustellen, die Sie während der Planungsphase ermittelt haben. Eine Möglichkeit, sich die Daten zu beschaffen, ist ein interner Portscan. Das können Sie mit kommerzieller Software, aber auch mit freier Software wie Nmap tun. Beispielsweise können Sie einen einfachen SYN-Scan mit dem folgenden Befehl durchführen: nmap –sn 172.16.16.0/24 Dadurch wird ein ICMP-Scan (Ping) an allen Hosts im Netzwerkbereich 172.16.16.0/24 durchgeführt. Die Ausgabe sehen Sie in Abb. 14.2. Abbildung 14.2: Ausgabe eines Ping-Scans in Nmap Wie Sie anhand dieser Daten sehen, gibt jeder Host, der auf ICMP-Echoanforderungen reagieren darf, eine ICMP-Echoantwort zurück. Sofern alle Hosts in Ihrem Netzwerk so eingerichtet sind, dass sie auf ICMP-Datenverkehr reagieren (oder wenn eine entspre- 14.2 Aufklärung über eigene Elemente 471 chende Ausnahme in der Hostfirewall angegeben ist), können Sie damit die aktiven Hosts im Netzwerk ermitteln. Dadurch erhalten wir eine grundlegende Liste der IP-Adressen. Wir können aber auch anspruchsvollere Scans vornehmen. Bei einem SYN-Scan wird versucht, mit jedem Host im Netzwerk zu kommunizieren, der über einen offenen TCP-Port verfügt. Dazu verwenden Sie folgenden Befehl: nmap –sS 172.16.16.0/24 Damit wird TCP-SYN-Paket an die 1000 am häufigsten verwendeten Ports aller Hosts im Netzwerk 172.16.16.0/24 gesendet. Die Ausgabe sehen Sie in Abb. 14.3. Abbildung 14.3: Ausgabe eines SYN-Scans in Nmap Der SYN-Scan liefert uns einige Informationen mehr. Neben den IP-Adressen der aktiven Hosts im Netzwerk haben wir nun auch eine Liste der Ports, die auf diesen Geräten geöffnet sind, was ein Indiz für die bereitgestellten Dienste ist. Wir können sogar noch weiter gehen und die Nmap-Funktionen zur Betriebssystem- und Versionserkennung nutzen: nmap –sV -O 172.16.16.0/24 472 14 Aufklärung über Freund und Feind Dieser Befehl führt einen normalen SYN-Portscan und daraufhin eine Reihe von Tests durch, um die an den offenen Ports lauschenden Dienste zu bestimmen und das Betriebssystem des Geräts zu erraten. Die Ausgabe sehen Sie in Abb. 14.4. Abbildung 14.4: Ausgabe der Versions- und Betriebssystemerkennung Ein solcher Scan ruft im Netzwerk eine ganze Menge zusätzlichen Datenverkehr hervor, hilft aber dabei, das Bestandsmodell abzurunden, da er Informationen über die Betriebssysteme und die an den offenen Ports ausgeführten Dienste liefert. In dem hier gezeigten Standardausgabeformat von Nmap lassen sich die Daten sehr gut lesen, allerdings nicht so leicht durchsuchen. Wir können Nmap jedoch auch dazu bringen, die Ergebnisse in einem einzeiligen Format anzuzeigen, das sich mit Grep gut durchsuchen lässt und sich für Analytiker sehr gut zum Nachschlagen eignet. Dazu müssen wir an die zuvor gezeigten Befehle lediglich -oG<Dateiname> anhängen. In Abb. 14.5 durchsuchen wir mit grep eine in diesem Format vorliegende Datei (data.scan) nach Daten über eine bestimmte IP-Adresse (172.16.16.10). 14.2 Aufklärung über eigene Elemente 473 Abbildung 14.5: Mit Grep durchsuchbare Nmap-Ausgabe Ein Scanner wir Nmap ist nicht immer besonders aussagekräftig. Viele Organisationen legen störende Scans auf die Abendstunden, wobei es sein kann, dass manche Geräte schon ausgeschaltet sind und daher nicht erfasst werden. Auch mobile Geräte, die nur zeitweilig mit dem Netzwerk verbunden sind, können dabei übersehen werden, also etwa Laptops, die die Angestellten abends mit nach Hause nehmen oder die von Außendienstmitarbeitern verwendet werden. Daher sollten Sie bei einer Bestandsaufnahme aufgrund von Netzwerkscans die Ergebnisse mehrerer Scans kombinieren, die zu unterschiedlichen Zeiten durchgeführt wurden. Um sicherzustellen, dass auch alle Geräte erkannt werden, kann es außerdem erforderlich sein, verschiedene Arten von Scans zu verwenden. Um ein Bestandsmodell aus Scandaten aufzubauen, ist mehr erforderlich, als einen einzigen Scan zu starten und die Ergebnisse zu speichern. Es sind gemeinsames Handeln und eine Nachbearbeitung notwendig, um die gewünschten Resultate zu erzielen. Wie zuverlässig Sie Ihre Scandaten auch immer einschätzen, Sie sollten sie in jedem Fall anhand von Daten aus anderen Quellen überprüfen. Dabei kann es sich um etwas handeln, was in Ihrem Netzwerk bereits vorhanden ist, etwa ein DNS-Transaktionsprotokoll, aber auch um einen Teil der NSM-Datenmenge, z. B. Sitzungsdaten. In den Kapiteln 4 und 11 haben Sie einige brauchbare Techniken kennengelernt, um mit SiLK Daten über die eigenen Hosts aus Sitzungsdaten zu gewinnen. Eine weitere Möglichkeit bieten passive Tools wie PRADS, das wir uns im nächsten Abschnitt ansehen werden. 14.2.3 PRADS (Passive Real-Time Asset Detection System) PRADS gewinnt aus dem Netzwerkverkehr Daten über die Hosts und Dienste, womit Sie eine Bestandsaufnahme Ihres Netzwerks machen können. Es basiert auf zwei anderen sehr erfolgreichen Tools, nämlich PADS (Passive Asset Detection Sytem) und P0f, einem passiven Werkzeug zur Betriebssystemermittlung. PRADS kombiniert die Funktionen dieser beiden Programme zu einem einzigen Dienst, der für die Informationsbeschaffung über eigene Elemente sehr gute Dienste leistet. Die Daten, die PRADS dazu generiert, ähneln im weitesten Sinne den Sitzungsdaten aus SiLK oder Argus. PRADS ist standardmäßig in Security Onion enthalten, sodass wir die Daten mithilfe einer Abfrage in Sguil untersuchen können. Im nächsten Kapitel sehen wir uns Sguil genauer an, aber in Kapitel 9 haben wir bereits kurz erwähnt, dass es sich um eine Konsole handelt, in der Sie die von Erkennungsmechanismen hervorgerufenen Alarme und die Daten aus anderen Erfassungs- und Erkennungstools einsehen können. 474 14 Aufklärung über Freund und Feind Sie können den Sguil-Clilent auf dem Desktop von Security Onion starten, aber auch auf einem anderen Gerät, zu dem Sie dann eine Verbindung über das Netzwerk aufbauen. In jedem Fall sortieren Sie anschließend die angezeigten Alarme nach der Spalte Event Message, um die PRADS-Einträge zu finden. Es kann sein, dass Sguil immer noch von PADSEinträgen spricht, aber keine Sorge, es handelt sich definitiv um PRADS-Daten. Abb. 14.6 zeigt Beispiele für PRADS-Protokolleinträge. Abbildung 14.6: PRADS-Daten in Sguil In dieser Abbildung sehen Sie verschiedene Arten von Einträgen. Ein Alarm vom Typ New Asset wird generiert, wenn ein Host im Netzwerk kommuniziert, der zuvor noch nicht zu sehen gewesen ist. Dagegen bedeutet Changed Asset, dass ein bereits bekannter Host ein Kommunikationsverhalten zeigt, das zuvor noch nicht beobachtet wurde, indem er z. B. einen neuen HTTP-Benutzeragenten, einen neuen Dienst o. Ä. nutzt. Um zu verstehen, wie diese Meldungen zustande kommen, sehen wir uns einige beispielhafte PRADS-Protokolldaten an. In einer Standardinstallation von Security Onion wird PRADS mit einem Befehl wie dem folgenden ausgeführt: prads -i eth1 -c /etc/nsm/<Sensorname>/prads.conf -u sguil -g sguil -L / nsm/sensor_data/<Sensorname>/sancp/ -f /nsm/sensor_data/<Sensorname>/ pads.fifo -b ip or (vlan and ip) Die folgende Aufstellung zeigt die hier verwendeten sowie einige weitere nützliche Befehlszeilenargumente für PRADS: •• •• •• •• -b<Filter>: Setzt beim Abhören des Netzwerkverkehrs die angegebenen BPFs ein. -c<Konfigurationsdatei>: Gibt die PRADS-Konfigurationsdatei an. -D: Führt PRADS als Daemon aus. -f<Datei>: Zeichnet die Netzwerkelemente in einer FIFO-Datei (First In, First Out) auf. •• -g<Gruppe>: Gibt die Gruppe an, unter der PRADS ausgeführt wird. 14.2 Aufklärung über eigene Elemente 475 •• -i<Schnittstelle>: Nennt die Schnittstelle, an der PRADS lauscht. Wenn diese Angabe fehlt, nimmt PRADS die Schnittstelle mit der niedrigsten Nummer. •• -L<Verzeichnis>: Zeichnet Ausgaben vom Cxtracker-Typ in dem angegebenen Verzeichnis auf. •• -l<Datei>: Zeichnet die Netzwerkelemente in einer linearen Datei auf. •• -r<Datei>: Liest Daten aus einer PCAP-Datei, anstatt sie von der Verbindung abzugreifen. •• -u<Benutzername>: Gibt den Benutzer an, unter dessen Konto PRADS ausgeführt wird. •• -v: Erhöht die Menge der Informationen in der PRADS-Ausgabe. In Security Onion läuft PRADS standardmäßig unter dem Konto des Benutzers Sguil und greift die Daten von der Verbindung ab. Die gesammelten Daten werden in einer FIFODatei gespeichert, sodass sie in eine Datenbank übernommen werden können, auf die Sguil Zugriff hat. Da die meisten Laufzeitoptionen von PRADS in Security Onion mithilfe von Befehlszeilenargumenten festgelegt werden, besteht der einzige Zweck der Datei prads.conf darin, die Variable home_nets für den IP-Bereich anzugeben (siehe Abb. 14.7). Diese Variable teilt PRADS mit, welche Netzwerke es überwachen soll. In den meisten Fällen werden Sie hier die gleichen Angaben machen wie für die Variable $HOME_NET in Snort und Suricata. Abbildung 14.7: Angabe der Variable home_nets in prads.conf Die Speicherung der PRADS-Daten in einem Datenbankformat erleichtert es, sie abzufragen oder Tools zu schreiben, die diese Daten nutzen. Allerdings ist dies nicht die beste Möglichkeit, die Rohdaten einzusehen. Zum Glück werden die Daten jedoch auch in der linearen Textdatei /var/log/prads-asset.log gespeichert. Ein Beispiel dafür sehen Sie in Abb. 14.8. 476 14 Aufklärung über Freund und Feind Abbildung 14.8: Eine PRADS-Protokolldatei Die erste Zeile dieser Datei definiert das Format der Einträge: asset,vlan,port,proto,service,[service-info],distance,discovered Dabei werden die folgenden Felder verwendet: •• •• •• •• •• asset: Die IP-Adresse des erkannten Elements aus der Variable home_nets vlan: Das VLAN-Kennzeichen des Elements port: Die Portnummer des erkannten Dienstes proto: Die Protkollnummer des erkannten Dienstes service: Der Dienst, den PRADS erkannt hat. Dabei kann das Netzwerkelement sowohl als Client als auch als Server mit diesem Dienst kommunizieren. •• service-info: Der Fingerabdruck des Dienstes und die zugehörige Ausgabe. •• distance: Die Entfernung zu dem Element, bestimmt anhand des geratenen ursprünglichen TTL-Werts. •• discovered: Der Unix-Zeitstempel des Zeitpunktes, an dem die Daten erfasst wurden. Wie Sie anhand dieser Daten erkennen können, nimmt PRADS die zuvor in Sguil gezeigten Einschätzungen darüber, ob es sich um ein neues oder ein verändertes Element handelt, nicht selbst vor. Es zeichnet einfach die beobachteten Daten auf und überlässt jegliche weitere Verarbeitung dem Benutzer, Skripten oder Anwendungen. Die Alarme New Asset und Changed Asset in Sguil werden nicht von PRADS selbst generiert, sondern von Sguil auf der Grundlage der PRADS-Daten. Sinnvolle Verwendung von PRADS-Daten Es gibt verschiedene Möglichkeiten, PRADS-Daten für die interne Aufklärung zu verwenden. Die erste Methode besteht darin, die Benachrichtigungen von Sguil über neue und veränderte Elemente zu nutzen. Ein Beispiel dafür sehen Sie in Abb. 14.9. 14.2 Aufklärung über eigene Elemente 477 Abbildung 14.9: Sguil-Abfrage nach einem einzelnen Host Hier habe ich eine Sguil-Abfrage nach allen Ereignissen im Zusammenhang mit einem bestimmten Alarm durchgeführt. Das können Sie in Sguil ziemlich leicht machen, indem Sie auf ein Ereignis für einen Host rechtsklicken, auf Quick Query und dann auf Query Event Table zeigen und schließlich die Option SrcIP oder DstIP wählen, je nachdem, ob Sie an Ereignissen für die Quell- oder die Zieladresse interessiert sind. In der Abbildung sehen Sie eine Reihe von Ereignissen im Zusammenhang mit dem Host 172.16.16.145, unter anderem einige Snort-Alarme, die besuchten URLs und weitere PRADS-Alarme. Unter den gezeigten PRADS-Alarmen sind vier vom Typ New Asset, die auf die vier Vorgänge verweisen, bei denen der Host zum ersten Mal mit den in dem Alarm aufgeführten Zieladressen Verbindung aufgenommen hat: •• •• •• •• Alarm-ID 4.66: HTTP-Verbindung zu 23.62.111.152 Alarm-ID 4.67: HTTPS-Verbindung zu 17.149.32.33 Alarm-ID 4.68: HTTPS-Verbindung zu 17.149.34.62 Alarm-ID 4.69: NTP-Verbindung zu 17.151.16.38 Bei der Untersuchung eines Ereignisses können Sie dadurch unmittelbar erkennen, ob das betreffende eigene Gerät jemals zuvor Verbindung mit einem bestimmten externen Gerät aufgenommen hat, was wertvollen Kontext liefert. Wenn Sie verdächtigen Datenverkehr zu einer unbekannten Adresse finden und das eigene Gerät vorher niemals mit dieser Zieladresse kommuniziert hat, dann ist das ein Zeichen dafür, dass wirklich etwas Verdächtiges vor sich geht, was eine eingehendere Untersuchung rechtfertigt. In der Abbildung sehen Sie auch einen Change-Asset-Alarm aufgrund eines neuen HTTPBenutzeragentenstrings: •• Alarm-ID 4.71: Mozilla/4.0 (kompatibel; UPnP/1.0; Windows NT/5.1) Ein solcher Alarm zeigt, dass der eigene Host etwas tut, was er nie zuvor getan hat. Das kann zwar durchaus etwas Harmloses wie das Herunterladen eines neuen Browsers sein, aber auch auf eine schädliche Aktivität hindeuten. Seien Sie besonders achtsam, wenn 478 14 Aufklärung über Freund und Feind Geräte plötzlich neue Dienste anbieten, insbesondere wenn es sich um Arbeitsstationen handelt, die eigentlich nicht als Server fungieren sollten. All dies bietet uns die Möglichkeit, neue oder veränderte Verhaltensweisen eigener Hosts zu erkennen, was sehr wertvolle Informationen über das eigene Netzwerk liefert. Es kann zwar einige Zeit dauern, bis PRADS Ihr Netzwerk nach der ersten Konfiguration kennengelernt hat, aber wenn das erst einmal der Fall ist, bietet es einen Schatz an Informationen, die Sie sonst nur aufgrund aufwendiger Analyse von Sitzungsdaten gewinnen könnten. Eine andere nutzbringende Verwendung von PRADS-Daten besteht darin, ein Referenzmodell der eigenen Elemente aufzustellen. Da PRADS alle gesammelten Informationen über die in der Variable home_nets angegebenen Elemente speichert, können Sie sie nach sämtlichen Daten für die einzelnen Hosts durchsuchen. Das macht das im Lieferumfang von PRADS enthaltene Perl-Skript prads-asset-report möglich. Es nimmt die Ausgabe einer PRADS-Protokolldatei entgegen und gibt selbst eine Aufstellung aller Informationen zurück, die es über die einzelnen IP-Adressen hat. Wenn Sie PRADS so einrichten, dass es Daten in /var/log/prads-asset.log aufzeichnet, können Sie einfach den Befehl prads-assetreport ausführen, um diesen Bericht zu generieren. Anderenfalls müssen Sie den Speicherort der PRADS-Daten mit dem Argument -r<Datei> angeben. Ein Beispiel für einen solchen Bericht sehen Sie in Abb. 14.10. Abbildung 14.10: Ein PRADS-Bericht 14.2 Aufklärung über eigene Elemente 479 Wie Sie sehen, versucht PRADS auch zu erraten, welche Betriebssysteme auf den einzelnen Geräten vorhanden sind. In dem Beispiel in der Abbildung ist das jedoch nur bei einem einzigen Gerät gelungen. Je besser PRADS die im Netzwerk kommunizierenden Geräte beobachten kann, umso genauer wird seine Einschätzung. In manchen Fällen ist es sinnvoll, diesen Bericht regelmäßig zu generieren und in einem Format bereitzustellen, das von Analytikern leicht durchsucht werden kann. Mit dem Argument -w<Dateiname> können Sie den Bericht in einer Datei speichern. Wenn die Analytiker selbst direkten Zugriff auf die PRADS-Protokolldaten haben, können sie selbst das Skript prads-asset-report einsetzen, um jeweils einen aktuellen Bericht zu generieren. Mit dem Schalter -i lässt sich dieser Bericht wie folgt auch für eine einzelne IP-Adresse erstellen: prads-asset-data –i 172.16.16.145 Die Ausgabe dieses Befehls sehen Sie in Abb. 14.11. Abbildung 14.11: Suche nach einzelnen Adressen in den PRADS-Daten Wenn Sie mithilfe von PRADS ein Bestandsmodell aufstellen, dürfen Sie nicht vergessen, dass es sich dabei um ein passives Werkzeug handelt, das nur Informationen über Geräte liefert, die es bei der Kommunikation über Sensorgrenzen hinweg beobachten kann. Geräte, die nur innerhalb eines Netzwerksegments kommunizieren und niemals über eine von einem Sensor überwachte Verbindung, kann es daher nicht erkennen. Daher müssen Sie PRADS immer mit anderen Techniken einsetzen, z. B. mit einem aktiven Scan, um das Inventar Ihres Netzwerks genau zu bestimmen. PRADS ist ein sehr leistungsfähiges und trotzdem einfaches Werkzeug, das Sie für die Informationsgewinnung über das eigene Netzwerk nutzen können. Da es so wenige Anforderungen stellt und so vielseitig ist, lässt es sich in die meisten Umgebungen aufnehmen. Mehr über PRADS erfahren Sie auf http://gamelinux.github.io/prads/. 480 14 Aufklärung über Freund und Feind 14.3 Aufklärung über Bedrohungen Nachdem Sie über Ihr Netzwerk Bescheid wissen, ist es an der Zeit, den Gegner kennenzulernen. Daher wollen wir uns als Nächstes mit der Aufklärung über Bedrohungen befassen, was für Sie nichts Neues sein sollte, wenn Sie in der Informationssicherheit arbeiten. Angesichts der täglichen Gefahr von gezielten Angriffen werben viele Hersteller damit, dass ihre Lösung es Ihnen ermöglicht, »Informationen über Angreifer zu gewinnen und damit den APT zu stoppen«. Das ist zwar typisch schräges Marketingsprech, aber die Aufklärung über Bedrohungen ist tatsächlich ein wichtiger Aspekt der Analyse im Rahmen des NSM und von entscheidender Bedeutung für den Erfolg. Bei der Aufklärung über Bedrohungen konzentrieren wir uns ausschließlich auf die Gegner und versuchen Daten zu erfassen, mit deren Hilfe wir die Natur der Bedrohungen einschätzen können. Diese Form von Aufklärung wiederum kann in die drei Teilbereiche strategische, operative und taktische Aufklärung gegliedert werden (siehe Abb. 14.12). Taksche Aulärung Operave Aulärung Strategische Aulärung Abbildung 14.12: Formen der Aufklärung über Bedrohungen Bei der strategischen Aufklärung geht es um Informationen im Zusammenhang mit der Strategie, der Politik und den großmaßstäblichen Plänen eines Angreifers. Eine Aufklärung auf diesem Niveau führen gewöhnlich nur staatliche oder militärische Organisationen als Reaktion auf Bedrohungen durch andere Staaten oder Streitkräfte durch. Allerdings entwickeln auch große Organisationen immer mehr die Fähigkeiten zu einer solchen Aufklärung, und einige bieten die strategische Aufklärung sogar als Dienstleistung an. Dabei geht es um die langfristigen Ziele der Kraft, die die einzelnen Angreifer unterstützt. Zu den Ergebnissen dieser Art von Aufklärung gehören Richtliniendokumente, Militärdoktrinen, Positionspapiere und die Ziele von Regierung, Militär oder anderen Gruppen. Bei der operativen Aufklärung geht es um Informationen darüber, wie Angreifer die Operationen zum Erreichen ihrer strategischen Ziele planen und unterstützen. Im Gegensatz zur strategischen Aufklärung geht es hier um enger gefasste Ziele, gewöhnlich um kurzfristige Zielsetzungen, die nur einen Teil des Gesamtbildes ausmachen. Auch dies fällt 14.3 Aufklärung über Bedrohungen 481 gewöhnlich mehr in die Domäne von Staaten und Streitkräften, doch auch einzelne Organisationen können Angreifern zum Opfer fallen, deren Maßnahmen operative Ziele erfüllen sollen. Daher haben einige öffentliche Organisationen Einblick in diese Angriffe und können operative Informationen beschaffen. Die Ergebnisse dieser Art von Aufklärung ähneln denen der strategischen Aufklärung, sind aber meistens enger gefasst. Bei der taktischen Aufklärung geht es um Informationen im Zusammenhang mit einzelnen Aktionen bei der Durchführung von Operationen. Hier beschäftigen wir uns mit den Werkzeugen, Taktiken und Vorgehensweisen von Angreifern. Dies ist das Gebiet, auf das 99 % aller NSM-Sicherheitsteams ihre Anstrengungen konzentrieren. Hier werden die einzelnen Aktionen der Angreifer erfasst und analysiert. Zu den Ergebnissen zählen Einbruchsindikatoren (wie IP-Adressen, Dateinamen oder Textstrings) oder Listen von typischen Angriffswerkzeugen. Diese Informationen veralten schnell. Bericht von der Front Die Erörterung der Aufklärung über Bedrohungen führt oft zu einer Diskussion über die Zurückführung der Aktionen eines Angreifers zu einer Einzelperson oder Gruppe. Erkennung und Zuschreibung sind jedoch zwei verschiedene Dinge, und damit sind auch Erkennungs- und Zuschreibungsindikatoren etwas ganz anderes. Bei der Erkennung geht es darum, Zwischenfälle aufzuspüren, bei der Zuschreibung dagegen darum, diese Zwischenfälle auf die Urheber zurückzuführen. Das ist zwar eine sinnvolle Maßnahme, die aber ohne die Korrelation der Daten aus der strategischen, operativen und taktischen Aufklärung nicht durchgeführt werden kann. Ohne erheblichen Einblick in die Daten anderer Organisationen zu nehmen, können jedoch die wenigsten Organisationen im privaten Sektor eine solche Erfassung und Analyse leisten. Die Sammlung von Einbruchsindikatoren aus mehreren Netzwerkangriffen für die taktische Aufklärung ist ­jedoch ein erreichbares Ziel. Allerdings liegt die Erfassung und Analyse von Daten aus anderen Quellen als den herkömmlichen – Menschen (Human Intelligence, HUMINT), Signalübertragung (Signals Intelligence, SIGINT) und Geoinformationen (Geospatial Intelligence, GEOINT) – außerhalb der praktischen Möglichkeiten der meisten Unternehmen. Selbst Organisationen, die diese Möglichkeiten haben, werden durch Gesetze in deren Anwendung beschränkt. Bei der Analyse der Erkenntnisse aus taktischer Aufklärung wird eine Bedrohung zunächst gewöhnlich als eine IP-Adresse wahrgenommen, die in einem IDS-Alarm oder einem anderen Erkennungsmechanismus angezeigt wird, oder als eine verdächtige Datei, die ein Client heruntergeladen hat. Zur taktischen Aufklärung werden diese Daten untersucht und in einer Untersuchung miteinander in Verbindung gebracht. Im restlichen Teil dieses Kapitels sehen wir uns Maßnahmen für die taktische Aufklärung über gegnerische Elemente an, die in NSM-Umgebungen auftauchen können. 482 14 Aufklärung über Freund und Feind 14.3.1 Recherche über gegnerische Hosts Wenn aufgrund einer verdächtigen Kommunikation zwischen einem eigenen und einem möglicherweise gegnerischen Host ein Alarm ausgelöst wird, sollten die Analytiker unter anderem auch eine taktische Aufklärung des externen Hosts durchführen. Schließlich versorgen die meisten IDS-Alarme Sie schon mit der IP-Adresse dieses Hosts und einer Probe der Kommunikation, die den Alarm veranlasst hat. In diesem Abschnitt sehen wir uns an, welche Informationen Sie allein aus der IP-Adresse des Hosts oder einem Domänen­ namen gewinnen können. Interne Datenquellen Die schnellste Möglichkeit, Informationen über externe und potenziell gefährliche Hosts einzuholen, besteht darin, die bereits vorhandenen internen Datenquellen zu untersuchen. Ein möglicherweise gegnerischer Host, an dem Sie interessiert sind, hat wahrscheinlich schon mit irgendeinem Ihrer Hosts kommuniziert, sodass Sie bereits Daten über ihn gesammelt haben. Mit diesen Daten können Sie nun versuchen, folgende Fragen zu beantworten: 1. Hat der gegnerische Hosts jemals zuvor mit diesem eigenen Host kommuniziert? 2. Welcher Art ist die Kommunikation dieses Hosts mit dem eigenen Host? 3. Hat der gegnerische Hosts jemals zuvor mit anderen eigenen Hosts in diesem Netzwerk kommuniziert? Die Antworten auf diese Fragen können in verschiedenen Datenquellen zu finden sein. Wenn Sie entsprechende Daten aus der internen Aufklärung zur Hand haben – beispielsweise PRADS-Daten –, können Sie Frage Nr. 1 schnell beantworten, also herausfinden, ob der externe Host zum ersten Mal mit dem eigenen Host kommuniziert oder das schon früher getan hat. Möglicherweise können Sie sogar das Betriebssystem erkennen, dass auf diesem Host aufgeführt wird. Wenn Ihnen solche Aufklärungsdaten nicht zur Verfügung stehen, bilden Sitzungsdaten wahrscheinlich die schnellste Möglichkeit, die Antwort zu finden. Frage 2 lässt sich nur mithilfe von detaillierteren Daten beantworten. In Sitzungsdaten finden Sie zwar grundlegende Angaben wie den Zeitpunkt der Kommunikation und die dabei verwendeten Ports, aber nicht genügend Einzelheiten, um genau zu erkennen, was vor sich gegangen ist. In manchen Fällen kann das Erkennungswerkzeug, das den Alarm ausgelöst hat, diese Einzelheiten liefern. Snort und Suricata sagen Ihnen, welches Paket mit einer ihrer Signaturen übereingestimmt hat, und Programme wie Bro geben Ihnen so viele zusätzliche Informationen, wie Sie bei der Einrichtung verlangt haben. In anderen Fällen kann es sein, dass Sie die FPC- oder PSTR-Daten untersuchen müssen, um die Antwort zu finden. Dazu sind Erfahrungen in der Paketanalyse sehr nützlich. 14.3 Aufklärung über Bedrohungen 483 Zur Beantwortung von Frage 3 ist es am besten, bei den Sitzungsdaten anzufangen, da dies die schnellste Möglichkeit ist, Informationen über die Kommunikation zwischen den Hosts zu finden. Wenn Sie festgestellt haben, dass es tatsächlich bereits eine solche Kommunikation gegeben hat, dann sollten Sie sich jedoch weiteren Quellen wie FPC- oder PSTR-Daten zuwenden, um die Natur dieser Kommunikation genauer zu bestimmen. Falls keine entsprechenden Sitzungsdaten zur Verfügung stellen, können Sie die Antwort anhand von PRADS-Daten finden. Bei der groben Analyse dieser Art geht es darum, die Punkte zu verbinden und Muster zu finden, etwa die Verwendung bestimmter Dienste bei der Kommunikation des gegnerischen Hosts mit den eigenen Geräten, die Einhaltung bestimmter Zeitabstände oder der Zusammenhang mit technischen Vorfällen oder Ereignissen in der realen Welt. Bei einer detaillierteren Analyse geht es darum, Muster wie die Verwendung maßgeschneiderter C2-Protokolle oder den Download verdächtiger Dateien von anderen Hosts zu erkennen. Anhand der gesammelten Antworten auf diese drei Fragen können Sie Informationen über das Verhalten gegnerischer Hosts in Ihrem Netzwerk sammeln. Die Analyse dieses Verhaltens bei einem einzigen Ereignis oder einer einzigen Kommunikationssequenz liefert meistens nicht genug Belege für eine weitergehende Untersuchung, aber angewandt auf die Kommunikation im gesamten Netzwerk kann diese Analyse der Schlüssel sein, um zu erkennen, ob ein Zwischenfall stattgefunden hat. Aufklärung anhand von öffentlich verfügbaren Quellen Nach den internen sollten Sie sich auch noch anderen verfügbaren Informationsquellen zuwenden. Zur Aufklärung anhand von öffentlich verfügbaren Quellen (Open Source Intelligence, OSINT) werden beim NSM hauptsächlich öffentliche Websites zurate gezogen. Der Vorteil besteht darin, dass Sie damit Informationen über einen Gegner einholen können, ohne Pakete an ihn zu senden. Im Folgenden wollen wir uns einige Websites ansehen, auf denen Sie Informationen über IP-Adressen, Domänennamen und Schaddateien einholen können. Die Aufklärung aus öffentlichen Quellen ist ein weites Feld, das viele verschiedene Vorgehensweisen umfasst, und könnte leicht ein ganzes Buch füllen. Eine ausführlichere Liste von Websites für OSINT-Recherchen finden Sie auf hptt://www.appliednsm.com/osint-resources. Registraturen für IP-Adressen und Domänennamen Die IANA (International Assigned Numbers Authority) ist als Abteilung der ICANN (Internet Corporation for Assigned Names and Numbers (ICANN) dafür zuständig, die Zuweisung von IP-Adressen und ASNs (Autonomous System Number), die Verwaltung von DNS-Stammzonen usw. zu überwachen. Die Zuweisung der Adressen wiederum delegiert die IANA an fünf regionale Internetregistraturen (RIRs), die dafür verantwortlich sind, Aufzeichnungen über die Zuordnung von IP-Adressen zu deren registrierten Besitzern zu pflegen. Eine Liste dieser Registraturen finden Sie in Tabelle 14.1. 484 14 Aufklärung über Freund und Feind Tabelle 14.1: Regionale Internetregistraturen Name Abkürzung Region Website African Network Information Centre AfriNIC Afrika http://www.afrinic.net/ American Registry for Internet Numbers ARIN USA, Kanada, Teile der Karibik, Antarktis https://www.arin.net/ Asia-Pacific Network Information Centre APNIC Asien, Australien, Neuseeland und benachbarte Länder http://www.apnic.net/ Latin America and Caribbean Network Information Centre LACNIC Lateinamerika und Teile der Karibik http://www.lacnic.net/ Reseaux IP Europeens Network Coordination Centre RIPE NCC Europa, Russland, Naher Oster, Zentralasien http://www.ripe.net/ Jede dieser Registraturen können Sie nach den Registrierungsdatensätzen für eine IP-Adresse fragen. Abb. 14.13 zeigt das Ergebnis einer solchen Abfrage in der ARIN-Datenbank für eine IP-Adresse im Bereich 50.128.0.0/9 über http://whois.arin.net/ui/advanced.jsp. Hier sehen Sie, dass dieser Block von IP-Adressen Comcast zugewiesen ist. Über die Links in dem Abfrageergebnis erhalten Sie Informationen zur Kontaktaufnahme mit Ansprechpartnern (Points of Contact, POC) in dieser Organisation zu technischen und Verwaltungsfragen sowie für Missbrauchsmeldungen. Das ist praktisch, wenn sich ein gegnerisches Gerät, von dem aus ein Einbruch in Ihr Netzwerk versucht wird, in einem IP-Adressraum befindet, der einem renommierten Unternehmen gehört. Oft ist das ein Indiz dafür, dass der wahre Gegner dieses Gerät geknackt hat und als Ausgangspunkt für seine Angriffe nutzt. In solchen Fällen ist es üblich, den Ansprechpartner für Missbrauchsmeldungen in der Organisation darüber zu informieren, dass aus deren Adressbereich ein Angriff vorgetragen wird. Bericht von der Front Andere Organisationen darüber zu informieren, dass einer ihrer Hosts möglicherweise übernommen wurde, kann manchmal schwierig sein. Es kann dabei durchaus vorkommen, dass die betreffende Organisationen Ihnen nicht glaubt und Sie in Extremfällen sogar beschuldigt, schädliche Maßnahmen gegen sie zu betreiben. Angesichts dieser Gratwanderung müssen Sie die notwendige Etikette walten lassen, wenn Sie jemandem mitteilen, dass sein Netzwerk angegriffen wurde. Einige wertvolle Erfahrungen damit beschreibt Tom Liston in einem Artikel für SANS Internet Storm Center auf http://www.dshield.org/diary.html?storyid=9325. 14.3 Aufklärung über Bedrohungen 485 Abbildung 14.13: Ergebnis einer Abfrage an die Internetregistratur ARIN In sehr vielen Fällen ist die IP-Adresse, nach der Sie suchen, bei einem Provider registriert. Wenn Sie Glück haben, kann es sinnvoll sein, den Provider darüber zu informieren, dass jemand von seinem IP-Adressraum aus einen Angriff auf Ihr Netzwerk versucht, aber meiner Erfahrung nach ist das gewöhnlich nicht sehr fruchtbar. Dies gilt insbesondere dann, wenn Sie es mit einem Provider außerhalb Ihrer Gerichtsbarkeit zu tun haben. Da IP-Adressen auf die fünf regionalen RIRs verteilt sind, werden Sie oft erst erfahren, welche RIR für eine gegebene Adresse zuständig ist, wenn Sie danach suchen. Wenn Sie auf der Website der falschen RIR nach der Adresse suchen, werden Sie zum Glück auf die richtige RIR verwiesen, sodass Sie Ihre Nachforschungen dort fortsetzen können. Eine andere Möglichkeit besteht darin, einen Dienst wie Robtex zu nutzen, der sich darum kümmert (und den wir uns in Kürze genauer ansehen werden). Eine weitere brauchbare Information, die Sie aus dem Registrierungseintrag gewinnen können, ist die ASN (Autonomous System Number), die mit der IP-Adresse verknüpft ist. Diese Zahl bezeichnet ein einzelnes Netzwerk oder eine Gruppe von Netzwerken, die von einer einzigen Körperschaft beherrscht werden. Gewöhnlich werden solche ASNs Providern, Großunternehmen und Universitäten zugewiesen. Wenn zwei IP-Adressen unterschiedlichen Eigentümern zugeordnet sind, aber dieselbe ASN aufweisen, können Sie daraus schließen, dass es irgendeine Verbindung zwischen ihnen gibt. Das allerdings müssen Sie von Fall zu Fall untersuchen. In jeder Registratur können Sie auch gezielt nach ASNs suchen. 486 14 Aufklärung über Freund und Feind Bei Domänennamen beginnt die Recherche ebenso wie bei IP-Adressen gewöhnlich damit, den registrierten Besitzer zu finden. Es ist jedoch wichtig, zwischen dem physischen Host und dem Domänennamen zu unterscheiden. Der IP-Adressraum ist endlich und unterliegt gewissen Einschränkungen. Wenn in Ihren Protokollen eine IP-Adresse erwähnt wird, können Sie davon ausgehen, dass die Daten, die Sie im Zusammenhang mit dem betreffenden Host erfasst haben, tatsächlich von dieser IP-Adresse stammen (zumindest bei der sitzungsorientierten Kommunikation). Sie können auch mit ausreichender Wahrscheinlichkeit annehmen, dass die IP-Adresse dem Besitzer gehört, für den sie registriert ist, wobei es natürlich möglich ist, dass der Computer von Dritten übernommen wurde. Ein Domänenname dagegen ist nur ein Zeiger auf einen Speicherort. Wenn einer Ihrer Hosts in irgendeiner Weise auf eine Domäne zugegriffen hat, dann wird der zugehörige Domänenname zwar in Ihren Protokollen aufgeführt, kann aber auf beliebige und im Laufe der Zeit sogar auf unterschiedliche Adressen verweisen. Der Domänenname aus den Protokollen von gestern kann daher schon auf eine ganz andere Adresse zeigen. Es ist ein übliches Vorgehen von Angreifern, Hosts zu knacken und dann den IP-Adressen dieser Hosts Domänennamen zuzuweisen, die Malware bereitstellen oder andere Schadfunktionen ausüben. Wenn der Besitzer des Hosts das bemerkt und den Angreifer aussperrt, weist dieser den Domänennamen einfach der IP-Adresse eines anderen Computers zu, über den er Einfluss hat. Es gibt sogar schon Malware, die Algorithmen zum Generieren von Domänennamen einsetzt, um zufällig ausgewählte Domänennamen zu registrieren und für Steuerfunktionen zu nutzen. Es ist nicht die Domäne, die von Angreifern übernommen wird, sondern die IP-Adresse. Ein Domänenname kann jedoch für schädliche Zwecke verwendet werden. Das ist etwas, was Sie bei der Recherche von möglicherweise schädlichen Domänen im Hinterkopf behalten müssen. Zuständig für die Domänennamenregistrierung ist die ICANN, die diese Verantwortung wiederum an Domänennamenregistraturen delegiert. Wenn jemand einen Domänennamen registriert, muss er Kontaktinformationen dafür angeben. Leider findet dabei so gut wie keine Überprüfung statt, sodass die Registrierungsinformationen für eine Domäne nicht unbedingt der Wahrheit entsprechen müssen. Viele Registraturen bieten auch einen anonymen Dienst an, bei dem der tatsächliche Besitzer der Domäne verschleiert und stattdessen die Registratur angegeben wird. Trotzdem lassen sich in vielen Fällen auch aus der Domänennamenregistrierung wertvolle Informationen gewinnen. Angaben zu Domänen können Sie auf viele verschiedene Weisen abfragen. Eine Möglichkeit besteht darin, eine whois-Abfrage auf der Website einer Registratur wie GoDaddy oder Network Solutions durchzuführen. Mit der folgenden einfachen Syntax können Sie den Befehl whois auch an einer Unix-Befehlszeile ausführen (siehe Abb. 14.14): whois<Domänenname> 14.3 Aufklärung über Bedrohungen 487 Abbildung 14.14: Ergebnisse einer whois-Abfrage nach ESPN.com Wie Sie sehen, erhalten wir dadurch Informationen über das Unternehmen, für das die Domäne registriert wurde (registrant) sowie einige weitere wertvolle Informationen. Das Registrierungsdatum kann einen Hinweis auf die Echtheit der Domäne liefern. Wenn Sie den Verdacht haben, dass eine Domäne, mit der Ihre Hosts kommunizieren, schädliche Inhalte bereitstellt, und Sie dann feststellen, dass diese Domäne erst wenige Tage zuvor registriert wurde, ist das ein weiteres Indiz dafür, dass hier tatsächlich etwas Ungutes vor sich geht. In der Ausgabe in Abb. 14.14 werden Ihnen auch die mit der Domäne verknüpften DNSServer genannt. Damit können Sie Verbindungen zwischen mehreren verdächtigen Domänen aufdecken. Mit etwas DNS-Zauberei und Techniken wie Zonenübertragungen können Sie auch versuchen, sich Unterdomänen und DNS-Hostnamen anzeigen zu lassen, aber da Sie dabei in Interaktion mit potenziellen DNS-Servern treten müssen, ist das in den meisten Fällen nicht zu empfehlen. Wenn Sie mehr darüber erfahren wollen, können Sie sich jedoch in den vielen Anleitungen informieren, die es dazu im Internet gibt. Auf http://www.securitytube.net finden Sie auch Videos dazu. 488 14 Aufklärung über Freund und Feind Bei der Suche nach Informationen über IP-Adressen und Domänennamen klappere ich gewöhnlich nicht all die verschiedenen einzeln Websites ab, sondern nutze öffentlich verfügbare Dienste, bei denen ich alle Angaben auf einmal erhalte. Zu meinen Favoriten dabei gehört Robtex (http://www.robtex.com), wo Sie in einer sehr praktischen Oberfläche eine Menge wertvoller Informationen finden, darunter alles, was wir bis jetzt besprochen haben. Als Beispiel sehen Sie in Abb. 14.15 die Ergebnisse auf der Registerkarte Records von Robtex für meine Suche nach espn.com. Abbildung 14.15: Die Registerkarte Records von Robtex Wie Sie hier sehen, gibt Robtex alle gewonnenen DNS-Informationen, die zugehörigen IP-Adressen und die damit verknüpften ASNs aus. Damit können Sie rasch ein Gesamtbild zeichnen, das für die Arbeit von Analytikern sehr gut geeignet ist. Vorsicht In diesem Kapitel werden viele Webdienste erwähnt, die öffentlich zugängliche Informationen bereitstellen. Diese Websites können zwar sehr nützlich sein, aber Sie müssen sich immer klarmachen, wie sie mit den Informationen umgehen, die Sie ihnen geben, um nach verdächtigen IP-Adressen oder Domänen zu suchen. Einige dieser Dienste kommunizieren mit diesen Adressen oder Domänen, und die Weitergabe Ihrer IP-Adresse an einen möglicherweise schädlichen Host ist natürlich das Letzte, was Sie wollen. Ich habe schon genug Fälle erlebt, in denen ein Webdienst die IP-Adresse des anfordernden Clients im HTTP-Header weitergeleitet hat. Ob das der Fall ist, können Sie prüfen, indem Sie mit diesen Tools eine Recherche über Ihr eigenes Netzwerk durchführen und dann die Daten über die Kommunikation mit dem Webdienst untersuchen. 14.3 Aufklärung über Bedrohungen 489 Reputation von IP-Adressen und Domänen In Kapitel 8 haben wir uns schon ausführlich mit der Reputation von IP-Adressen und Domänen beschäftigt. Die Reputation ist nicht nur für eine nützliche Information für die Erkennung, sondern auch für die Analyse. Wenn eine IP-Adresse oder Domäne schon früher im Zusammenhang mit schädlichen Aktivitäten stand, dann ist es wahrscheinlich, dass sie auch heute noch damit in Verbindung steht. Meine bevorzugten Quellen für Reputationsinformationen zu Erkennungszwecken habe ich bereits in Kapitel 8 genannt. Diese Websites sind zwar für die Erkennung optimiert, da sie Listen generieren, die sich in Erkennungsmechanismen einspeisen lassen, können aber auch für die Analyse von IP-Adressen und Domänennamen verwendet werden. Ich werde sie hier aber nicht noch einmal aufführen. Stattdessen stelle ich zwei meiner bevorzugten Reputationswebsites vor, die besser für die Analyse nach der Erkennungsphase geeignet sind, nämlich IPVoid (http://www.ipvoid.com/) und URLVoid (http://www.urlvoid.com/). Beide Websites wurden als kostenlose Dienste von dem Unternehmen NoVirusThanks entwickelt. Sie greifen auf mehrere andere Reputationslisten zurück (darunter einige derjenigen, die in diesem Buch erwähnt wurden) und zeigen an, ob die eingegebene IPAdresse bzw. Domäne auf einer dieser Listen zu finden ist. In den Abbildungen 14.16 und 14.17 finden Sie Beispielausgaben beider Dienste. Abbildung 14.16: Beispielausgabe von URLVoid 490 14 Aufklärung über Freund und Feind Abbildung 14.17: Beispielausgabe von IPVoid Beide Dienste geben grundlegende Informationen über die IP-Adresse bzw. Domäne und eine Statistik über die Anzahl der schwarzen Listen aus, auf denen sie gefunden wurde. In Abb. 14.16 können Sie erkennen, das die Domäne auf drei von 28 Blacklists (11 %) gefunden wurde, die URLVoid durchsucht hat. Diese drei Listen werden an der Spitze des Ergebnisses aufgeführt, wobei Sie über den Link in der Spalte Info direkt zu dem Eintrag für den betreffenden Domänennamen auf der zugehörigen Website gelangen. In Abb. 14.17 wurden die Informationen von IPVoid über die angefragte IP-Adresse aus Platzgründen gekürzt, aber Sie können trotzdem noch mehrere der verwenden IP-Blacklistdienste sehen. IPVoid und URLVoid sind hervorragende zentrale Anlaufstellen, um zu bestimmen, ob eine bestimmte IP-Adresse oder Domäne auf irgendeiner schwarzen Liste geführt wird. Wenn ja, ist das zwar immer noch kein sicherer Beweis für schädliche Aktivitäten, aber in den meisten Fällen ein wertvolles Indiz. Denken Sie bei der Analyse immer daran, dass mehrere Domänen eine einzige IP-Adresse nutzen können. Wenn eine Domäne auf mehreren schwarzen Listen auftaucht, heißt das nicht zwangsläufig, dass auch jede andere Domäne, deren Inhalt über dieselbe IP-Adresse bereitgestellt wird, ebenfalls schädlich ist. Das gilt insbesondere für gemeinsam genutzte Hostingserver. Wenn eine Website auf einem solchen Server unter falschen Einfluss gerät, 14.3 Aufklärung über Bedrohungen 491 liegt das gewöhnlich an einem Mangel in der Webanwendung. Meistens ist dieser Einbruch nur auf die betroffene Domäne beschränkt. Es kann natürlich auch Ausnahmen von dieser Regel geben, aber Sie sollten sie bei der Untersuchung der Reputation von IPAdressen und Domänennamen trotzdem im Hinterkopf behalten. Eine Möglichkeit, die über eine IP-Adresse bereitgestellten Domänen schnell zu ermitteln, ohne selbst mit fremden DNS-Servern arbeiten zu müssen, bietet der Dienst Domains by IP (http://www.domainsbyip.com/). Die Ausgabe dieses Dienstes sehen Sie in Abb. 14.18. Abbildung 14.18: Ergebnisse einer Abfrage auf Domains by IP In diesem Beispiel können Sie erkennen, dass über diese IP-Adresse vier verschiedene Domänen vorgehalten werden, zwischen denen es keine offenkundige Verbindung gibt. Das sieht ganz nach einem gemeinsam genutzten Hostingserver aus. Wie Sie sehen, führt der Dienst auch »nahegelegene« IP-Adressen auf (Nearby IP addresses), die numerisch nicht so weit entfernt von der angefragten IP-Adresse liegen und ebenfalls Domänen bereitstellen. Dieser Dienst ist sehr nützlich, aber nicht allumfassend, weshalb Sie damit je nachdem, was Sie erreichen wollen, unterschiedlich weit kommen. Nach diesen öffentlichen Informationsquellen über Hosts sehen wir uns im Folgenden einige öffentliche Informationsquellen über Dateien an. 492 14 Aufklärung über Freund und Feind 14.3.2 Recherche über schädliche Dateien Die Elemente, die Ihnen bei der NSM-Analyse neben IP-Adressen und Hostnamen am häufigsten begegnen werden, sind Dateien. Manchmal haben Sie dabei nur einen Dateinamen, manchmal auch einen MD5-Hash, und im besten Fall können Sie sogar auf die komplette Datei zugreifen. Verdächtig sind Dateien gewöhnlich dann, wenn sie von einem verdächtigen Host heruntergeladen werden oder in Zusammenhang mit einem Alarm stehen, den ein Erkennungsmechanismus ausgelöst hat. Informationen über Dateien zu gewinnen ist ein wichtiger Bestandteil der taktischen Aufklärung über eine Bedrohung. Bericht von der Front Es gibt verschiedene Möglichkeiten, verdächtige Dateien an einer Verbindung abzugreifen. Mit Bro können Sie bestimmte Dateitypen in Echtzeit abrufen, wie wir bereits in Kapitel 10 besprochen haben. Bei der Untersuchung von FPCDaten können Sie Dateien mit Werkzeugen wie Wireshark aus dem Kommunikationsstream extrahieren. Diese Vorgehensweise wurde in Kapitel 13 erklärt. Aufklärung anhand von öffentlich verfügbaren Quellen Ebenso wie bei der Aufklärung über Hosts finden Sie auch für Recherchen über verdächtige Dateien verschiedene brauchbare Quellen im Internet. Im Folgenden wollen wir uns einige davon ansehen. Wenn Ihnen die verdächtige Datei tatsächlich vorliegt, ist es am einfachsten, eine Verhaltensanalyse dafür durchzuführen. Das können Sie auch mit internen Ressourcen erledigen, doch wenn Ihnen die notwendigen Einrichtungen dafür fehlen, ist es besser, die Datei bei einer Online-Malwaresandbox einzureichen, die eine automatische Verhaltensanalyse durchführt, indem sie beobachtet, welche Änderungen die Malware an dem System vornimmt und welche Maßnahmen sie zu ergreifen versucht. Sehen wir uns einige dieser Sandboxes an. 14.3 Aufklärung über Bedrohungen 493 Vorsicht Sehr viele öffentliche Malwaresandboxes indizieren die eingereichte Malware, sodass andere Personen danach suchen können. Dadurch muss die Sandbox eine Datei, die schon einmal eingereicht wurde, nicht ein zweites Mal analysieren. Das hilft den Betreibern der Website zwar, Ressourcen zu sparen, kann aber ein Risiko darstellen. Wenn normale Benutzer in einer öffentlichen Sandbox nach Malware suchen können, so ist das auch Personen und Gruppen möglich, die Malware erstellen. Wenn ein Gegner mit einer Malware, die eigens auf Ihre Organisation zugeschnitten ist, einen gezielten Angriff führt, kann er anschließend regelmäßig die öffentlichen Sandboxes auf den Dateinamen oder MD5-Hash dieser Malware untersuchen. Stößt er dabei auf die Malware, dann weiß er, dass Sie sie gefunden haben und dass er seine Taktik ändern oder neue, weniger leicht zu erkennende Malware schreiben muss. Das müssen Sie bedenken, bevor Sie Malware bei einer öffentlichen Website einreichen, insbesondere wenn Sie in einer Hochsicherheitsumgebung arbeiten, auf die gezielte Angriffe durchgeführt werden. VirusTotal Die einfachste Möglichkeit, zu bestimmen, ob eine Datei schädlich ist, besteht darin, sie von einem Antivirusprogramm überprüfen zu lassen. Leider ist die Erkennungsrate solcher Software sehr gering. Die Chance, dass ein einziges Antivirusprodukt eine Malware erkennt, liegen bei 50:50. Sie können das Verhältnis verbessern, indem Sie eine verdächtige Datei von mehreren Antivirus-Engines überprüfen lassen. Es ist jedoch technisch meistens nicht möglich, mehrere AV-Engines auf einem einzigen System einzurichten, und die Lizenzierung dafür wäre auch nicht billig. Es gibt jedoch den Onlinedienst VirusTotal (http://www.virustotal.com), einen kostenlosen Dienst, den Google 2012 gestartet hat und der verdächtige Dateien und URLs mithilfe mehrerer Antivirus-Engines untersucht. Es gibt verschiedene Möglichkeiten, Dateien bei VirusTotal einzureichen: über die entsprechende Website, per E-Mail oder mithilfe von Tools, die die API von VirusTotal verwenden. Ich bevorzuge die entsprechende GoogleChrome-Erweiterung. Nachdem Sie eine Datei eingereicht haben, führt VirusTotal die Analyse durch und gibt einen Bericht aus, der angibt, welche Antivirus-Engines eine Übereinstimmung mit der Datei oder ihrem Inhalt gefunden haben und welche Strings übereinstimmen. Ein Beispiel dieser Ausgabe sehen Sie in Abb. 14.19. Zurzeit nutzt VirusTotal 49 verschiedene Antivirus-Engines, einschließlich derjenigen der größten und bekanntesten Hersteller auf diesem Gebiet. 494 14 Aufklärung über Freund und Feind Abbildung 14.19: Beispiel für einen Bericht von VirusTotal Dieser Beispielbericht besagt, dass sieben von 48 Antivirus-Engines die eingereichte Datei als Malware erkannt haben. Zwei dieser sieben sind in dem Ausschnitt zu sehen, nämlich antiy-AVL und Baidu-International. Beide sehen diese Datei als eine Art von VNC-­Anwendung an, die zur Fernsteuerung eines Systems verwendet werden kann. Das Zeigerinstrument oben rechts auf dem Bildschirm gibt aufgrund der Anzahl der Befunde und einiger anderer Faktoren eine Einschätzung ab, ob es sich um eine schädliche Datei handelt. In diesem Fall geht VirusTotal davon aus, dass sie wahrscheinlich schädlich ist. VirusTotal stellt die eingereichten Proben nicht öffentlich zur Verfügung, leitet diejenigen, die von mindestens einer Antivirus-Engine als Malware erkannt wurden, aber an die Hersteller von Antivirussoftware weiter. Denken Sie daran, wenn Sie Dateien einreichen, die sehr sensibel sind oder in maßgeschneiderten Angriffen verwendet wurden. Cuckoo und Malwr.com Eine der beliebtesten Sandboxumgebungen zur Malwareanalyse ist Cuckoo (http://www. cuckoosandbox.org). Sie führt Malware in einer neuen Instanz einer virtuellen Maschine aus und nimmt dabei eine Reihe von Analyseaufgaben vor. Unter anderem zeichnet sie die Änderungen und sonstigen Aktionen der Malware auf, z. B. alle Änderungen am System, alle Aufrufe von Windows-APIs und alle Dateien, die erstellt oder gelöscht werden. Darüber hinaus kann Cuckoo auch ein komplettes Speicherabbild des Systems oder eines 14.3 Aufklärung über Bedrohungen 495 ausgewählten Prozesses erstellen und Screenshots der virtuellen Maschine während der Ausführung der Malware anfertigen. All dies geht in den endgültigen Bericht von Cuckoo ein. Das System von Cuckoo ist modular aufgebaut, sodass die Benutzer gezielt festlegen können, was es bei der Ausführung der Malware und bei der Berichterstattung tun soll. Sie können die Cuckoo-Sandbox herunterladen und intern bereitstellen. Ich habe sie schon in vielen Umgebungen erfolgreich im Einsatz erlebt. In diesem Abschnitt geht es jedoch um Online-Sandboxes zur Malwareanalyse. Die Website http://www.malwr.com nutzt Cuckoo für einen kostenlosen Online-Analysedienst. Sie wird von Sicherheitsexperten auf freiwilliger Basis als nicht kommerzielle Dienstleistung angeboten. Die von Ihnen eingereichten Dateien werden weder öffentlich noch privat weitergeben, es sei denn, dass Sie ausdrücklich Ihre Erlaubnis dazu erteilen. Die Abbildungen 14.20 und 14.21 zeigen Ausschnitte aus einem Cuckoo-Bericht von Malwr. Im ersten Bild gibt Cuckoo Informationen über Signaturen, mit denen die eingereichte Datei übereinstimmt, was für Sie ein Hinweis ist, die entsprechenden Abschnitte des Berichts genauer zu untersuchen. Außerdem werden Screenshots der virtuellen Maschine gezeigt, in der die Malware ausgeführt wurde. In Abb. 14.21 sehen Sie die Ergebnisse der Verhaltensanalyse durch Cuckoo. Hier werden einige der Aktionen angegeben, die die Datei mypcbackup0529.exe vorgenommen hat. Malwr veröffentlicht freigegebene Analyseberichte auf seiner Homepage. Diese Berichte geben Ihnen eine Vorstellung davon, was Cuckoo wirklich leisten kann. Sie können die Berichte auch nach dem MD5-Hash einer Malwareprobe durchsuchen, um herauszufinden, ob es für die Datei bereits einen Bericht gibt. Dadurch kommen Sie schneller zu einem Ergebnis und müssen nicht erst auf den Abschluss der Analyse warten. Abbildung 14.20: Cuckoo-Bericht mit gefundenen Signaturen und Screenshots 496 14 Aufklärung über Freund und Feind Abbildung 14.21: Cuckoo-Bericht mit den Ergebnissen der Verhaltensanalyse Sofern die Möglichkeiten dazu bestehen, ist der Aufbau einer internen Cuckoo-Sandbox in Sicherheits- und NSM-Umgebungen ein lohnendes Unterfangen. Die Einrichtung ist ziemlich langwierig und kompliziert, doch dadurch erhalten Sie eine viel größere Vielseitigkeit, als Onlinedienste bieten. Unter anderem können Sie die Analyseroutinen und die Berichterstattung Ihrem Bedarf anpassen. Cuckoo ist eine voll ausgestattete Sandbox zur Malwareanalyse, die sich für viele tägliche Analyseaufgaben als nützlich erweist. 14.3 Aufklärung über Bedrohungen 497 ThreatExpert ThreatExpert ist eine weitere Online-Sandbox und bietet ähnliche Funktionen wie ­Cuckoo und Malwr. Auf der zugehörigen Website (http://www.threatexpert.com) können Sie verdächtige Dateien einreichen, die dann in einer Sandbox ausgeführt werden, um eine eingeschränkte Verhaltensanalyse durchzuführen. Das Endergebnis ist ein Bericht, der angibt, welche Aktionen die Datei im Dateisystem, in der Systemregistrierung und an anderen Orten vorgenommen hat. Die Abbildungen 14.22 und 14.23 zeigen Auszüge aus einem ThreatExport-Bericht. Abbildung 14.22: Zusammenfassung eines ThreatExport-Berichts 498 14 Aufklärung über Freund und Feind Abbildung 14.23: Detaillierte Darstellung der Aktionen in einem ThreatExpert-Bericht In dem ersten Bild können Sie erkennen, dass die eingereichte Datei offensichtlich mit UPX gepackt wurde und dass ThreatExpert einige ihrer Merkmale als Sicherheitsrisiken einstuft, nämlich das Erstellen eines Starteintrags in der Registrierung und die Kommunikation mit einem externen IRC-Server. Der Ausschnitt in dem zweiten Bild gibt technische Einzelheiten zu diesen Befunden an, darunter Änderungen am Arbeitsspeicher und der Registrierung, das Erstellen eines Mutex und das Öffnen eines Ports. ThreatExpert verfügt auch über eine umfassende Suchfunktion. Sie können über den MD5- oder SHA1-Hash nach bereits analysierten Dateien suchen, sodass eine bereits früher eingereichte Datei nicht erneut analysiert werden muss. Die wertvollste Funktion ist jedoch die Möglichkeit, in den Berichten nach beliebigem Text, nach Dateinamen, IPAdressen oder Domänennamen zu suchen, die Sie in Ihrem Netzwerk gefunden haben, um zu sehen, ob Sie in irgendeinem der Malwareanalyseberichte von ThreatExpert vorkommen. Bei vielen Untersuchungen, an denen ich beteiligt war, waren die ThreatExpertMalwareberichte die einzige Informationsquelle über eine gesuchte Adresse, und sehr oft reichten die Angaben in diesen Berichten aus, mich auf die richtige Spur zu bringen und entscheiden zu können, ob tatsächlich ein Zwischenfall vorlag oder nicht. 14.3 Aufklärung über Bedrohungen 499 ThreatBox ist zwar eine gut funktioniere Sandbox, allerdings geht sie nicht so sehr ins Detail wie Cuckoo und kann auch nicht heruntergeladen und lokal installiert werden. In vielen Fällen erfüllt sie aber ihren Zweck, und ihre Suchfunktionen machen sie für die NSM-Analyse äußerst wertvoll. Malware Hash Registry von Team Cymru Eine Datei lässt sich am schnellsten anhand ihres kryptografischen Hashwerts identifizieren, wobei gewöhnlich ein MD5-, manchmal aber auch ein SHA1-Hash verwendet wird. Der große Vorteil besteht darin, dass Sie anhand dieses Hashwerts eine Datei unabhängig von ihrem Namen erkennen können. Wie wir in den vorigen Beispielen gesehen haben, verwenden sowohl Malwr als auch ThreatExpert solche Hashes. Das Team Cymru nun hat eine Liste der Hashwerte bekannter Malware aufgestellt. Dieses Malware Hash Registry (http://www.team-cymru.org/Services/MHR/) ist eine Datenbank, die bekannte Malwarehashes aus verschiedenen Quellen enthält. Diese Datenbank lässt sich auf verschiedene Weisen abfragen und bietet eine schnelle und einfache Möglichkeit, zu ermitteln, ob eine Datei, die Sie bei der Erkennung oder Analyse gefunden haben, schädlich ist. Die einfachste Methode zur Abfrage dieses Registers bietet der Befehl whois. Das mag eigenartig erscheinen, funktioniert aber sehr gut. Dazu müssen Sie den Befehl im folgenden Format geben: whois -h hash.cymru.com<Hash> Abb. 14.24 zeigt das Ergebnis zweier Abfragen dieser Art. Abbildung 14.24: Abfragen der Malware Hash Registry von Team Cymru Die beiden Abfragen in diesem Beispiel geben jeweils drei Spalten zurück. Die erste enthält den Hashwert, die zweite den Zeitstempel (im Epochenformat, das Sie mit dem Befehl date -d in die lokale Uhrzeit umrechnen lassen können) des Zeitpunkts, an dem der Hash das letzte Mal beobachtet wurde. In der dritten Spalte ist der prozentuale Anteil der Antivirus-Engines angegeben, die die Datei als schädlich einstufen. Im ersten Fall sind es 79 %, im zweiten dagegen steht in diesem Feld NO_DATA, was bedeutet, dass es in dem Register keine Einträge für den Hashwert gibt. Datensätze für Hashwerte mit einer Erkennungsrate unter 5 % werden vom Malware Hash Registry nicht aufbewahrt. 500 14 Aufklärung über Freund und Feind Dieses Register kann sich für die Analyse einzelner verdächtiger Dateien als sehr nützlich erweisen. Da es so viele verschiedene Möglichkeiten gibt, die Datenbank abzufragen, eignet sie sich darüber hinaus auch sehr gut zur automatischen Analyse. So kann Bro beispielsweise seine Extraktionsfunktionen (siehe Kap. 10) mit seinem Intel-Framework kombinieren (siehe Kapitel 8), um Dateien selektiv zu extrahieren und ihre Hashes automatisch mit denen im Hashregister zu vergleichen. Das ist nicht nur für die Erkennung äußerst praktisch, sondern kann auch die Arbeit bei der Analyse eines Ereignisses erleichtern. Auf der zuvor genannten Website erfahren Sie mehr über das Hashregister und die zahlreichen Möglichkeiten, es abzufragen. Die hier besprochenen Informationen aus der Aufklärung über IP-Adressen und Domänennamen und die Beobachtungen aus Ihren Netzwerkdaten liefern Ihnen zusammen genommen wichtige taktische Erkenntnisse. 14.4 Zusammenfassung Um eine Untersuchung erfolgreich durchführen zu können, müssen Sie Ihr Netzwerk und Ihren Gegner kennen. Die Fähigkeit, Informationen über eigene Elemente zu gewinnen und Recherchen über mögliche schädliche Elemente anzustellen, ist für die erfolgreiche Analyse von Zwischenfällen unverzichtbar. In diesem Kapitel haben wir uns Vorgehensweise für beides angesehen. Es gibt verschiedene Ansätze zur Aufklärung. Wichtig ist jedoch, dass Sie dabei Ergebnisse anstreben, die Analytikern helfen, Entscheidungen zu treffen, die eine Untersuchung vorantreiben. Im nächsten Kapitel beschäftigen wir uns mit dem Analyse­vorgang, der sich auf die Informationen aus der Erfassung und Erkennung stützt. 15 Der Analysevorgang Der wichtigste Part des NSM ist die Analyse. Dabei nutzen die Analytiker die Ausgabe der Erkennungsmechanismen und verschiedene Datenquellen, um Informationen zu sammeln und dadurch zu bestimmen, ob tatsächlich etwas vorgefallen ist, das sich schädlich auf das Netzwerk oder die darin gespeicherten Informationen auswirkt. Bei Besuchen bei Sicherheitsorganisationen und bei Gesprächen mit Analytikern habe ich fast immer festgestellt, dass der Analysevorgang ad hoc durchgeführt wird und aus einer subjektiv festgelegten Abfolge nur locker definierter Schritte besteht, die jeder Einzelne für sich selbst aufstellt. Natürlich haben wir alle unseren eigenen Stil, und jeder geht anders an die Untersuchung von Informationen heran, weshalb das bis zu einem gewissen Grad zu erwarten ist. Allerdings kann es sich als wertvoll erweisen, einen formalen, systematischen Analyseprozess zu verwenden, nach dem sich alle Analytiker bei ihrer Arbeit richten. Die Nutzung eines solchen Prozesses beschleunigt die Entscheidungsfindung, macht die Teamarbeit effizienter und sorgt für eine klarere Berichterstattung über Zwischenfälle. Vor allem aber hilft sie den Analytikern, schneller mit einer Untersuchung fertig zu werden. In diesem Kapitel sehen wir uns zwei verschiedene Vorgehensweisen an, die als Grundgerüst für die NSM-Analyse dienen können. Die erste ist einem System entlehnt, das bei polizeilichen Ermittlungen eingesetzt wird, die zweite dagegen stammt von einem Prozess, den Ärzte für medizinische Untersuchungen verwenden. Zum Zeitpunkt der Abfassung dieses Buches habe ich noch keine schriftlich ausgearbeitete Struktur für die 502 15 Der Analysevorgang NSM-Analyse gesehen. Daher soll Ihnen dieses Kapitel die nötigen Kenntnisse vermitteln, um eine dieser beiden Analysemethoden bei der täglichen Arbeit einzusetzen und Ihre Fähigkeiten zur Analyse zu verbessern, damit Sie bei Ihren Untersuchungen nicht nur zu besseren Ergebnissen kommen, sondern diese auch schneller erreichen. Nach der Erörterung der Analysemethoden werde ich noch einige empfehlenswerte Vorgehensweisen vorstellen, die ich aus meiner eigenen Erfahrung als NSM-Analytiker und von meinen Kollegen gelernt habe. Am Ende besprechen wir noch den Prozess, um die »Morbidität und Mortalität« eines Zwischenfalls zu bestimmen. Dieser Vorgang dient dazu, die Erfassung, Erkennung und Analyse nach dem Abschluss einer Untersuchung zu verbessern. 15.1 Analysemethoden In jedem Analyseprozess sind drei Dinge erforderlich: eine Eingabe, eine Untersuchung und eine Ausgabe. Die Art und Weise, wie diese Schritte erledigt werden und gegliedert sind, definiert eine Analysemethode, wobei es sich schlicht um eine systematische Vorgehensweise handelt, um zu ermitteln, ob ein Zwischenfall stattgefunden hat. In unserem Fall ist die Eingabe gewöhnlich irgendeine Form von IDS-Alarm oder eine andere Anomalie, die die Aufmerksamkeit eines Analytikers erregt hat, und die Ausgabe die Entscheidung, ob ein Zwischenfall vorliegt. Es sind die Schritte, die dazwischen in der Untersuchungsphase unternommen werden, mit denen wir uns im Folgenden beschäftigen. 15.1.1 Relationale Untersuchung Die Prozesse zur Untersuchung einer Verletzung der Informationssicherheit ähneln sehr stark denen einer polizeilichen Ermittlung. Die Vorgehensweise, mit der Kriminalbeamte einem Verbrechen auf den Grund geben, können wir sogar als Grundgerüst für eine Analysemethode verwenden. Dies ist die sogenannte »relationale Untersuchung«. Diese Methode beruht darauf, lineare Beziehungen zwischen Objekten aufzustellen. Wenn Sie jemals eine Folge von CSI oder NYPD Blue gesehen haben, wo die Ermittler Papierblätter an eine Pinnwand heften und dann versuchen, diese Elemente mit Garn zu verbinden, dann haben Sie bereits ein Beispiel für eine relationale Untersuchung in Aktion erlebt. Diese Art der Ermittlung stützt sich auf die Beziehungen zwischen den Anhaltspunkten und den in den Fall verwickelten Personen. Ein Computernetzwerk ähnelt in gewisser Hinsicht einer Gruppe von zusammengehörigen Menschen. Alles ist miteinander verbunden, und jede Aktion kann eine andere Aktion verursachen. Wenn wir als Analytiker die Beziehungen zwischen verschiedenen Objekten gut genug erkennen, können wir daraus ein Netz spannen, das uns hilft, uns ein Gesamtbild von dem zu machen, was bei dem möglichen Zwischenfall vor sich geht. Der Prozess der relationalen Untersuchung besteht aus vier Schritten (siehe Abb. 15.1). 15.1 Analysemethoden 503 Schri 1 Schri 2 Schri 3 Schri 4 (wiederholt) Untersuchung der Hauptbeteiligten Untersuchung der Beziehungen zwischen den Hauptbeteiligten Untersuchung der sekundären Beteiligten Untersuchung der Beteiligten weiterer Grade Vorläufige Bewertung der Meldung Untersuchung der aktuellen Interakon Unersuchung der Beziehungen zwischen primären und sekundären Beteiligten Untersuchung der Beziehungen zwischen Beteiligten weiterer Grade Abbildung 15.1: Die Analysemethode der relationalen Untersuchung Schritt 1: Untersuchung der Hauptbeteiligten und vorläufige Bewertung der Meldung Die Untersuchung eines Verbrechens beginnt oft damit, dass die Polizeiwache eine Meldung über die Tat ausgibt. Die zuständigen Beamten erhalten darin Informationen über die Art des Vorfalls und die darin verwickelten Personen. Beim Eintreffen am Tatort besteht die erste Maßnahme darin, die Identität der anwesenden Personen (Hauptbeteiligte) festzustellen und herauszufinden, ob die Meldung eine weitergehende Untersuchung erfordert. Diese Entscheidung wird aufgrund der gesetzlichen Erfordernisse und der Einschätzung der Beamten getroffen, ob ein Gesetzesbruch vorliegt. Wenn die Beamten davon ausgehen, dass tatsächlich eine Straftat vorgelegen haben kann, beginnen sie damit, Informationen über die einzelnen Beteiligten einzuholen. Das kann die Überprüfung von deren Ausweispapieren, einen Einblick in ihr Strafregister und eine Durchsuchung umfassen, um festzustellen, ob sie Waffen oder illegale Gegenstände mit sich führen. Bei einer NSM-Untersuchung werden die Analytiker gewöhnlich durch Alarmdaten über ein Ereignis informiert, also beispielsweise durch den Alarm eines IDS. Dabei werden gewöhnlich die Art des Vorfalls und die darin verwickelten Hosts genannt. Der Alarm entspricht der Meldung von der Polizeiwache, und die Hosts sind die Hauptbeteiligten. Auch die NSM-Analytiker müssen zunächst entscheiden, ob der Alarm eine weitere Untersuchung rechtfertigt. Dazu werden zunächst die Einzelheiten der Regel oder die Angaben des Erkennungsmechanismus untersucht, der den Alarm ausgelöst hat, und bestimmt, ob der Datenverkehr tatsächlich die Bedingungen für einen Alarm erfüllt. Damit sollen Fehlalarme möglichst schnell als solche erkannt werden. Wenn der Vorfall nicht sofort als Fehlalarm abgetan werden kann, besteht der nächste Schritt darin, Informationen über 504 15 Der Analysevorgang die Hauptbeteiligten an dem Alarm einzuholen, nämlich über die IP-Adressen der eigenen und der möglicherweise gegnerischen Hosts. Das bedeutet Aufklärung über die eigenen Elemente und taktische Aufklärung über Bedrohungen, wie wir sie in Kapitel 14 besprochen haben. Schritt 2: Untersuchung der Beziehungen zwischen den Hauptbeteiligten und ihrer aktuellen Interaktion Nachdem die Hauptbeteiligten identifiziert sind, untersuchen die Beamten die Beziehungen zwischen ihnen, was sowohl die frühere Beziehung als auch die gegenwärtige Interaktion umfasst. Betrachten Sie dazu als Beispiel einen Polizeieinsatz aufgrund häuslicher Gewalt. In einem solchen Fall versuchen die Beamten erstens herauszufinden, ob die beiden Beteiligten eine Beziehung führen, wie lange diese Beziehung besteht, ob sie zusammenleben usw., und zweitens, welche Handlungen zu dem Vorfall geführt haben, wann die Situation eskaliert ist und was danach geschah. Auch NSM-Analytiker untersuchen die primäre Beziehung zwischen dem eigenen und dem möglicherweise feindlichen Host. Als Erstes sehen sie sich dazu die Art der vorherigen Kommunikation an, wobei sie unter anderem folgende Fragen stellen: •• Haben die beiden Hosts jemals zuvor miteinander kommuniziert? •• Wenn ja, welche Ports, Protokolle und Dienste waren daran beteiligt? Als Nächstes untersuchen die Analytiker gründlich die Kommunikation im Zusammenhang mit dem Alarm. Dazu müssen sie Daten aus verschiedenen Quellen abrufen und auf Verbindungen überprüfen. Das umfasst unter anderem folgende Tätigkeiten: •• •• •• •• •• Erfassen von PCAP-Daten Paketanalyse Erfassen von PSTR-Daten Extrahieren von Dateien und Malwareanalyse Aufstellen von Statistiken aufgrund von Sitzungsdaten In manchen Fällen können die Analytiker an dieser Stelle bestimmen, ob ein Zwischenfall stattgefunden hat. Damit kann die Untersuchung hier enden. Wenn jedoch immer noch keine Entscheidung getroffen werden kann oder die Natur des Zwischenfalls noch nicht ganz klar es, geht es mit dem nächsten Schritt weiter. Schritt 3: Untersuchung der sekundären Beteiligten und ihrer Beziehungen Bei der Untersuchung der Hauptbeteiligten und ihrer Beziehungen werden oft sekundäre Beteiligte ermittelt – Personen, die in irgendeinem Zusammenhang mit dem Fall stehen, etwa Zeugen oder Bekannte, Freunde und Angehörige der Hauptbeteiligten. Oft ist es für 15.1 Analysemethoden 505 eine Ermittlung hilfreich, auf diese Personen die gleichen Vorgehensweisen anzuwenden wie in den ersten beiden Schritten, also Informationen über sie einzuholen und ihre Beziehungen zu den Hauptbeteiligten zu untersuchen. Dies geschieht auch oft bei der NSM-Analyse. Beispielsweise kann es sich bei Untersuchung der Beziehung zwischen zwei Hosts zeigen, dass der eigene Host auf die gleiche Weise auch mit anderen fremden Hosts kommuniziert oder der möglicherweise feindliche Host mit anderen eigenen Hosts. Die Überprüfung möglicherweise schädlicher Dateien kann auch die IP-Adressen anderer verdächtiger Kommunikationsquellen offenlegen. All diese Hosts sind sekundäre Beteiligte, die auf die gleiche Weise untersucht werden müssen wie die Hauptbeteiligten. Auch ihre Beziehungen zu den Hauptbeteiligten müssen genau überprüft werden. Schritt 4: Untersuchung der Beteiligten weiterer Grade und ihrer Beziehungen Die Untersuchung von Beteiligten und Beziehungen sollte so oft wiederholt werden, wie es nötig ist, und kann auch tertiäre und quartäre Beteiligte einschließen. Untersuchen Sie dabei jeweils erschöpfend die Beteiligten und Beziehungen einer Ebene, bevor Sie zur nächsten übergehen. Ansonsten könnten Sie sich in den Tiefen des Kaninchenlochs verirren und Beziehungen übersehen, die Ihre Sichtweise auf einige Hosts verändern könnten. Wenn Sie damit fertig sind, können Sie die Beziehungen zwischen den Beteiligten beschreiben und angeben, wie eventuelle schädliche Aktivitäten abgelaufen sind. Beispiel einer relationalen Untersuchung Sehen wir uns nun ein Beispiel dafür an, wie der relationale Untersuchungsprozess in einer NSM-Umgebung in der Praxis abläuft. Schritt 1: Untersuchung der Hauptbeteiligten und vorläufige Bewertung der Meldung Nehmen wir an, wir werden durch den folgenden Snort-Alarm auf eine Anomalie aufmerksam gemacht: ET WEB_CLIENT PDF With Embedded File In diesem Alarm werden die IP-Quelladresse 192.0.02.5 (möglicherweise feindlicher Host A) und die IP-Zieladresse 172.16.16.20 (eigener Host B) angegeben. Dies sind die Hauptbeteiligten. Die vorläufige Untersuchung des zugehörigen Datenverkehrs zeigt, dass im Rahmen des Vorfalls eine PDF-Datei heruntergeladen wurde. Als Nächstes beschaffen wir uns die PCAP-Daten für die fragliche Kommunikationssequenz, entnehmen daraus mithilfe von Wireshark die PDF-Datei und reichen den MD5-Hash dieser Datei beim Malware Hash Registry von Team Cymru ein. Das Register gibt an, dass 23 % der AntivirusEngines die Datei für schädlich halten. 506 15 Der Analysevorgang Der nächste Schritt besteht in einer taktischen Aufklärung über den eigenen und den fremden Host. Dabei gewinnen wir folgende Informationen: Erkenntnisse über den eigenen Host 172.16.16.20: •• Bei dem System handelt es sich um eine Benutzerarbeitsstation mit Windows 7. •• Auf dem System lauschen keine Dienste, es sind auch keine Ports geöffnet. •• Der Benutzer dieses Systems ist häufig im Web unterwegs. In den PRADS-Daten finden sich mehrere New-Assets-Benachrichtigungen. Erkenntnisse über den fremden Host 192.0.2.5: •• IPVoid findet keine Übereinstimmungen mit öffentlichen Blacklists für die IP-Adresse. •• URLVoid findet fünf Übereinstimmungen mit öffentlichen Blacklists für die Domäne, von der die PDF-Datei heruntergeladen wurde. •• Die NetFlow-Daten zeigen, dass diese IP-Adresse nicht mit anderen Geräten im eigenen Netzwerk kommuniziert hat. Nicht definierte Beziehung Snort-Alarm wegen des Downloads einer PDF-Datei Hauptbeteiligter Gegnerisches Element Hält eine schädliche Domäne vor Hauptbeteiligter Eigenes Element Benutzerarbeitsstation Abbildung 15.2: Die Hauptbeteiligten Schritt 2: Untersuchung der Beziehungen zwischen den Hauptbeteiligten und ihrer aktuellen Interaktion Um die Beziehung zwischen 172.16.16.20 und 192.0.2.5 zu untersuchen, laden wir die Paketdaten für die Kommunikation zwischen diesen beiden Hosts im Zeitraum von zehn Minuten vor dem Alarm bis zehn Minuten danach herunter. Eine Analyse dieser Daten zeigt, dass der eigene Host durch eine Drittanbieterwerbung auf einer legalen Website zu dem gegnerischen Host umgeleitet wurde, wo er dann die Datei heruntergeladen hat. Danach endete die Kommunikation mit dem gegnerischen Host. Der nächste Schritt in der Untersuchung der Beziehung zwischen den beiden Hosts besteht darin, die heruntergeladene PDF-Datei zu inspizieren. Dazu übergeben wir sie an Cuckoo, um eine automatische Malwareanalyse durchführen zu lassen. Die Verhaltensanalyse zeigt, dass das PDF eine ausführbare Datei einhält, in deren Konfiguration die IP-Adresse 192.0.2.6 hartkodiert ist. Das allerdings ist alles an Informationen, was die Malwareanalyse ergibt. 15.1 Analysemethoden 507 Damit haben wir die Untersuchung der Hauptbeteiligten und ihrer Beziehungen abgeschlossen. Alles deutet zwar darauf hin, dass es sich tatsächlich um einen Zwischenfall handelt, aber eine eindeutige Bestimmung ist noch nicht möglich. Allerdings haben wir einen sekundären Beteiligten erkannt, weshalb wir zum nächsten Schritt übergehen können. Schädliche EXE-Datei Hartkodierte IP-Adresse in der Stringausgabe In der Malware erkannt Schädliche PDF-Datei Enthält schädliche EXE-Datei Übereinstimmung in Team Cymru MHR gefunden Sekundärer Beteiligter Gegnerisches Element Downloads einer PDF-Datei durch das eigene Element Umleitung aufgrund einer Anzeige auf einer legalen Website Hauptbeteiligter Gegnerisches Element Hält eine schädliche Domäne vor Hauptbeteiligter Eigenes Element Benutzerarbeitsstation Abbildung 15.3: Beziehungen zwischen den Hauptbeteiligten Schritt 3: Untersuchung der sekundären Beteiligten und ihrer Beziehungen In der ausführbaren Datei innerhalb der heruntergeladenen PDF-Datei haben wir den sekundären Beteiligten 192.0.2.6 gefunden, über den wir als Nächstes Informationen einholen müssen: Erkenntnisse über den fremden Host 192.0.2.6: •• IPVoid findet zwei Übereinstimmungen mit öffentlichen Blacklists für die IP-Adresse. •• Die NetFlow-Daten zeigen, dass der Hauptbeteiligte 172.16.16.20 mit diesem Host kommuniziert hat. Dies geschah etwa 30 Minuten nach dem Alarm. •• Die NetFlow-Daten zeigen, dass zwei andere eigene Hosts in unserem Netzwerk während der letzten Tage regelmäßig mit diesem Host kommuniziert haben. Der Umfang des Datenverkehrs war gering. Die Adressen dieser Hosts lauten 172.16.16.30 und 172.16.16.40. 508 15 Der Analysevorgang Diese Informationen deuten darauf hin, dass das Problem größer ist als ursprünglich gedacht. Als Nächstes bestimmen wir die Beziehung zwischen dem sekundären Beteiligten 192.0.2.6 und dem Hauptbeteiligten 172.16.16.20. Aufgrund unserer Aufklärung über den gegnerischen Host wissen wir bereits, dass zwischen diesen beiden Adressen eine Kommunikation stattgefunden hat. Daher analysieren wir die PCAP-Daten über diese Kommunikation. Sie zeigt, dass die Geräte zwar über Port 80 kommunizieren, dabei aber nicht das Protokoll HTTP verwenden, sondern ein benutzerdefiniertes. Wir können auch die Befehle erkennen, die an unser Gerät übertragen werden und die es dazu veranlassen, Systeminformationen an den gegnerischen Host zu senden. Dabei bemerken wir auch einen regelmäßigen Rückruf an diesen Host. Damit haben wir genügend Informationen, um das Vorliegen eines Zwischenfalls und einen Einbruch in 172.16.16.20 zu erklären (siehe Abb. 15.4). Unter Umständen kann die Untersuchung damit enden. Hier aber haben wir zwei weitere Hosts gefunden (tertiäre Beteiligte), die mit dem gegnerischen Host 192.0.2.6 kommunizieren. Es besteht daher eine hohe Wahrscheinlichkeit, dass auch sie infiziert sind. Schritt 4: Untersuchung der Beteiligten weiterer Grade und ihrer Beziehungen Eine Untersuchung der zwischen den tertiären Hosts und 192.0.2.6 übertragenen Paketdaten zeigt, dass sie das gleiche Rückrufverhalten aufweisen, dass wir bereits bei unserem eigenen Hauptbeteiligten festgestellt haben (siehe Abb. 15.5). Daraus können wir schließen, dass auch unsere eigenen tertiären Hosts übernommen wurden. Schädliche EXE-Datei Hartkodierte IP-Adresse in der Stringausgabe Sekundärer Beteiligter Gegnerisches Element IP-Adresse auf schwarzer Liste Unbekannte tertiäre Beziehung In der Malware erkannt Schädliche PDF-Datei Enthält schädliche EXE-Datei Übereinstimmung in Team Cymru MHR gefunden Tertiärer Beteiligter Eigenes Element Benutzerarbeitsstation Unbekannte tertiäre Beziehung Sekundäre Beziehung Kommunikation über TCP-Port 80 mit benutzerdefiniertem Protokoll C2-Befehle erkannt Systeminformationen werden an gegnerisches Element gesendet Regelmäßiger Rückruf an gegnerisches Element Primäre Beziehung Downloads einer PDF-Datei durch das eigene Element Umleitung aufgrund einer Anzeige auf einer legalen Website Hauptbeteiligter Gegnerisches Element Hält eine schädliche Domäne vor Hauptbeteiligter Eigenes Element Benutzerarbeitsstation Abbildung 15.4: Beziehungen zwischen Haupt- und sekundären Beteiligten Tertiärer Beteiligter Eigenes Element Benutzerarbeitsstation 15.1 Analysemethoden 509 Schädliche EXE-Datei Hartkodierte IP-Adresse in der Stringausgabe Sekundärer Beteiligter Gegnerisches Element IP-Adresse auf schwarzer Liste Tertiäre Beziehung Regelmäßiger Rückruf an gegnerisches Element In der Malware erkannt Schädliche PDF-Datei Enthält schädliche EXE-Datei Übereinstimmung in Team Cymru MHR gefunden Tertiäre Beziehung Regelmäßiger Rückruf an gegnerisches Element Sekundäre Beziehung Kommunikation über TCP-Port 80 mit benutzerdefiniertem Protokoll C2-Befehle erkannt Systeminformationen werden an gegnerisches Element gesendet Regelmäßiger Rückruf an gegnerisches Element Tertiärer Beteiligter Eigenes Element Benutzerarbeitsstation Tertiärer Beteiligter Eigenes Element Benutzerarbeitsstation Primäre Beziehung Downloads einer PDF-Datei durch das eigene Element Umleitung aufgrund einer Anzeige auf einer legalen Website Hauptbeteiligter Gegnerisches Element Hält eine schädliche Domäne vor Hauptbeteiligter Eigenes Element Benutzerarbeitsstation Abbildung 15.5: Beziehungen aller Beteiligter Zusammenfassung des Zwischenfalls Das zuvor gezeigte Beispiel beruht auf einem tatsächlichen Zwischenfall. Durch einen systematischen Analyseprozess, bei dem wir die beteiligten Hosts und die Beziehungen zwischen ihnen identifizierten, konnten wir nicht nur bestimmen, ob tatsächlich ein Einbruch erfolgt war, sondern auch weitere betroffene Hosts entdecken, die in dem Alarm nicht genannt worden waren. Dieses Beispiel zeigt deutlich, wie ein klar gegliederter Prozess Analytikern helfen kann, von A nach B zu gelangen, ohne sich zu verzetteln oder von einer Informationsflut überwältigt zu werden, was in einer Situation wie dieser nur zu leicht geschehen kann. Der Schlüssel zum Erfolg besteht darin, jeden Schritt so durchzuführen, wie er gedacht ist, und nicht zu weit vom Pfad abzuweichen. Wenn Sie auf dem Weg bleiben, wird er Sie schließlich ans Ziel führen. 15.1.2 Differenzielle Diagnose NSM-Analytiker untersuchen die von Erkennungsmechanismen ausgelösten Alarme, indem sie verschiedene Datenquellen zurate ziehen, Tests durchführen und Nachforschungen anstellen, um herauszufinden, ob eine Verletzung der Netzwerksicherheit vorliegt. Das ähnelt der Vorgehensweise von Ärzten, die die von einem Patienten geschilderten Symptome untersuchen, indem sie verschiedene Datenquellen zurate ziehen, Tests durchführen und Nachforschungen anstellen, um herauszufinden, ob schädliche Einflüsse das Immunsystem des Patienten überwunden haben. Beide verbinden die Punkte, um zu ermitteln, ob etwas Gefährliches vor sich gegangen ist oder immer noch vor sich geht. 510 15 Der Analysevorgang Im Gegensatz zum NSM, bei dem es sich um eine relativ neue Entwicklung handelt, gibt es die Medizin schon seit Jahrhunderten, weshalb sie bei der Entwicklung von Diagnosemethoden einen gehörigen Vorsprung hat. Eine der in der klinischen Medizin am häufigsten eingesetzten Methoden ist die differenzielle Diagnose. Wenn Sie jemals eine Folge von Dr. House gesehen haben, kennen Sie den Vorgang wahrscheinlich schon. Einer Gruppe von Ärzten wird eine Liste von Symptomen genannt, woraufhin sie auf einer Tafel eine Liste möglicher Diagnosen aufstellen. Danach werden Nachforschungen und Tests angestellt, um nacheinander die einzelnen möglichen Ursachen auszuschließen, bis nur noch eine übrig ist. Die in der Fernsehserie angewendeten Methoden sind zwar oft ziemlich unkonventionell, aber der Vorgang als solcher ist nichtsdestotrotz eine differenzielle Diagnose. Diese Methode beruht auf dem Ausschlussverfahren. Sie besteht aus fünf Schritten, wobei in manchen Fällen jedoch auch nur zwei erforderlich sein können. Der Vorgang läuft wie folgt ab: Schritt 1: Bestimmen und Auflisten der Symptome In der Medizin werden die Symptome gewöhnlich mündlich von der Person geschildert, die darunter leidet. Beim NSM ist ein Symptom gewöhnlich ein Alarm, der von einem Intrusion-Detection-System oder einer Erkennungssoftware ausgelöst wurde. In diesem Schritt geht es zunächst um die ursprünglichen Symptome, wobei jedoch nach der Durchführung von zusätzlichen Tests oder Untersuchungen weitere Symptome hinzukommen können. Schritt 2: Untersuchung der häufigsten Diagnose Jeder Medizinstudent lernt in seinem ersten Jahr den Lehrsatz: »Wenn Sie Hufe klappern hören, halten Sie nach Pferden Ausschau – nicht nach Zebras.« Das besagt, dass die häufigste Diagnose wahrscheinlich die richtige ist und daher als erste untersucht werden sollte. Analytiker sollten daher zunächst das tun, was erforderlich ist, um diese Diagnose zu bestätigen. Wenn das nicht möglich ist, geht es mit dem nächsten Schritt weiter. Schritt 3: Auflisten aller möglichen Diagnosen für die gegebenen Symptome Der nächste Schritt im differenziellen Prozess besteht darin, eine Liste aller Diagnosen aufzustellen, die aufgrund der zurzeit verfügbaren Informationen und ursprünglichen Symptome möglich sind. Das erfordert Kreativität und ist vor allem dann erfolgreich, wenn mehrere Analytiker ihren Beitrag dazu leisten. Wenn die häufigste Diagnose im vorherigen Schritt nicht bestätigt, aber auch nicht vollständig ausgeschlossen werden konnte, gehört sie auch auf diese Liste. 15.1 Analysemethoden 511 Schritt 4: Ordnen der Liste von möglichen Diagnosen nach dem Schweregrad Nachdem die Ärzte die Liste der möglichen Diagnosen aufgestellt haben, ordnen sie sie nach Priorität, wobei die Diagnose, die den lebensbedrohlichsten Zustand darstellt, an die Spitze gesetzt wird. Ebenso ordnen auch NSM-Analytiker ihre Liste danach, welche Befunde die größte Bedrohung für die Sicherheit des Netzwerks ihrer Organisation darstellen. Wie die Prioritäten gesetzt werden, hängt sehr stark von der Natur des Unternehmens ab. Ein Einbruch in eine MySQL-Datenbank mit Root-Berechtigungen ist für ein Unternehmen, dessen Datenbank Kreditkartennummern enthält, weitaus schwerwiegender als für ein Unternehmen, das nur eine Datenbank mit dem Schichtplan der Mitarbeiter unterhält. Schritt 5: Sukzessiver Ausschluss der möglichen Diagnosen, beginnend mit der schwerwiegendsten Die meisten Aktivitäten finden im letzten Schritt statt. Hier führen die Analytiker alle erforderlichen Maßnahmen auf, um die möglichen Diagnosen nach und nach von der Liste zu entfernen, wobei sie mit derjenigen beginnen, die die größte Bedrohung für die Sicherheit des Netzwerks darstellt. Dabei müssen für die einzelnen Diagnosen Tests durchgeführt, Nachforschungen angestellt und weitere Datenquellen untersucht werden, um sie als eine Möglichkeit auszuschließen. In manchen Fällen kann die Untersuchung einer Diagnose auch gleich mehrere andere ausschließen, was den Vorgang beschleunigt. Es kann aber auch sein, dass sich bei der Untersuchung von einigen möglichen Diagnosen keine eindeutigen Schlüsse ziehen lassen, sodass sie nicht definitiv ausgeschlossen werden können. Das ist akzeptabel, da es beim Network Security Monitoring (wie in der Medizin) Anomalien gibt, die vorläufig nicht erklärt werden können und eine weitere Beobachtung erfordern, bevor eine abschließende Diagnose gestellt werden kann. Letzten Endes aber soll in diesem Schritt nur noch eine einzige Diagnose übrig bleiben, sodass ein Zwischenfall erklärt oder das Ereignis als Fehlalarm abgetan werden kann. Denken Sie immer daran, dass »normale Kommunikation« eine gültige Diagnose ist. Tatsächlich ist es die Diagnoe, die NSM-Analytiker am häufigsten stellen werden. 512 15 Der Analysevorgang Schri 1 Bes mmen und Auflisten der Symptome Schri 2 Untersuchung der häufigsten Diagnose Schri 3 Auflisten aller möglichen Diagnosen für die gegebenen Symptome Schri 4 Ordnen der Liste von möglichen Diagnosen nach dem Schweregrad Schri 5 Sukzessiver Ausschluss der möglichen Diagnosen, beginnend mit der schwerwiegendsten Abbildung 15.6: Der Analyseprozess der differenziellen Diagnose Beispiele für die differenzielle Diagnose Sehen wir uns nun einige Beispiele dafür an, wie die differenzielle Diagnose in der Praxis abläuft. Da dieser Vorgang sehr unterschiedlich sein kann, betrachten wir zwei verschiedene Situationen. Beispiel 1 Schritt 1: Bestimmen und Auflisten der Symptome. In IDS-Alarmen und bei der Untersuchung der unmittelbar verfügbaren Daten wurden folgende Symptome beobachtet: 1. Ein eigener Host sendet Datenverkehr an eine russische IP-Adresse. 2. Dieser Datenverkehr tritt regelmäßig alle 10 Minuten auf. 3. Es handelt sich um HTTPS-Datenverkehr über Port 443, weshalb er verschlüsselt und nicht lesbar ist. Schritt 2: Untersuchung der häufigsten Diagnose. Angesichts dieser Symptome scheint die logischste Annahme darin zu bestehen, dass der Computer mit Malware infiziert ist und nach Hause telefoniert, um weitere Anweisungen zu bekommen, denn schließlich wendet er sich alle 10 Minuten an die russische IP-Adresse. All diese Umstände sind zwar durchaus beachtenswert (sonst hätte ich sie hier auch nicht aufgeführt), aber ich glaube trotzdem, dass wir uns nicht so schnell auf die Malwaretheorie versteifen sollten. Der geografische Standort einer IP-Adresse wird meistens überbewertet. Dass es sich um eine russische IP-Adresse handelt, sagt zunächst einmal nicht viel aus. Es gibt auch viele normale Kommunikationsmechanismen, die in regelmäßigen Zeitabständen durchgeführt 15.1 Analysemethoden 513 werden, beispielsweise für Webchats, RSS-Feeds, webgestützte E-Mail, Aktienticker, Softwareupdates usw. Wenn wir nach dem Prinzip vorgehen, dass alle Pakete gut sind, sofern wir nicht das Gegenteil bewiesen haben, muss die wahrscheinlichte Diagnose hier lauten, dass es sich um normalen Datenverkehr handelt. Es kann jedoch schwer sein zu bestätigen, dass etwas normal ist. In diesem Fall könnten wir dazu Informationen über die russische IP-Adresse einholen. Auch wenn sie in Russland beheimatet ist, kann sie durchaus einer legitimen Organisation gehören. Wenn wir Recherchen über die IP-Adresse anstellen und feststellen, dass sie für einen renommierten Hersteller von Antiviruslösungen registriert ist, können wir daraus schließen, dass hier ein Antivirusprogramm nach Updates sucht. Wenn Sie auch den URL kennen, zu dem der HTTPS-Datenverkehr gerichtet ist, können Sie in Google danach suchen, um herauszufinden, ob es sich um eine legitime Website, eine Malwareplattform oder eine Steuerzentrale für ein Botnetz handelt. Eine andere Technik besteht darin, die Systemprotokolle und die Protokolle des Host-IDS darauf zu untersuchen, ob auf dem betroffenen Computer in denselben Zeitabständen verdächtige Aktivitäten ablaufen, in denen auch der Datenverkehr auftritt. Sie können auch Informationen über den eigenen Host einholen. Stammt der Benutzer etwa aus Russland? Läuft auf dem Computer ein Antivirusprodukt, für das es Updateserver in Russland gibt (wie es bei Kaspersky der Fall ist)? All dies kann Ihnen dabei helfen herauszufinden, ob es sich um normalen Datenverkehr handelt oder nicht. Für dieses Beispiel nehmen wir an, dass wir nicht in der Lage waren, eindeutig zu erkennen, ob es sich um normale Kommunikation gehandelt hat oder nicht. Schritt 3: Auflisten aller möglichen Diagnosen für die gegebenen Symptome. Für die vorliegende Situation gibt es mehrere mögliche Ursachen. Der Kürze halber beschränken wir uns hier nur auf die folgenden: Normale Kommunikation. Da wir diese Möglichkeit im vorherigen Schritt nicht komplett ausschließen konnten, müssen wir sie in diesen Schritt übernehmen. Malwareinfektion/installierte Schadlogik. Das ist eine ziemlich breit gefasste Kategorie. Bevor wir nicht wissen, ob überhaupt Malware im Spiel ist, machen wir uns gewöhnlich noch keine Gedanken über ihre konkrete Natur. Wenn Sie allerdings berechtigte Sorgen wegen einer bestimmten Malware haben, dann können Sie sie als eigenen Eintrag in die Liste aufnehmen. Das ist ungefähr so, als ob ein Arzt »bakterielle Infektion« in dem Bewusstsein auf die Liste schreibt, dass er die konkrete Natur dieser Infektion genauer bestimmen kann, sobald er mehr Informationen hat. Datendiebstahl von dem betroffenen Host. Dies bedeutet, dass der Host in kurzen Abständen vertrauliche Informationen nach draußen sendet. Solche Vorfälle treten oft im Rahmen gezielter Angriffe auf. Fehlkonfiguration. Es kann durchaus möglich sein, dass sich ein Systemadministrator bei der Eingabe einer IP-Adresse vertippt hat, weshalb eine Software, die eigentlich regelmäßig mit einem internen System kommunizieren soll, jetzt ständig versucht, sich an die russische Adresse zu wenden. So etwas geschieht sogar ziemlich häufig. 514 15 Der Analysevorgang Schritt 4: Ordnen der Liste von möglichen Diagnosen nach dem Schweregrad. Die Sortierung der erkannten möglichen Ursachen nach dem Schweregrad hängt sehr stark vom Risikoprofil der Organisation ab. In diesem Fall habe ich die Diagnosen wie folgt geordnet: Priorität 1: Datendiebstahl von dem betroffenen Host Priorität 2: Malwareinfektion/installierte Schadlogik Priorität 3: Fehlkonfiguration Priorität 4: Normale Kommunikation Schritt 5: Sukzessiver Ausschluss der möglichen Diagnosen, beginnend mit der schwerwiegendsten. Jetzt können wir Daten sammeln und Tests durchführen, um die einzelnen möglichen Ursachen auszuschließen. Dieser Vorgang endet, wenn Sie die richtige Diagnose ermittelt haben. Zur Veranschaulichung gehen wir in diesem Beispiel jedoch alle möglichen Diagnosen durch. Priorität 1: Datendiebstahl von dem betroffenen Host. Diese Möglichkeit auszuschließen kann schwierig sein, denn da der Datenverkehr verschlüsselt ist, helfen Ihnen auch die FPC-Daten nicht weiter. Falls Sie Sitzungsdaten zur Verfügung haben, können Sie immerhin den Umfang der gesendeten Daten ermitteln. Gehen in den 10-Minuten-Abständen immer nur wenige Bytes nach draußen, handelt es sich wahrscheinlich nicht um Datendiebstahl, da dabei viel größere Mengen von Daten übertragen werden. Es kann sich auch lohnen nachzuforschen, ob andere Hosts in Ihrem Netzwerk mit derselben IP-Adresse oder mit anderen IP-Adressen im selben Adressraum kommunizieren. Der Vergleich des möglicherweise schädlichen Datenverkehrs mit einem Referenzwert für die normale Kommunikation kann ebenfalls wichtige Einsichten liefern. Dazu können Sie Informationen aus der Aufklärung über eigene Elemente einsetzen, z. B. PRADS-Daten. Priorität 2: Malwareinfektion/installierte Schadlogik. Wenn Sie bei Ihren Untersuchungen so weit gekommen sind, sollten Sie schon eine gute Vorstellung davon haben, ob dies die Ursache ist oder nicht. Es ist durchaus wahrscheinlich, dass Sie diese Diagnose bei der Untersuchung der Möglichkeit eines Datendiebstahls ausschließen oder bestätigen können. Neben den Maßnahmen, die in dem entsprechenden Schritt beschrieben wurden, können Sie auch die Protokolle von Netzwerk-Antivirusprogrammen und dem Host-IDS genau untersuchen. Priorität 3: Fehlkonfiguration. Diese Möglichkeit lässt sich am besten dadurch untersuchen, dass Sie den verdächtigen Datenverkehr mit dem Datenverkehr anderer eigener Hosts vergleichen, die in Ihrem Netzwerk eine ähnliche Rolle spielen. Wenn jede Arbeitsstation im selben Subnetz das gleiche Verkehrsmuster aufweist, dabei aber andere IP-Adressen anruft, ist es wahrscheinlich, dass an irgendeiner Stelle eine falsche IP-Adresse eingegeben wurde. Auch in den Systemprotokollen von Windows- und Unix-Hosts können sich Hinweise darauf finden, ob eine Fehlkonfiguration vorliegt. Priorität 4: Normale Kommunikation. Wenn Sie bis hierhin gekommen sind, ist »normale Kommunikation« die einzige mögliche Diagnose, die noch übrig ist. 15.1 Analysemethoden 515 Abschließende Diagnose. Jetzt müssen Sie sich auf Ihre Erfahrung als Analytiker und Ihre Intuition verlassen, um zu entscheiden, ob wirklich etwas Schädliches vor sich geht oder nicht. Wenn Sie die vorstehende Analyse bis hierhin gründlich durchgeführt haben, dann bedeutet das im Prinzip, dass alle Pakete gut sind, sofern nicht das Gegenteil bewiesen ist, dass Ihre abschließende Diagnose »normale Kommunikation« lauten muss. Sollten Sie aber trotzdem das Gefühl haben, dass etwas nicht mit rechten Dingen zugeht, sollten Sie sich nicht scheuen, den Host weiterhin zu beobachten und die Situation erneut zu bewerten, sobald Sie weitere Daten zur Verfügung haben. Beispiel 2 Schritt 1: Bestimmen und Auflisten der Symptome. In IDS-Alarmen und bei der Unter­ suchung der unmittelbar verfügbaren Daten wurden folgende Symptome beobachtet: 1. Ein Webserver in der DMZ empfängt erhebliche Mengen eingehenden Daten­ verkehrs. 2. Dieser eingehende Datenverkehr ist nicht lesbar und möglicherweise verschlüsselt oder verschleiert. 3. Der Datenverkehr geht auf dem internen Host an mehreren Zielports ein. 4. Es handelt sich um UDP-Datenverkehr. Schritt 2: Untersuchung der häufigsten Diagnose. Da es sich um erhebliche Mengen von Datenverkehr handelt, der an den internen Host geht, und dabei das Protokoll UDP mit zufälligen Zielports verwendet wird, liegt die Vermutung nahe, dass es sich um eine Form von Denial-of-Service-Angriff handelt. Am schnellsten lässt sich diese mögliche Ursache dadurch überprüfen, dass Sie den Umfang des empfangenen Datenverkehrs mit dem vergleichen, was normalerweise auf diesem Host eingeht. Das können Sie sehr leicht mit den Sitzungsdaten und Durchsatzstatistiken tun, die wir in Kapitel 11 besprochen haben. Wenn der Host nur 20 % mehr Datenverkehr empfängt als gewöhnlich, sollen Sie sich lieber nach einer anderen Erklärung umsehen. Ist der Datenverkehr aber um einen Faktor 10 oder gar 100 umfangreicher als üblich, ist ein DoS-Angriff sehr wahrscheinlich. Denken Sie daran, dass auch ein unbeabsichtigter DoSAngriff ein DoS-Angriff ist. Auch hier werden wir zur Veranschaulichung davon ausgehen, dass wir in diesem Schritt keine klare Entscheidung treffen konnten, ob ein DoS-Angriff vorliegt. Schritt 3: Auflisten aller möglichen Diagnosen für die gegebenen Symptome. Für die vorliegende Situation gibt es mehrere mögliche Ursachen. Der Kürze halber beschränken wir uns auf die folgenden: Denial of Service. Da wir diese Möglichkeit im vorherigen Schritt nicht komplett ausschließen konnten, müssen wir sie in diesen Schritt übernehmen. 516 15 Der Analysevorgang Normale Kommunikation. Es mag sehr unwahrscheinlich klingen, ist aber trotzdem denkbar, dass es sich hierbei um normalen Datenverkehr durch einen legitimen Dienst handelt. Fehlgeleiteter Angriff. Angreifer fälschen oft die Quelladresse, um anonym zu bleiben und zu verhindern, dass sie selbst Opfer eines DoS-Angriffs werden. Das führt dazu, dass der Besitzer der falschen Adresse den betreffenden Datenverkehr wahrnimmt. Es kann sein, dass der Webserver in unserem Beispiel die Auswirkungen eines solchen Vorgangs sieht. Falsch konfigurierter externer Host. Eine Fehlkonfiguration kann in einem fremden Netzwerk genauso vorkommen wie in Ihrem. Das kann dazu führen, dass ein externer Host Datenverkehr an Ihren Webserver sendet. Spamrelais. Der Server kann fehlkonfiguriert oder übernommen worden sein, sodass er zur Weiterleitung von Spammails über das Internet missbraucht wird. Schritt 4: Ordnen der Liste von möglichen Diagnosen nach dem Schweregrad. Die Sortierung der erkannten möglichen Ursachen nach dem Schweregrad hängt sehr stark vom Risikoprofil der Organisation ab. In diesem Fall habe ich die Diagnosen wie folgt geordnet: Priorität 1: Denial of Service Priorität 2: Spamrelais Priorität 3: Falsch konfigurierter externer Host Priorität 4: Fehlgeleiteter Angriff Priorität 5: Normale Kommunikation Schritt 5: Sukzessiver Ausschluss der möglichen Diagnosen, beginnend mit der schwerwiegendsten. Jetzt können wir Daten sammeln und Tests durchführen, um die einzelnen möglichen Ursachen auszuschließen. Dieser Vorgang endet, wenn Sie die richtige Diagnose ermittelt haben. Zur Veranschaulichung gehen wir in diesem Beispiel jedoch alle möglichen Diagnosen durch. Priorität 1: Denial of Service. Diese Möglichkeit haben wir bereits untersucht, ohne dabei zu einer eindeutigen Diagnose zu kommen. Auch wenn es sich um die schwerwiegendste Ursache handelt, müssen wir zunächst damit weitermachen, die anderen Möglichkeiten auszuschließen, um herauszufinden, ob es sich tatsächlich um einen DoS-Angriff handelt. Je nachdem, welche Auswirkungen der Vorfall hat, kann es jedoch sinnvoll sein, das Problem zunächst einmal einzudämmen, indem Sie den entsprechenden Datenverkehr blockieren, bevor Sie Ihre Zeit der Suche nach der Ursache widmen. Priorität 2: Spamrelais. Diese Möglichkeit lässt sich relativ leicht ausschließen. Wenn der Server tatsächlich als Mailrelais missbraucht wird, dann können Sie nicht nur sehr viel eingehenden, sondern auch eine entsprechende Menge ausgehenden Datenverkehrs beobachten. Ist das nicht der Fall – geht also kein Datenverkehr in unnormalem Umfang von dem Server aus –, dann handelt es sich wahrscheinlich nicht um ein Spamrelais. Das können Sie herausfinden, indem Sie aus den Sitzungsdaten Durchsatzstatistiken erstellen, wie 15.1 Analysemethoden 517 wir es in Kapitel 11 besprochen haben. Wenn auf dem Webserver auch Maildienste laufen, sollten Sie sich auch deren Protokolle ansehen. Ist der Server dagegen nicht für Maildienste vorgesehen, überprüfen Sie ihn darauf, ob er sie ohne Autorisierung doch ausführt. Priorität 3: Falsch konfigurierter externer Host. Dies ist gewöhnlich ein ziemlich kniffliges Problem. Sofern Sie den Besitzer der IP-Adresse nicht kennen und mit ihm sprechen können, bleibt Ihnen meistens nichts anderes übrig, als den Datenverkehr lokal zu sperren oder eine Missbrauchsmeldung bei dem zuständigen Provider einzureichen. Priorität 4: Fehlgeleiteter Angriff. Dies ist aus ähnlichen Gründen wie im vorherigen Fall schwierig. Wenn die Kapriolen irgendeines unbekannten Angreifers dafür sorgen, dass Datenverkehr zu Ihrem Server umgeleitet wird, dann können Sie meistens nichts anderes tun, als das Problem dem für die IP-Adresse zuständigen Provider zu melden und den Datenverkehr lokal zu blockieren. Priorität 5: Normale Kommunikation. Das mag unwahrscheinlich klingen, aber solange Sie keinen Referenzwert für den normalen Datenverkehr auf diesem Host haben, können Sie es nicht mit Sicherheit ausschließen. Informationen über den eigenen Host, die Sie mit einem Tool wie PRADS gewonnen haben, in Kombination mit einer Untersuchung der Sitzungsdaten ermöglichen es Ihnen, den auf dem Host anfallenden Datenverkehr zu ähnlichen Zeitpunkten am Vortag zu vergleichen und daraus Schlüsse zu ziehen. Ist das Kommunikationsmuster normal und nur der Umfang anomal? Hat der Server jemals zuvor mit der verdächtigen IP-Adresse kommuniziert? Die Beantwortung dieser Fragen kann Ihnen wichtige Fingerzeige geben. Abschließende Diagnose. Bei diesem Beispiel kann es sein, dass Sie am Ende drei mögliche Ursachen haben, die Sie nicht ausschließen können. Zum Glück können Sie aber bei allen diesen Möglichkeiten Maßnahmen zur Eindämmung oder Linderung des Problems einleiten. Damit sind Sie durch die Diagnose immerhin in eine Lage gekommen, in der sich das Netzwerk von dem Vorfall erholen kann. Das ist ungefähr so, als ob ein Arzt zwar weiß, dass bei einem Patienten eine Infektion vorliegt, und ihre genaue Natur zwar nicht bestimmen kann, aber wenigstens weiß, dass eine Behandlung mit Antibiotika das Problem lösen wird. Wenn der Datenverkehr nicht so umfangreich ist, dass er die Ausführung von Diensten behindert, brauchen Sie die Aktivitäten möglicherweise gar nicht zu blockieren. Dadurch haben Sie die Gelegenheit, sie weiter zu beobachten, um noch mehr Informationen zu gewinnen, die zu einer genauen Diagnose führen können. 15.1.3 Umsetzen der Analysemethoden Die beiden hier beschriebenen Analysemethoden sind sehr unterschiedlich. Es gibt keine eindeutige Formel, um die richtige auszuwählen, da beide ihre Stärken und Schwächen haben. Welche Vorgehensweise besser geeignet ist, hängt von der vorliegenden Situation und von den Stärken und Schwächen des Analytikers ab. Nach meiner Erfahrung eignet sich die relationale Untersuchung bei komplizierten Vorfällen am besten, in die mehrere Hosts 518 15 Der Analysevorgang verwickelt sind. Das liegt daran, dass Sie bei dieser Vorgehensweise den Überblick über eine große Anzahl von Beteiligten und Beziehungen bewahren können, ohne überfordert zu werden und auf Irrwege zu geraten. Die differenzielle Diagnose dagegen funktioniert am besten in Situationen mit nur wenigen Hosts, bei denen Sie einige klar ausgeprägte Symptome festgestellt haben. Wichtig ist, sich nicht buchstabengetreu an diese Methoden zu klammern. Sie stellen lediglich ein Grundgerüst dar, das Sie an Ihre Umgebung anpassen müssen. Jede Analyse profitiert von einer systematischen Vorgehensweise, die es den Analytikern erlaubt, ihre Untersuchungen effizient durchzuführen. 15.2 Empfohlene Vorgehensweisen für die Analyse Ich habe überall in diesem Buch schon verschiedene empfohlene Vorgehensweisen für die Analyse erwähnt. Jeder geht bei der Analyse nach seinem eigenen Stil vor, aber es gibt einige Grundsätze, deren Beachtung ich immer als vorteilhaft erachtet habe. Die folgenden empfohlenen Vorgehensweisen beruhen auf den jahrelangen Erfahrungen der Autoren dieses Buches und unserer Kollegen. 15.2.1 Bei Paketen können Sie sich auf nichts verlassen Bei der Analyse spielen Annahmen und fundierte Vermutungen eine große Rolle. Die meisten Entscheidungen treffen Sie auf der Grundlage eines Pakets oder eines Protokoll­ eintrags sowie zusätzlicher Daten. Sobald neue Informationen hinzukommen, können sich diese Annahmen und Vermutungen aber ändern. Doch keine Sorge, das ist ein ganz normaler Vorgang. Fragen Sie mal Ihren Arzt oder Apotheker! Der Großteil von deren Arbeit beruht ebenfalls auf Annahmen, und sie sind damit sehr erfolgreich. Was Sie sich merken sollten, ist, dass es bei der Analyse kaum etwas gibt, auf das Sie sich verlassen können, weshalb es sinnvoll ist, alle Annahmen und Vermutungen ständig zu überprüfen. Handelt es sich bei der IP-Adresse wirklich um einen bekannten legitimen Host? Gehört die Domäne wirklich zum Unternehmen XYZ? Soll der DNS-Server wirklich mit dem Datenbankserver kommunizieren? Stellen Sie immer Ihre eigenen Annahmen infrage und bleiben Sie wachsam. 15.2.2 Machen Sie sich klar, wie die Daten abstrahiert werden Als Analytiker stützen Sie sich bei Ihrer Arbeit auf Daten, z. B. auf PCAP-Dateien, PSTREinträge oder IIS-Dateien. Da Sie beim Umgang mit diesen Daten meistens mehrere Werkzeuge einsetzen, müssen Sie immer im Hinterkopf behalten, was diese Werkzeuge mit den Daten machen. Manche »Features« solcher Tools können Daten verschleiern und eine korrekte Analyse verhindern. 15.2 Empfohlene Vorgehensweisen für die Analyse 519 Ich habe einmal für eine Organisation gearbeitet, die eine weit verbreitete kommerzielle SIEM-Lösung eingesetzt hat. Eines Tages entdeckten wir in der SIEM-Konsole merkwürdige Protokolleinträge, nach denen interner Datenverkehr in großem Umfang zu Port 80 an der IP-Adresse 255.255.255.255 ging. Eine genauere Untersuchung der Daten ergab, dass es sich bei diesem Datenverkehr um interne HTTP-Anforderungen handelte, die von einem Webproxy blockiert wurden. Eine Aktualisierung des Parsers, den das SIEM-System nutzte, um Datensätze von diesem Proxy zu verarbeiten, hatte dazu geführt, dass er nicht mehr wusste, wie er mit dem Feld für die IP-Zieladresse umgehen sollte, was zu dem falschen Wert 255.255.255.255 führte. Dieses Beispiel zeigt, wie wichtig es ist, sich immer darüber im Klaren zu sein, wie stark die Daten abstrahiert werden. In einem Beruf, bei dem die Verwendung von Daten das A und O ist, ist es unverzichtbar zu wissen, wie Ihre Werkzeuge sich auf die Daten auswirken. 15.2.3 Vier Augen sehen mehr als zwei Es hat seinen Grund, dass Lektoren die Werke von Autoren lesen, dass Polizeibeamte zu zweit arbeiten und in Raketensilos immer zwei Personen auf Wache sind. Wie viel Erfahrung Sie auch immer haben und wie gut Sie auch sein mögen, irgendetwas werden Sie trotzdem übersehen, denn niemand arbeitet stets und ständig zu 100 % effizient. Schließlich sind wir alle nur Menschen. Da ich aus der Rüstungsindustrie komme, schaue ich mir bei der Untersuchung von Netzwerkverkehr als Erstes das Quell- und Zielland an. Ich weiß zwar, dass die Angaben über den geografischen Standort meistens irrelevant sind, da sie sich leicht fälschen lassen oder nur die Lage eines weiteren geknackten Hosts angeben, der von jemandem in einem ganz anderen Land gesteuert wird. Aber diese Vorgehensweise ist mir in Fleisch und Blut übergegangen. Viele meiner Kollegen sind ehemalige Systemadministratoren, weshalb sie als Erstes nach den Portnummern schauen. Ich habe auch schon mit Personen zusammengearbeitet, die ursprünglich mit rechenintensiver Datenverarbeitung zu tun hatten, und sie fragen als Erstes nach der Menge der übertragenen Daten. Dies zeigt, dass unsere Erfahrungen unsere Vorgehensweise formen. Dadurch kann der Datenverarbeiter etwas erkennen, was dem Systemadministrator nicht auffällt, und der Rüstungsexperte wiederum sieht etwas, was der Datenverarbeiter nicht wahrnimmt. Lassen Sie nach Möglichkeit immer ein zweites Paar Augen einen Blick auf das vorliegende Problem werfen. In Sicherheitsteams setze ich gewöhnlich eine Zwei-PersonenRegel durch, laut der immer mindestens zwei Analytiker erforderlich sind, um einen Zwischenfall zu konstatieren. 15.2.4 Laden Sie einen Angreifer niemals zum Tanz ein Mein Mitarbeiter Mike Poor, leitender SANS-Ausbilder und Paketninjameister, hat es auf den Punkt gebracht: »Laden Sie einen Angreifer niemals zum Tanz ein!« Für Analytiker 520 15 Der Analysevorgang kann es eine große Versuchung sein, eine gegnerische IP-Adresse genauer zu untersuchen, als es mit konventionellen Mitteln möglich ist. Es gab viele Gelegenheiten, bei denen es mich gereizt hat, einen Portscan an einem gegnerischen Computer durchzuführen, der schlecht zusammengestellte UDP-Pakete an mein Netzwerk sendete. Jedes Mal, wenn jemand einen DoS-Angriff auf ein Netzwerk zu starten versucht, für dessen Schutz ich verantwortlich bin, wünsche ich mir nichts sehnlicher, als über seine unvorbereitete DSLVerbindung die tobende Gewalt eines /8-Netzwerks loszulassen. Das Problem dabei ist jedoch, dass wir in 99 % der Fälle nicht wissen, mit wem oder was wir es zu tun haben. Auch wenn Sie nur einen Scan erkennen, kann es sein, dass der Host, von dem dieser Datenverkehr stammt, von einer großen Gruppe von Angreifern oder sogar vom Militär eines anderen Landes betrieben wird. Selbst etwas so Harmloses wie ein Ping kann einen Angreifer auf Sie aufmerksam machen und dazu veranlassen, seine Taktik zu ändern, andere Quellhosts zu verändern oder sogar seine Anstrengungen zu verstärken. Sie wissen nicht, mit wem Sie es zu tun haben, was er beabsichtigt und wozu er fähig ist. Daher sollten Sie ihm niemals auch nur den kleinen Finger hinhalten, denn Sie wissen nicht, ob Sie in der Lage sein werden, mit den Folgen fertig zu werden. 15.2.5 Pakete sind von Natur aus gut Einer der großen Streitfragen im Leben dreht sich darum, ob die Menschen von Natur aus gut oder von Natur aus böse sind. Dieselben Standpunkte gibt es auch bei Paketen: Manche Analytiker gehen davon aus, dass sie von Natur aus böse sind, andere dagegen halten sie für von Natur aus gut. Nach meiner Erfahrung neigen Analytiker am Anfang ihrer Karriere dazu, Pakete als generell böse einzuschätzen, gehen dann aber mehr und mehr zu der Ansicht über, dass sie im Grunde genommen gut sind. Das liegt daran, dass es schlicht unmöglich ist, jede einzelne im Netzwerk übertragene Information als etwas zu behandeln, was eine Bedrohung auf Root-Ebene darstellen könnte. Wenn Sie so vorgingen, würden Sie schließlich gefeuert, weil Sie den lieben langen Tag lang versuchen, einem einzigen Alarm auf die Spur zu kommen; oder sie brechen einfach vor Erschöpfung zusammen. Gründlichkeit ist sicherlich nichts Verkehrtes, aber es ist nun einmal Tatsache, dass der Großteil des Datenverkehrs in einem Netzwerk nicht böse ist, weshalb Sie Pakete grundsätzlich als unschuldig ansehen sollten, solange nicht das Gegenteil bewiesen ist. 15.2.6 Wireshark macht so wenig einen Analytiker wie ein Teleskop einen Astronomen Wenn ich ein Einstellungsgespräch für die Stelle eines Analytikers (oberhalb des Einsteigerniveaus) führe, bitte ich den Kandidaten immer zu beschreiben, wie er einen typischen IDS-Alarm untersuchen würde. Damit möchte ich mir über seinen Denkprozess klarwerden. Nicht selten aber erhalte ich dabei Antworten wie: »Ich verwende Wireshark, Network Miner, Netwitness und Arcsight.« Und das war es dann auch schon. 15.2 Empfohlene Vorgehensweisen für die Analyse 521 Es gibt es zwar Prozesse und wissenschaftliche Vorgehensweisen, um ein Network Security Monitoring durchzuführen, aber NSM ist mehr als das. Anderenfalls wäre es gar nicht nötig, überhaupt noch Menschen einzubeziehen. Einem guten Analytiker muss klar sein, dass die vielen verschiedenen Werkzeuge zwar unentbehrlich sind, um die Aufgaben zu erledigen, aber nur Teile des Gesamtkunstwerks darstellen. Für einen Astronomen ist ein Teleskop nur eines von vielen Werkzeugen, mit denen er Erkenntnisse über den Lauf der Gestirne gewinnt, und ebenso ist auch Wireshark nur eines von vielen Werkzeugen, die Analytiker einsetzen, um herauszufinden, wie ein Paket von A nach B gelangt. Gehen Sie von den wissenschaftlichen Grundlagen aus, nehmen Sie einige Werkzeuge und formale Prozesse hinzu, behalten Sie das Gesamtbild im Auge und beachten Sie die Einzelheiten. Durch die Kombination all dieser verschiedenen Elemente und der Erfahrungen, die Sie im Laufe der Zeit sammeln, werden Sie Ihre eigene Analysetechnik entwickeln. 15.2.7 Klassifizierung hilft Es wird nicht lange dauern, bis Sie sich in einer Situation wiederfinden, in der Sie mehr als ein signifikantes Ereignis auf einmal analysieren müssen. In einem Fall ist es hilfreich, ein System parat zu haben, um zu bestimmen, welcher Vorfall die Priorität für die Untersuchung genießt. In den meisten Sicherheitsorganisationen gibt es ein solches Klassifizierungssystem. Es gibt verschiedene Varianten, aber ich habe mich an das Klassifizierungssystem des US-Verteidigungsministeriums für Netzwerkzwischenfälle und -ereignisse nach CJCSM 6510 gewöhnt.1 Tabelle 15.1 führt die die einzelnen Kategorien nach ihrer Priorität auf. Tabelle 15.1: Klassifizierungssystem des US-Verteidigungsministeriums für Zwischenfälle und Ereignisse Priorität Kategorie Name Einstufung 0 0 Schulung – 1 1 Einbruch auf Root-Ebene Zwischenfall 2 2 Einbruch auf Benutzerebene Zwischenfall 3 4 Denial of Service Zwischenfall 4 7 [Installierte/ausgeführte] Schadlogik Zwischenfall 5 3 Nicht erfolgreiche versuchte Aktivität Ereignis 6 5 Nicht richtlinienkonforme Aktivität Ereignis 7 6 Aufklärung Ereignis 8 8 Untersuchung Ereignis 9 9 Erklärte Anomalie Ereignis 1 http://www.dtic.mil/cjcs_directives/cdata/unlimit/m651001.pdf 522 15 Der Analysevorgang Bericht von der Front Ereignisse im Zusammenhang mit Schadlogik bringen neue Analytiker oft zum Stolpern. Wenn Anfänger irgendeinen Hinweis auf Schadcode erkennen, klassifizieren sie das Ereignis gewöhnlich als Kategorie 7. Bei Zwischenfällen dieser Kategorie geht es jedoch um installierte oder ausgeführte Schadlogik und nicht einfach darum, dass ein System Schadcode herunterlädt. Um ein Ereignis als Kategorie 7 klassifizieren zu können, müssen Sie Belege dafür haben, dass der Schadcode tatsächlich auf einem Computer installiert oder ausgeführt wurde. Es kann zwar sein, dass sich dieses konkrete Modell nicht besonders gut für Ihre Organisation eignet, doch glaube ich, dass jede Organisation von einem Klassifizierungssystem profitiert. Wenn ein Analytiker eine erste vorläufige Überprüfung eines Ereignisses durchführt und dabei zu dem Schluss kommt, dass eine gründlichere Untersuchung angebracht ist, sollte das Ereignis immer einer Kategorie zugeordnet werden, und wenn es auch nur die Kategorie »Untersuchung« (Kategorie 8) ist. Während der Untersuchung kann sich die Kategorie mehrmals ändern, und zwar sowohl nach oben als auch nach unten. Die Kategorie und jegliche Änderungen daran sollten zusammen mit einer Erklärung durch den jeweils verantwortlichen Analytiker in dem internen Dokumentierungssystem der Organisation festgehalten werden. 15.2.8 Die Zehnerregel Neulinge auf dem Gebiet der Analyse neigen dazu, bei der Untersuchung eines Ereignisses zu viele oder zu wenige Daten abzurufen. Nehmen wir beispielsweise an, am 7. Oktober um 8.35 Uhr tritt ein Ereignis ein. Wenn ein Analytiker nun NSM-Daten für den betroffenen Host abruft, die den gesamten 7. Oktober umfassen, hat er viel zu viele Daten, um noch eine effiziente Analyse durchzuführen. Am anderen Ende des Spektrums stehen Analytiker, die sich nur die Daten für die eine Minute ansehen, in der das Ereignis stattfand. Das sind zu wenig Informationen, um bestimmen zu können, was genau geschehen ist. Um zu verhindern, dass meine Analytiker in eine dieser beiden Fallen tappen, habe ich die Zehnerregel aufgestellt. Bei der Untersuchung eines Ereignisses, das an einem konkreten Zeitpunkt stattgefunden hat, sollen sie die Daten aus dem Zeitraum von zehn Minuten vor bis zehn Minuten nach diesem Ereignis abrufen. Nach meiner Erfahrung ist dieser Zeitraum ein guter Kompromiss, durch den die Analytiker gute Daten erhalten, um herausfinden zu können, was zu dem Ereignis geführt hat und was danach geschehen ist. Nachdem sie diese Daten untersucht haben, können Sie gegebenenfalls weitere abrufen. Natürlich ist diese Regel nicht für alle Situationen ideal, aber sie hat sich in 99 % der Untersuchungen, die neue Analytiker durchführen, als wirkungsvoll erwiesen. 15.3 Morbidität und Mortalität von Zwischenfällen 523 15.2.9 Wenn Sie Hufe klappern hören, halten Sie nach Pferden Ausschau – nicht nach Zebras Diese Weisheit ist aus der Medizin ausgeborgt, wo sie den Studenten während ihrer gesamten Ausbildung immer wieder eingetrichtert wird. Wenn ein Patient mit Bauchschmerzen zu Ihnen kommt, ist es nicht sinnvoll, bei der Diagnose mit Tests für seltene Erkrankungen zu beginnen. Fragen Sie den Patienten stattdessen, was er am Abend zuvor gegessen hat. Wenn es zwei Dutzend Tacos und eine halbe Pizza waren, dann sind Sie dem Problem wahrscheinlich schon auf die Spur gekommen. Ebenso sollen Sie auch bei der Untersuchung eines Ereignisses zuerst die offensichtlichste Erklärung berücksichtigen. Wenn ein System regelmäßig Daten an einen unbekannten Webserver sendet, sollten Sie nicht gleich annehmen, dass es sich um einen Rückruf an eine gegnerische Steuerinfrastruktur handelt. Wahrscheinlich hat nur jemand eine Webseite geöffnet, die ständig nach aktuellen Sportergebnissen oder Börsenkursen sucht. Um nach diesem Prinzip arbeiten zu können, müssen Sie die zuvor angeführte »Unschuldsvermutung« akzeptieren, nach der Pakete von Natur aus gut sind. Es ist auch wichtig für die Analysemethode der differenziellen Diagnose, die wir in einem früheren Abschnitt besprochen haben. 15.3 Morbidität und Mortalität von Zwischenfällen Es mag wie ein Gemeinplatz klingen, aber durch die Stärkung des Teamworks in einer Gruppe von Analytikern betonen Sie den gemeinsamen Erfolg gegenüber dem individuellen Erfolg. Es gibt dazu viele verschiedene Möglichkeiten, darunter die Vorgehensweisen, die wir schon in Kapitel 1 kennengelernt haben, z. B. die Förderung von Superstars und die Kultivierung von Führung als Dienst. Daneben gibt es aber keinen besseren Weg, für den Erfolg eines Teams zu sorgen, als eine Kultur des Lernens aufzubauen. Das bedeutet mehr als einfach nur die Analytiker auf Fortbildungskurse zu schicken oder für Zertifizierungen zu zahlen. Es erfordert, eine Haltung anzunehmen, nach der ein Analytiker bei jeder Handlung immer entweder lehrt oder lernt – ohne Ausnahme. Wenn alle Analytiker jeden Aspekt ihrer täglichen Arbeit als eine Gelegenheit sehen, etwas Neues zu lernen oder ihren Kollegen etwas beizubringen, dann blüht und gedeiht die Kultur des Lernens. Dazu gehört es auch, sowohl aus Erfolgen als auch aus Niederlagen zu lernen. Beim NSM geht es um technische Untersuchungen von Fällen und, wenn etwas Schlimmes geschieht, um Zwischenfälle. Das ähnelt wiederum der Medizin, bei der es ebenfalls um die Untersuchung von Fällen und, wenn das Schlimmste eintritt, von Todesfällen geht. 524 15 Der Analysevorgang 15.3.1 M&M in der Medizin Wenn ein Patient stirbt und es so aussieht, als hätte sein Tod durch eine andere medizinische Behandlung verhindert oder verzögert werden können, wird der behandelnde Arzt oft zu einer sogenannten Morbiditäts- und Mortalitätskonferenz oder kurz M&M gebeten, in der er den Fall darstellt, vom ersten Besuch des Patienten mit den geschilderten Symptomen, der Krankengeschichte und den Ergebnissen der Untersuchung über die Diagnose bis zu den Behandlungsschritten, die bis zum Tod des Patienten vorgenommen wurden. An dieser Besprechung nehmen Kollegen teil, darunter alle weiteren Ärzte, die an der Behandlung des Patienten beteiligt waren, aber auch Ärzte, die gar nichts mit dem Fall zu tun hatten. Diese Kollegen hinterfragen die Behandlung, um Fehler zu entdecken, die möglicherweise gemacht wurden, Prozesse, die verbessert werden können, und Situationen, die besser auf andere Weise gehandhabt worden wären. Das Ziel einer M&M in der Medizin besteht darin, aus den aufgetretenen Komplikationen und Fehlern zu lernen, das eigene Verhalten und seine Entscheidungen aufgrund der gemachten Erfahrungen zu ändern und die Wiederholung der Fehler zu verhindern, die zu den Komplikationen geführt haben. In der Medizin wird das seit über hundert Jahren so gehandhabt und hat sich als äußerst erfolgreich erwiesen.2 15.3.2 M&M in der Informationssicherheit Weiter vorn in diesem Kapitel haben uns bereits angesehen, wie sich das Prinzip der differenziellen Diagnose von der Medizin auf die Informationssicherheit übertragen lässt. Ebenso können wir das Konzept von M&M-Konferenzen übernehmen. Wenn man auf dem Gebiet der Informationssicherheit arbeitet, ist es sehr leicht, etwas zu übersehen. Da wir wissen, dass vorbeugende Maßnahmen irgendwann versagen werden, können wir nicht erwarten, niemals mit einem tatsächlich erfolgten Einbruch konfrontiert zu werden. Stattdessen müssen wir uns so aufstellen, dass wir einen Zwischenfall erkennen und schnell darauf reagieren können. Nachdem das geschehen ist, können wir aus den Fehlern lernen, die den Einbruch ermöglicht haben, damit wir die Vorbeugung, Erkennung und Reaktion beim nächsten Mal besser machen können. Wenn ein Zwischenfall eintritt, würden wir uns gern vormachen können, dass wir ohnehin nichts dagegen hätten tun können, weil es sich um einen besonders ausgeklügelten Angriff handelt oder weil der Angreifer einen noch unbekannten Zero-Day-Exploit verwendet hat. In Wirklichkeit jedoch sind nicht alle Angriffe so kompliziert, und es gibt oft Möglichkeiten für eine schnellere Erkennung, Analyse und Reaktion. Bei der M&M auf dem Gebiet der Informationssicherheit sammeln wir solche Erkenntnisse und wenden sie an. Um aus Fehlern zu lernen, wie wir uns verbessern können, müssen wir begreifen, warum die Fehler passiert sind. In seinem Beitrag zu dem Buch Managing Strategic Surprise – Pflichtlektüre für Informationssicherheitsexperten! – fasst Uzi Arad das sehr gut 2 Campbell, W. (1988). »Surgical morbidity and mortality meetings«. Annals of the Royal College of Surgeons of England 70 (6): 363–365. PMC 2498614.PMID 3207327. 15.3 Morbidität und Mortalität von Zwischenfällen 525 zusammen.3 Er beschreibt darin drei Probleme, die zu Fehlern bei der Verwaltung von Aufklärungsinformationen führen. Diese drei Grundprobleme lassen sich auf die Informationssicherheit übertragen: •• Die falsche Wahrnehmung des Materials, die aus der Schwierigkeit herrührt, die objektive Realität oder die Realität aus der Sicht des Gegners zu begreifen. •• Das Vorherrschen vorgefasster Meinungen unter den Analytikern, die keine objektive, professionelle Deutung der Realität zulässt, die sich aus den ermittelten Informationen erkennen lässt. •• Gruppenzwang, Gruppendenken und sozio-politische Überlegungen, die die professionelle Bewertung und Analyse verzerren. Der Zweck einer M&M-Konferenz in der Informationssicherheit besteht darin, ein Forum zu bieten, in dem diese Probleme durch strategische Überprüfung erfolgter Zwischenfälle überwunden werden können. Zeitpunkt Die M&M-Konferenz wird einberufen, nachdem der Zwischenfall aufgetreten ist und behandelt wurde. Die Entscheidung, welche Zwischenfälle eine solche Konferenz erfordern, trifft gewöhnlich der Teamleiter oder ein Mitglied der Geschäftsführung, das in der Lage ist zu erkennen, ob eine Untersuchung auch besser gehandhabt worden sein könnte. Die Konferenz sollte relativ kurz nach dem Zwischenfall stattfinden, sodass die Einzelheiten noch im Gedächtnis der Beteiligten haften geblieben sind, aber es sollte auch genügend Zeit verstrichen sein, um den Vorfall komplett zu analysieren. Ein guter Zeitpunkt ist gewöhnlich eine Woche nach dem Zwischenfall. Referenten Die Darstellung der Untersuchung wird oft von mehreren Personen vorgetragen. In der Medizin kann dies der Arzt in der Notaufnahme, der Chirurg und der Hausarzt sein, in der Informationssicherheit der NSM-Analytiker, der den Zwischenfall als Erster erkannt hat, eine Krisenreaktionskraft, die den Zwischenfall eingedämmt und korrigierende Maßnahmen ergriffen hat, ein Forensiker, der den betroffenen Computer untersucht hat, oder ein Malwarespezialist, der ein Reverse Engineering der bei dem Vorfall eingesetzten Malware durchgeführt hat. Teilnehmende Kollegen Als weitere Teilnehmer an der M&M sollte mindestens je ein weiterer Vertreter der durch die Referenten vertretenen Fachgebiete anwesend sein, also beispielsweise für jeden direkt 3 Arad, Uzi (2008). »Intelligence Management as Risk Management«, in: Paul Bracken, Ian Bremmer, David Gordon (Hrsg.), Managing Strategic Surprise (S. 43–77). Cambridge: Cambridge University Press. 526 15 Der Analysevorgang in den Vorfall verwickelten NSM-Analytiker mindestens ein weiterer NSM-Analytiker, der nichts damit zu tun hat. Das dient dazu, frische Ideen einzubringen, die nicht auf das Bedürfnis beschränkt sind, die Aktionen zu rechtfertigen, die im Rahmen der Untersuchung vorgenommen wurden. Im Idealfall, der sich aber nur in großen Organisationen verwirklichen lässt, sollte es mindestens zwei zusätzliche Teilnehmer aus jedem Fachgebiet geben, wobei der eine weniger und der andere mehr Erfahrung hat als der Referent. Die Präsentation Der oder die Referenten sollten mindestens einige Tage Zeit bekommen, sich auf die Präsentation vorzubereiten. Eine M&M-Konferenz ist zwar keine formale Veranstaltung, aber es sollte trotzdem eine ordentliche Darstellung erwartet werden, die eine chronologische Übersicht über den Zwischenfall gibt und alle unterstützenden Daten einschließt. Der Referent sollte die Erkennung, Untersuchung und Wiederherstellung in der Reihenfolge des Ablaufs beschreiben und die gewonnenen Erkenntnisse an den Stellen angeben, an denen sie auch tatsächlich entdeckt wurden. Dadurch ist eine ganzheitliche Untersuchung des Zwischenfalls möglich. Die Kollegen werden dazu aufgefordert, während der Präsentation Fragen zu stellen, sobald sie auftauchen. Natürlich muss dies auf geordnete Weise durch Handheben geschehen, aber die Fragen sollten nicht bis zum Ende der Präsentation aufgeschoben werden. Das dient dazu, den Referenten auf die gleiche Weise mit den Fragen zu konfrontieren, wie es während der laufenden Untersuchung der Fall wäre. Strategische Befragung Die gestellten Fragen sollen dazu dienen herauszufinden, worum irgendetwas auf eine bestimmte Weise getan wurde oder warum es nicht anders gemacht wurde. Solche Fragen können sehr leicht als persönlicher Angriff aufgefasst werden, weshalb es wichtig ist, dass alle Teilnehmer offen an die M&M herangehen und dass sowohl Referenten als auch teilnehmende Kollegen beim Stellen und Beantworten der Fragen professionell und mit dem gebotenen Respekt vorgehen. Zu Anfang mag es für die Teilnehmer schwierig sein, Fragen zu formulieren, die konstruktiv sind und dabei helfen, die drei zuvor genannten Probleme zu überwinden. Es gibt jedoch verschiedene Möglichkeiten, die richtigen Arten von Fragen zu fördern. Advocatus Diaboli Eine Methode, die Uzi Arad in seinem Beitrag zu Managing Strategic Surprise erwähnt, ist die des Advocatus Diaboli. Dabei versuchen die Teilnehmer, praktische jede analytische Schlussfolgerung des Referenten anzuzweifeln. Dazu wird erst bestimmt, welche Schlussfolgerungen angreifbar sind, um dann Informationen aus dem Zwischenfall zu sammeln, 15.3 Morbidität und Mortalität von Zwischenfällen 527 die eine andere Annahme unterstützen. Aufgabe der Referenten ist es dann, ihre eigenen Schlussfolgerungen zu verteidigen und gegenteilige Ansichten zu widerlegen. Alternative Analyse (AA) In seinem Aufsatz »The Limits of Intelligence Analysis« stellt R. J. Heuer mehrere Methoden für die strategische Befragung vor. Sie gehören alle zu einem Satz analytischer Werkzeuge, die als alternative Analyse (AA)4 bezeichnet werden. Zu den gebräuchlicheren dieser Methoden zählen: Gruppe A/Gruppe B Bei dieser Vorgehensweise analysieren zwei Gruppen von Experten den Zwischenfall getrennt voneinander auf der Grundlage derselben Informationen. Dazu stellen die Referenten (Gruppe A) den teilnehmenden Kollegen (Gruppe B) die unterstützenden Daten zu dem Zwischenfall bereits vor der M&M bereit, sodass diese zusammenarbeiten können, um eine eigene Analyse durchzuführen, die dann während der Besprechung mit der Analyse von Gruppe A verglichen wird. Das Ziel besteht darin, zwei getrennte Gedankengänge durchzuführen. Wenn die beiden Gruppen an einzelnen Stellen zu unterschiedlichen Schlussfolgerungen gelangen, sind weitere Diskussionen erforderlich, um herauszufinden, warum das so ist. Rote-Zellen-Analyse Der Schwerpunkt dieser Methode liegt auf dem gegnerischen Standpunkt. Die teilnehmenden Kollegen nehmen hierbei die Rolle des Gegners in dem betreffenden Zwischenfall ein. Sie befragen die Referenten darüber, wie deren Untersuchungsmaßnahmen als Reaktion auf die Aktionen des Angreifers durchgeführt wurden. Beispielsweise kann es sein, dass sich die Verteidiger einzig und allein darauf konzentrieren, wie sie verhindern können, dass eine Malware Rückmeldung an den Angreifer gibt, während der Angreifer mehr daran interessiert ist, ob die Verteidiger die stattgefundene Kommunikation entschlüsseln konnten. Das kann zu einer sehr positiven Folge von Fragen führen, die wiederum in neuen Analysemethoden resultieren, um den Einfluss des Angreifers besser bewerten zu können. Davon profitiert letztendlich der Prozess zur Eindämmung von Zwischenfällen. Was-wäre-wenn-Analyse Der Hauptaugenmerk bei dieser Methode liegt auf den möglichen Ursachen und Wirkungen von Ereignissen, die gar nicht eingetreten sind. So kann ein Kollege beispielsweise Fragen, wie der Angriff hätte erkannt werden können, wenn der Mechanismus, mit dem er aufgespürt worden ist, nicht richtig funktioniert hätte. Eine Frage zur Reaktion auf einen Zwischenfall könnte etwa lauten, was die Referenten getan hätten, wenn der Angreifer nicht erst nach abgeschlossenem Datendiebstahl entdeckt worden wäre, sondern während 4 Heuer, Richards J., Jr. »Limits of Intelligence Analysis«, Orbis 49, Nr. 1 (2005) 528 15 Der Analysevorgang er noch dabei war, die Daten aus dem Netzwerk herauszuschmuggeln. Solche Fragen stehen nicht immer in einer direkten Beziehung zu dem behandelten Zwischenfall, führen aber zu sehr wertvollen Gedankenspielen, die Ihrem Team helfen können, sich besser gegen zukünftige Zwischenfälle zu wappnen. Analyse widerstreitender Hypothesen Diese Methode ähnelt der Vorgehensweise bei der differenziellen Diagnose. Hier stellen die Kollegen eine erschöpfende Liste alternativer Schlussfolgerungen aus den geschilderten Symptomen auf. Am wirkungsvollsten ist es, auf einer Whiteboardtafel alle möglichen Diagnosen aufzulisten und sie nach der Überprüfung der zusätzlichen Daten sukzessive auszuschließen und durchzustreichen. Überprüfung der zentralen Annahmen In praktisch allen Wissenschaften werden Annahmen auf der Grundlage allgemein anerkannter Fakten getroffen. Bei dieser Befragungsmethode geht es darum, die wichtigsten Annahmen und deren Auswirkungen auf die Untersuchung zu überprüfen. Diese Vorgehensweise wird oft mit einer Was-wäre-wenn-Analyse kombiniert. Betrachten wir zum Beispiel die Annahme, dass eine Malware, die in einer virtuellen Maschine ausgeführt wird, nicht die Möglichkeit hat, auf den Host oder auf andere virtuelle Maschinen auf diesem Host überzugreifen. Bei einem Zwischenfall, in dem eine virtuelle Maschine mit Malware infiziert wurde, könnte ein Teilnehmer nun die Frage stellen, welche Maßnahmen ergriffen worden wären, wenn die Malware der virtuellen Umgebung entflohen wäre und die anderen VMs auf dem Host oder den Host selbst infiziert hätte. Ergebnis der M&M Alle Teilnehmer sollten während der Durchführung der M&M Notizen machen. Nach dem Ende der Besprechung fassen die Referenten ihre Notizen zu einem Abschlussbericht zusammen, der ihrem Präsentationsmaterial und den unterstützenden Daten beigefügt wird. Dieser Bericht sollte auch alles einschließen, was man anders hätte handhaben können, sowie sämtliche Verbesserungen, die die Organisationen im Ganzen vornehmen kann, sowohl technisch als auch was die Vorgehensweisen betrifft. Der Bericht wird der Akte für die Untersuchung des Zwischenfalls beigefügt. Letzten Endes dienen diese Informationen als Erfahrungswerte, die aus dem Zwischenfall gewonnen werden konnten. Weitere Tipps zur M&M Nachdem ich schon mehrere solcher Konferenzen und ähnliche Überprüfungen organisiert und auch daran teilgenommen habe, kann ich Ihnen einige weitere Tipps geben, um dafür zu sorgen, dass diese Besprechungen auch Nutzen bringen: 15.3 Morbidität und Mortalität von Zwischenfällen 529 •• M&M-Konferenzen sollten nur sporadisch abgehalten werden – nicht mehr als eine pro Woche und nicht mehr als drei pro Monat. •• Es muss betont werden, dass der Zweck einer M&M nicht darin besteht, Personen zu kritisieren oder zu beurteilen, sondern um eine Kultur des Lernens zu fördern. •• M&M-Konferenzen müssen von jemandem aus der Teamleitung oder dem unteren Management moderiert werden, damit die Diskussion nicht zu hitzig wird und um Fragen in die richtige Richtung zu lenken. Es ist wichtig, dass der Moderator einen technischen Hintergrund hat und nicht etwa aus dem oberen Management stammt, damit er auch genau versteht, was besprochen wird. •• Wenn Sie in Ihrer Organisation M&M-Konferenzen einführen, sollte es ein Erfordernis sein, dass alle Mitarbeiter irgendwann dabei mitwirken, entweder als Referent oder als teilnehmende Kollegen. •• Der Abschlussbericht sollte dem gesamten technischen Personal sowie der Geschäftsführung zur Verfügung gestellt werden. •• Spezialisten für Informationssicherheit ähneln Ärzten oft auch hinsichtlich eines aufgeblähten Egos. Bei den ersten Konferenzen dieser Art kann es daher zu Auseinandersetzungen und hitzigen Debatten kommen. Das ist zu Anfang zu erwarten, wird sich aber bei guter Leitung und Moderation mit der Zeit legen. •• Eine M&M-Konferenz sollte als zwanglose Veranstaltung durchgeführt werden. Um die Anspannung zu verringern, können Sie vor oder nach der Besprechung etwas zu essen reichen oder andere Tätigkeiten koordinieren. •• Überlegen Sie es sich sehr gut, ob Sie jemanden aus dem oberen Management zu diesen Konferenzen einladen. Die Gegenwart solcher Personen verhindert oft offene Fragen und Antworten, und meistens bringen sie nicht genügend technisches Verständnis mit, um Nutzen aus der Präsentation zu ziehen oder gar selbst wertvolle Beiträge zu leisten. •• Wenn Sie nicht genügend Zwischenfälle für M&Ms haben, dann denken Sie sich welche aus! Solche Konferenzen bilden eine hervorragende Vorgehensweise, um Übungen durchzuführen, bei denen hypothetische Szenarien diskutiert werden. Sie können dazu auch ein Gegenspielerteam einsetzen, das Angriffe simuliert. Die Einführung solcher Konferenzen muss unbedingt mit großer Vorsicht erfolgen! In der Medizin wurde das M&M-Prinzip in den frühen 1900er Jahren von Dr. Ernest Codman am Massachusetts General Hospital von Boston eingeführt. Das MGH war so empört über Dr. Codmans Vorschlag, die Kompetenz der Ärzte zu überprüfen, dass er seine Privilegien einbüßte. Heutzutage dagegen ist M&M in der modernen Medizin eine Standardmaßnahme und wird in den besten Krankenhäusern der Welt durchgeführt, auch im MGH. Auch in der Informationssicherheit habe ich eine ähnlich abweisende Haltung auf den Vorschlag von Peer-Reviews erlebt. Für uns als NSM-Fachleute ist es jedoch von entscheidender Bedeutung, ein solches Peer-Review anzunehmen, das Lernen in der ganzen Gruppe zu fördern und zu einer Verbesserung unserer Fähigkeiten anzuregen. 530 15 Der Analysevorgang 15.4 Zusammenfassung In diesem Kapitel ging es um den Analysevorgang und zwei verschiedene Methoden, um ihn auf strukturierte und systematische Weise durchzuführen. Wir haben uns auch einige Beispiele für die Anwendung dieser Methoden und bewährte Vorgehensweisen angesehen. Zum Schluss haben wir uns mit Methoden für eine nachträgliche Untersuchung beschäftigt, um aus Zwischenfällen Lehren zu ziehen. Wie sehr Sie sich auch immer anstrengen mögen, eines Tages wird in dem Netzwerk, das Sie schützen, ein erfolgreicher Angriff und damit ein Einbruch erfolgen. In der Sicherheitslandschaft von heute ist das unvermeidlich. Dagegen können Sie nicht viel tun, denn alle vorbeugenden Maßnahmen werden irgendwann versagen. Daher ist es wichtig, dass Sie sich auf diesen Fall vorbereiten. Bei einem Zwischenfall wird sich später niemand mehr dafür interessieren, wie er vonstatten gegangen ist, sondern wie darauf reagiert wurde, welche Ausfallzeiten er hervorrief, wie viele Informationen verloren gingen und wie viel Geld die Organisation dadurch verloren hat. Welche Empfehlungen können Sie der Geschäftsführung machen, damit ähnliche Zwischenfälle nicht wieder auftreten können? Wie können Sie Ihren Vorgesetzten erklären, warum der Angriff nicht erkannt wurde? Welche Schwächen haben Ihre Tools? Vollständig beantworten können Sie diese Fragen erst im Zusammenhang mit einem tatsächlichen Angriff, also erst dann, wenn ein Einbruch erfolgt ist. Dennoch sollten Sie sich diese Fragen ständig selbst stellen, um Ihre Erfassungs-, Erkennungs- und Analyseprozesse zu verbessern. Jedes Ereignis und jeder Zwischenfall durchläuft den NSM-Zyklus, und die Lehren, die Sie aus jedem dieser Ereignisse und Zwischenfälle ziehen, helfen dabei, den Prozess für das nächste Mal zu verbessern. Die Angreifer werden Sie überraschen, Sie werden an Ihrer schwachen Stelle getroffen, und manchmal werden Sie den Kampf verlieren. Dieses Kapitel und dieses Buch haben Sie mit den Werkzeugen und Techniken bekannt gemacht, mit denen Sie sich für diesen Fall wappnen können. A Steuerskripte für Security Onion Dieser Anhang führt