Malware-Payloads und Beacons: Arten bösartiger Payloads
In der vorheriger Blogbeitrag, wir haben besprochen, wie Payloads bösartige Kommunikation ermöglichen und wie ein Angreifer die Kontrolle über ein System erlangen kann, nachdem er die Payloads und Beacons erfolgreich ausgeführt hat. Wir haben einen reverse_tcp-Kommunikationskanal verwendet, der durch die Meterpreter-Nutzlast (aus dem Metasploit Framework) unterstützt wird.
Dieser Beitrag konzentriert sich darauf, mehr über die verschiedenen Arten von Nutzlasten und Beispiele für die Speichermanipulationstechniken zu erfahren, die sie möglicherweise anwenden.
Schadsoftware ist in seiner Zusammensetzung und Ausführung ausgefeilter geworden — vor allem im Gegensatz zu den Zeiten einfacherer Viren, wie dem Kriecher Programm in den frühen siebziger Jahren. Für Bedrohungsakteure, die in erster Linie von geheimen Zielen motiviert sind, ist es in der Regel ein Hauptaugenmerk, unter dem Radar zu bleiben, um über einen längeren Zeitraum unentdeckt in einem Netzwerk zu verbleiben. Daher werden sie entsprechende Techniken wie Köder, Kodierung, Verschleierung, Verschlüsselung und Nachahmung einsetzen, um das gewünschte Maß an Betriebssicherheit zu erreichen.
Einem Bedrohungsakteur stehen mehrere ausführbare Formate zur Verfügung. Die Wahl des Angreifers hängt von den anfänglichen Angriffsvektoren und den nachfolgenden Aktionen ab. Hier sind einige der Metasploit Die ausführbaren und transformierten Formate von Framework.
Wie gezeigt in Teil eins, das Beacon oder die Nutzlast ist das Implantat auf einer Maschine oder einem Netzwerk des Opfers, das einem Angreifer Zugang gewährt und dann Fuß fasst. Es ist ein wichtiger Bestandteil des Malware-Arsenals und des gesamten Angriffslebenszyklus und ermöglicht dem Bedrohungsakteur direkten Zugriff, um weiteren bösartigen Aktivitäten nachzugehen.
Wenn es um die eigentliche allgemeine Kategorisierung geht, kann eine Nutzlast entweder „inszeniert“ oder „stufenlos“ sein. Ein Bedrohungsakteur kann das eine dem anderen vorziehen, abhängig von mehreren Faktoren, von denen in erster Linie Überlegungen zur Betriebssicherheit sein können.
Was sind gestaffelte Nutzlasten?
Bei gestaffelten Nutzlasten werden die einzelnen Phasen eines Angriffs aufgeschlüsselt, wobei häufig mehrere Nutzlastphasen verwendet werden, die eine einzelne Nutzlast andernfalls ausgeführt hätte. Diese Payloads werden in der Regel in eine „Stager“ -Programmdatei (anfängliche Nutzlast oder Beacon) und eine „Stage“ -Programmdatei (Hauptnutzlast) aufgeteilt.
Ein Stager ist eine kleine ausführbare Datei, die eine anfängliche Nutzlast darstellt. Dabei handelt es sich um einen relativ kleinen Codeabschnitt, der ausgeführt wird, um sich auf eine viel größere und leistungsfähigere Nutzlast vorzubereiten, die sogenannte Staging-Nutzlast. Das bedeutet, dass „der Stager die Bühne bereitet“. Ein Stager ist in der Regel Teil eines Exploit-Codes, wenn der erste Eintrag eine Sicherheitslücke ausnutzt. Hier nutzt der Exploit-Code die Zielschwachstelle erfolgreich aus und führt dann den Stager-Code (Payload) aus. Der Stager tritt dann in Aktion.
Die Hauptaufgabe des Stagers besteht darin, erfolgreich und ohne Erkennung auszuführen, die Infrastruktur des Angreifers wieder zu kontaktieren, um die gewünschte Hauptnutzlast herunterzuladen, und dann das System so einzurichten, dass es diese Payload ausführt. Bei der heruntergeladenen Stufe oder einer größeren Hauptnutzlast kann es sich je nach den vom Angreifer benötigten Fähigkeiten um eine oder mehrere Payloads handeln. Sobald die Stufe heruntergeladen ist, übergibt der Stager dann die Ausführungskontrolle, um die bösartige Aktivität fortzusetzen.
Im Falle eines Schwachstellen-Exploits macht das anfängliche Exploit-Programm für den Stager etwas Ähnliches wie der Stager für die Nutzlast der Hauptstufe, was die Ressourcenzuweisung auf dem kompromittierten System angeht. Es wird einem ähnlichen Muster folgen:
Das folgende Beispiel zeigt eine gestaffelte Nutzlast als ausführbare Windows-Datei.
Staging-Payloads eignen sich für Szenarien, in denen es systembedingte Einschränkungen wie Festplatten- und Speicherplatz geben kann, wenn es um die Bereitstellung und Ausführung von Nutzdaten geht — wie im Fall von Shellcode, der verwendet wird, um eine Pufferüberlauf-Schwachstelle auszunutzen.
Was sind stufenlose Nutzlasten?
Das Gegenteil von abgestuften Nutzlasten sind stufenlose Nutzlasten. Nutzlasten ohne Stufen sind in sich abgeschlossen und in der Regel viel größer als abgestufte Nutzlasten. Sie kombinieren in der Regel alle für einen Angreifer erforderlichen Funktionen in einer ausführbaren Datei.
Hier ist in der Regel keine anfängliche Nutzlast (Stager) erforderlich, die die Hauptnutzlast (Stager) herunterlädt. Sobald die Nutzlast ohne Stufen ausgeführt wird, verfügt sie über alle notwendigen Funktionen, um böswillige Aktionen auszuführen, wie z. B. Speicherinjektion, Rückrufe an die Infrastruktur des Angreifers und Bereitstellung einer Shell für den Angreifer.
Das folgende Beispiel zeigt eine stufenlose Meterpreter-Reverse-TCP-Nutzlast als ausführbare Windows-Datei.
Die Entscheidung, welche Art von Nutzlast im Rahmen einer böswilligen Kampagne verwendet werden soll, wird für diesen Bedrohungsakteur als „betriebliche Sicherheitsüberlegungen“ bezeichnet. Die Art der entsprechenden Angreiferinfrastruktur, die die bösartige Kampagne unterstützt, wird teilweise von diesen Überlegungen beeinflusst.
Mehrstufige Nutzlasten im Vergleich zu stufenlosen Nutzlasten
In Metasploit inszenierte Nutzlasten haben den Schrägstrich (/) hinter dem Wort Meterpreter. Die Abbildung unten zeigt Beispiele für in Windows bereitgestellte Meterpreter-Payloads.
Nutzlasten ohne Stufen verwenden das Unterstrichsymbol (_) nach dem Wort Meterpreter. Die Abbildung unten zeigt Beispiele für stufenlose Windows Meterpreter-Payloads.
Und das folgende Beispiel zeigt beide Kategorien von Nutzlasten.
Nutzlasten ohne Stufen sind in sich abgeschlossen und erfordern nicht den zusätzlichen Schritt, eine Stufe (Hauptnutzlast) an den Computer des Opfers zu senden, sobald die Malware einen Rückruf an die Infrastruktur des Angreifers tätigt. Beachten Sie in der Abbildung unten, dass nach dem Start des Reverse-TCP-Handlers der nächste Schritt darin besteht, sofort eine praktische Meterpreter-Remote-Shell-Sitzung für den Opfercomputer zu öffnen — ohne dass weitere Payloads wie eine Stage gesendet werden müssen.
In der Abbildung unten können wir sehen, dass es den zusätzlichen Schritt gibt, die Stage zu senden, nachdem der Stager einen Callback an die Infrastruktur des Angreifers getätigt hat: „Stage (175174) to 203.0.113.1 senden“.
Ein weiterer Unterschied zwischen stufenweise und stufenlos ist die Größe der Nutzlasten. In der Abbildung unten ist die Nutzlast ohne Stufen (meeting_update_stageless.exe) mit 245 KB viel größer als die Nutzlast in Staging (web1_meeting_update.exe) mit 73 KB.
Was ist Shellcode?
Shellcode ist ein bösartiger Code, der versucht, den normalen Ablauf eines laufenden Programms im Computerspeicher zu kapern. Anschließend leitet er den Datenfluss um, sodass der Schadcode anstelle des normalen Programms ausgeführt wird, sodass der Angreifer eine Shell oder einen Hands-On-Zugriff erhält. Dabei handelt es sich häufig um Beacons oder Payloads in Form von Low-Level-Programmiercode oder einem Maschinencode in Kombination mit einem Exploit. Exploits sind Teile von Low-Level oder nativem Code, die eine Sicherheitslücke erfolgreich ausnutzen.
Bei ausgenutzten Sicherheitslücken kommt es häufig zu einem Pufferüberlauf im Speicher einer Anwendung, bei dem der Angreifer den zugewiesenen Speicher überrannt hat, um den normalen Programmablauf umzuleiten. Ein erfolgreicher Exploit führt dann zur Ausführung einer Payload, bei der es sich um die Malware handelt.
In seiner reinsten Form wird Shellcode nativer Code oder Assemblercode sein, der häufig bei speicherbezogenen Exploits verwendet wird.
Das folgende Beispiel zeigt den Powershell (ps1) -Shellcode.
Dieses spezielle Beispiel verwendet eine Dynamische Link-Bibliothek von Windows (DLL) wird über einen reflektierenden Loader in den Speicher injiziert. Der Shellcode wird in alphanumerischer Form generiert. Nach erfolgreicher Ausführung kann er über eine vom Metasploit Framework generierte Reverse-DNS-TCP-Sitzung eine Verbindung zum Angreifer herstellen.
Die Wahl des Übertragungsmechanismus, die Art des Exploits und das anfällige Zielsystem bestimmen die Wahl des Beacons oder der Nutzlast, die mit dem Angriff verknüpft sind. Der Exploit wird verwendet, um eine anfällige Anwendung auszunutzen, bevor Zugriff auf das zugrunde liegende Betriebssystem erlangt wird. In einem solchen Fall kann spezifischer Code für die entsprechende Anwendung verwendet werden (z. B. PHP oder ASP für Webserver-Frontend-Anwendungen).
Shellcode-Eigenschaften
Es gibt einige wichtige Überlegungen und Merkmale, um eine erfolgreiche Shellcode-Ausführung sicherzustellen und eine hohe Betriebssicherheit aufrechtzuerhalten.
Der Code muss:
- Haben Sie alle Anweisungen, die zum Ausführen der gewünschten Shell erforderlich sind, und sind Sie dennoch relativ klein.
- Seien Sie „positionsunabhängig“ im Speicher — das ist entscheidend, da es oft nicht möglich ist, vorher zu wissen, wo es in den Speicher des anfälligen Zielprozesses geladen wird.
- Enthält nichts, was zu potenziellen Fehlern oder zum Absturz des gesamten Prozesses führen könnte, z. B. aufgrund von Nullzeichen (0x00).
- Seien Sie in der Lage, mithilfe einiger Injektionstechniken — Code- oder Reflexionsinjektion — einen Teil der vorhandenen Speicherzuweisung zu nutzen.
Ab diesem Zeitpunkt muss der Angreifer dann den geeigneten ausführbaren Post-Exploit-Typ auswählen, der auf dem Zielsystem ausgeführt werden soll, z. B. EXE oder DLL für Windows, ELF für Linux und APKs für Android. Um die Betriebssicherheit zu erhöhen, werden auch hier Techniken bevorzugt, die nach der Ausnutzung nur Speicher verwenden.
Was ist Codeinjektion und DLL-Injektion?
DLL-Injektion ist der Prozess, bei dem Code (DLL) im Kontext eines anderen Prozesses ausgeführt wird. Meterpreter-Nutzlasten verwenden DLL-Injektionstechniken für Tarnungs- und Ausweichmechanismen.
In Windows ist eine Dynamic Link Library oder DLL („Shared Library“ in Linux) ein Codeabschnitt, der als gemeinsam genutzte Bibliotheksdatei gespeichert wird. Dies bedeutet, dass sie von verschiedenen Computerprogrammen nach Bedarf verwendet werden kann. Das Betriebssystem (in diesem Fall Windows) übernimmt das Schreiben und Laden der Bibliothek, was zur Laufzeit erfolgt. Ein Programm kann einfach die benötigte DLL-Datei aufrufen oder auf sie verweisen, um den darin enthaltenen Code zu verwenden.
Dies ist für Programmierer nützlich, da sie Code nur einmal schreiben, ihn kompilieren und als gemeinsam genutzte Bibliothek oder DLL speichern und ihn dann bei Bedarf und von mehreren Programmen verwenden.
Der Hauptunterschied zwischen einer DLL- und einer EXE-Datei besteht darin, dass eine DLL nicht unabhängig ausgeführt werden kann. Es benötigt ein Programm wie eine EXE, um es aufzurufen oder zu referenzieren und dann auszuführen. Das folgende Beispiel zeigt DLL-Dateien in einem Windows-Betriebssystem, die normalerweise im Ordner C:\Windows\ WinSxS gespeichert werden (WinSxS steht für Windows Side-by-Side).
Die Fähigkeiten von DLLs machen sie auch für Bedrohungsakteure sehr nützlich. Bei der Code-Injection versucht ein Prozess (bösartig), einen Remote-Prozess (Opferprozess) anzuhängen (oder ein Handle zu erhalten). Anschließend wird dem Opferprozess genügend Arbeitsspeicher zugewiesen oder Seitenberechtigungen geändert, um neuen Code wie eine DLL auszuführen. Danach wird der bösartige DLL-Code in den Speicherplatz des neuen oder bereits laufenden Opferprozesses kopiert (injiziert).
Ein neuer Thread, in dem Prozesse bestimmte Aufgaben ausführen, wird dann im Opferprozess gestartet, um die im injizierten Code oder der DLL enthaltenen Anweisungen auszuführen.
Ein Thread teilt sich den gleichen Speicherplatz wie der Prozess, der ihn gestartet hat, wohingegen verschiedene Prozesse unterschiedliche Speicherbereiche zugewiesen sind, insbesondere in Fällen, in denen sie keine Variablen gemeinsam nutzen. Dies wird vom Betriebssystem erzwungen. Betriebssysteme bieten jedoch Mechanismen, mit denen Prozesse bei Bedarf mithilfe von Inter-Process Communication (IPC) kommunizieren können, wie Pipes (benannt oder anonym), Sockets, Semaphore, Shared Memory und Message Queues.
In Windows-Betriebssystemen beinhaltet die Codeinjektion die Verwendung legitimer Windows-APIs und -Funktionen für böswillige Zwecke. Zum Beispiel:
- Prozess öffnen wird verwendet, um einen Prozess in den Griff zu bekommen,
- Virtuelles Allocex erleichtert dann die Zuweisung von ausreichend Speicher in diesem Remote-Prozess oder
- Virtuell geschütztes X kann verwendet werden, um Speicher- (Seiten-) Berechtigungen zu überschreiben, und dann
- Prozessspeicher schreiben schreibt den Schadcode, z. B. eine DLL, in den Opferprozess.
- CreateRemoteThread, RTLCreateUserThread oder ntCreateThreadEx wird verwendet, um einen neuen Thread zu erstellen (über den Prozesse bestimmte Aufgaben ausführen) und bösartige Funktionen wie das Stehlen von Anmeldeinformationen oder das Ausführen von Ransomware auszuführen.
Das Laden einer DLL in Windows erfordert den Aufruf der Funktionen LoadLibraryA oder LoadLibraryExa, die Teil von libloaderapi.h sind. Diese Funktionen, wie Microsoft es ausdrückt, „laden das angegebene Modul in den Adressraum des aufrufenden Prozesses“. Die Verwendung von LoadLibrary zum Laden einer DLL bedeutet, dass die DLLs von der Festplatte geladen werden müssen.
Mithilfe der reflektierenden DLL-Injektionstechnik kann eine DLL jedoch direkt aus dem Speicher geladen werden, eine Funktion, die LoadLibrary derzeit nicht bietet. Ein Bedrohungsakteur kann mithilfe der reflektierenden DLL-Injektion seinen bösartigen Code selbst vollständig in den Arbeitsspeicher laden, ohne dass der native Windows-Loader auf der Festplatte aufgerufen werden muss. Hier verwenden sie einen benutzerdefinierten Loader anstelle der Windows LoadLibrary.
Angreifer können auch andere Injektions- und Prozessmanipulationstechniken verwenden, wie z. B.:
- Aushöhlen verarbeiten — Schadsoftware startet einen Opferprozess in einem angehaltenen Zustand. Anschließend höhlt sie den Speicher aus, um Platz für neuen Code zu schaffen, ändert Seitenberechtigungen, injiziert bösartigen Code und setzt den Prozess fort, um den injizierten bösartigen Code auszuführen.
- DLL-Seitenladen — Wenn ein legitimes und oft älteres anfälliges Windows-Programm (Opferprozess) gezwungen wird, eine bösartige DLL zu laden, die bewusst mit der vom Opfer erwarteten legitimen DLL identisch benannt und im selben Verzeichnis (Seite an Seite) wie das anfällige Programm abgelegt wird. Der Prozess des Opferprogramms durchsucht zunächst seinen unmittelbaren Ordner, um die umbenannte (nachgeahmte) bösartige DLL zu finden. Diese Technik nutzt die DLL-Suchreihenfolge, die der Windows-Loader verwendet hat, um erfolgreich zu sein.
Diese Techniken versuchen, böswillige Aktivitäten als legitim erscheinen zu lassen, sodass sie nicht erkannt werden und auf einem kompromittierten System bestehen bleiben.
Aus den erörterten Techniken zur Prozessmanipulation in Teil eins dieser Serie, wir können unten sehen, dass die Migration der ursprünglichen bösartigen web1_meeting_update.exe eine Code-Injektion beinhaltete.
In diesem Beispiel hat die bösartige Nutzlast einen völlig neuen Prozess notepad.exe als den gewünschten Opferprozess zum Injizieren von Code gestartet (erzeugt). Der ursprüngliche bösartige Prozess (PID 2472) wird dann in den neuen Opferprozess notepad.exe (PID 1768) injiziert oder migriert.
Notepad.exe ist ein vertrauenswürdiger Microsoft-Prozess, und als solcher gibt dies dem Angreifer die Möglichkeit, den ursprünglich bösartig aussehenden Prozess durch einen vertrauenswürdigeren Prozess zu verschleiern. Notepad.exe ist ein einfacher Windows-Texteditor, der keine Windows-API, -Funktion oder -DLL aufrufen (referenzieren) muss, die für die Netzwerkverbindung erforderlich sind — was in unserem Beispiel der bösartige Prozess ist, der ausgeführt wurde.
Eine dynamische Analyse ist erforderlich, um die Injektion im Speicher zu erkennen. Zuordnung von Anwendungsabhängigkeiten wird auch benötigt, um die verdächtige Netzwerkkommunikation des Texteditors, in diesem Fall des Prozesses notepad.exe, zu erkennen und eine Netzwerkverbindung herzustellen.
Fazit
Im Anschluss an Teil eins In dieser Blogserie haben wir einige der Kategorien und Typen von Payloads untersucht, die ein Bedrohungsakteur verwenden kann, und warum er möglicherweise dafür entscheidet, einen anderen Typ vorzuziehen.
The most angreifers are major efforts to ensure that they are successful with first access, their persistence and prevent an discovery. Bisher haben wir festgestellt, dass die Kombination von Tools, Techniken und Verfahren bedeutet, dass eine ebenso leistungsfähige Kombination von Sicherheitstools und -verfahren erforderlich ist, um einen erfolgreichen Angriff zu verhindern — oder mit größerer Wahrscheinlichkeit von einem Verstoß ausgehen und verhindern, dass aus einem anfänglichen Cybervorfall ein schwerwiegender Verstoß wird.
Im letzten Teil dieser Reihe werden wir einige weitere Techniken und Fähigkeiten erörtern und, was am wichtigsten ist, Analysen und Schadensbegrenzungen untersuchen.