Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/thewover/donut
Криминалистика памятиГенерация полезной нагрузкиЭксплуатацияОбход IDS/IPSШелл-кодПост-эксплуатацияТестирование на ПроникновениеRed TeamingГенерация ШеллкодаРазработка Полезной НагрузкиТоп в Обход IDS/IPS №7
4.7k753151 год назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Топ в Разработка Полезной Нагрузки №1
Топ в Генерация полезной нагрузки №2
Топ в Шелл-код №1
Топ в Генерация Шеллкода №2
GitHubthewover/donut

donut

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

Репозиторий

Issues Contributors Stars Forks License Chat Github All Releases Twitter URL

Alt text

Текущая версия: v1.1

Содержание

  1. Введение
  2. Как это работает
  3. Сборка
  4. Использование
  5. Подпроекты
  6. Разработка с Donut
  7. Вопросы и обсуждения
  8. Отказ от ответственности

1. Введение

Donut — это позиционно-независимый код, который позволяет выполнять в памяти VBScript, JScript, EXE, DLL и сборки .NET. Модуль, созданный Donut, может быть как загружен с HTTP-сервера, так и встроен непосредственно в загрузчик. Модуль опционально шифруется с помощью блочного шифра Chaskey и 128-битного случайно сгенерированного ключа. После загрузки и выполнения файла в памяти исходная ссылка стирается для затруднения работы сканеров памяти. Генератор и загрузчик поддерживают следующие возможности:

  • Сжатие входных файлов с помощью aPLib, LZNT1, Xpress, Xpress Huffman через RtlCompressBuffer.
  • Использование энтропии для хешей API и генерации строк.
  • 128-битное симметричное шифрование файлов.
  • Перезапись заголовков нативных PE.
  • Хранение нативных PE в памяти MEM_IMAGE.
  • Патч Antimalware Scan Interface (AMSI) и Windows Lockdown Policy (WLDP).
  • Патч Event Tracing for Windows (ETW).
  • Патч командной строки для EXE-файлов.
  • Патч API, связанных с выходом, чтобы избежать завершения хост-процесса.
  • Несколько выходных форматов: C, Ruby, Python, PowerShell, Base64, C#, Hex-строка, строка UUID.

Существуют динамические и статические библиотеки как для Linux, так и для Windows, которые можно интегрировать в ваши собственные проекты. Также есть модуль Python, о котором можно узнать больше в документации по сборке и использованию расширения Python.

2. Как это работает

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.

Те, кто хочет узнать больше о внутреннем устройстве, должны обратиться к Заметкам разработчика.

3. Сборка

Существует два типа сборки. Если вы хотите отлаживать Donut, обратитесь к документации здесь. Если нет, продолжайте чтение для релизной сборки.

Клонирование

Из командной строки Windows или терминала Linux клонируйте репозиторий.

root@kitploit:~
 
  git clone http://github.com/thewover/donut.git

Следующий шаг зависит от вашей операционной системы и выбранного компилятора. В настоящее время генератор и шаблон загрузчика для Donut успешно компилируются как с Microsoft Visual Studio 2019, так и с MingGW-64. Чтобы использовать библиотеки в вашем собственном проекте C/C++, обратитесь к примерам, приведённым здесь.

Windows

Для генерации шаблона загрузчика, динамической библиотеки donut.dll, статической библиотеки donut.lib и генератора donut.exe. Запустите x64 Microsoft Visual Studio Developer Command Prompt, перейдите в каталог, куда вы клонировали репозиторий Donut, и введите следующее:

root@kitploit:~
  nmake -f Makefile.msvc

Чтобы сделать то же самое, используя MinGW-64 в Windows или Linux, перейдите в каталог, куда вы клонировали репозиторий Donut, и введите следующее:

root@kitploit:~
  make -f Makefile.mingw

Linux

Для генерации динамической библиотеки donut.so, статической библиотеки donut.a и генератора donut. Перейдите в каталог, куда вы клонировали репозиторий Donut, и просто введите make.

Модуль Python

Donut можно установить и использовать как модуль Python. Для установки из исходников требуется pip для Python3. Сначала убедитесь, что старые версии donut-shellcode не установлены, выполнив следующую команду в терминале Linux или командной строке Microsoft Visual Studio.

root@kitploit:~
  pip3 uninstall donut-shellcode

После подтверждения, что старые версии удалены, выполните следующую команду.

root@kitploit:~
  pip3 install .

Вы также можете установить Donut как модуль Python, загрузив его из репозитория PyPi.

root@kitploit:~
  pip3 install donut-shellcode

Для получения дополнительной информации обратитесь к документации по сборке и использованию расширения Python.

Docker

Сборка Docker-контейнера.

root@kitploit:~
  docker build -t donut .

Запуск donut.

root@kitploit:~
  docker run -it --rm -v "${PWD}:/workdir" donut -h

Вспомогательные инструменты

Donut включает несколько других исполняемых файлов, которые могут быть собраны отдельно. К ним относятся "hash.exe", "encrypt.exe", "inject.exe" и "inject_local.exe". Первые два используются при генерации шелл-кода. Последние два предоставлены для помощи в тестировании шелл-кода donut. "inject.exe" внедряет сырой бинарный файл (loader.bin) в процесс по его PID или имени процесса. "inject_local.exe" внедряет сырой бинарный файл в свой собственный процесс.

Чтобы собрать эти вспомогательные исполняемые файлы отдельно, вы можете использовать makefile MSVC. Например, чтобы собрать "inject_local.exe" для тестирования вашего шелл-кода donut, вы можете выполнить:

root@kitploit:~
  nmake inject_local -f Makefile.msvc

Релизы

Для каждой релизной версии Donut предоставлены теги, содержащие скомпилированные исполняемые файлы.

  • v0.9.3, TBD
  • v0.9.2, Bear Claw
  • v0.9.1, Apple Fritter
  • v0.9.0, Первоначальный выпуск

В настоящее время доступны два других генератора.

  • C# генератор от n1xbyte
  • Go генератор от awgh

4. Использование

В следующей таблице перечислены ключи, поддерживаемые консольной версией генератора.

Требования к полезной нагрузке

Существуют определённые требования, которым должна соответствовать ваша полезная нагрузка, чтобы Donut успешно её загрузил.

Сборки .NET

  • Метод точки входа должен принимать только строки в качестве аргументов или не принимать аргументов.
  • Метод точки входа должен быть помечен как public и static.
  • Класс, содержащий метод точки входа, должен быть помечен как public.
  • Сборка НЕ должна быть смешанной (Mixed Assembly) (содержать как управляемый, так и неуправляемый код).
  • Следовательно, сборка НЕ должна содержать неуправляемых экспортов (Unmanaged Exports).

Нативные EXE/DLL

  • Бинарные файлы, собранные с Cygwin, не поддерживаются.

Исполняемые файлы Cygwin используют процедуры инициализации, которые ожидают, что хост-процесс запущен с диска. При выполнении из памяти хост-процесс, скорее всего, аварийно завершится.

Неуправляемые DLL

  • Указанный пользователем метод точки входа должен принимать только строку в качестве аргумента или не принимать аргументов. Пример предоставлен здесь.

5. Подпроекты

С donut поставляются четыре сопутствующих проекта:

6. Разработка с Donut

Возможно, вы захотите добавить поддержку дополнительных типов полезных нагрузок, изменить наш набор функций или интегрировать Donut в ваши существующие инструменты. Мы предоставили документацию для разработчика. Дополнительные функции оставлены в качестве упражнения для читателя. Наши предложения:

  • Добавьте привязку к окружению (environmental keying).
  • Сделайте Donut полиморфным, обфусцируя загрузчик каждый раз при генерации шелл-кода.
  • Интегрируйте Donut как модуль в вашу любимую RAT/C2-структуру.

7. Вопросы и обсуждения

Если у вас есть вопросы или комментарии о Donut, присоединяйтесь к каналу #Donut в Slack BloodHound Gang.

8. Отказ от ответственности

Мы не несём ответственности за любое неправомерное использование этого программного обеспечения или техники. Donut предоставляется как демонстрация CLR Injection и загрузки в память через шелл-код, чтобы предоставить красным командам (red teamers) возможность эмулировать противников, а защитникам — основу для создания аналитики и мер защиты. Это неизбежно создаёт риск злоупотребления со стороны авторов вредоносного ПО и угроз. Однако мы считаем, что общая польза перевешивает риск. Надеемся, это верно. В случае, если продукты EDR или AV смогут обнаруживать Donut по сигнатурам или поведенческим шаблонам, мы не будем обновлять Donut для противодействия сигнатурам или методам обнаружения. Чтобы не обижаться, пожалуйста, не спрашивайте об этом.

Скачать инструмент
КлючАргументОписание
-aархитектураЦелевая архитектура для загрузчика: 1=x86, 2=amd64, 3=x86+amd64 (по умолчанию).
-bуровеньПоведение при обходе AMSI/WLDP: 1=Нет, 2=Прервать при ошибке, 3=Продолжить при ошибке (по умолчанию).
-kзаголовкиСохранить заголовки PE. 1=Перезаписать (по умолчанию), 2=Сохранить все.
-jприманкаНеобязательный путь к модулю-приманке для перегрузки модулей (Module Overloading).
-cклассНеобязательное имя класса (требуется для .NET DLL). Может включать пространство имён: например, пространство_имён.класс.
-dимяИмя AppDomain для создания в .NET. Если включена энтропия, будет сгенерировано случайное.
-eуровеньУровень энтропии. 1=Нет, 2=Генерировать случайные имена, 3=Генерировать случайные имена + использовать симметричное шифрование (по умолчанию).
-fформатФормат вывода загрузчика, сохраняемого в файл. 1=Бинарный (по умолчанию), 2=Base64, 3=C, 4=Ruby, 5=Python, 6=PowerShell, 7=C#, 8=Hex.
-mимяНеобязательный метод или функция для DLL (метод обязателен для .NET DLL).
-nимяИмя модуля для HTTP-стейджинга. Если включена энтропия, генерируется случайное.
-oпутьУказывает, куда Donut должен сохранить загрузчик. По умолчанию "loader.bin" в текущем каталоге.
-pпараметрыНеобязательные параметры/командная строка в кавычках для метода/функции DLL или EXE.
-rверсияВерсия среды выполнения CLR. Используется MetaHeader или v4.0.30319, если нет.
-sсерверURL HTTP-сервера, который будет хостить модуль Donut. Учётные данные могут быть указаны в следующем формате:
root@kitploit:~
https://имя_пользователя:пароль@192.168.0.1/
-tЗапустить точку входа неуправляемого/нативного EXE как поток и ждать завершения потока.
-wКомандная строка передаётся функции неуправляемой DLL в формате UNICODE (по умолчанию ANSI).
-xопцияОпределяет, как загрузчик должен завершить работу. 1=Завершить поток (по умолчанию), 2=Завершить процесс, 3=Не завершать и не очищать, блокироваться бесконечно.
-yадресСоздаёт новый поток для загрузчика и продолжает выполнение по адресу, который является смещением относительно исполняемого файла хост-процесса. Предоставленное значение — это смещение. Эта опция поддерживает загрузчики, которые хотят возобновить выполнение хост-процесса после завершения donut.
-zдвижокУпаковать/сжать входной файл. 1=Нет, 2=aPLib, 3=LZNT1, 4=Xpress, 5=Xpress Huffman. В настоящее время последние три поддерживаются только в Windows.
ИнструментОписание
DemoCreateProcessОбразец сборки .NET для использования в тестировании. Принимает два параметра командной строки, каждый из которых указывает программу для запуска.
DonutTestПростой инжектор шелл-кода на C# для тестирования donut. Шелл-код должен быть закодирован в Base64 и вставлен как строка.
ModuleMonitorИнструмент для подтверждения концепции (PoC), который обнаруживает внедрение CLR, как это делают такие инструменты, как Donut и execute-assembly от Cobalt Strike.
ProcessManagerИнструмент обнаружения процессов, который может использоваться оперативными (offensive) операторами для определения, во что внедряться, и защитными (defensive) операторами для определения, что выполняется, какие свойства имеют эти процессы, и загружен ли в них CLR.