
Um repositório de executores de Shellcode do Windows e utilitários de suporte. Os aplicativos carregam e executam Shellcode usando várias chamadas de API ou técnicas.
go-shellcode é um repositório de executores de Shellcode para Windows e utilitários de suporte. Os aplicativos carregam e executam Shellcode usando várias chamadas de API ou técnicas.
Os executores de Shellcode disponíveis incluem:
Este aplicativo utiliza a função Windows CreateFiber da Kernel32.dll para executar shellcode no processo deste aplicativo. É útil quando se deseja evitar injeção em processo remoto e evitar chamar CreateThread. Este aplicativo NÃO utiliza funções do pacote golang.org/x/sys/windows. A diferença mais significativa é que este aplicativo carrega todas as DLLs e Procedures necessárias por conta própria e usa a função Call() da procedure.
NOTA: Ainda não descobri uma maneira de fazer o processo sair, e você terá que encerrá-lo manualmente.
O aplicativo pode ser compilado com o seguinte comando em um host Windows, a partir do diretório raiz do projeto:
set GOOS=windows GOARCH=amd64;go build -o CreateFiber.exe .\cmd\CreateFiber\main.go
Este aplicativo utiliza a função Windows CreateProcess da Kernel32.dll. O processo é criado em estado suspenso, o AddressOfEntryPoint na estrutura IMAGE_OPTIONAL_HEADER é atualizado para executar shellcode no processo filho, e então o processo é retomado. Este é um tipo de processo oco (process hollowing), mas o PE existente NÃO é desmapeado e o ThreadContext NÃO é atualizado. A arquitetura do shellcode fornecido (ou seja, x86 ou x64) deve corresponder à arquitetura do processo filho.
O aplicativo pode ser compilado com o seguinte comando em um host Windows, a partir do diretório raiz do projeto:
set GOOS=windows GOARCH=amd64;go build -o CreateProcess.exe .\cmd\CreateProcess\main.go
Este aplicativo utiliza a função Windows CreateProcess da Kernel32.dll. O processo é criado em estado suspenso, o AddressOfEntryPoint na estrutura IMAGE_OPTIONAL_HEADER é atualizado para executar shellcode no processo filho, e então o processo é retomado. Este é um tipo de processo oco, mas o PE existente NÃO é desmapeado e o ThreadContext NÃO é atualizado. A arquitetura do shellcode fornecido (ou seja, x86 ou x64) deve corresponder à arquitetura do processo filho.
Este aplicativo difere do CreateProcess porque irá coletar quaisquer dados escritos para STDOUT ou STDERR no processo filho e retorná-los ao processo pai. Os dados são coletados usando a função CreatePipe para criar um pipe anônimo pelo qual o processo pai e o filho se comunicam. Isso é útil ao usar ferramentas como Donut para executar um assembly .NET em um processo filho como shellcode e recuperar a saída do programa executado. O seguinte comando pode ser usado para gerar shellcode independente de posição para executar Seatbelt com Donut v0.9.3:
.\donut.exe -o donut_v0.9.3_Seatbelt.bin -x 2 -c Seatbelt.Program -m Main -p "ARPTable" Seatbelt.exe
O aplicativo pode ser compilado com o seguinte comando em um host Windows, a partir do diretório raiz do projeto:
set GOOS=windows GOARCH=amd64;go build -o CreateProcessWithPipe.exe .\cmd\CreateProcessWithPipe\main.go
Este aplicativo utiliza a função Windows CreateRemoteThread da Kernel32.dll para executar shellcode em um processo remoto. O aplicativo exige que o processo alvo a ser injetado já esteja em execução. O PID (Identificador de Processo) alvo pode ser fornecido em tempo de execução para teste usando a flag de linha de comando -pid. Hardcode o PID na seguinte linha de código para uso operacional, substituindo o 0 pelo PID alvo:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Este aplicativo utiliza funções do pacote golang.org/x/sys/windows, quando viável, como windows.OpenProcess(). O aplicativo pode ser compilado com o seguinte comando em um host Windows, a partir do diretório raiz do projeto:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThread.exe .\cmd\CreateRemoteThread\main.go
Este aplicativo utiliza a função Windows CreateRemoteThread da Kernel32.dll para executar shellcode em um processo remoto. O aplicativo exige que o processo alvo a ser injetado já esteja em execução. O PID (Identificador de Processo) alvo pode ser fornecido em tempo de execução para teste usando a flag de linha de comando -pid. Hardcode o PID na seguinte linha de código para uso operacional, substituindo o 0 pelo PID alvo:
pid := flag.Int("pid", 0, "Process ID to inject shellcode into")
Este aplicativo NÃO utiliza funções do pacote golang.org/x/sys/windows. A diferença mais significativa é que este aplicativo carrega todas as DLLs e Procedures necessárias por conta própria e usa a função Call() da procedure. O aplicativo pode ser compilado com o seguinte comando em um host Windows, a partir do diretório raiz do projeto:
set GOOS=windows GOARCH=amd64;go build -o CreateRemoteThreadNative.exe .\cmd\CreateRemoteThreadNative\main.go
Este aplicativo utiliza a função Windows CreateThread da Kernel32.dll para executar shellcode no processo deste aplicativo. É útil quando se deseja evitar injeção em processo remoto. Este aplicativo utiliza funções do pacote golang.org/x/sys/windows, quando viável, como windows.VirtualAlloc(). O aplicativo pode ser compilado com o seguinte comando em um host Windows, a partir do diretório raiz do projeto:
set GOOS=windows GOARCH=amd64;go build -o CreateThread.exe .\cmd\CreateThread\main.go
Este aplicativo utiliza a função Windows CreateThread da Kernel32.dll para executar shellcode no processo deste aplicativo. É útil quando se deseja evitar injeção em processo remoto. Este aplicativo NÃO utiliza funções do pacote golang.org/x/sys/windows. A diferença mais significativa é que este aplicativo carrega todas as DLLs e Procedures necessárias por conta própria e usa a função Call() da procedure. O aplicativo pode ser compilado com o seguinte comando em um host Windows, a partir do diretório raiz do projeto: