Process Hollowing/RunPE — Como executar código malicioso por trás de um processo legítimo

Vinícius K-Max
4 min readDec 4, 2017

--

De tempos em tempos, velhas técnicas são redescobertas ou finalmente emergem para a superfície após algum notório incidente, quando na verdade já eram há anos alvo de tímidas discussões e explorações maliciosas no underground da internet. E dessa vez não é diferente.

Process Hollowing, também conhecida como Dynamic Forking, é uma técnica similar ao clássico ataque de DLL Injection, com a diferença de que no lugar de injetar uma DLL, todo o espaço do executável alvo será substituído por outro executável. A grande vantagem nisso é a possibilidade injetar praticamente qualquer EXE, em vez de DLLs.

Esse conceito de ataque se disseminou no submundo do malware em meados de 2004 através do código conhecido como RunPE, criado por Tan Chew Keong. Seu programa impressionou tanto que popularizou a técnica com esse nome entre desenvolvedores de malware. Desde então esse truque tem sido implementando amplamente, especialmente em RATs (Remote Administration Tools) e packers de arquivos PE. Também parece ser a mesma técnica usada na opção -m do comando execute do meterpreter.

Seu fluxo de ataque basicamente é o seguinte. Quando o malware é executado pela primeira vez, ele escolherá a vítima entre os processos do Windows (como o explorer.exe ou svchost.exe) e iniciará uma nova instância desse processo, só que um estado suspenso. Nesse estado, desde que seja um processo que compartilhe os mesmos tokens de acesso (como é o caso de processos iniciados pelo usuário atual), é seguro manipulá-lo completamente, alocando espaço para um código malicioso que será copiado para sua memória. Em seguida, o malware fará uma "mágica" para ajustar o endereço do entry point e endereço base. Por fim, colocará novamente o processo alvo em estado de execução.

Como resultado, nesse ponto o processo malicioso se apresentará oculto sob a pele de um processo de sistema, que na verdade não tem mais nada a ver com o que fazia originalmente. O ataque é tão eficiente que ferramentas de monitoramento de processos como TCPView e Process Explorer mostrarão o processo malicioso como totalmente legítimo, inclusive aparentando validar sua assinatura digital (cuja imagem é checada no disco, não na memória).

Essa técnica traz alguns beneficios óbvios para atacantes. Como o código sequestra um executável legítimo do sistema, há potencial para enganar também certas soluções antivirus e até firewalls pessoais. Muitos deles irão ver o processo sequestrado como legítimo, e portando, pertencente a sua lista branca de permissão.

Pensando nisso e interessado em ter mais uma ferramenta para testar em pentests, modifiquei o código original para permitir também a escolha de qual processo do Windows será sequestrado, além de adicionar a capacidade de repassar argumentos via linha de comando. Dessa forma podemos fazer uso de diversas outras ferramentas do nosso arsenal que funcionam via cmd.exe. Exemplo:

LoadEXE -> tcpsvcs -> iCmd. Abrindo uma backdoor insuspeita por dentro de um processo de sistema.
Porta TCP 999 aberta aparentemente por um processo do sistema.
Nenhum traço de que o executável é na verdade o icmd.exe. O Process Explorer chega a mostrar o processo como "Verificado", ludibriando usuários e até administradores experientes.

Ou, numa investida mais ofensiva usando o Metasploit, estabelecendo uma conexão reversa com ajuda da implementação do meterpreter/reverse_http em C++:

Como tudo acontece no nível do usuário atual, a técnica não requer acesso administrativo. Não é a toa que alguns rootkits em nível de usuário (ring-3) vem implementando ela até hoje.

Com essa artimanha, consegui burlar com sucesso antivirus e firewalls pessoais em algumas situações ao longo dos anos.

Download

https://github.com/vipzen/LoadEXE

Obs:

  • Esse código não suporta nativamente sistemas recentes rodando em x64 (mas talvez funcione por dentro do modo WoW64);
  • O exe que será injectado precisa ser compilado no VS com static linking.

Proteção

Com a crescente adoção da técnica por invasores, em julho desse ano, após 13 anos desde a publicação do primeiro código do RunPE, a Microsoft implementou uma forma de detecção e defesa em sua respeitosa ferramenta Windows Defender ATP. Alguns poucos antivirus também são capazes de detectar o ataque.

Administradores podem sempre considerar implementar políticas AWL (Application Whitelisting) via Applocker ou similar.

Referências

Dynamic Forking of Win32 EXE
http://web.archive.org/web/20080117115736/security.org.sg/code/loadexe.html

Defeating Kernel Native API Hookers by Direct KiServiceTable Restoration
https://dl.packetstormsecurity.net/hitb04/hitb04-chew-keong-tan.pdf

Detecting stealthier cross-process injection techniques with Windows Defender ATP: Process hollowing and atom bombing
https://blogs.technet.microsoft.com/mmpc/2017/07/12/detecting-stealthier-cross-process-injection-techniques-with-windows-defender-atp-process-hollowing-and-atom-bombing/

--

--

Vinícius K-Max

Desde 1999 consagrando o tempo e o estudo necessário para obter o domínio da arte do Pentesting. Analista de cibersegurança e pentester na MIDRI.com.br