
Genera shellcode independiente de posición para x86, x64 o AMD64+x86 que carga .NET Assemblies, archivos PE y otras cargas útiles de Windows desde la memoria y las ejecuta con parámetros

Versión actual: v1.1
Donut es un código independiente de la posición que permite la ejecución en memoria de archivos VBScript, JScript, EXE, DLL y ensamblados .NET. Un módulo creado por Donut puede ser servido desde un servidor HTTP o incrustado directamente en el propio cargador. El módulo está opcionalmente cifrado usando el cifrador de bloque Chaskey y una clave de 128 bits generada aleatoriamente. Después de que el archivo se cargue y ejecute en memoria, la referencia original se borra para disuadir a los escáneres de memoria. El generador y cargador soportan las siguientes características:
Hay bibliotecas dinámicas y estáticas tanto para Linux como para Windows que se pueden integrar en tus propios proyectos. También hay un módulo de Python del que puedes leer más en Construcción y uso de la extensión Python.
Donut contiene cargadores individuales para cada tipo de archivo soportado. Para ensamblados .NET EXE/DLL, Donut utiliza la API de Alojamiento CLR No Administrada para cargar el Common Language Runtime. Una vez que el CLR se carga en el proceso anfitrión, se crea un nuevo Dominio de Aplicación para permitir la ejecución de Ensamblados en AppDomains desechables. Cuando el AppDomain está listo, el ensamblado .NET se carga mediante el método AppDomain.Load_3. Finalmente, se invoca el Punto de Entrada para EXEs o el método público para DLLs especificado por el usuario con cualquier parámetro adicional. Consulte MSDN para obtener documentación sobre la API de Alojamiento CLR No Administrada. Para un ejemplo independiente de un Host CLR, consulte el código aquí.
Los archivos VBScript y JScript se ejecutan utilizando la interfaz IActiveScript. También hay soporte mínimo para algunos de los métodos proporcionados por el Host de Scripts de Windows (wscript/cscript). Para un ejemplo independiente, consulte el código aquí. Para una descripción más detallada, lea: Ejecución en Memoria de JavaScript, VBScript, JScript y XSL
Los archivos EXE/DLL no administrados o nativos se ejecutan utilizando un cargador PE personalizado con soporte para Importaciones Retrasadas, TLS y parcheo de la línea de comandos. Solo se admiten archivos con información de reubicación. Lea Ejecución en Memoria de DLL para más información.
El cargador puede deshabilitar AMSI y WLDP para ayudar a evadir la detección de archivos maliciosos ejecutados en memoria. Para más información, lea Cómo los Red Teams evaden AMSI y WLDP para Código Dinámico .NET. También soporta la descompresión de archivos en memoria usando aPLib o la API RtlDecompressBuffer. Lea Compresión de Datos para más información.
A partir de v1.0, ETW también se evita. Al igual que con AMSI/WLDP, este es un sistema modular que te permite intercambiar la evasión predeterminada por la tuya propia. La evasión predeterminada se deriva de la investigación de XPN. Lea Ocultando tu .NET - ETW para más información.
Por defecto, el cargador sobrescribirá las cabeceras PE de los PE no administrados (desde la dirección base hasta `IMAGE_OPTIONAL_HEADER.SizeOfHeaders`). Si no se utiliza un módulo señuelo (sobrecarga de módulos), las cabeceras PE se pondrán a cero. Si se utiliza un módulo señuelo, las cabeceras PE del módulo señuelo se usarán para sobrescribir las del módulo de carga útil. Esto es para disuadir la detección comparando las cabeceras PE de los módulos en memoria con el archivo que los respalda en disco. El usuario puede solicitar que todas las cabeceras PE se conserven en su estado original. Esto es útil para escenarios donde el módulo de carga útil necesita acceder a sus cabeceras PE, como cuando se buscan recursos PE incrustados.
Para un recorrido detallado usando el generador y cómo Donut afecta el arte operativo, lea Donut - Inyectando Ensamblados .NET como Shellcode. Para más información sobre el cargador, lea Cargando Ensamblados .NET desde Memoria.
Aquellos que deseen saber más sobre el funcionamiento interno deben consultar las Notas de desarrollo.