Malware-Payloads & Beacons: Arten von bösartigen Payloads
Im vorherigen Blogbeitrag haben wir erörtert, wie Payloads bösartige Kommunikation erleichtern und wie ein Angreifer nach erfolgreicher Ausführung der Payloads und Beacons die Kontrolle über ein System erlangen kann. Wir haben einen reverse_tcp Kommunikationskanal verwendet, der durch die Meterpreter-Nutzlast (aus dem Metasploit-Framework) ermöglicht wird.
In diesem Beitrag geht es darum, mehr über die verschiedenen Arten von Nutzlasten und Beispiele für die Speichermanipulationstechniken zu erfahren, die sie verwenden können.
Malware ist in ihrer Zusammensetzung und Ausführung immer ausgefeilter geworden – vor allem im Gegensatz zu den Tagen einfacherer Viren wie dem Creeper-Programm in den frühen siebziger Jahren. Für Bedrohungsakteure, die in erster Linie durch geheime Ziele 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 bleiben. Daher werden sie entsprechende Techniken wie Köder, Codierung, 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 nach der Ausnutzung ab. Hier sind einige der ausführbaren und transformierbaren Formate des Metasploit Frameworks.

Wie im ersten Teil gezeigt, ist der Beacon oder die Payload das Implantat auf einem Opfercomputer oder -netzwerk, das einem Angreifer Zugang und dann Halt gibt. Es ist ein wichtiger Teil des Malware-Arsenals und des gesamten Angriffslebenszyklus und ermöglicht dem Bedrohungsakteur den direkten Zugriff, um weitere bösartige Aktivitäten zu verfolgen.
Wenn es um die eigentliche allgemeine Kategorisierung geht, kann eine Nutzlast entweder "gestuft" oder "bühnenlos" sein. Ein Bedrohungsakteur kann sich je nach mehreren Faktoren für das eine oder das andere entscheiden, wobei die wichtigste betriebliche Sicherheit sein kann.
Was sind gestaffelte Nutzlasten?
Gestaffelte Payloads schlüsseln die verschiedenen Phasen eines Angriffs auf, wobei häufig mehrere Payload-Phasen verwendet werden, die sonst von einer einzelnen Payload ausgeführt worden wären. Diese Payloads werden in der Regel in eine ausführbare "Stester"-Datei (anfängliche Nutzlast oder Beacon) und eine ausführbare "Stage"-Datei (Hauptnutzlast) unterteilt.
Ein Stager ist eine kleine ausführbare Datei, bei der es sich um eine anfängliche Nutzlast handelt. Es handelt sich um ein relativ kleines Stück Code, das ausgeführt wird, um eine viel größere und leistungsfähigere Nutzlast vorzubereiten, die als Phasennutzlast bezeichnet wird. Das bedeutet, dass "der Inszenierer die Bühne bereitet". Ein Stager ist in der Regel Teil eines Exploit-Codes, wenn der erste Eintrag eine Schwachstelle ausnutzt. Hier nutzt der Exploit-Code die Zielschwachstelle erfolgreich aus und führt dann den Stager-Code (Payload) aus. Dann tritt der Stager in Aktion.
Die Hauptaufgabe des Stagers besteht darin, erfolgreich und unentdeckt auszuführen, sich wieder an die Infrastruktur des Angreifers zu wenden, um die gewünschte Hauptnutzlast herunterzuladen, und dann das System so einzurichten, dass diese Nutzlast ausgeführt wird. Die heruntergeladene Phase oder eine größere Hauptnutzlast kann eine oder mehrere Nutzlasten sein, je nachdem, welche Funktion der Angreifer benötigt. Sobald die Phase heruntergeladen wurde, übergibt der Stager die Ausführungssteuerung, um die bösartige Aktivität fortzusetzen.
Im Falle eines Schwachstellen-Exploits führt das anfängliche Exploit-Programm für den Stager etwas Ähnliches aus wie der Stager für die Nutzlast der Hauptstufe, was die Ressourcenzuweisung auf dem kompromittierten System betrifft. Es folgt ein ähnliches Muster wie dieses:

Das folgende Beispiel zeigt eine bereitgestellte Nutzlast als ausführbare Windows-Datei.

Staged Payloads eignen sich für Szenarien, in denen es systembezogene Einschränkungen geben kann, wie z. B. Festplatten- und Speicherplatz, wenn es um die Bereitstellung und Ausführung von Payloads geht – wie im Fall von Shellcode, der zur Ausnutzung einer Pufferüberlauf-Schwachstelle verwendet wird.
Was sind stufenlose Nutzlasten?
Das Gegenteil von gestaffelten Nutzlasten sind stufenlose Nutzlasten. Stufenlose Nutzlasten sind in sich geschlossen und in der Regel viel größer als gestaffelte Nutzlasten. Sie vereinen in der Regel alle erforderlichen Fähigkeiten eines Angreifers in einer ausführbaren Datei.
Hier ist in der Regel keine initiale Payload (Stager) erforderlich, die die Hauptpayload (Stager) herunterlädt. Sobald die stufenlose Nutzlast ausgeführt wird, verfügt sie über alle notwendigen Funktionen, um bösartige Aktionen auszuführen, wie z. B. Speicherinjektion, Rückruf 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 als Teil einer bösartigen Kampagne verwendet werden soll, wird als "betriebliche Sicherheitsüberlegungen" für diesen Bedrohungsakteur bezeichnet. Die Art der entsprechenden Angreiferinfrastruktur, die die bösartige Kampagne unterstützt, wird teilweise von diesen Überlegungen beeinflusst.
Gestaffelte vs. stufenlose Nutzlasten
Metasploit-Staged-Payloads haben das Schrägstrichsymbol ( / ) nach dem Wort Meterpreter. Der folgende Screenshot zeigt Beispiele für von Windows bereitgestellte Meterpreter-Nutzlasten.

Stufenlose Nutzlasten verwenden das Unterstrichsymbol ( _ ) nach dem Wort Meterpreter. Der folgende Screenshot zeigt Beispiele für stufenlose Windows Meterpreter-Nutzlasten.

Das folgende Beispiel zeigt beide Kategorien von Nutzlasten.

Phasenlose Payloads sind in sich geschlossen und erfordern nicht den zusätzlichen Schritt, eine Stufe (Hauptnutzlast) an den Opfercomputer zu senden, sobald die Malware einen Rückruf an die Infrastruktur des Angreifers sendet. Beachten Sie im Screenshot unten, dass der nächste Schritt nach dem Start des Reverse-TCP-Handlers darin besteht, sofort eine praktische Meterpreter-Remote-Shell-Sitzung für den Opfercomputer zu öffnen – ohne dass weitere Nutzlasten, wie z. B. eine Phase, gesendet werden müssen.

Aus dem Screenshot unten können wir sehen, dass es einen zusätzlichen Schritt gibt, den Abschnitt zu senden, nachdem der Stager einen Rückruf an die Infrastruktur des Angreifers getätigt hat: "Senden der Phase (175174) an 203.0.113.1".

Ein weiterer Unterschied zwischen gestuft und bühnenlos ist die Größe der Nutzlasten. Im folgenden Screenshot ist die stufenlose Nutzlast (meeting_update_stageless.exe) mit 245 KB viel größer als die gestaffelte anfängliche Nutzlast (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 wird der Ablauf so umgeleitet, dass der bösartige Code anstelle des normalen Programms ausgeführt wird, wodurch der Angreifer eine Shell oder einen praktischen 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, der eine Schwachstelle erfolgreich ausnutzt.
Ausgenutzte Sicherheitsanfälligkeiten beinhalten häufig einen Pufferüberlauf im Speicher einer Anwendung, bei dem der Angreifer den zugewiesenen Speicher überschritten hat, um den normalen Programmablauf umzuleiten. Ein erfolgreicher Exploit führt dann zur Ausführung einer Nutzlast, bei der es sich um die Malware handelt.
In seiner reinsten Form handelt es sich bei Shellcode um nativen oder Assembler-Code, der häufig in speicherbezogenen Exploits verwendet wird.
Das folgende Beispiel zeigt Powershell (ps1)-Shellcode.

In diesem speziellen Beispiel wird eine Windows Dynamic Link Library (DLL) verwendet, die über ein reflektierendes Ladeprogramm in den Arbeitsspeicher eingefügt wird. Der Shellcode wird in alphanumerischer Form generiert. Nach erfolgreicher Ausführung kann es sich über eine Reverse-DNS-TCP-Sitzung, die vom Metasploit-Framework generiert wird, wieder mit dem Angreifer verbinden.
Die Wahl des Übermittlungsmechanismus, die Art des Exploits und das anfällige Zielsystem bestimmen die Wahl des Beacons oder der Nutzlast, die mit dem Angriff verbunden sind. Der Exploit wird verwendet, um eine anfällige Anwendung auszunutzen, bevor sie Zugriff auf das zugrunde liegende Betriebssystem erhält. 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 zu gewährleisten und eine hohe Betriebssicherheit aufrechtzuerhalten.
Der Code muss:
- Halten Sie alle Anweisungen bereit, die zum Ausführen der gewünschten Shell erforderlich sind, obwohl sie noch relativ klein ist.
- Seien Sie "positionsunabhängig" im Speicher – dies ist entscheidend, da es oft nicht möglich ist, im Voraus zu wissen, wo es im Speicher des anfälligen Zielprozesses geladen wird.
- Nichts enthalten, was potenzielle Fehler verursachen oder den gesamten Prozess zum Absturz bringen könnte; Zum Beispiel aufgrund von NULL-Zeichen (0x00).
- Sie müssen in der Lage sein, eine vorhandene Speicherzuweisung mit Hilfe einiger Injektionstechniken – Code- oder Reflexionsinjektion – zu nutzen.
Von diesem Zeitpunkt an muss der Angreifer den entsprechenden Typ der ausführbaren Datei nach dem Exploit 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. Auch hier werden Techniken nach der Ausnutzung nur mit Speicher bevorzugt, um die Betriebssicherheit zu erhöhen.
Was ist Code-Injection und DLL-Injection?
DLL-Injektion ist der Prozess des Ausführens von Code (DLL) im Kontext eines anderen Prozesses. Meterpreter-Nutzlasten verwenden DLL-Injektionstechniken für Stealth- und Umgehungsmechanismen.
Unter Windows ist eine Dynamic Link Library oder DLL ("Shared Library" unter Linux) ein Stück Code, das als gemeinsam genutzte Bibliotheksdatei gespeichert ist. Das bedeutet, dass es von verschiedenen Computerprogrammen verwendet werden kann, wann immer sie es benötigen. Das Betriebssystem (in diesem Fall Windows) übernimmt das Schreiben und Laden der Bibliothek, was zur Laufzeit erfolgt. Ein Programm kann einfach die erforderliche DLL-Datei aufrufen oder darauf verweisen, um den darin enthaltenen Code zu verwenden.
Dies ist nützlich für Programmierer, da sie Code nur einmal schreiben, kompilieren und als gemeinsam genutzte Bibliothek oder DLL speichern und ihn dann bei Bedarf und von mehreren Programmen verwenden können.
Der Hauptunterschied zwischen einer DLL und einer EXE-Datei besteht darin, dass eine DLL nicht unabhängig voneinander 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 in der Regel im Ordner C:\Windows\ WinSxS gespeichert sind (WinSxS steht für Windows Side-by-Side).

Die Fähigkeiten von DLLs machen sie auch sehr nützlich für Bedrohungsakteure. Bei der Codeinjektion auf der grundlegenden Ebene handelt es sich um den Versuch eines Prozesses (bösartig), einen Remoteprozess (Opferprozess) an einen Remoteprozess anzuhängen (oder ein Handle zu erhalten). Anschließend wird im Opferprozess genügend Arbeitsspeicher zugewiesen oder Seitenberechtigungen geändert, um neuen Code wie eine DLL auszuführen, wonach der DLL-Schadcode in den Speicherplatz des neuen oder bereits ausgeführten Opferprozesses kopiert (injiziert) wird.
Ein neuer Thread, in dem Prozesse bestimmte Aufgaben ausführen, wird dann im Opferprozess gestartet, um die Anweisungen auszuführen, die im injizierten Code oder in der DLL enthalten sind.
Ein Thread teilt sich denselben Speicherplatz wie der Prozess, der ihn gestartet hat, während verschiedene Prozesse unterschiedliche zugeordnete Speicherplätze haben, insbesondere in Fällen, in denen sie keine Variablen gemeinsam nutzen. Dies wird vom Betriebssystem erzwungen. Betriebssysteme stellen jedoch Mechanismen bereit, mit denen Prozesse bei Bedarf mithilfe von Interprozesskommunikation (Inter-Process Communication, IPC) kommunizieren können, z. B. Pipes (benannt oder anonym), Sockets, Semaphoren, gemeinsam genutzter Speicher und Nachrichtenwarteschlangen.
In Windows-Betriebssystemen beinhaltet die Code-Injektion die Verwendung legitimer Windows-APIs und -Funktionen für böswillige Zwecke. Zum Beispiel:
- OpenProcess wird verwendet, um ein Handle in einen Prozess zu erhalten,
- VirtualAllocEx erleichtert dann die Zuweisung von genügend Arbeitsspeicher in diesem Remoteprozess oder
- VirtualProtectEx kann verwendet werden, um Speicherberechtigungen (Seitenberechtigungen) zu überschreiben, und dann
- WriteProcessMemory schreibt den bösartigen Code, z. B. eine DLL, in den Opferprozess.
- CreateRemoteThread, RtlCreateUserThread oder NtCreateThreadEx wird verwendet, um einen neuen Thread zu erstellen (wie Prozesse bestimmte Aufgaben ausführen) und die bösartige Funktion auszuführen, z. B. das Stehlen von Anmeldeinformationen oder das Ausführen von Ransomware.
Zum Laden einer DLL in Windows müssen die Funktionen LoadLibraryA oder LoadLibraryExA aufgerufen werden, die Teil von libloaderapi.h sind. Diese Funktionen laden, wie Microsoft es ausdrückt, "das angegebene Modul in den Adressraum des aufrufenden Prozesses". Die Verwendung von LoadLibrary zum Laden einer DLL bedeutet, dass die DLLs vom Datenträger geladen werden müssen.
Mit der reflektierenden DLL-Injektionstechnik kann eine DLL jedoch direkt aus dem Speicher geladen werden, eine Funktion, die derzeit von LoadLibrary nicht angeboten wird. Ein Bedrohungsakteur kann die reflektierende DLL-Injektion verwenden, um seinen bösartigen Code vollständig in den Speicher zu 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.:
- Prozessaushöhlung – Malware startet einen Opferprozess in einem angehaltenen Zustand. Anschließend wird der Speicher ausgehöhlt, um Platz für neuen Code zu schaffen, Seitenberechtigungen geändert, bösartiger Code eingefügt und der Prozess zur Ausführung des injizierten bösartigen Codes fortgesetzt.
- DLL-Querladen – Wenn ein legitimes und oft älteres anfälliges Windows-Programm (Opferprozess) gezwungen wird, eine bösartige DLL zu laden, die absichtlich den gleichen Namen hat wie eine legitime DLL, die vom Opfer erwartet wird, und die im selben Verzeichnis (nebeneinander) wie das anfällige Programm abgelegt wird. Der Prozess des Opferprogramms sucht zuerst in seinem unmittelbaren Ordner, um die umbenannte (imitierte) bösartige DLL zu finden. Diese Technik nutzt die DLL-Suchreihenfolge, die vom Windows-Ladeprogramm verwendet wird, um erfolgreich zu sein.
Diese Techniken versuchen, bösartige Aktivitäten legitim erscheinen zu lassen und so der Erkennung zu entgehen, um auf einem kompromittierten System bestehen zu bleiben.
Aus den Prozessmanipulationstechniken, die im ersten Teil dieser Serie besprochen wurden, können wir unten sehen, dass die Migration des ursprünglichen bösartigen web1_meeting_update.exe eine gewisse Code-Injektion beinhaltete.
In diesem Beispiel hat die bösartige Payload einen völlig neuen notepad.exe Prozess als gewünschten Opferprozess zum Einfügen von Code gestartet. Der ursprüngliche bösartige Prozess (PID 2472) wird dann in den neuen notepad.exe Opferprozess (PID 1768) injiziert oder migriert.

Notepad.exe handelt sich um einen vertrauenswürdigen Microsoft-Prozess, der dem Angreifer die Möglichkeit gibt, den ursprünglichen bösartig aussehenden Prozess für einen vertrauenswürdigeren Prozess zu tarnen. Notepad.exe handelt sich um einen einfachen 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.
Eine dynamische Analyse ist erforderlich, um die Injektion im Speicher zu erkennen. Die Zuordnung von Anwendungsabhängigkeiten ist auch erforderlich, um die verdächtige Netzwerkkommunikation des Texteditors zu erkennen, in diesem Fall notepad.exe Prozesses, der eine Netzwerkverbindung herstellt.
Conclusion
Im Anschluss an den ersten Teil dieser Blogserie haben wir uns einige der Kategorien und Arten von Nutzlasten angesehen, die ein Bedrohungsakteur verwenden kann, und warum er sich möglicherweise für einen Typ gegenüber einem anderen entscheidet.
Die meisten Bedrohungsangreifer unternehmen große Anstrengungen, um sicherzustellen, dass sie einen erfolgreichen Ersteintritt haben, die Persistenz aufrechterhalten und eine Entdeckung vermeiden. Wir haben bisher gesehen, 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 eher von einer Sicherheitsverletzung auszugehen und zu verhindern, dass ein erster Cybervorfall zu einer größeren Sicherheitsverletzung wird.
Im letzten Teil dieser Serie werden wir einige weitere Techniken und Fähigkeiten besprechen und vor allem die Analyse und Minderung untersuchen.