N-W0rm Analyse (Teil 2)

Bevor wir diesen RAT eingehend analysieren, zeigen wir einen Überblick über sein Verhalten in Form eines Diagramms. Dies kann helfen, seine innere Funktionsweise auf einer höheren Ebene zu verstehen:

 

Um dieses Beispiel zu analysieren, werden wir es mit dnSpy öffnen, um es zu dekompilieren und möglicherweise zu debuggen.

Einstiegspunkt

Wir beginnen mit dem Einstiegspunkt dieses RATs und analysieren seinen ausgeführten Code, bevor wir alle möglichen Module dieses RATs untersuchen. Um zum Einstiegspunkt zu springen, können wir mit der rechten Maustaste auf das Klassenmenü auf der linken Seite klicken und Go to Entry Point wählen:

Abb. 1: Erreichen des Einstiegspunkts

 

Auf diese Weise gelangen wir zur ersten aufgerufenen Funktion namens uLnqUtvIwAOVXLU. Zum besseren Verständnis haben wir sie unten eingefügt. Sie schläft zunächst 2 Sekunden lang, bevor sie hlIinikmNYFRC.gwgzcfkYmyQKIgW() aufruft. Wenn diese Funktion False zurückgibt, dann existiert der RAT, was bedeutet, dass diese Funktion wahrscheinlich einige Umgebungsprüfungen durchführen wird. Beginnen wir damit, zu untersuchen, was der RAT prüft.

Abb. 2: Der Einstiegspunkt

hlIinikmNYFRC.gwgzcfkYmyQKIgW()

Der Inhalt der Funktion ist unten zu sehen. Der RAT versucht, einen neuen Mutex zu erstellen. Der Name des Mutex ist in der Variablen hlIinikmNYFRC.HREdkIUrRAzFBOcfZ zu finden und lautet 2e3fb6d0. Dies ist ein relevanter IOC.

Abb. 3: Mutex Erstellung

Wenn die Mutex bereits erstellt wurde, ist das Ergebnis False, aber wenn die Erstellung der Mutex erfolgreich ist, ist das Ergebnis True. Abschließend prüft der Einstiegspunkt, ob die Mutex bereits existiert, d.h. ob das System bereits mit diesem RAT infiziert wurde.

hlIinikmNYFRC.ATCCkfeyJnyt()

Wenn die Mutex-Prüfung bestanden wurde, ruft das RAT hlIinikmNYFRC.ATCCkfeyJnyt() auf und übergibt ein Enum. Dies ist nur ein Wrapper zum Aufruf von SetThreadExecutionState. Laut den Microsoft Dokumenten bewirkt diese Funktion folgendes: “Ermöglicht es einer Anwendung, dem System mitzuteilen, dass sie in Gebrauch ist, und verhindert so, dass das System in den Ruhezustand geht oder den Bildschirm ausschaltet, während die Anwendung läuft.”

Zum Schluss startet der Einstiegspunkt einen neuen Thread und übergibt die Kontrolle an hlIinikmNYFRC.fqLxpecOTiCgE

hlIinikmNYFRC.fqLxpecOTiCgE

Diese Funktion beginnt mit einer Endlosschleife und ist im Wesentlichen dafür verantwortlich, die Befehle zu erhalten und zu interpretieren. Wenn die Verbindung nicht aufgebaut oder unterbrochen wird, wird sie zurückgesetzt. Hier erfahren wir auch die C2-Adresse, die von diesem RAT verwendet wird: nyanmoney02[.]duckdns.org

An dieser Stelle gibt es eine interessante Beobachtung. Wenn die Verbindung zum C2 ausfällt, wird eine zweite C2-Adresse verwendet. Diese Ausweichadresse ist jedoch dieselbe wie die primäre. Entweder hat der Autor der Malware also vergessen, die Failback-Adresse zu ändern oder es handelt sich bei dieser Version des RAT nur um eine Alpha/Beta-Version.

Wir werden die Socket-Behandlung hier nicht eingehend analysieren, sondern uns stattdessen alle Informationen, die der RAT an seinen Operator sendet und die Funktion, die die empfangenen Befehle verarbeitet, genauer ansehen.

Informationssammlung

Wenn der RAT eine neue Verbindung herstellt oder eine neue Verbindung aufbaut, sendet er einige allgemeine Informationen über den Host an seinen C2. Wir werden nicht jede Funktion Zeile für Zeile durchgehen, sondern vielmehr zusammenfassen, welche Informationen gesammelt und zurückgesendet werden:

  • Benutzer Domänenname
  • Benutzername
  • Anzahl der Prozessoren
  • Vollständiger Name des Betriebssystems
  • Ist der Benutzer Administrator?
  • Version des RAT (das analysierte RAT hat die Version v0.3.8)
  • Liste der installierten Antivirenprodukte mit Hilfe einer WMI-Abfrage
  • Letzte Schreibzeit des RAT auf der Festplatte
  • Pfad des RATs auf der Festplatte
  • Module

Bevor wir alle verfügbaren Module erläutern, werden wir zunächst die Vorverarbeitung der empfangenen Daten betrachten.

Abb. 4: Vorverarbeitung der empfangenen Daten

Bevor ein Modul ausgeführt wird, wird eine weitere Funktion aufgerufen und die Eingabe wird aufgeteilt. Die Funktion GYZswDqNcBskynCV() ist dafür verantwortlich, die Zeichenkette “received” an ihr C2 zu senden und für 1 Sekunde zu schlafen. Als nächstes wird die Eingabe durch ein hartkodiertes Trennzeichen, nämlich “|NW|”, geteilt. Der erste Wert in dieser Liste ist der Schlüssel bzw. das Modul, das ausgeführt werden soll. Alle weiteren Daten werden als Parameter für das gewählte Modul verwendet. Wir werden nun alle Module im Detail erklären.

runFile

Abb. 5: Modul runFile

Dieses Modul ist weiter in mehrere Optionen unterteilt. Der RAT kann Binärdateien direkt im Speicher ausführen oder die Daten zunächst auf die Festplatte schreiben und von dort aus ausführen. Wenn die übergebene Datei ein PowerShell-Skript war, werden die typischen Argumente verwendet. Wenn array[3] wahr ist, löscht sich der RAT schließlich selbst.

runUrl

Dieses Modul ist dem vorherigen sehr ähnlich, außer dass der Operator eine URL übergibt und der RAT die Datei selbst herunterlädt und ausführt.

Plugin

Hier kann der Operator weitere Plugins in dieses .NET-Binary laden und damit die Funktionalität erweitern.

Schließen

Dieses Modul tut, was der Name sagt. Es schließt die Mutex und den TcpClient und beendet sich dann.

Neu starten

Der Aufruf dieses Moduls schließt ebenfalls zuerst die Mutex und den TcpClient und legt dann eine Batch-Datei im Verzeichnis %temp% an.

Abb. 6: Temp Batch Skript

Nach dem Start der Batchdatei beendet sich das Programm selbst.

del

Dieses Modul löscht den RAT und schließt den Mutex und TcpClient.

ps1

Führt die angegebene ps1-Datei aus.

url

Hier wird der Inhalt einer übergebenen URL heruntergeladen. Es scheint jedoch nichts zu passieren, wenn die Anfrage erfolgreich war.

Figure 7: Modul url (dekompiliert mit DnSpy)

Um zu überprüfen, dass es sich nicht nur um eine fehlerhafte Dekompilierung handelt, habe ich meine Ergebnisse mit ILSpy überprüft. Das Ergebnis ist mehr oder weniger dasselbe. Entweder ist diese Methode nicht fertig oder sie wird nur verwendet, um zu überprüfen, ob eine Verbindung besteht (vielleicht für Sandbox-Tests?).

Abb. 8: Modul url (dekompiliert mit ILSpy)

killer

Diese Funktion tut, was sie sagt – sie tötet eine Menge Dinge.

Zuerst durchläuft sie alle Prozesse und wendet einige Prüfungen auf den Namen des Prozesses an. Wenn das Attribut “FileName” des Prozesses eine der folgenden Prüfungen erfüllt und das Fenster des Prozesses nicht sichtbar ist, wird der nächste Block eingegeben:

  • der Pfad enthält “wscript.exe”
  • der Pfad enthält den Benutzerprofilpfad (d.h. C:\Users\<USER>)
  • der Pfad enthält den Common Application Data Path (d. h. C:\ProgramData).

Wenn diese Überprüfungen zutreffen, wird der Prozess beendet, das Programm wird gelöscht und das Programm wird aus den Registrierungsschlüsseln Run und RunOnce entfernt, die sich unter den folgenden Pfaden befinden:

  • Software\\Microsoft\\Windows\\CurrentVersion\\\Run
  • Software\\Microsoft\\Windows\\CurrentVersion\\\RunOnce

Nach der Iteration durch alle Prozesse sendet der RAT die Anzahl der getöteten Prozesse an seinen C2.

Abb. 9: Modul killer

 

IOC

Memory

Mutex: 2e3fb6d0

Network

nyanmoney02[.]duckdns.org

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36

Port: 9031

Yara

Eine vollständige Yara-Regel finden Sie hier -> SECUINFRA Falcon Team Git

Serienübersicht

N-W0rm Analyse Teil 1 

Beitrag teilen auf:

XING
Twitter
LinkedIn

SECUINFRA Falcon Team • Autor

Digital Forensics & Incident Response Experten

Neben den Tätigkeiten, die im Rahmen von Kundenaufträgen zu verantworten sind, kümmert sich das Falcon Team um den Betrieb, die Weiterentwicklung und die Forschung zu diversen Projekten und Themen im DF/IR Bereich.

> alle Artikel
Cookie Consent mit Real Cookie Banner