Dieser Artikel ist die dritte und letzte Ausgabe der Sysmon Threat Analysis-Reihe. Alle anderen Teile der Serie:
Teil 1. Einführung in die Sysmon-Protokollanalyse
Teil 2. Verwenden von Sysmon-Ereignisdaten zum Erkennen von Bedrohungen
Teil 3. Erweiterte Sysmon-Bedrohungsanalyse mithilfe von Diagrammen (wir sind hier)
Suchen von nicht standardmäßigen Untergraphen mit Sysmon-Ereignisdaten (einfaches Beispiel)
Bevor wir uns ein Beispiel für die Identifizierung von Anomalien in Untergraphen ansehen, die auf eine potenzielle Bedrohung hinweisen (und wenn diese Wörter den Nerd in Ihnen nicht wecken, wird Sie nichts wecken!), Machen wir einen kleinen Exkurs.
An dieser Stelle muss ich eine Warnung ausgeben: Dieser Beitrag kann zusammen mit dem Code auf GitHub keine Lösung für Unternehmen ersetzen. Es kann helfen, Bedrohungen in kleinerem Maßstab zu identifizieren, aber meine große Mission ist es, IT-Sicherheitsexperten dabei zu helfen, reale Bedrohungsschutzlösungen zu verstehen und zu schätzen. Eine Möglichkeit, dies zu erreichen, besteht darin, selbst eine Lösung zu erstellen (mit meiner Hilfe).
Experimente zu Hause helfen Ihnen zu verstehen, wie schwierig es ist, DIY-Software zur Erkennung von Bedrohungen zu skalieren. Sie werden mit großen Datensätzen zu arbeiten und alles im Zusammenhang mit ihnen: Reinigung (was eine extrem schwierige Aufgabe ist), eine effiziente Verarbeitung (die notwendigen Datenstrukturen zu finden, Algorithmen, etc.) und die Ergebnisse mit einer geringen Anzahl der Bereitstellung Fehlalarme , so dass Ihre Die gleichen Kollegen sind dann nicht mit den Fäusten auf dich geklettert. Vor diesem Hintergrund möchten Sie möglicherweise eine vorgefertigte Lösung zur Erkennung von Bedrohungen in Betracht ziehen ... jedoch erst, nachdem Sie unsere Artikelserie fertiggestellt und Ihre eigenen Experimente durchgeführt haben.
Diagrammgewichte einstellen
Eine einfache Möglichkeit, eine Bedrohungsschutzlösung zu erstellen, die nicht auf Malware- Signaturen basiert, ist die Verwendung des Bedrohungsdiagramms aus dem vorherigen Teil .
Ein solches Diagramm verbindet Prozessknoten basierend auf Einträgen aus dem Sysmon-Ereignisprotokoll.
Bitte beachten Sie: Ich habe nicht jedes Prozessstartereignis (Ereignis-ID 1 in Sysmon-Ereignissen) in einen separaten Scheitelpunkt unterteilt. Stattdessen habe ich ein abstrakteres Diagramm erstellt, das beispielsweise zeigt, dass der PowerShell-Scheitelpunkt einen Link zu der Anwendung enthält, von der aus er unter einem beliebigen Benutzer gestartet wird - einen Link für Excel, einen für den Browser usw.
Die PSQuickGraph-Baumansicht meines Sysmon-Bedrohungsdiagramms. Achten Sie auf den anomalen Zweig unter cmd.exe
. Wir möchten jedoch weiterhin die Häufigkeit der laufenden Prozesse verfolgen . Wenn PowerShell beispielsweise "whoami" 1 Mal und den veralteten Windows-Editor "Notepad.exe" 10 Mal gestartet hat, sollten die Diagrammkanten , die vom PowerShell-Scheitelpunkt ausgehen, mit den entsprechenden "Gewichten" von 1 bzw. 10 markiert werden. Ist es logisch?
In vielen der einfachsten Bedrohungserkennungsalgorithmen wird dieses Gewicht zu einer Metrik zum Vergleichen der Bereiche des Diagramms. Der Hauptpunkt ist, dass ein Teilgraph mit einem niedrigeren Durchschnittsgewicht im Vergleich zum Gesamtdurchschnittsgewicht verdächtig ist.
Nicht wahr? Der selten besuchte Gipfel ist eine anomale Zone. Wenn Benutzeraktionen bei der Analyse potenzieller Bedrohungen auf einen selten verwendeten Untergraphen abzielen, sollten Sie daher die Alarmstufe auf Gelb erhöhen.
Der von mir beschriebene Ansatz und die folgenden PowerShell-Skripts sind nicht für praktische Zwecke in großen Infrastrukturen vorgesehen. Bei einem separaten Server funktioniert die Lösung jedoch möglicherweise oder bietet zumindest eine unabhängige Überprüfung der von Ihnen verwendeten Unternehmenslösungen.
Habe ich erwähnt, dass die PowerShell- Algorithmen von Doug Finke für Datenstrukturen großartige und leistungsstarke Tools sind? Ohne seine Arbeit hätte ich in meinem Anomalie-Graph-Projekt nichts erreicht. Nochmals vielen Dank, Doug!
Mit seiner PowerShell-Bibliothek mit schönen Diagrammfunktionen kann ich das Gewicht meines Sysmon-Bedrohungsdiagramms mit nur wenigen PS-Linien einfach berechnen und auch das durchschnittliche Scheitelpunktgewicht für das gesamte Diagramm ermitteln. Beim Durchlaufen des Diagramms weist der Code jedem Scheitelpunkt auch das Gewicht aller ausgehenden Kanten zu:
$AW=0 #average weight
$GW=0 #total weight
$mset = [System.Collections.ArrayList]@() #master set of subraphs
#calculate total weight by summing up the frequencies or weights of the edges
foreach ($e in $g.getAllEdges() ) {
$GW = $GW + $e.weight
}
write-host "Weight of Graph: " $GW
$AW = $GW / $g.vertices.count
write-host "Average weight per vertex: " $AW
#assign weight of edges to vertice
for ($i=0; $i -lt $g.vertices.count; $i++) {
$w=0
$v=$g.vertices[$i]
foreach($e in $v.getEdges()) {
if($e -eq $null) {continue}
$w=$w + $e.weight
}
$v.value.Weight = $w
}
Der obige Code führt die Berechnungen durch, die wir benötigen. In diesem Fall kann jeder Scheitelpunkt als Häufigkeit der Besuche in Abhängigkeit von den ausgehenden Kanten betrachtet werden.
Der schwierigste Teil meines PowerShell-Anomaliediagrammskripts - das ich Ihnen in Kürze zeigen werde - besteht darin, die Bereiche des Diagramms zu finden, die am seltensten auftreten, und dann den größten Untergraphen zu finden, der sie enthält . Möglicherweise müssen Sie ein altes Informatikbuch durchblättern, um diese Aufgabe abzuschließen. Aber es ist eigentlich nicht so schwer zu schreiben!
Ich habe die klassische Breitensuche für mein Diagramm verwendet, indem ich jeden Scheitelpunkt besucht und dann auf Kosten benachbarter Scheitelpunkte erweitert habe, bis mein Untergraph abhängig vom Durchschnittsgewicht des Scheitelpunkts einen bestimmten Schwellenwert erreicht. So:
function extend-subgraph($v, $t) {
$vertexQueue = New-Object Queue
#initialize
$vertexQueue.enqueue($v)
$h=$v.value.Weight
$s=@() #subgraph
$s+=$v
$extend=$false
while (!$vertexQueue.isEmpty()) { #bfs
$currentVertex = $vertexQueue.dequeue()
$es= $currentVertex.getEdges()
foreach($e in $es) {
$ev= $e.endVertex
if ((($h + $ev.value.Weight)/($s.count+1) -lt $th) {
#extend the sub-graph
$s+=$ev
$h =$h + $ev.value.weight
#queue it up
$vertexQueue.enqueue($ev)
}
}
Ein kurzer Hinweis für Heimwerker: Um eine Reihe von Arrays zu erstellen, verwenden Sie den Arraylist- Typ, und Sie sparen sich viel Kopfschmerzen.
Bedrohungen und Untergraphen mit geringem Gewicht
Es gibt viele verschiedene Algorithmen für anomale Graphen. Die von mir verwendete basiert auf einem bestimmten graphBAD, das ich im Internet gefunden habe - und ich werde einen Link geben, sobald ich ihn wieder finde.
Im Allgemeinen besteht das Hauptproblem bei der praktischen Erkennung von Bedrohungen darin, einen guten Datensatz zu finden, um eine Basislinie zu bilden. Als Vollzeit-Blogger und Spezialist für die Erkennung von Bedrohungen auf Partyzeit habe ich es nie geschafft, ein ausreichend interessantes Sysmon-Protokoll mit vielen verschiedenen Anwendungen zu erstellen. Es war ziemlich schwierig, anomale Untergraphen zu erstellen, da ich keine ausreichend große Gewichtsverteilung hatte. Auf die eine oder andere Weise erhalten Sie bei Verwendung eines echten Servers möglicherweise einen viel besseren Datensatz als bei gelegentlicher Verwendung einer AWS Windows-Instanz, wie in meinem Fall.
Das PS-Skript für anomale Diagramme, das ich geschrieben habe, war durchaus in der Lage, verdächtige Teilgraphen mit niedrigen Durchschnittsgewichten zu erstellen. Und ich habe es sogar geschafft, einige interessante Umgebungen einzufangen (siehe unten).
Algorithmus für Subgraph-Gewichte in Aktion: Eine interessante Umgebung mit geringem Gewicht für Subgraph 7
Wie bereits erwähnt, gibt es andere Algorithmen zum Erkennen von Anomalien in Diagrammen mit anderen Metriken als einfachen Gewichten, die es wert sind, gelernt zu werden. Einer von ihnen sucht nach Clustern "ähnlicher" Eckpunkte und bemerkt Verbindungen oder Verbindungen zwischen verschiedenen Umgebungen. In diesem Fall liegt die Anomalie in dem Benutzer oder Prozess, der Umgebungen durch ein anderes Merkmal verbindet. Es macht Sinn, nicht wahr?
Wenn dein innerer Nerd stark in dir ist, kannst du dir SCAN ansehen(Struktureller Clustering-Algorithmus für Netzwerke), der die oben genannten Schritte ausführt. Zusammen mit den PowerShell-Algorithmen von Doug Finke können Sie sie sogar verwenden. Ich selbst möchte dieses Projekt übernehmen und es bald auf meinem GitHub veröffentlichen .
Finden Sie Anomalien durch zufällige Spaziergänge
Beenden wir diesen Abschnitt mit einer anderen Möglichkeit, Anomalien im Bedrohungsdiagramm zu finden. Ich habe am Ende des vorherigen Teils auf diesen Ansatz Bezug genommen . Für mich als Person mit Mathematik auf dem "Sie" ist er intuitiver. Und Fans der alten TV-Show numb3rs werden das Konzept der Markov-Ketten sofort erkennen.
Für alle anderen können Sie sich dies als einen "zufälligen Spaziergang" durch die Grafik vorstellen. An jedem der Eckpunkte würfeln wir und wählen je nach Gewicht eine Kante des Diagramms aus: Je größer das Gewicht der Kante ist, desto höher ist die Wahrscheinlichkeit, dass wir ihr folgen. Sie müssen ein Diagramm in zwei Teile aufteilen - in der Diagrammtheorie als zweiteiliges Diagramm bezeichnet - mit Benutzern auf einem Teil und Anwendungen auf dem anderen.
Als nächstes rangieren SieAlle Scheitelpunktanwendungen, die vom Benutzer basierend auf der Wahrscheinlichkeit des Erreichens eines bestimmten Scheitelpunkts erreicht werden können. Für die Bedrohungsanalyse suchen Sie dann nach laufenden Anwendungen. Wenn eine von ihnen eine sehr geringe Wahrscheinlichkeit hat, sie zu erreichen, haben Sie möglicherweise eine echte Bedrohung gefunden!
Plus ein Karma für denjenigen, der es mit dem PageRank- Algorithmus von Google verknüpft hat . Ich werde dies im nächsten Abschnitt genauer beschreiben, aber Interessenten können den Ausdruck Random Walk mit Neustart googeln .
Random Traversal Theory und EQL Practice
Nehmen wir einen weiteren Exkurs und analysieren, was wir mit dem Sysmon-Protokoll erreichen wollen, das ein großartiges Werkzeug zum Erkennen von Bedrohungen und zum Durchführen von Untersuchungen nach Vorfällen darstellt.
- , Sysmon. Sysmon , .
- 2 Sysmon , , .
- Im dritten Teil haben wir uns einen Überblick über einen einfachen Algorithmus gegeben, der Kantenverbindungen als Gewichte betrachtet. Abschnitte eines Diagramms, die weniger (in Bezug auf Kanten) wiegen als das durchschnittliche Gesamtgewicht über das gesamte Diagramm, können eine potenzielle Bedrohung darstellen. Ich werde die PowerShell-Skripte der Algorithmen aus diesem Abschnitt auf meinen GitHub hochladen (nachdem ich den Mauszeiger darüber gehalten habe).
Der Vorteil dieser Methoden besteht darin, dass sie nicht von bestimmten Befehlen oder Prozessnamen abhängen , die Angreifer ständig ändern oder maskieren.
Darüber hinaus gibt es eine weitere wahrscheinlichkeitsbasierte Methode zum Auffinden von Schwachstellen. Schauen wir es uns genauer an.
Zufälliges Durchlaufen eines Diagramms von Schwachstellen aus Daten basierend auf Sysmon-Ereignissen
Anstatt die Struktur des Diagramms selbst zu analysieren, können wir uns Links als eine Art Pfad oder Roadmap vorstellen, in der jede Anwendung ein separater Stopp auf dem Weg ist. Aus den Sysmon-Protokolldaten können wir die Häufigkeit ermitteln, mit der jede Anwendung von ihrem übergeordneten Element gestartet wird .
Wenn Sie sich mein Bedrohungsdiagramm- Skript auf GitHub ansehen , werden Sie feststellen, dass diese Häufigkeit in jedem Kantenobjekt mithilfe der wunderbaren PowerShell-Algorithmen von Doug Finke gespeichert wird.
Wir können die Häufigkeit des Überschreitens jeder Kante des Schwachstellendiagramms als Wahrscheinlichkeit betrachten!
Der nächste Schritt besteht darin, diese Informationen zu verwenden, um die Wahrscheinlichkeit eines PowerShell-Starts von taskmgr.exe, Windows Process Analyzer, Notepad oder hostname.exe zu ermitteln.
Worauf komme ich hinaus?
Kurz gesagt: Ich kann eine Wahrscheinlichkeitsübergangsmatrix erstellen, die von Markov- Anhängern so geliebt wirdund häufig in Modellierungssystemen verwendet. Tatsächlich ist das Würfeln, das Wechseln zur nächsten Anwendung in der Grafik und das Wiederholen dieser Aktionen ein zufälliger Spaziergang durch die Grafik. Letztendlich ordnet diese mathematische Methode jeden Scheitelpunkt des Graphen nach der Wahrscheinlichkeit, vom Ausgangspunkt dorthin zu gelangen. Sie werden feststellen, dass das Starten von Tabellenkalkulationen über den Windows Explorer beispielsweise ein äußerst häufiger Vorgang ist und die Windows Script Host Engine theoretisch äußerst unüblich und dementsprechend möglicherweise ein Bedrohungsindikator ist.
Diese Methode wird als Random Walk With Restart (im Folgenden: RWWR, Random Walk With Restart) bezeichnet und ist eine Variation des mittlerweile legendären Google PageRank- Ranking- Algorithmus .
Werfen wir einen Blick auf ein Skript, das ich geschrieben habe, um diese Ränge zu berechnen:
#lets build a row
$row= @(0)*$g.vertices.count
$w=0
foreach($e in $start.getEdges()) { #calculate total frequency
$w+=$e.weight
}
if ($w -eq 0) { #make it connected
$row[$ix] =1
}
else { #we assign probabilitys
#now create transition probability
foreach($e in $start.getEdges()) {
$ev = $e.endVertex
$p = $e.weight
$jx = v-index $ev.value.Key
$row[$jx]= $p/$w #normalize by dividing by total
}
}
$P[$ix] = $row #yay! One row added to transition matrix
Für jeden Scheitelpunkt berechne ich die resultierende Häufigkeit aller Nachbarn und ordne dann die Wahrscheinlichkeit jedes Übergangs durch die Normalisierung durch die Summe zu. Wenn PowerShell.exe 20 Besuche bei allen Nachbarn hat, nc.exe jedoch nur einmal von oben in PowerShell.exe besucht wurde, beträgt die Wahrscheinlichkeit, dass Sie gehen, 1/20 oder 0,05. Ist es logisch?
Die Schwierigkeit liegt in der Berechnung der in RWWR verwendeten Matrix, aber für diejenigen, die an probabilistischen Modellierungsstunden teilgenommen haben, wird dieses Verfahren nicht schwierig sein. Es gibt einen guten Übersichtsartikel zu diesem Thema auf der Medium- Website .
Mein Skript, das ich Random-Rater nenne , ordnet die 10 kleinsten und gibt sie ausWerte aus der Liste. Auf diese Weise erhalten Sie Anwendungen mit der geringsten Wahrscheinlichkeit, gestartet zu werden, beginnend mit einem bestimmten Scheitelpunkt des Bedrohungsdiagramms. Hier ist das Ergebnis, wenn Sie PowerShell.exe als Ausgangspunkt verwenden:
Der Random Walk With Restart-Algorithmus kann ein Google-ähnliches Ranking von Bedrohungen erstellen. Hmmm, whoami läuft am seltensten.
Als praktischer Hinweis und Warnung ist anzumerken, dass PWWR in einem realen System ein Big-Data-Problem darstellt. Selbst bei meinem kleinen Sysmon-Protokoll war die Berechnungsverzögerung aufgrund der großen Anzahl von Gleitkommaoperationen ziemlich auffällig.
Event Query Language (EQL) für die Bedrohungsanalyse
Im Moment ist es erwähnenswert, dass Anbieter, die ausgefeiltere Ansätze verwenden, um Bedrohungen in ihren Produkten zu erkennen , weit über das hinausgehen, was Sie oder ich selbst tun können. Und definitiv mit viel höherer Genauigkeit.
Für diejenigen, die sich mit dem Thema Bedrohungserkennung befassen möchten, aber nicht mit meinen Skripten arbeiten möchten - ich verstehe! - Es gibt Event Query Language oder EQL . Dies ist ein Open Source-Projekt zum Anwenden der Sysmon Log Query Language, über das Sie in dem äußerst umfassenden Beitrag mehr erfahren können... EQL eignet sich nicht nur hervorragend zur Untersuchung von Vorfällen, sondern kann auch als Tool verwendet werden, sofern Sie über eine aktuelle Kopie des Sysmon-Protokolls verfügen.
Die EQL-Suite bietet einen Ereignishandler, der das Protokoll in lesbares JSON konvertiert. Sie können eine Kopie meines Zweigs auf GitHub auschecken. Im Gegensatz zu meinem statischen PS-Skript " Show-Threat-Path " können Sie mit EQL Abfragen im laufenden Betrieb durchführen.
Angenommen, ich interessiere mich für alle cmd.exe-Shells, die im Auftrag von scvhost.exe gestartet wurden. Dies kann ein Zeichen für die Verwendung von psexec.exe oder smb.exe durch den Angreifer sein. Die Anfrage sieht folgendermaßen aus:
Verwenden von EQL zum Auffinden von Shells cmd.exe, die von svchost.exe gestartet wurden. Übrigens ist jq ein Linux-Dienstprogramm zum Anzeigen von JSON-Daten.
Es gibt eine noch coolere und leistungsfähigere Möglichkeit, dieses Ergebnis mit dem untergeordneten Modifikator zu erzielen. Mit dieser EQL-Abfrage können Sie alle Prozesse mit einem bestimmten Vorfahren an einer beliebigen Stelle in der Hierarchie durchsuchen . Sie können beispielsweise nach Anwendungen suchen, die beispielsweise den Prozess regsvr32.exe als Vorfahren hatten und eine bekannte Sicherheitsanfälligkeit ausnutzen, die ich hier beschrieben habe .
In diesem bereits langen Beitrag gibt es zu viel über EQL zu sagen. Daher möchte ich lieber einen separaten Artikel über die Details der EQL-Kenntnisse zum Auffinden von Schwachstellen veröffentlichen.
Letzte Gedanken zu DIY-Lösungen zur Erkennung von Bedrohungen
Ich habe versprochen, das Sysmon-Repository mit allen in diesem Artikel beschriebenen Bedrohungserkennungsskripten herunterzuladen. Überprüfen Sie meinen GitHub regelmäßig, da ich im Laufe der Zeit neue grafische Tools zur Erkennung von Bedrohungen sowie zusätzliche Dokumentationen hinzufügen werde - zu viel, um in einem einzigen Artikel behandelt zu werden.
Du hast es bis hierher geschafft, Glückwunsch!
Probieren Sie meine Skripte aus oder verwenden Sie sie als Grundlage für die Entwicklung Ihrer eigenen Ideen zur Erkennung von Bedrohungen. PowerShell eignet sich für komplexe Algorithmen. Für mich, der ich in der Linux-Shell-Sprache aufgewachsen bin, war es eine angenehme Überraschung, mit einer ausgereiften Skriptsprache zu arbeiten. Und ich rate Ihnen, die PowerShell-Galerie zu besuchen, eine weitere großartige Ressource für vorgefertigte Kampfskripte: Sie müssen das Rad in der PowerShell-Welt nicht neu erfinden.
Eine weitere wichtigere Erkenntnis aus dem gesamten Artikel wird die Erkenntnis sein, dass Anbieter von Lösungen für Unternehmen nicht nur viel ausgefeiltere Technologien zur Erkennung von Bedrohungen verwenden als diejenigen, die ein IT-Entwickler in seiner Freizeit schreiben kann, sondern auch die Anpassungsfähigkeit dieser Lösungen an das Verkehrsaufkommen große Organisation. Die Verwendung von DIY-Lösungen zur Analyse eines nicht ausgelasteten Servers oder zur zusätzlichen Validierung von Unternehmensprodukten ist natürlich eine gute Idee. Die Aufklärung und Identifizierung von Bedrohungen ist jedoch in der Tat ein Big-Data-Problem und offensichtlich keine Herausforderung, die PowerShell lösen kann.
Wenn Sie mehr darüber erfahren möchten, wie Varonis mit der Analyse und Erkennung von Bedrohungen umgeht, können Sie jederzeit eine persönliche Demo anfordern .