
Generiert positionsunabhängigen Shellcode für x86, x64 oder AMD64+x86, der .NET-Assemblies, PE-Dateien und andere Windows-Payloads aus dem Speicher lädt und mit Parametern ausführt

Aktuelle Version: v1.1
Donut ist ein positionsunabhängiger Code, der die In-Memory-Ausführung von VBScript-, JScript-, EXE-, DLL-Dateien und .NET-Assemblys ermöglicht. Ein mit Donut erstelltes Modul kann entweder von einem HTTP-Server bereitgestellt oder direkt in den Loader selbst eingebettet werden. Das Modul wird optional mit der Chaskey-Blockchiffre und einem 128-Bit-zufällig generierten Schlüssel verschlüsselt. Nachdem die Datei geladen und im Speicher ausgeführt wurde, wird die ursprüngliche Referenz gelöscht, um Speicherscanner abzuschrecken. Der Generator und Loader unterstützen die folgenden Funktionen:
Es gibt dynamische und statische Bibliotheken für Linux und Windows, die in Ihre eigenen Projekte integriert werden können. Es gibt auch ein Python-Modul, über das Sie in Building and using the Python extension mehr erfahren können.
Donut enthält individuelle Loader für jeden unterstützten Dateityp. Für .NET EXE/DLL-Assemblys verwendet Donut die Unmanaged CLR Hosting API, um die Common Language Runtime zu laden. Sobald die CLR in den Hostprozess geladen ist, wird eine neue Anwendungsdomäne erstellt, um die Ausführung von Assemblys in entsorgbaren AppDomains zu ermöglichen. Wenn die AppDomain bereit ist, wird die .NET-Assembly über die Methode AppDomain.Load_3 geladen. Schließlich wird der Einstiegspunkt für EXEs oder die vom Benutzer festgelegte öffentliche Methode für DLLs mit allen zusätzlichen Parametern aufgerufen. Siehe MSDN für die Dokumentation zur Unmanaged CLR Hosting API. Für ein eigenständiges Beispiel eines CLR-Hosts siehe Code hier.
VBScript- und JScript-Dateien werden über die IActiveScript-Schnittstelle ausgeführt. Es gibt auch minimale Unterstützung für einige der Methoden des Windows Script Host (wscript/cscript). Für ein eigenständiges Beispiel siehe Code hier. Für eine detailliertere Beschreibung lesen Sie: In-Memory Execution of JavaScript, VBScript, JScript and XSL
Nicht verwaltete oder native EXE/DLL-Dateien werden mit einem benutzerdefinierten PE-Loader ausgeführt, der Verzögerte Importe, TLS und das Patchen der Befehlszeile unterstützt. Es werden nur Dateien mit Verschiebeinformationen unterstützt. Lesen Sie In-Memory Execution of DLL für weitere Informationen.
Der Loader kann AMSI und WLDP deaktivieren, um die Erkennung von bösartigen Dateien, die im Speicher ausgeführt werden, zu erschweren. Weitere Informationen finden Sie unter: How Red Teams Bypass AMSI and WLDP for .NET Dynamic Code. Er unterstützt auch die Dekomprimierung von Dateien im Speicher mittels aPLib oder der RtlDecompressBuffer-API. Lesen Sie Data Compression für weitere Informationen.
Seit v1.0 wird auch ETW umgangen. Wie bei AMSI/WLDP handelt es sich um ein modulares System, das es Ihnen ermöglicht, die Standardumgehung durch Ihre eigene zu ersetzen. Die Standardumgehung basiert auf Forschungsergebnissen von XPN. Lesen Sie Hiding your .NET - ETW für weitere Informationen.
Standardmäßig überschreibt der Loader die PE-Header von nicht verwalteten PEs (von der Basisadresse bis zu `IMAGE_OPTIONAL_HEADER.SizeOfHeaders`). Wenn kein Täuschungsmodul verwendet wird (Modulüberlagerung), werden die PE-Header auf Null gesetzt. Wenn ein Täuschungsmodul verwendet wird, werden die PE-Header des Täuschungsmoduls verwendet, um die des Nutzlastmoduls zu überschreiben. Dies dient dazu, eine Erkennung durch Vergleich der PE-Header von Modulen im Speicher mit der Datei auf der Festplatte zu erschweren. Der Benutzer kann verlangen, dass alle PE-Header in ihrem ursprünglichen Zustand erhalten bleiben. Dies ist hilfreich für Szenarien, in denen das Nutzlastmodul auf seine PE-Header zugreifen muss, z. B. beim Nachschlagen eingebetteter PE-Ressourcen.
Für einen detaillierten Leitfaden zur Verwendung des Generators und wie Donut die Arbeitsweise beeinflusst, lesen Sie Donut - Injecting .NET Assemblies as Shellcode. Weitere Informationen zum Loader finden Sie unter Loading .NET Assemblies From Memory.
Diejenigen, die mehr über die Interna erfahren möchten, sollten die Entwicklernotizen lesen.