
Генерирует позиционно-независимый шелл-код для x86, x64 или AMD64+x86, который загружает сборки .NET, PE-файлы и другие полезные нагрузки Windows из памяти и запускает их с параметрами.

Текущая версия: v1.1
Donut — это позиционно-независимый код, который позволяет выполнять в памяти VBScript, JScript, EXE, DLL и сборки .NET. Модуль, созданный Donut, может быть как загружен с HTTP-сервера, так и встроен непосредственно в загрузчик. Модуль опционально шифруется с помощью блочного шифра Chaskey и 128-битного случайно сгенерированного ключа. После загрузки и выполнения файла в памяти исходная ссылка стирается для затруднения работы сканеров памяти. Генератор и загрузчик поддерживают следующие возможности:
Существуют динамические и статические библиотеки как для Linux, так и для Windows, которые можно интегрировать в ваши собственные проекты. Также есть модуль Python, о котором можно узнать больше в документации по сборке и использованию расширения Python.
Donut содержит отдельные загрузчики для каждого поддерживаемого типа файлов. Для сборок .NET EXE/DLL Donut использует Unmanaged CLR Hosting API для загрузки Common Language Runtime. После загрузки CLR в хост-процесс создаётся новый домен приложения (AppDomain) для возможности запуска сборок в disposable AppDomain. Когда AppDomain готов, сборка .NET загружается через метод AppDomain.Load_3. Наконец, вызывается точка входа для EXE или публичный метод для DLL, указанный пользователем, с любыми дополнительными параметрами. Обратитесь к MSDN за документацией по Unmanaged CLR Hosting API. Пример отдельного CLR Host см. в коде здесь.
Файлы VBScript и JScript выполняются с помощью интерфейса IActiveScript. Также есть минимальная поддержка некоторых методов, предоставляемых Windows Script Host (wscript/cscript). Пример отдельного решения см. в коде здесь. Более подробное описание читайте в: In-Memory Execution of JavaScript, VBScript, JScript and XSL
Неуправляемые (нативные) EXE/DLL-файлы выполняются с помощью пользовательского загрузчика PE с поддержкой отложенных импортов, TLS и патча командной строки. Поддерживаются только файлы с информацией о перемещениях. Подробнее читайте в In-Memory Execution of DLL.
Загрузчик может отключать AMSI и WLDP, чтобы помочь обойти обнаружение вредоносных файлов, выполняемых в памяти. Подробнее читайте в How Red Teams Bypass AMSI and WLDP for .NET Dynamic Code. Также он поддерживает декомпрессию файлов в памяти с помощью aPLib или API RtlDecompressBuffer. Подробнее читайте в Data Compression.
Начиная с версии v1.0 также осуществляется обход ETW. Как и для AMSI/WLDP, это модульная система, позволяющая заменить стандартный обход на свой собственный. Стандартный обход основан на исследовании XPN. Подробнее читайте в Hiding your .NET - ETW.
По умолчанию загрузчик перезаписывает заголовки PE неуправляемых PE (от базового адреса до `IMAGE_OPTIONAL_HEADER.SizeOfHeaders`). Если модуль-приманка не используется (module overloading), заголовки PE обнуляются. Если используется модуль-приманка, заголовки PE модуля-приманки используются для перезаписи заголовков полезной нагрузки. Это делается для затруднения обнаружения путём сравнения заголовков PE модулей в памяти с файлами на диске. Пользователь может запросить сохранение всех заголовков PE в исходном состоянии. Это полезно в сценариях, когда модулю полезной нагрузки требуется доступ к своим заголовкам PE, например, для поиска встроенных PE-ресурсов.
Подробное руководство по использованию генератора и влиянию Donut на тактику см. в Donut - Injecting .NET Assemblies as Shellcode. Дополнительную информацию о загрузчике см. в Loading .NET Assemblies From Memory.
Те, кто хочет узнать больше о внутреннем устройстве, должны обратиться к Заметкам разработчика.
Существует два типа сборки. Если вы хотите отлаживать Donut, обратитесь к документации здесь. Если нет, продолжайте чтение для релизной сборки.
Из командной строки Windows или терминала Linux клонируйте репозиторий.
git clone http://github.com/thewover/donut.git