Der Inside-Out-Sicherheits Blog Blog   /  

Volatility für die Speicherforensik und -analyse

How to Use Volatility for Memory Forensics and Analysis | Varonis

Wenn Sie in Incident Response arbeiten, wissen Sie, wie wichtig es ist, so schnell wie möglich forensisch fundierte Beweise von kompromittierten Geräten zu erhalten. Dies geschieht häufig in Form von Protokollen oder Festplattenimages. 

Bei beiden können Probleme auftreten, und beide können zeitaufwändig sein. Wenn Sie die Protokolle von einem Gerät abrufen, haben Sie es ggf. mit Millionen von Protokollen zu tun und müssen den Inhalt verstehen, ihn in eine Plattform aufnehmen, die die Analyse vereinfacht, oder die Daten manuell über die Linux-Kommandozeile abfragen.

Festplattenimages benötigen aufgrund der Größe der Festplatten oftmals viel Zeit für die Erfassung oder Übertragung, bevor überhaupt eine Analyse durchgeführt wird. Aus diesen Gründen frage ich bei einem Vorfall immer zuerst: „Können wir den Speicher erfassen?“.

Denn der Arbeitsspeicher (RAM) eines Geräts ist immer kleiner als die Festplatte und leicht zu erfassen. Sobald Sie den RAM-Speicher erfasst haben, können Sie die Ausgabe schnell analysieren, mit einem meiner Lieblingstools der Incident Response: Volatility.

In diesem Artikel erfahren Sie, was Volatility ist, wie Sie es installieren und vor allem, wie Sie es verwenden.

Was Sie vor dem Anfang wissen sollten

Aufgrund des Umfangs von Volatility ist dies keine umfassende Liste der Funktionen des Tools, sondern soll eher als Einführung dienen und Ihnen eine solide Wissensgrundlage vermitteln, auf der Sie aufbauen können.

Bevor Sie ein Tool wie Volatility verwenden, müssen Sie einige wichtige Themen verstehen:

  • Was sind flüchtige Daten?
  • Was ist ein Speicher-Dump?
  • Forensisch solide Erfassung des Arbeitsspeichers
  • Erfassung des Arbeitsspeichers von einem physischen Gerät
  • Erfassung des Arbeitsspeichers von einer virtuellen Maschine

Zum Glück habe ich das bereits in einem nützlichen Leitfaden erläutert, den Sie hier finden.

Wenn Sie mit den oben genannten Themen bereits vertraut sind, lassen Sie uns nun in Volatility einsteigen!

Installation von Volatility

Zunächst sollten Sie wissen, dass es mehr als eine Version von Volatility gibt. Die neueste Version ist Volatility 3, und in diesem Artikel beziehe ich mich stets auf Volatility 3.

Vor Volatility 3 mussten Sie bei der Verwendung eines Tools zur Analyse eines RAM-Dumps das Betriebssystem des Rechners angeben, von dem er stammte, damit Volatility funktionierte. Das konnte sehr zeitaufwändig werden, je nach Architektur des Geräts und je nachdem, ob ein bestimmtes Service Pack installiert war oder nicht.

Volatility 3 findet das Betriebssystem automatisch für Sie heraus, Sie können also sofort mit der Analyse des erfassten RAMs anfangen.

Um die neueste Version von Volatility herunterzuladen, verwenden Sie den folgenden Befehl:

git clone https://github.com/volatilityfoundation/volatility3.git

Es wird nun ein Ordner mit dem Namen „volatility3“ erstellt. Navigieren Sie zu diesem Speicherort, und es wird eine Reihe von Dateien aufgelistet.

Installieren Sie die erforderlichen Abhängigkeiten, damit Volatility problemlos ausgeführt werden kann.

pip3 install -r requirements.txt

Volatility sollte jetzt erfolgreich installiert worden sein. Um sicherzustellen, dass das Tool korrekt installiert wurde, verwenden Sie die folgende Syntax, um die help-Datei zu starten:

python3 vol.py -h

Nun können Sie Volatility verwenden! 

Identifizierung von bösartigen Prozessen

Wenn ich einen RAM-Dump von einem potenziell kompromittierten Gerät erhalte, schaue ich meist zuerst nach, welche Prozesse auf dem Gerät ausgeführt wurden, als der Dump erfasst wurde.

Ich habe schon in früheren Artikeln eine Sache erwähnt, an die ich immer denke: „Malware kann sich verstecken, aber sie muss auch ausgeführt werden“. Ein Blick auf die laufenden Prozesse eines Geräts ist immer eine gute Möglichkeit, Malware zu identifizieren, die auf dem Gerät ausgeführt wird.

pslist

Es gibt einige Befehle in der Volatility, die für die Analyse von laufenden Prozessen verwendet werden können. Der erste heißt „pslist“.

python3 vol.py -f <filename> windows.pslist

Der obige Befehl gibt die folgende Ausgabe zurück:

In der Abbildung oben sehen wir die Ausgabe von „pslist“. Wenn diese Befehle ausgeführt werden, können große Datenmengen anfallen. Daher lohnt es sich, die folgende folgende Syntax zu verwenden, um durch die Ausgabe durchzuschalten oder sie in eine Textdatei zu dumpen. Das geht mit allen Befehlen in Volatility.

python3 vol.py -f <filename> windows.pslist | less

python3 vol.py -f <filename> windows.pslist > output.txt

Nachfolgend finden Sie wichtige Kopfzeileneinträge von „pslist“, die Sie verstehen müssen, wenn Sie das Tool benutzen möchten:

  • PID – Prozess-ID-Nummer
  • PPID - ID-Nummer des übergeordneten Prozesses
  • ImageFileName – Name des laufenden Prozesses
  • Offset – Hexadezimalwert, der die Position im Speicher angibt, an der der Prozess ausgeführt wird
  • CreateTime – Zeitpunkt des Prozessbeginns
  • ExitTime – Zeitpunkt des Prozessendes

Mit dieser Funktion schaue ich mir einfach die Prozessnamen an und sehe, ob mir etwas auffällt. Wenn Sie auf einen Prozess aufmerksam werden, können Sie einfach den Namen googeln. Dann können Sie schnell feststellen, ob er legitim aussieht oder weiter untersucht werden muss.

pstree

Nachdem ich mir die Prozessnamen angeschaut habe, möchte ich mir ein Bild davon machen, welcher Prozess einen anderen Prozess gestartet hat. Dadurch wird es einfacher, verdächtige Prozessaktivitäten zu erkennen, da Sie sehen können, welcher Prozess beispielsweise „cmd.exe“ oder „powershell.exe“ gestartet hat. Dann können Sie ermitteln, ob es sich dabei um legitime Aktivitäten handelt oder nicht.

Ein weiterer Grund, aus dem ich gerne „pstree“ benutze, ist, dass Angreifer den laufenden Prozess ihrer Malware oft nach legitimen Windows-Prozessen wie „svchost.exe“ benennen. So kann die Malware auch aus der Nähe unerkannt bleiben, da sie nicht unter den zahlreichen anderen Windows-Prozessen hervorsticht.

Mit „pstree“ lassen sich solche bösartigen Prozesse, die sich als legitime Windows-Prozesse tarnen, gut erkennen. Windows-Prozesse werden immer von festgelegten Speicherorten auf der Festplatte ausgeführt und ihr übergeordneter Prozess ist in der Regel ein festgelegter Prozess. Beispielsweise wird „taskhostw“ immer von „%systemroot%\system32\taskhostw.exe“ aus gestartet und sein übergeordneter Prozess ist immer „svchost.exe“. Wenn Sie also feststellen, dass „taskhostw“ von einem anderen Ort aus oder mit einem anderen übergeordneten Prozess ausgeführt wird, sollten Sie es sich auf jeden Fall genauer ansehen.

python3 vol.py -f <filename> windows.pstree

Das folgende Bild zeigt die Ausgabe von „pstree“. Beachten Sie, dass sich die Ausgabe der Spalte „PID“ leicht verändert hat.

Die Reihenfolge der Spalte „PID“ wird jetzt nach einem Prozess und seinen zugehörigen untergeordneten Prozessen sortiert. Um jedoch die Visualisierung für den Benutzer übersichtlicher zu gestalten, wird jedem untergeordneten Prozess ein „*“ vor der PID zugeordnet. Jeder nachfolgende untergeordnete Prozess erhält ein zusätzliches „*“ vor der PID.

Die folgende Abbildung zeigt, dass der „System“-Prozess „smss.exe“ gestartet hat, das einen weiteren „smss.exe“-Prozess gestartet hat, der wiederum „winlogon.exe“ gestartet hat, und so weiter.

Dies ist für die Incident Responses sehr vorteilhaft, da Sie so einfacher sehen können, welche Prozesse auf der Box aktiv waren, und jede potenziell bösartige Prozessaktivität identifizieren können.

Identifizierung bösartiger Netzwerkverbindungen

Wenn ein RAM-Dump erfasst wird, werden alle Netzwerkverbindungen, die zum Zeitpunkt der Aufzeichnung bestanden, ebenfalls darin gespeichert. Für Incident Response ist das sehr nützlich, da schädliche Netzwerkverbindungen mit Quell-Port, Ziel-IP, Ziel-Port und dem Prozess erkannt werden können, auf den sich die Netzwerkaktivität bezieht.

netscan

Verwenden Sie den folgenden Befehl, um die Netzwerkverbindungen anzuzeigen, die mit dem zu analysierenden RAM-Dump verknüpft sind:

python3 vol.py -f <filename> windows.netscan

Die folgenden Informationen werden bei der Ausführung dieses Befehls angezeigt:

Die Ausgabe von „netscan“ besteht aus 10 Spalten:

    • Offset – Position im Speicher
    • Proto – Vom Prozess verwendetes Netzwerkprotokoll
    • LocalAddr – Quelladresse der Netzwerkverbindung
    • LocalPort – Quell-Port der Netzwerkverbindung
  • ForeignAddr – Zieladresse der Netzwerkverbindung
  • ForeignPort – Ziel-Port der Netzwerkverbindung
  • Status – Status der Netzwerkverbindung, also „established“ (hergestellt), „closed“ (geschlossen) oder „listening“ (hört ab)
  • PID – Prozess-ID des zugehörigen Prozesses
  • Owner – Mit dem Prozess verbundenes Konto
  • Created – Zeitpunkt, zu dem die Netzwerkverbindung initiiert wurde

Die folgende Abbildung zeigt einige Netzwerkverbindungen, die von einem Prozess namens „smsfwder.exe“ erzeugt wurden.

Volatility hat drei Verbindungen zu drei verschiedenen IP-Adressen identifiziert, die über die Ports 443 und 8080 kommunizieren.

Die Überprüfung der einzelnen IP-Adressen mit Symantec Site Review bestätigt, dass diese Aktivität zu einem bekannten Command-and-Control-Server für Malware gehört.

Diese IOCs können nun verwendet werden, um nach anderen Geräten zu suchen, die gefährdet sein könnten und im Rahmen des Incident Response-Plans des Unternehmens vom übrigen Netzwerk isoliert werden müssen.

Identifizieren von injiziertem Code

Malware wird oft so gepackt, dass der vom Malware-Urheber geschriebene Code verschleiert ist. Die Kriminellen nehmen sich die Zeit, um bösartigen Code zu schreiben, und wollen es möglichst schwer machen, sich schnell die Funktionsweise der Malware anzuschauen und sich zu überlegen, wie man sie aufhalten kann.

Gepackte Malware wird im Grunde mit einer Codeschicht „umwickelt“. Diese zusätzliche Schicht versteckt den Code, den der Malware-Urheber geschrieben hat. Diese Verschleierungstechnik wird als „Packing“ von Malware bezeichnet.

Wenn eine Malware gepackt wird, muss sie sich daher selbst entpacken. Das geschieht im Speicher, was für Volatility sehr vorteilhaft, da das Tool genau darauf ausgelegt ist, diesen zu analysieren!

Wenn Ihnen dieses Konzept nicht geläufig ist, empfehle ich, meinen zuvor veröffentlichten Artikel über das Entpacken von Malware zu lesen. Vor allem sollten Sie wissen, dass die Malware – um sich selbst zu entpacken – einen untergeordneten Prozess erstellt und die entpackte ausführbare/ungepackte Malware in diesen neuen Prozess injiziert.

malfind

Die Suche nach injiziertem Code in Volatility erfolgt über die Funktion „malfind“. Dadurch wird eine Liste von Prozessen ausgegeben, von denen Volatility vermutet, dass sie injizierten Code enthalten. Das geschieht auf der Grundlage der in Hex-Werten angezeigten Header-Daten, der Berechtigungen und etwas extrahiertem Assembler-Code. Wenn allerdings ein Prozess in der Ausgabe aufgeführt ist, bedeutet das nicht, dass er zu 100 % Malware ist.

Die Ausgabe von „malfind“ wird unten angezeigt.

Vor allem sollten Sie die PID, den Prozessnamen, den Schutz und den rot hervorgehobenen Bereich verstehen.

Die PID und der Prozessname sind selbsterklärend, der „Schutz“ bezieht sich auf die Ausgabe „PAGE_EXECUTE_READWRITE“. Das bedeutet, dass der Prozess über Ausführ-, Lese- und Schreibberechtigungen verfügt. Das ist üblich bei Malware, da sie sich selbst oder andere ausführbare Dateien ausführen können muss, die sie herunterlädt bzw. ablegt. Sie muss außerdem Dateien auf dem kompromittierten Gerät lesen und auf die Festplatte schreiben können. Daher werden alle erfassten Prozesse, die diese Berechtigungen haben, in der „malfind“-Ausgabe angezeigt.

Da dieser Artikel als Einführung vorgesehen ist, fangen wir ganz einfach mit „malfind“ an: Wir konzentrieren uns auf den Prozessnamen und den von mir rot markierten Bereich.

Es ist der Beginn der im Prozess enthaltenen Daten in hexadezimaler Darstellung, und daneben die gleichen Werte in ASCII. In meinen vorherigen Artikeln habe ich Werkzeuge wie x64dbg und PeStudio verwendet, um den Header einer ausführbaren Windows-Datei anzuzeigen (ausführbare Dateien sind ein gängiger Dateityp für Malware).

Der Header einer ausführbaren Windows-Datei beginnt in hexadezimaler Darstellung immer mit „4D 5A“ – in ASCII „MZ“. Nachfolgend sehen Sie eine Malware, die ich in HxD – einem Hex-Editor – geöffnet habe. Mit diesem Tool kann ich den Datei-Header anzeigen, der diese Informationen enthält.

Wenn Sie in Incident Responses bei der Verwendung von „malfind“ solche Werte innerhalb eines Prozesses sehen, haben Sie höchstwahrscheinlich eine Malware gefunden, die sich in einen anderen Prozess injiziert hat.

procdump

Wenn Sie die in diesem Artikel beschriebenen Befehle verwenden, sollten Sie gut aufgestellt sein, um potenzielle Malware zu identifizieren, die im Speicher auf einem Gerät ausgeführt wird. Mit „netscan“ konnte ich einen Prozess namens „smsfwder.exe“ identifizieren, der schädliche Netzwerkverbindungen zu bekannten C2-Infrastrukturen herstellte. Im Rahmen meiner Untersuchung mit Volatility kann ich diesen Prozess mit einer Funktion namens „procdump“ zur weiteren Analyse extrahieren.

python3 vol.py -f <filename> -o <location to dump process> windows.dumpfiles –pid <PID>

Dadurch werden die ausführbare Datei und alle zugehörigen DLLs extrahiert. In der folgenden Abbildung habe ich den Prozess in einen Ordner namens „procdump“ extrahiert.

Das ist praktisch, denn so können Sie anschließend mit einigen einfachen Prüfungen weitere Informationen aus dem gedumpten Prozess extrahieren. Mit dem Befehl „strings“ auf dem gedumpten Prozess können Sie beispielsweise sehen, ob Sie zusätzliche IOCs wie IP-Adressen, Dateinamen, Persistenzorte usw. finden können.

Abschließende Überlegungen

Dieser Artikel sollte Ihnen eine solide Grundlage dienen und ein klares Verständnis dafür vermitteln, wie nützlich Volatility als Tool für die Reaktion auf Vorfälle ist. Es ist jedoch keine Wunderwaffe. Bedenken Sie, dass Sie nur analysieren, was im Speicher ausgeführt wurde, als der RAM-Dump erfasst wurde. Dadurch lässt sich ein potenziell kompromittierter Host sehr gut triagieren und untersuchen. Wenn die Malware jedoch zum Zeitpunkt der Erfassung des RAM-Dumps nicht aktiv war, werden Sie keine böswilligen Aktivitäten feststellen können; dasselbe gilt für Netzwerkverbindungen.

Aufgrund des Umfangs des Tools konnte ich hier nur oberflächlich darauf eingehen. Ich empfehle Ihnen jedoch mit Nachdruck, sich die Zeit zu nehmen, um mit dem Tool zu spielen und es in Ihr Incident Response-Arsenal aufzunehmen. Eine empfehlenswerte Ressource ist der Volatility-Spickzettel, der von Ashley Pearson zusammengestellt wurde. Dort sehen Sie, wie man die Funktionen benutzt, die nicht in diesen Artikel gepasst haben..


Wenn Sie wissen möchten, wie Varonis die Sicherheitslage Ihres Unternehmens verbessern kann, dann schauen Sie sich an, wie Varonis Ihnen bei der Bekämpfung von Insider-Bedrohungen hilft und die Sicherheit Ihrer Unternehmensdaten gewährleistet.