Com este artigo, estamos concluindo uma série de publicações dedicadas à análise de malware. Na
primeira parte, realizamos uma análise detalhada do arquivo infectado recebido por correio por uma empresa européia e encontramos o spyware AgentTesla lá. A
segunda parte descreveu os resultados de uma análise em fases do módulo principal AgentTesla.
Hoje Ilya Pomerantsev, especialista em análise de malware do CERT Group-IB, falará sobre o primeiro estágio da análise de malware - descompactação semiautomática de amostras do AgentTesla usando três minicapas da prática de especialistas do CERT Group-IB.
Geralmente, o primeiro estágio na análise de malware é a remoção da proteção na forma de um empacotador, cryptor, banda de rodagem ou carregador de inicialização. Na maioria dos casos, esse problema é resolvido iniciando o malware e o dumping, mas há situações em que esse método não é adequado. Por exemplo, se o malware é um criptografador, se protege suas regiões de memória de um despejo, se o código contém mecanismos para detectar uma máquina virtual ou se, imediatamente após o início, o malware executa uma reinicialização. Nesses casos, é utilizada a chamada descompactação "semi-automática", ou seja, o pesquisador controla totalmente o processo e pode intervir a qualquer momento. Considere este procedimento usando três amostras da família AgentTesla como exemplo. Este é um malware relativamente inofensivo se você desativar o acesso à rede.
Amostra número 1
O arquivo de origem é um documento do MS Word que explora a vulnerabilidade CVE-2017-11882.
Como resultado, a carga útil é carregada e iniciada.
A análise da árvore do processo e dos marcadores comportamentais mostra uma injeção no processo
RegAsm.exe .
Marcadores comportamentais específicos do AgentTesla estão disponíveis.
A amostra baixada é um arquivo
.NET executável protegido pelo protetor do
.NET Reactor .
Abra-o no utilitário
dnSpy x86 e vá para o ponto de entrada.
Entrando na função
DateTimeOffset , encontramos o código de inicialização para o novo módulo
.NET . Coloque um
ponto de
interrupção na linha de seu interesse e execute o arquivo.
Em um dos buffers retornados, você pode ver a assinatura MZ (
0x4D 0x5A ). Salve.
Um arquivo executável despejado é uma biblioteca dinâmica, que é um carregador, ou seja, extrai a carga útil da seção de recurso e a lança.
Ao mesmo tempo, os próprios recursos necessários não estão disponíveis no dump. Eles estão na amostra pai.
O utilitário
dnSpy possui dois recursos extremamente úteis que nos ajudarão a criar rapidamente um Frankenstein a partir de dois arquivos vinculados.
- A primeira permite "colar" uma biblioteca dinâmica na amostra pai.

- O segundo é reescrever o código de função no ponto de entrada para chamar o método desejado da biblioteca dinâmica inserida.
Nós salvamos nosso "Frankenstein", colocamos um
ponto de
interrupção na linha que retorna o buffer com os recursos descriptografados e fazemos o dump, por analogia com o estágio anterior.
O segundo despejo é um arquivo executável escrito em
VB.NET, protegido pelo protetor
ConfuserEx que
conhecemos .
Após remover a banda de rodagem, usamos as regras YARA escritas anteriormente e garantimos que o malware descompactado seja realmente o AgentTesla.
Amostra número 2
O arquivo de origem é um documento do MS Excel. A macro interna leva à execução de código malicioso.
Como resultado, o script do PowerShell é iniciado.
O script descriptografa o código em C # e transfere o controle para ele. O código em si é um carregador, o que também é visto no relatório sandbox.
A carga útil é um arquivo
.NET executável.
Ao abrir o arquivo no
dnSpy x86 , você pode ver que ele está ofuscado. Remova a ofuscação com o utilitário
de4dot e retorne à análise.
Durante a pesquisa de código, você pode descobrir a seguinte função:
As seqüências de caracteres codificadas
EntryPoint e
Invoke são
impressionantes .
Colocamos o ponto de
interrupção na primeira linha, iniciamos e salvamos o valor do buffer
byte_0 .
O despejo é novamente um
aplicativo .NET e é protegido pelo
ConfuserEx .
Remova a ofuscação com o
de4dot e carregue no
dnSpy . Entendemos pela descrição do arquivo que encontramos o
carregador CyaX-Sharp .
Este carregador de inicialização possui uma ampla funcionalidade anti-análise.
Essa funcionalidade inclui ignorar os sistemas internos de proteção do Windows, desativar o Windows Defender, bem como mecanismos para detectar caixas de proteção e máquinas virtuais. É possível carregar a carga útil da rede ou armazená-la na seção de recursos. O lançamento é realizado através de uma injeção no próprio processo, em uma duplicata do próprio processo ou nos processos
MSBuild.exe ,
vbc.exe e
RegSvcs.exe , dependendo do parâmetro escolhido pelo invasor.
No entanto, para nós, eles são menos significativos do que a função
AntiDump adicionada pelo
ConfuserEx . Seu código fonte pode ser encontrado no
GitHub .
Para desativar a proteção, use o
recurso dnSpy , que permite editar o código
IL .
Salvamos e colocamos um
ponto de
interrupção na linha de chamada da função de descriptografia da carga útil. Está no construtor da classe principal.
Inicie e despeje a carga útil. Usando as regras YARA escritas anteriormente, garantimos que temos o AgentTesla.
Amostra número 3
O arquivo de origem é um arquivo executável do
VB Native PE32 .
Uma análise da entropia mostra a presença de um grande fragmento de dados criptografados.
Ao analisar o formulário de inscrição no
VB Decompiler, você pode notar um fundo de pixel estranho.
O gráfico de entropia da imagem
bmp é idêntico ao gráfico de entropia do arquivo de origem e o tamanho é 85% do tamanho do arquivo.
A visão geral da imagem indica o uso de esteganografia.
Vamos prestar atenção à aparência da árvore do processo, bem como à presença de um marcador de injeção.
Isso indica desembalar. Para carregadores no Visual Basic (também conhecido como
VBKrypt ou
VBInjector ), é comum usar o
shellcode para inicializar a carga, bem como para executar a própria injeção.
A análise no
VB Decompiler revelou a presença do evento
Load no formulário
FegatassocAirballoon2 .
Vamos ao
IDA pro no endereço especificado e estudamos a função. O código está ofuscado. O fragmento que nos interessa é apresentado abaixo.
É aqui que o espaço de endereço do processo é verificado quanto à assinatura. Essa abordagem é extremamente duvidosa.
Primeiro, o endereço inicial da verificação é
0x400100 . Este valor é estático e não é ajustado quando a base é deslocada. Em condições ideais de efeito estufa, ele apontará para o final do cabeçalho
PE do arquivo executável. No entanto, o banco de dados não é estático, seu valor pode mudar e a busca pelo endereço real da assinatura desejada, embora não cause o transbordamento da variável, pode levar muito tempo.
Em segundo lugar, o valor da assinatura
iWGK . Acho óbvio que 4 bytes são muito pequenos para garantir exclusividade. E se você levar em conta o primeiro ponto, a probabilidade de cometer um erro é bastante alta.
De fato, o fragmento desejado é anexado ao final da imagem
bmp encontrada anteriormente no deslocamento
0xA1D0D .
O Shellcode é executado em dois estágios. O primeiro descriptografa o corpo principal. Nesse caso, a chave é determinada por pesquisa exaustiva.
Despejar o
Shellcode descriptografado e olhar para as linhas.
Primeiro, agora sabemos a função para criar um processo filho:
CreateProcessInternalW .
Em segundo lugar, tomamos conhecimento do mecanismo de consolidação no sistema.
Voltar ao processo original. Defina o
ponto de
interrupção como
CreateProcessInternalW e continue a execução. Em seguida, observamos o pacote
NtGetContextThread / NtSetContextThread , que altera o endereço do início da execução para o endereço do
ShellCode .
Nós nos conectamos ao processo criado pelo depurador, ativamos o
evento Suspend on libraryu load / unload , retomamos o processo e aguardamos o carregamento das bibliotecas
.NET .
Em seguida, usando
ProcessHucker, despejamos as regiões que contêm o aplicativo
.NET descompactado.
Interrompemos todos os processos e excluímos a cópia do malware corrigido no sistema.
O arquivo de despejo é protegido pelo protetor do
.NET Reactor , que pode ser facilmente removido usando o utilitário
de4dot .
Usando as regras YARA escritas anteriormente, garantimos que temos o AgentTesla à nossa frente.
Resumir
Assim, demonstramos detalhadamente o processo de descompactação semiautomática de amostras usando o exemplo de três mini-casos e também analisamos o malware com base em um caso completo, descobrindo que a amostra sob investigação é o AgentTesla, configurando sua funcionalidade e uma lista completa de indicadores de comprometimento.
A análise do objeto malicioso que conduzimos exige muito tempo e esforço, e esse trabalho deve ser realizado por um funcionário especial da empresa; no entanto, nem todas as empresas estão prontas para manter as análises na equipe.
Um dos serviços prestados pelo Laboratório de Análise Forense e de Código Malicioso do Grupo-IB é a resposta a incidentes cibernéticos. E para que os clientes não percam tempo coordenando documentos e discutindo no meio de um ataque cibernético, o Group-IB lançou o
Incident Response Retainer , um serviço de resposta a incidentes de pré-assinatura que também inclui uma etapa de análise de código maliciosa. Mais informações sobre isso podem ser encontradas
aqui .
Se você deseja estudar mais uma vez como as amostras do AgentTesla são descompactadas e ver como o especialista do CERT Group-IB faz isso, você pode baixar a gravação do webinar sobre este tópico
aqui .