🚀 A CloudSEK se torna a primeira empresa de segurança cibernética de origem indiana a receber investimentos da Estado dos EUA fundo
Leia mais

Os carregadores de malware são essencialmente trojans de acesso remoto (RATs) que estabelecem a comunicação entre o atacante e o sistema comprometido. Os carregadores normalmente representam o primeiro estágio de um compromisso. Seu objetivo principal é baixar e executar cargas adicionais, do servidor controlado pelo atacante, no sistema comprometido sem serem detectadas.
Pesquisadores da ProofPoint descobriram um novo carregador de malware chamado Bumblebee. O carregador de malware tem o nome de uma string exclusiva de agente de usuário usada para comunicação C2. Foi observado que os adversários começaram a usar o Bumblebee para implantar malwares como os beacons CobaltStrike e os projetos Meterpreter. O grupo de ameaças TA578 também tem usado o carregador Bumblebee em suas campanhas.
Este artigo explora e decodifica o carregador de malware Bumblebee:
Os adversários enviam arquivos ISO por meio de cadeias de e-mail (resposta) comprometidas, conhecidas como e-mails sequestrados por tópicos, para implantar o carregador Bumblebee. Os arquivos ISO contêm uma cópia byte a byte dos dados de baixo nível armazenados em um disco. Os arquivos ISO maliciosos são inseridos por meio de links do Google Cloud ou pastas zip protegidas por senha.


Os arquivos ISO contêm uma DLL oculta com nomes aleatórios e um arquivo LNK. DLL (Dynamic Link Library) é uma biblioteca que contém códigos e dados que podem ser usados por mais de um programa ao mesmo tempo. LNK é uma extensão de nome de arquivo no Microsoft Windows para atalhos para arquivos locais.
O arquivo LNK geralmente contém um link direto para um arquivo executável ou metadados sobre o arquivo executável, sem a necessidade de rastrear o caminho completo do programa. Os arquivos LNK são uma alternativa atraente para abrir um arquivo e, portanto, uma forma eficaz de os agentes de ameaças criarem ataques baseados em scripts. O local de destino dos arquivos LNK está definido para ser executado rundll32.exe, que chamará uma função exportada na DLL associada. Se a opção “mostrar itens ocultos” não estiver ativada no sistema da vítima, as DLLs podem não ficar visíveis para o usuário.
A amostra analisada (f98898df74fb2b2fad3a2ea2907086397b36ae496ef3f4454bf6b7125fc103b8) é um arquivo DLL com funções exportadas.

Funções exportadas para o arquivo DLL de amostra
Ambas as funções exportadas, Trabalho interno e Definir caminho, execute a função Sub_180004AA0.

InternalJob executando a função sub_180004AA0 SetPath executando a função sub_180004AA0
A entropia de um arquivo mede a aleatoriedade dos dados no arquivo. A entropia pode ser usada para determinar se há dados ocultos ou scripts suspeitos no arquivo. A escala de entropia é de 0 (não aleatória) a 8 (totalmente aleatória). Valores de entropia altos indicam que há dados criptografados armazenados no arquivo, enquanto valores mais baixos indicam que a criptografia e o armazenamento da carga são úteis em diferentes seções durante o tempo de execução.

O pico está espalhado pelos segmentos de dados do arquivo DLL. É altamente possível que esse pico tenha sido causado pela presença de dados compactados nos segmentos de dados da DLL de amostra. Isso indica que o malware, em algum momento do tempo de execução, buscará os dados do segmento de dados e os descompactará para uso posterior.
A função exportada Sub_180004AA0 é um componente essencial para descompactar e implantar a carga principal no sistema de destino.

A função sub_180003490 serve como descompactador da carga principal.

Função sub_180003490 contém 2 funções de interesse:
Sub_1800021D0: Essa rotina de funções é responsável por alocar memória de pilha.

Sub_1800029BC: Essa função grava os dados incorporados, no segmento de dados da amostra de DLL, na memória heap recém-alocada. A carga útil compactada é obtida do segmento de dados e gravada na memória da pilha alocada. O segmento de código destacado na imagem abaixo é responsável pela transferência dos dados.



Depois de despejar a carga útil embalada na memória alocada, o controle volta para Sub_180004AA0 e função Sub_180002FF4 é executado.

Função Sub_180002FF4
Função Sub_180002FF4 executa as seguintes operações:
Depois que o controle retornar para Sub_180004AA0 função sub_180004180 é executado.

Função sub_180004180

Três funções encapsuladas na função sub_180004180
Função sub_180004180 tem 3 funções:

Hooking se refere a uma variedade de técnicas usadas para modificar o comportamento de um sistema operacional, software ou componente de software, interceptando chamadas de função, eventos ou comunicação entre componentes de software. O código que manipula essas chamadas de função, eventos ou comunicações interceptadas é chamado de gancho.
Logo após o carregador do Bumblebee descompactar a carga principal na memória, ele conecta algumas funções interessantes exportadas pelo ntdll.dll (um arquivo contendo funções do kernel do NT, suscetíveis a ataques cibernéticos) por meio de uma técnica de conexão em linha. Os ganchos em linha desempenham um papel significativo na execução da carga útil final. O mecanismo de gatilho, para a implantação da carga útil, mostra a criatividade do desenvolvedor do malware. Função sub_180001000 é responsável pela implementação dos ganchos em linha.

Função sub_180001000 salva inicialmente os endereços das 3 funções de desenvolvimento usadas para enganar. As funções de desenvolvimento são responsáveis por sequestrar o fluxo de controle em funções conectadas do Windows. Depois de armazenar os endereços, Sub_1800025EC é executado para resolver os endereços das funções de API (Interface de Programação de Aplicativos) de destino para conexão.

Funções de desenvolvimento na função sub_180001000
Sub_1800025EC carrega ntdll.dll no espaço de endereço do processo de carregamento usando a função Carregar biblioteca A. Após o carregamento do ntdll, função Obtenha o endereço do Proc é usado para resolver os endereços das funções:

Funções LoadLibraryA e GetProcAddress
Depois de obter os endereços nas páginas de memória das funções de desvio para enganchar, o carregador usa a função VirtualProtect para alterar as permissões de memória das páginas de destino. Depois de alterar as permissões, o carregador grava os ganchos em linha em sub_180002978. Então VirtualProtect é chamado novamente para restaurar as permissões da página.

Funções do VirtualProtect e sub_180002978
Os dados passados para VirtualProtect em tempo de execução é mostrado na imagem abaixo. A chamada para VirtualProtect muda de ntdll.nt Abrir arquivo permissão de página para 0x40 (PAGE_EXECUTE_READWRITE).

Dados passados/chamados para a função VirtualProtect
Depois de alterar as permissões da página do ntdll.nt Abrir arquivo, o carregador modifica a sequência inicial de bytes não NT Abrir arquivo API executando a função sub_180002978.

função sub_180002978 modificando a API NtOpenFile
A conexão em linha envolve as seguintes etapas:

ntdll.ntOpenfile antes da execução (hook) da função sub_180002978

Ligue para NTOpenfile fazendo com que o malware saísse para 1800023D4

Função VirtualProtect usado para restaurar a permissão da página Ntdll.ntopenfile

Após a conexão bem-sucedida, sempre que as funções de destino são chamadas no espaço de endereço do processo do carregador, o fluxo de controle é transferido para os respectivos endereços de gancho em linha:
Função alvoGancho em linha (Desvios)ntdll.nt Abrir arquivo1800023D4Ntdll.nt Criar seção1800041ECNTDLL.NTMAP Visualização da seção180001D4CA função final executada pelo carregador é Sub_1800013A0. O malware usa uma função Carregar biblioteca W para carregar o módulo DLL. Em seguida, ele usa a função Obtenha o endereço do Proc para obter o endereço de uma função específica exportada pela biblioteca carregada.
Isso representa uma etapa crucial na implantação da carga principal no sistema da vítima. Ao contrário dos TTPs (táticas, técnicas e procedimentos) dos carregadores de malware comuns, é aqui que o carregador do Bumblebee é criativo.

Função sub_1800013A0 com as funções LoadLibraryW e GetProcAddress
O módulo gdiplus.dll é carregado no espaço de endereço da memória do processo. Gdiplus.dll é um módulo importante, contendo bibliotecas que suportam o GDI Window Manager, no sistema operacional Microsoft Windows.

Execução em tempo de execução da função Sub_1800013A0
O módulo gdiplus.dll é executado na última função do carregador de malware. Essa é a primeira instância em que a carga útil MZ descompactada é usada diretamente pelo carregador. Portanto, o carregamento deste módulo parece suspeito. Além disso, um endereço base incomum (0x1d54fd0000) é atribuído ao carregado gdiplus.dll módulo. 
Endereço base incomum atribuído a gdiplus.dll
Ao examinar mais detalhadamente a memória suspeita, descobriu-se que o endereço é uma página mapeada com permissão RWX no espaço de endereço do carregador. Esse é um caso de uso clássico de esvaziamento, em que o conteúdo do módulo é substituído por artefatos maliciosos descompactados.

Endereço como uma página mapeada com permissão RWX
Mas, em nossa análise até agora, não encontramos nenhum código que faça o esvaziamento. Então, como o malware alterou o conteúdo do gdiplus.dll? Curiosamente, foi aqui que o desenvolvedor de malware decidiu ser criativo! O engate visto anteriormente é responsável por esvaziar o módulo carregado com a carga útil descompactada. Mais detalhes sobre o mesmo são abordados na seção a seguir.
Conforme visto na seção anterior, o malware conecta 3 APIs específicas:
A seleção da API não é aleatória. O funcionamento interno de carregar qualquer DLL via Carregar biblioteca A API usa as 3 funções mencionadas acima. Conectar essas funções dá ao malware a flexibilidade de implantar secretamente a carga útil descompactada. Esse recurso torna difícil para os pesquisadores caçar a carga principal.
A função de desvio em 0x180001D4C é usada para conectar a função Visualização do mapa NT da seção, que estabelece as bases para o esvaziamento do módulo carregado (neste caso, gdiplus.dll) como o binário Bumblebee descompactado. A função de desvio é capaz das seguintes ações:
A implementação da função de desvio em 0x180001D4C mostra o uso de um ponteiro para o NT Criar seção API, para criar um objeto de seção a ser usado posteriormente no mapeamento do gdiplus.dll módulo.

Ponteiro para a API NtCreateSection
Depois de criar um objeto de seção, a função de desvio chama Visualização do mapa NT da seção, por meio de um ponteiro. Agora, a visualização da seção é criada pelo sistema. A função Sub_180002E74 é responsável por preencher a visualização mapeada com uma carga útil descompactada.

Ponteiro para NTMapViewOfSection junto com a função sub_180002E74
O endereço da visualização mapeada, retornado por Visualização do mapa NT da seção O ponteiro no processo do carregador, que é 0x1D54F5D0000, é o mesmo endereço visto ao examinar os módulos do processo.

Endereço da visualização mapeada retornado por NTMapViewOfSection

Endereço base incomum atribuído a “gdiplus.dll”, conforme visto anteriormente
A visualização mapeada começa em 0x1D54F5D0000. O carregador despeja a carga útil descompactada aqui, esvaziando gdiplus.dll. Portanto, a carga útil final do Bumblebee permanece oculta dentro do módulo carregado. gdiplus.dll.
Logo após mapear a visualização, a função de desvio é executada Sub_180002E74 para iniciar a escrita do binário descompactado.

Função Sub_180002E74 responsável por preencher a visualização mapeada com a carga final
Os ganchos são ativados assim que o carregador carrega o gdiplus.dll módulo via Carregar biblioteca W API. Em seguida, a carga útil é carregada secretamente no gdiplus.dll módulo. A carga final é uma DLL, portanto, o carregador precisa chamar explicitamente uma função exportada para acionar a execução.
Nesse caso, o carregador obtém o endereço da função exportada Definir caminho via função Obtenha o endereço do Proc. O controle é então transferido para a carga final pela chamada final para Definir caminho, fornecendo o nome do programa carregador como argumento.

O carregador obtém o endereço da função exportada “setPath” via getProcAddress
A imagem abaixo mostra a função Definir caminho exportado pela carga útil descompactada do Bumblebee.

Função setPath
O principal componente malicioso da abelha é executado na memória, quando a abelha está oca gdiplus.dll é carregado por meio do Carregar biblioteca API. Quando o módulo é carregado na memória, a função DLL principal cria um novo tópico e executa Sub_180008EC0 rotina.

A função dllMain do carregamento útil do bumblebee
Sub_180008EC0 rotina é uma função bastante grande que é responsável por todas as atividades maliciosas realizadas pelo Bumblebee no sistema comprometido.

Fluxo lógico da função Sub_180008EC0
A primeira atividade realizada por Sub_180008EC0 é verificar se há um ambiente de máquina virtual (VM). Se a função retornar True, o Bumblebee desligará executando o Processo de saída função.

Sub_18003DA0 executa a verificação da VM
A rotina de verificação da VM é. Rigoroso. Ele emprega várias técnicas para garantir que o malware não seja executado em um ambiente de sandbox usado por pesquisadores de segurança. Algumas das características interessantes são:

Funções de malware que ajudam na iteração dos processos em execução

Processo em execução sendo comparado com a lista de nomes de programas

Verificação de malware para nomes de usuário específicos

Enumerando serviços ativos do sistema em execução via OpenSCManagerW


Verificação do sistema em busca de drivers e arquivos de biblioteca comuns usados por aplicativos populares de VM

Verificando tubos nomeados
Esses são alguns exemplos de técnicas empregadas pelo malware para identificar ambientes de análise. Ele também possui outras funcionalidades criadas, como o uso de recursos de WMI e registro para identificar informações de hardware e verificar a presença de ambientes de VM instalados no sistema de destino.
Após as verificações da VM, se for seguro continuar, o malware cria um evento. A ID do evento é 3C29FEA2-6FE8-4BF9-B98A-0E3442115F67. Isso é usado para sincronização de tópicos.

O evento criado por malware
O malware usa wsript.exe como um vetor de persistência para executar o malware toda vez que o usuário faz login no sistema. A instrução VB é escrita em um .vbs arquivo. Isso é realizado quando o C2 envia o comando “ins” como uma tarefa a ser executada no sistema.

Wsript.exe

Instrução VB escrita em um arquivo.vbs
O malware realiza a manipulação de tokens para aumentar seu privilégio no sistema de destino, concedendo ao processo de malware uma Veja o privilégio de depuração. Com esse privilégio, o malware pode realizar operações arbitrárias de leitura/gravação.

O malware recebe o “SEDebugPrivilege”
O malware é capaz de realizar injeções de código para implantar código malicioso em processos em execução usando várias APIs. O malware recupera dinamicamente os endereços das APIs necessárias para a injeção de código. A carga principal do bumblebee vem com arquivos incorporados que são injetados no processo em execução para atacar ainda mais a vítima.

Lista de APIs usadas para realizar injeções de código
Quando o malware recebe o comando junto com um buffer de DLL que é injetado, o malware começa a procurar uma lista de processos no sistema. Um dos executáveis da lista é escolhido aleatoriamente para injetar uma DLL maliciosa.

Malware procurando uma lista de processos no sistema

Lista de executáveis
Após a injeção de código, o malware:

Malware criando um processo e injetando código de shell nele
Função Sub_180037A80 é responsável por realizar a injeção do shellcode no processo gerado no estado suspenso.

Função Sub_180037A80
Depois de injetar o shellcode no processo, o malware retorna ao processo. Em seguida, execute a função Sub_18003A9BC para finalmente injetar DLL maliciosa criando várias seções e visualizações de memória.

Executando a função sub_18003A9BC para injetar DLL maliciosa
O código DLL é executado por meio do Tópico NTQueueAPC API, que é resolvida dinamicamente durante a execução.

Código DLL executado por meio da API NtQueueAPCThread
A Infraestrutura de Comando e Controle, também conhecida como C2 ou C&C, é uma coleção de ferramentas e técnicas usadas para manter contato com um sistema de dispositivos comprometido após a obtenção do acesso inicial. O endereço IP do C2 pode ser recuperado do código de carregamento, conforme mostrado abaixo.

Recuperando o endereço IP do C2
O C2 envia periodicamente tarefas ao agente para serem executadas no sistema. O malware usa extensivamente o WMI (Windows Management Infrastructure) para coletar informações básicas da vítima, como nome de domínio e nome de usuário, e enviar as informações comprometidas para o C2. O C2 distingue os agentes ativos com base na ID do cliente atribuída a cada um.

Dados transferidos na comunicação C2
Curiosamente, a string do agente do usuário usada pelo malware para comunicação é “bumblebee”.

Dados transferidos para fora do sistema comprometido

Comandos recebidos pelo sistema comprometido
O campo de tarefa na resposta C2 contém um dos seguintes comandos:
ComandoDescriçãoDexDownloads executáveisDllKill LoaderInsPersistenceDij.dll injetarA carga principal vem com duas DLLs incorporadas no binário. A finalidade e a função de ambas as DLLs são as mesmas, mas uma é de 32 bits e a outra de 64 bits. Eles são usados para realizar mais manipulações de engate e controlar o fluxo.
Assinaturas DLL (SHA256)
Nesta seção, examinaremos o funcionamento interno da DLL embutida de 32 bits. O módulo procura um conjunto específico de funções no ntdll.dll, kernel32.dll, kernelbase.dll, e advapi32.dll para remover posteriormente quaisquer ganchos presentes no código. Isso também removerá todos os ganchos implementados pelo EDR/AV (Endpoint Detection and Response/Antivirus) usados para monitoramento.

Funções em ntdll.dll verificadas quanto aos ganchos existentes

Funções em kernel32.dll verificadas quanto aos ganchos existentes
Em kernelbase32.dll, as seguintes funções são verificadas em busca de ganchos já existentes:

Funções em kernelbase32.dll verificadas quanto aos ganchos existentes

Funções em advapi32.dll verificadas quanto aos ganchos existentes
O processo de desengate envolve as seguintes etapas:

Etapas para desengatar o mecanismo
A função Sub_10005B90 executa as seguintes operações:

Operações realizadas pela função sub_10005B90
A lógica usada para desenhar é simples. O malware compara a função de destino no módulo carregado na memória com a função definida no módulo mapeado via Visualização do mapa do arquivo. Se os dois códigos não corresponderem, o conteúdo do módulo mapeado será gravado no módulo carregado, para restaurar o estado da versão mapeada do disco rígido.
O malware passa pelas exportações da DLL carregada e executa uma correspondência de string com o conjunto de nomes de funções armazenados como uma matriz em um loop. O sub_10005930 é responsável pela correspondência de strings.

Correspondência de cadeias de caracteres com o conjunto de nomes de funções
Quando o nome da função na matriz do malware corresponde à função exportada do módulo carregado, o sinalizador é definido como [v8] e interrompe o loop. Isso ocorre nas seguintes etapas:

O malware corresponde à função exportada
Se o código carregado não for igual ao código mapeado, as seguintes operações serão executadas pelo malware para desconectá-lo:

O malware não corresponde à função exportada
Depois de limpar todos os ganchos nas funções selecionadas, o malware instala os ganchos.
Funções Exceção RaiseFailFast de kernel32.dll e api-ms-win-core-errorhandling-l1-1-2.dll estão enganados. Em seguida, a função de desvio Sub_100057F0 sequestra o fluxo de controle quando as funções acima são chamadas pelo sistema após a conexão ser feita pelo malware.

Instalação de ganchos
Função Sub_100057F0 simplesmente retorna a chamada.

Função sub_100057F0
A DLL incorporada tem uma estratégia de conexão semelhante à do carregador Bumblebee. Várias funções usadas pelo sistema, ao carregar um módulo DLL, são conectadas e wups.dll é carregado para acionar a corrente.

Conectando as funções usadas para carregar a DLL e carregar o wups.dll
API de destinoFunção de desvioVisualização ZWMAP da seção SUB_10004C50ZW Abrir seção SUB_10004FF0ZW Criar seção SUB_10004BC0ZW Abrir arquivo SUB_10004F20Depois de analisar muitas amostras na natureza, observamos as modificações no código do carregador.

Modificações de código proeminentes feitas no carregador Bumblebee desde sua descoberta
A amostra da extrema esquerda na imagem acima é a que abordamos neste relatório. Como podemos ver no fluxo lógico do carregador, o desenvolvedor do malware modificou o código do carregador em outras duas amostras. Todas as amostras observadas na natureza são módulos DLL de 64 bits com uma função exportada que tem uma string gerada aleatoriamente como nome da função. Isso pode ser justificado pelo fato de que o código desempenha um papel importante na detecção de malware por produtos de segurança. Para contornar esse obstáculo, os desenvolvedores de malware fazem alterações no código e no design do malware.
As amostras mais recentes de carregadores disponíveis contêm várias cargas úteis, como faróis CobaltStrike e projetos Meterpreter, ao contrário da carga útil personalizada do bumblebee vista na primeira geração.