A participação falhou: levamos o AgentTesla à água limpa. Parte 3



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.

  1. A primeira permite "colar" uma biblioteca dinâmica na amostra pai.

  2. 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 .

Source: https://habr.com/ru/post/pt481078/


All Articles