
Gera shellcode independente de posição para x86, x64 ou AMD64+x86 que carrega assemblies .NET, arquivos PE e outros payloads do Windows a partir da memória e os executa com parâmetros.

Versão atual: v1.1
Donut é um código independente de posição que permite a execução em memória de arquivos VBScript, JScript, EXE, DLL e assemblies dotNET. Um módulo criado pelo Donut pode ser obtido de um servidor HTTP ou embutido diretamente no próprio carregador. O módulo é opcionalmente criptografado usando a cifra de bloco Chaskey e uma chave de 128 bits gerada aleatoriamente. Após o arquivo ser carregado e executado em memória, a referência original é apagada para dificultar scanners de memória. O gerador e o carregador suportam as seguintes funcionalidades:
Existem bibliotecas dinâmicas e estáticas tanto para Linux quanto para Windows que podem ser integradas em seus próprios projetos. Há também um módulo Python sobre o qual você pode ler mais em Compilando e usando a extensão Python.
Donut contém carregadores individuais para cada tipo de arquivo suportado. Para assemblies dotNET EXE/DLL, Donut usa a API Unmanaged CLR Hosting para carregar o Common Language Runtime. Uma vez que o CLR é carregado no processo hospedeiro, um novo Application Domain é criado para permitir a execução de Assemblies em AppDomains descartáveis. Quando o AppDomain está pronto, o Assembly dotNET é carregado via o método AppDomain.Load_3. Finalmente, o Ponto de Entrada para EXEs ou método público para DLLs especificado pelo usuário é invocado com quaisquer parâmetros adicionais. Consulte a MSDN para documentação sobre a API Unmanaged CLR Hosting. Para um exemplo independente de um CLR Host, consulte o código aqui.
Arquivos VBScript e JScript são executados usando a interface IActiveScript. Há também suporte mínimo para alguns dos métodos fornecidos pelo Windows Script Host (wscript/cscript). Para um exemplo independente, consulte o código aqui. Para uma descrição mais detalhada, leia: Execução em Memória de JavaScript, VBScript, JScript e XSL
Arquivos EXE/DLL não gerenciados ou nativos são executados usando um carregador PE personalizado com suporte para Importações Atrasadas, TLS e correção da linha de comando. Apenas arquivos com informações de realocação são suportados. Leia Execução em Memória de DLL para mais informações.
O carregador pode desabilitar AMSI e WLDP para ajudar a evitar a detecção de arquivos maliciosos executados em memória. Para mais informações, leia Como Equipes Vermelhas Contornam AMSI e WLDP para Código Dinâmico .NET. Ele também suporta descompressão de arquivos em memória usando aPLib ou a API RtlDecompressBuffer. Leia Compressão de Dados para mais informações.
A partir da v1.0, o ETW também é contornado. Assim como com AMSI/WLDP, este é um sistema modular que permite substituir o bypass padrão pelo seu próprio. O bypass padrão é derivado da pesquisa de XPN. Leia Escondendo seu .NET - ETW para mais informações.
Por padrão, o carregador sobrescreverá os cabeçalhos PE de PEs não gerenciados (do endereço base até `IMAGE_OPTIONAL_HEADER.SizeOfHeaders`). Se nenhum módulo falso for usado (sobrecarga de módulo), os cabeçalhos PE serão zerados. Se um módulo falso for usado, os cabeçalhos PE do módulo falso serão usados para sobrescrever os do módulo carregado. Isso visa dificultar a detecção por comparação dos cabeçalhos PE de módulos em memória com o arquivo que os originou em disco. O usuário pode solicitar que todos os cabeçalhos PE sejam preservados em seu estado original. Isso é útil para cenários onde o módulo carregado precisa acessar seus cabeçalhos PE, como ao procurar por recursos PE embutidos.
Para um passo a passo detalhado usando o gerador e como o Donut afeta as técnicas de operação, leia Donut - Injetando Assemblies .NET como Shellcode. Para mais informações sobre o carregador, leia Carregando Assemblies .NET a Partir da Memória.
Aqueles que desejam saber mais sobre os detalhes internos devem consultar as Notas do desenvolvedor.
Existem dois tipos de compilação. Se você deseja depurar o Donut, consulte a documentação aqui. Caso contrário, continue lendo para a compilação de lançamento.
De um prompt de comando do Windows ou terminal Linux, clone o repositório.