Burlando antivirus com DLL Side-Loading por diversão e vantagem — parte 1

Vinícius K-Max
3 min readApr 23, 2018

--

Esse é mais um ataque que permite vencer diversos antivirus de forma engenhosa e saborosa, e por isso considero indispensável no inventário de ferramentas e habilidades de qualquer invasor de sistemas.

A idéia aqui se resume a abusar de executáveis legítimos que chamam suas DLLs, geralmente através da clásica API LoadLibrary(), mas que continuam funcionando (não travam) mesmo quando não as encontram. Uma vez que uma DLL original é substituida por uma arbitrária, o atacante ganha a oportunidade de injetar seu código malicioso dentro de uma thread do executável. Ao contrário de um ataque de DLL injection convencional, aqui não há uso de nenhuma API suspeita sendo invocada (como CreateRemoteThread(), NtCreateThreadEx() etc) por um processo estranho e sem reputação, e é justamente por isso que nosso código malicioso será considerado insuspeito por boa parte das soluções antivirus.

Outra vantagem nesse ataque ocorre quando o executável abusado funcionar mesmo quando copiado para um outro sistema diferente daquele onde foi originalmente instalado. Isso abre a oportunidade pro atacante usá-lo como um perfeito loader universal para suas DLLs maliciosas em qualquer sistema atacado.

Entretando, como o ataque necessariamente requer que a DLL esteja copiada para o sistema alvo, geralmente a única barreira que o atacante precisa transpassar é da análise estática que o antivirus fará na DLL, o que pode ser fácil de contornar quando o atacante compila a sua própria DLL, fazendo uso de uma básica codificação de shellcode, virtualização de código, etc.

E se esse ataque for aplicado contra um executável de um grande antivirus do mercado? Então a destruição da reputação do produto perante um cliente será humilhante e irreversível.

Symantec vs Symantec

Para esse exemplo, veremos passo a passo como abusar do arquivo dot1xtra.exe, um executável legítimo e digitalmente assinado pela Symantec e que está presente em várias versões dos seus produtos. Em outras palavras, usaremos o antivirus contra si mesmo — ou contra seus pares.

Para identificar quais arquivos são invocados por esse executável, poderíamos usar o Process Monitor, da Sysinternals. Outra forma mais simples ainda de identificar quai as DLLs carregadas via LoadLibrary() é abrindo o dot1xtra.exe no MalTrap. Ele irá injetar sua própria DLL no processo e mostrará todas as hooks em tempo de execução.

Imediatamente vemos que o arquivo RasTls.dll é chamado.

O primeiro passo é tentar usar um DLL arbitrária nossa contendo uma simples função DllMain(), renomear o arquivo para RasTls.dll na mesma pasta e ver se o executável roda nosso código. Mas nem sempre funciona. Pode acontecer o executável buscar diferentes funções dentro da DLL. Nesse caso, precisaremos identificá-las. Se tivermos uma cópia dessa DLL, poderíamos identificar com ajuda do programa PE Export Viewer, da NoVirusThanks.

Mas vamos considerar que não temos uma cópia dessa DLL. Nesse caso devemos buscar no executável quais as funções importadas da DLL e podemos fazer isso besbilhotando as strings do binário. Pra isso iremos usar o utilitário strings, também da Sysinternals, e exportar sua saída para um arquivo txt. Em seguida usamos o comando FINDSTR native do Windows para ver onde no texto a DLL em questão é chamada.

Podemos ver que nossa DLL alvo é chamada na linha 987. Ao abrirmos o output.txt, veremos que uma linha após encontramos todas as quatro funções importadas da DLL.

No próximo post vamos criar uma incrivelmente simples DLL que exporte essas quatro funções e ver se o executável da Symantec finalmente executa nosso código malicioso dentro de si mesmo.

Atualização: Leia a parte 2 aqui,

Me siga aqui ou no twitter em @viniciuskmax para ser avisado dos próximos posts.

Até lá.

--

--

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