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 .