
Implementando Ghostly-Hollowing usando syscalls adulterados para injeção remota de PE
[!NOTE] O repositório original utilizava anteriormente uma licença incorreta que omitia a atribuição ao fundador da DeceptIQ, @Rad9800, cujo repositório TamperingSyscalls é publicado sob a Licença MIT. O trabalho dele já era creditado no módulo do curso (Tampered Syscalls Via Hardware BreakPoints) e também é refletido na nossa página pública de Licenças de Terceiros.
Ao tomarmos conhecimento da omissão, corrigimos prontamente o repositório original e contactámos o Rad no mesmo dia para nos desculparmos pelo descuido. Apesar dos nossos melhores esforços para corrigir o erro não intencional, ele não respondeu e bloqueou qualquer comunicação adicional, e recebemos um aviso de remoção DMCA cinco meses depois, o que resultou na eliminação do repositório original.
Infelizmente, a escalada de má-fé deixou-nos sem um caminho prático para resolver o assunto, por isso reenviámos o repositório com a licença e a atribuição corretas.
Página inicial da Maldev Academy
Esta implementação utiliza duas técnicas abordadas nas atualizações recentes do curso da Maldev Academy:
Tampered Syscalls Via Hardware BreakPoints: Utilizado para contornar hooks no espaço do utilizador enquanto falsifica simultaneamente os argumentos da syscall invocada.
Ghostly Hollowing: Uma técnica híbrida entre Process Hollowing e Process Ghosting.
Todas as syscalls invocadas na implementação são chamadas através da macro TAMPER_SYSCALL. Esta macro chama a função StoreTamperedSyscallParms para:
syscall dentro do stub da syscall NtQuerySecurityObject (ou seja, syscall isco), e definir um hardware breakpoint nesse endereço.Ao chamar a macro TAMPER_SYSCALL, esta irá falsificar os primeiros quatro argumentos da syscall invocada com valores NULL. Em seguida, chamará a syscall NtQuerySecurityObject, acionando o breakpoint instalado anteriormente.
Tratamos a exceção levantada substituindo o SSN da syscall isco (NtQuerySecurityObject) pela syscall real invocada (por exemplo, o SSN de ZwAllocateVirtualMemory). Depois, substituímos os argumentos falsificados pelos reais. Estes passos são executados na função VEH ExceptionHandlerCallbackRoutine.
Obter o payload PE: A implementação obtém o payload PE (mimikatz.exe) do disco. Numa situação ideal, deve encriptar o payload e armazená-lo na secção de recursos.
Criar um ficheiro vazio no disco: Criar um ficheiro temporário (.tmp) no diretório $env:TMP. Este ficheiro será posteriormente sobrescrito com o payload PE.
Criar uma secção fantasma a partir do ficheiro temporário: Uma secção fantasma é criada chamando ZwCreateSection para criar uma secção a partir do ficheiro .tmp com eliminação pendente, fechando o handle do ficheiro e eliminando o ficheiro do disco.
Criar um processo remoto: Utilizando a WinAPI CreateProcess, criamos um processo remoto e mapeamos a secção fantasma para ele.
Corrigir o ImageBaseAddress: Corrigir o elemento ImageBaseAddress da estrutura PEB para apontar para a secção fantasma mapeada e executar o ponto de entrada do payload PE via thread hijacking.
Um enorme agradecimento à hasherezade por publicar o Ghostly Hollowing e todas as suas outras técnicas de injeção interessantes.