
Uma PoC de uma nova técnica de injeção de processos “threadless” que funciona utilizando o conceito de Callbacks de Notificação de DLL em processos locais e remotos.
DllNotificationInection é uma Prova de Conceito (POC) de uma nova técnica de injeção de processo "threadless" que funciona utilizando o conceito de Callbacks de Notificação de DLL em processos locais e remotos.
Um post de blog acompanhante com mais detalhes está disponível aqui:
https://shorsec.io/blog/dll-notification-injection/
DllNotificationInection funciona criando uma nova LDR_DLL_NOTIFICATION_ENTRY no processo remoto. Ela a insere manualmente na LdrpDllNotificationList remota através de patches do List.Flink do cabeçalho da lista e do List.Blink da primeira entrada (agora segunda) da lista.
Nossa nova LDR_DLL_NOTIFICATION_ENTRY apontará para um shellcode trampoline personalizado (construído com o projeto ShellcodeTemplate do @C5pider) que restaurará nossas alterações e executará um shellcode malicioso em uma nova thread usando TpWorkCallback.
Após registrar manualmente nossa nova entrada no processo remoto, só precisamos esperar que o processo remoto acione nosso Callback de Notificação de DLL carregando ou descarregando alguma DLL. Isso obviamente não acontece regularmente em todo processo, então é necessário um trabalho prévio para encontrar candidatos adequados para essa técnica de injeção. A partir de minhas breves pesquisas, parece que RuntimeBroker.exe e explorer.exe são candidatos adequados para isso, embora eu encoraje você a encontrar outros também.
Isso é uma POC. Para que seja seguro em termos de OPSEC e evite produtos AV/EDR, algumas modificações são necessárias. Por exemplo, usei RWX ao alocar memória para os shellcodes – não seja preguiçoso (como eu) e altere isso. Também pode ser desejável substituir OpenProcess, ReadProcessMemory e WriteProcessMemory por APIs de nível mais baixo e usar Indirect Syscalls ou (propaganda descarada) HWSyscalls. Talvez criptografe os shellcodes ou vá além e modifique o shellcode trampoline para atender às suas necessidades, ou pelo menos altere os valores hash padrão no projeto ShellcodeTemplate do @C5pider que foi utilizado para criar o shellcode trampoline.