Pesquisadores da ESET descobriram uma campanha ainda em andamento usando uma variante do malware Korplug até então desconhecida que eles batizaram como Hodur devido a sua semelhança com a variante THOR anteriormente documentada pela Unit 42 em 2020. Na mitologia norueguesa, o Hodur é o meio-irmão cego de Thor, que é enganado por Loki para matar seu meio-irmão Baldr.

Principais descobertas apresentadas neste artigo:

  • Em março de 2022, esta campanha ainda está em andamento e remonta, pelo menos, a agosto de 2021.
  • Entre as vítimas conhecidas estão instituições de pesquisa, provedores de serviços de internet e missões diplomáticas europeias.
  • A cadeia de comprometimento inclui documentos utilizados como isca frequentemente atualizados e estão relacionados a eventos na Europa.
  • A campanha usa um loader personalizado para executar uma nova variante do Korplug.
  • Cada etapa do processo de implantação usa técnicas antianálise e de ofuscação do controle de fluxo, o que a diferencia de outras campanhas.
  • Os pesquisadores da ESET fornecem uma análise profunda das capacidades e comandos desta nova variante.

As vítimas dessa campanha provavelmente são atraídas por documentos de phishing que se aproveitam dos últimos acontecimentos na Europa, como a invasão russa na Ucrânia. Isso resultou em mais de três milhões de residentes fugindo da guerra para países vizinhos, levando a uma crise sem precedentes nas fronteiras da Ucrânia. Um dos nomes dos arquivos relacionados a esta campanha é Situation at the EU borders with Ukraine.exe.

Outras iscas usadas por phishings mencionam restrições de viagem em relação à Covid-19, um mapa de ajuda regional aprovado para a Grécia e um Regulamento do Parlamento Europeu e do Conselho Europeu. O último é um documento real disponível no site do Conselho Europeu. Isso mostra que o grupo APT por trás dessa campanha está acompanhando os assuntos atuais e é capaz de reagir a eles com sucesso e rapidamente.

Figura 1. Países afetados pelo Mustang Panda nesta campanha.

Países afetados:

  • Mongólia
  • Vietnã
  • Mianmar
  • Grécia
  • Rússia
  • Chipre
  • Sul do Sudão
  • África do Sul

Organizações afetadas:

  • Missões diplomáticas
  • Instituições de pesquisa
  • Provedores de serviços de internet (ISPs)

Análise

Com base nas semelhanças de código e nas muitas semelhanças em Táticas, Técnicas e Procedimentos (TTPs), os pesquisadores da ESET atribuem esta campanha grupo ao Mustang Panda (também conhecido como TA416, RedDelta, ou PKPLUG). Trata-se de um grupo de ciberespionagem que visa principalmente a órgãos governamentais e ONGs. As vítimas desse grupo estão localizadas principalmente, mas não exclusivamente, no leste e sudeste da Ásia, especialmente na Mongólia. O grupo também é conhecido por uma campanha que foi direcionada ao Vaticano em 2020.

Embora não tenhamos sido capazes de identificar os mercados verticais de todas as vítimas, esta campanha parece ter os mesmos objetivos de direcionamento que outras campanhas do Mustang Panda. Seguindo a vitimologia típica deste grupo APT, a maioria das vítimas está localizada no leste e sudeste da Ásia, juntamente com algumas em países europeus e africanos. De acordo com a telemetria da ESET, a grande maioria dos alvos está localizada na Mongólia e Vietnã, seguida por Mianmar, com poucas vítimas nos outros países afetados.

As campanhas do grupo Mustang Panda normalmente usam loaders personalizados para malware compartilhado, incluindo Cobalt Strike, Poison Ivy e Korplug (também conhecido como PlugX). O grupo também é conhecido por criar suas próprias variantes do Korplug. Em comparação com outras campanhas que utilizam o Korplug, cada etapa do processo de implantação utiliza técnicas antianálise e de ofuscação de controle de fluxo.

Este artigo contém uma análise detalhada dessa variante do Korplug, desconhecida anteriormente, utilizada nessa campanha. Esta atividade faz parte da mesma campanha recentemente investigada pela Proofpoint, mas fornecemos informações históricas e de orientação adicional.

Conjunto de ferramentas

O grupo Mustang Panda é conhecido pela elaboração de loaders personalizadas e variantes do Korplug, e as amostras utilizadas nesta campanha mostram isso perfeitamente.

As cadeias de comprometimento vistas nesta campanha seguem o típico padrão do Korplug: um executável legítimo, validamente assinado e vulnerável a técnica conhecida como DLL search-order hijacking, uma DLL maliciosa e um arquivo do Korplug criptografado que são implantados na máquina da vítima. O executável é utilizado para carregar o módulo, que então descriptografa e executa o RAT Korplug. Em alguns casos, um downloader é usado primeiro para distribuir estes arquivos juntamente com um documento utilizado como isca. Este processo é ilustrado na Figura 2.

Figura 2. Visão geral do processo de implantação da variante do Korplug chamada Hodur.

O que diferencia esta campanha é o intenso uso de técnicas de ofuscação de controle de fluxo e antianálise em cada etapa do processo de implantação. As seções seguintes descrevem o comportamento de cada etapa e analisam mais profundamente as técnicas de evasão de defesa utilizadas em cada uma delas.

Acesso inicial

Não fomos capazes de observar o vetor utilizado para a implantação inicial, mas nossa análise aponta os ataques de phishing e de watering hole como prováveis vetores. Nos casos em que vimos um downloader, os nomes dos arquivos utilizados sugerem um documento com um assunto interessante para a vítima. Tais exemplos incluem:

  • COVID-19 travel restrictions EU reviews list of third countries.exe
  • State_aid__Commission_approves_2022-2027_regional_aid_map_for_Greece.exe
  • REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe
  • Situation at the EU borders with Ukraine.exe

Para fomentar a ilusão, estes binários baixam e abrem um documento que tem o mesmo nome, mas com uma extensão .doc ou .pdf. O conteúdo dessas iscas reflete com precisão o nome do arquivo. Como mostrado na Figura 3, pelo menos um deles é um documento legítimo do Parlamento Europeu, acessível publicamente.

Figura 3. Primeira página do documento utilizado como isca para o downloader REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe. É um documento real, disponível no site do Conselho Europeu.

Downloader

Embora sua complexidade tenha aumentado ao longo da campanha, o downloader é bastante simples. Este aumento na complexidade vem de técnicas antianálise adicionais, que abordamos a seguir.

Primeiro ele baixa quatro arquivos através do HTTPS: um documento isca, um executável legítimo, um módulo malicioso e um arquivo do Korplug criptografado. A combinação destes três últimos componentes para executar uma payload via DLL é às vezes referida como um tridente e é uma técnica comumente usada pelo Mustang Panda, e geralmente com os loaders do Korplug. Tanto os endereços dos servidores quanto os caminhos dos arquivos são codificados no executável do downloader. Uma vez que tudo é baixado, e o documento isca é aberto para distrair a vítima, o downloader usa a seguinte linha de comando para lançar o executável legítimo:

cmd /c ping 8.8.8.8 -n 70&&"%temp%\<legitimate executable>"

Este comando ping verifica a conectividade à internet e introduz um atraso (através da opção -n 70) antes de executar o executável legítimo baixado.

O downloader usa múltiplas técnicas antianálise, muitas das quais também são usadas no loader e no payload final. A ofuscação adicional foi adicionada a novas versões ao longo da campanha, sem alterar seu objetivo.

Nas primeiras versões do downloader se usava código lixo e previsões opacas para dificultar a análise, como mostrado na Figura 4, mas o servidor e os nomes dos arquivos são claramente visíveis no texto.

Figura 4. Ofuscação do controle de fluxo nas primeiras versões do downloader.

Em versões posteriores, os arquivos no servidor estão criptografados com RC4, usando como chave a representação da string em base 10 do tamanho do arquivo, e depois codificados com hexadecimal. Este processo é ilustrado no fragmento de Python logo abaixo. O downloader realiza as operações opostas do lado do cliente para recuperar os arquivos de texto simples. Isto provavelmente é feito para contornar as proteções a nível de rede.

from Crypto.cipher import ARC4
key = "%d" % len(plaintext)
rc4 = ARC4.new(key)
cipher_content = rc4.encrypt(plaintext).hex().upper()

Estas versões substituem o uso de strings de texto simples por pilhas de strings criptografadas. Elas ainda estão codificadas no arquivo, mas a ofuscação que as envolve, e o uso de chaves diferentes faz com que seja difícil descriptografá-las estaticamente de forma automatizada. Esta mesma técnica é muito utilizada nas etapas posteriores. As pilhas de strings criptografadas também são usadas para ofuscar chamadas às funções da API do Windows.

Primeiro, o nome da função alvo é descriptografada e passada para uma função. Esta função obtém um ponteiro para o campo InMemoryOrderModuleList do PEB (Process Environment Block). Em seguida, itera sobre os módulos carregados, passando cada identificador para GetProcAddress junto com o nome da função até que a função alvo seja resolvida com sucesso. Parte deste processo pode ser visto na Figura 5.

Figura 5. Obfuscao de chamadas à API do Windows no downloader. A captura de tela mostra uma chamada para o WriteFile, mas o mesmo padrão é usado para todas as funções da API.

Loader

Como é comum com o Korplug, o loader é uma DLL que explora uma vulnerabilidade de carga lateral em um executável legítimo e assinado. Observamos muitos aplicativos diferentes sendo abusados nesta campanha, por exemplo, um executável SmadAV vulnerável anteriormente visto pela Qurium em uma campanha atribuída ao grupo Mustang Panda que tinha como alvo a Myanmar.

O loader exporta múltiplas funções. A lista exata varia dependendo da aplicação explorada, mas em todos os casos, apenas uma delas faz algo importante. Em todos os loaders que observamos, esta é a função exportada com o endereço de carga mais alto. Todas as outras exportações, e o ponto de entrada da biblioteca retornam imediatamente ou executam algum código de lixo inútil. Muitas destas exportações têm nomes que consistem de letras minúsculas aleatórias e apontam para o mesmo endereço como mostrado na Tabela 1.

Tabela 1. Funções exportadas por um loader Hodur. A exportação createSystemFontsUsingEDL é a que carrega a etapa final do malware nesta versão.

Name Ordinal Function RVA
CreatePotPlayerExW 1 0x00007894
RunPotPlayer 2 0x000166A5
createSystemFontsUsingEDL 3 0x00016779
gGegcerhwyvxtkrtyawvugo 4 0x00007894
liucigvyworf 5 0x00007639
ojohjinbgdfqtcwxojeusoneslciyxtiyjuieaugadjpd 6 0x000077CA
soeevhiywsypipesxfhgxboleahfwvlqcqp 7 0x00007894
srkeqffanuhiuwahbmatdurggpffhbkcpukyxgxmosn 8 0x00007894
thggvmrv 9 0x00007701

A função do loader obtém o diretório a partir do qual se executa a DLL usando GetModuleFileNameA e tenta abrir o arquivo Korplug criptografado que ele contém. Esse nome de arquivo é codificado no loader. Ele lê o conteúdo do arquivo em um buffer alocado localmente e o descriptografa. O loader torna este buffer executável usando o VirtualProtect antes de chamá-lo no offset 0x00.

As chamadas de funções do API do Windows são ofuscadas com uma técnica diferente daquela utilizada no downloader. Ao contrário do loader, que contém os nomes de suas funções (como mostrado na Tabela 1 acima), somente os hashes de 64 bits das chamadas de funções do API do Windows estão presentes no binário. Para resolver essas funções, o loader usa as listas de exportação de todas as bibliotecas carregadas através do InMemoryOrderModuleList do PEB. O nome de cada exportação é codificada, depois comparada com o valor esperado. O algoritmo hash FNV-1a, recentemente trazido de volta pelo backdoor Sunburst, foi usado anteriormente pelo Mustang Panda, em loaders do Korplug documentados pelo XORHEX, para resolver o GetProcAddress e LoadLibraryA, embora não tenha sido identificado pelo nome nessa análise. Nesta versão, no entanto, todas as funções API são utilizadas.

Backdoor Korplug

O Korplug (também conhecido como PlugX) é um RAT usado por vários grupos APT. Apesar de ser tão amplamente utilizado, ou talvez por causa dele, poucos relatórios descrevem extensamente seus comandos e os dados que ele exfiltra. Sua funcionalidade não é constante entre variantes, mas parece existir uma sobreposição significativa na lista de comandos entre a versão que analisamos e outras fontes como o relatório Avira de janeiro de 2020 e o projeto plugxdecoder no GitHub.

Como mencionado anteriormente, a variante utilizada nesta campanha tem muitas semelhanças com a variante THOR, e é por isso que a chamamos de Hodur. As semelhanças incluem o uso da chave de registro do Software\CLASSES\M-pu, o mesmo formato para servidores C&C na configuração, e o uso da classe window Static.

Como esperado para os payloads do Korplug, o loader só descriptografa esta etapa na memória. Apenas a versão criptografada é escrita em disco em um arquivo com extensão .dat.

A menos que se indique o contrário, todas as strings codificadas discutidas nesta seção são armazenadas como cadeias de pilhas criptografadas.

Neste módulo, as funções do API do Windows são ofuscadas através de uma combinação dos métodos utilizados nas etapas anteriores. LoadLibraryA e GetProcAddress são resolvidos através da técnica de hashing FNV-1a e as cadeias de pilha são descriptografadas e passadas para obter a função do alvo.

Loading

Uma vez descriptografado, o payload é uma DLL válida que exporta uma única função. Em quase todas as amostras observadas desta campanha, esta função é denominada StartProtect. Entretanto, lançá-la diretamente através desta exportação ou de seu ponto de entrada não executará o payload principal e o processo de carregamento é bastante complicado.

Como explicado na seção anterior, o loader descriptografa o arquivo na memória como um blob contínuo e a execução começa no offset 0x00. O cabeçalho PE contém um shellcode, mostrado na Figura 6, que chama um offset específico que corresponde à exportação única do módulo.

Figura 6. Shellcode no cabeçalho PE que chama a função exportada.

Esta função analisa o cabeçalho PE na memória e o mapeia manualmente como uma biblioteca em um buffer recentemente alocado. Isto inclui o mapeamento das várias seções, a resolução das importações e, finalmente, o uso da DLL_PROCESS_ATTACH para chamar o ponto de entrada da DLL. Mais uma vez, os predicados opacos e o código lixo são usados para ofuscar o propósito desta função.

O ponto de entrada da biblioteca devidamente carregada é então chamado com o valor não-padrão de 0x04 para o parâmetro fdwReason (somente valores de 0x00 a 0x03 são definidos atualmente). Este valor especial é necessário para que ele execute o payload principal. Esta simples verificação evita que o RAT seja executado diretamente com uma ferramenta genérica como o rundll32.exe.

O backdoor primeiro descriptografa sua configuração usando a string 123456789 como uma chave XOR repetitiva. Uma vez descriptografada, o bloco de configuração começa com ########. O layout da configuração varia ligeiramente entre as amostras, mas todas elas contêm pelo menos os seguintes campos:

  • Nome do diretório de instalação. Também usado como o nome da chave de registro criada para persistência. Este valor corresponde aproximadamente ao nome da aplicação utilizada com três letras aleatórias anexadas (por exemplo, FontEDLZeP ou AdobePhotosGQp);
  • Nome do mutex;
  • Um valor que é ou uma string da versão ou do ID;
  • Lista de servidores C&C. Cada entrada inclui endereço IP, número de porta e um número indicando o protocolo que deve ser usado com esse C&C.

O backdoor então verifica o caminho a partir do qual está sendo executado usando GetModuleFileNameW. Se isso corresponder a %userprofile%%<installation directory> ou %allusersprofile%<installation directory>, a funcionalidade RAT será executada. Caso contrário, ela passará pelo processo de instalação.

Instalação

Para se instalar, o malware cria o diretório acima mencionado no %allusersprofile%. Usando o SetFileAttributesW, ele é então marcado como hidden e system. O executável vulnerável, módulo carregador e arquivos criptografados do Korplug criptografados são copiados para o novo diretório.

A seguir, a persistência é estabelecida. Amostras anteriores conseguiram isso criando uma tarefa programada para ser executada na inicialização via schtasks.exe. Amostras mais recentes adicionam uma entrada de registro ao Software\Microsoft\Windows\CurrentVersion\Run, provando primeiro a seção HKLM e depois a HKCU. Esta entrada tem o mesmo nome do diretório de instalação com seu valor definido para o caminho do executável recém copiado.

Uma vez estabelecida a persistência, o malware lança o executável a partir de sua nova localização e sai.

RAT

A funcionalidade RAT da variante Hodur utilizada nesta campanha alinha-se em sua maioria com outras variantes do Korplug, com alguns comandos e características adicionais. Porém, como já destacamos anteriormente, as análises detalhadas dos comandos do Korplug são poucas e distantes, portanto, nosso objetivo é fornecer tal análise na esperança de ajudar os futuros analistas.

Quando neste modo, o backdoor faz iteração através da lista de servidores C&C em sua configuração até chegar ao final ou receber um comando de desinstalação. Para cada um desses servidores, ele processa comandos até receber um comando Stop ou encontrar um erro.

O handshake inicial do Hodur pode ser feito através do HTTPS ou TCP. Isso é determinado por um valor na configuração para aquele servidor C&C em particular. A comunicação posterior é sempre feita sobre o TCP usando um protocolo personalizado que descrevemos nesta seção, juntamente com os comandos que podem ser emitidos. O Hodur usa soquetes da API do Windows Sockets (Winsock) que suportam I/O sobrepostas.

Depois do protocolo de link inicial, as comunicações do Hodur envolvem mensagens TCP que consistem em um cabeçalho, com a estrutura descrita na Tabela 2, seguido por um corpo de mensagem que normalmente é comprimido usando LZNT1 e sempre se criptografa com RC4. As mensagens cujo campo do cabeçalho do número de comando tem o conjunto de 0x10000000 bits (aquelas que contêm conteúdo de arquivo para os comandos ReadFile e WriteFile, descritos na Tabela 3) têm corpos de mensagem criptografados mas não comprimidos. Todos os corpos de mensagens criptografados usam a chave hardcoded sV!e@T#L$PH% com um nonce aleatório de quatro bytes (o valor em offset 0x00 no cabeçalho) anexado.

Tabela 2. Formato de cabeçalho utilizado para a comunicação entre a C&C e o backdoor.

Offset Field Description
0x00 Nonce Random nonce appended to the RC4 key.
0x04 Command number This field indicates the command to run or the command that caused this response to be sent.
0x08 Length of body Length of the message body. It seems that this field isn’t checked by the client for messages from the C&C server.
0x0C Command exit status The return or error value of the command that was run. This field is not checked by the client in messages received from the C&C server.

Os cabeçalhos das mensagens do C&C do Hodur são transmitidos sem criptografia, seguidos por corpos de mensagens de tamanho variável (o valor em offset 0x08 do cabeçalho). O formato do corpo da mensagem varia segundo o comando, mas uma vez descriptografados e descomprimidos, os valores de comprimento variável (como strings) estão sempre no final do corpo da mensagem e seu offset no corpo é armazenado como um número inteiro no campo de mensagem correspondente.

Como a versão descrita pela Avira, o Hodur tem dois grupos de comandos - 0x1001 e 0x1002 - cada um com seu próprio controlador. O servidor C&C pode definir qual grupo ouvir enviando a identificação correspondente como o número de comando quando um cliente ainda não está em um dos dois modos. Ele continuará escutando para o mesmo grupo até receber o comando Stop ou caso ocorra um erro (incluindo o recebimento de uma mensagem com um número de comando inválido em seu cabeçalho).

O primeiro grupo, 0x1001, contém comandos para gerenciar a execução do backdoor e fazer o reconhecimento inicial em um host recém-comprometido. Como estes comandos não levam argumentos, as mensagens enviadas pelo servidor C&C consistem apenas nos cabeçalhos. A tabela 3 contém uma lista desses comandos. O comando GetSystemInfo é descrito com mais detalhes abaixo. Observe que nenhum nome de comando está presente no RAT; eles foram retirados de análises anteriores ou fornecidos por nós.

Tabela 3. Comandos no grupo 0x1001.

ID Name Description Data in client response
0x1000 Ping Sent by the client when it starts listening for commands from this group. Between 0 and 64 random bytes
0x1001 GetSystemInfo Get information about the system. See Table 4
0x1002 ListenThread Start a new thread that listens for group 0x1002 commands. None
0x1004 ResetConnection Terminate with WSAECONNRESET. N/A
0x1005 Uninstall Delete persistence registry keys, remove itself and created folders. None
0x1007 Stop Set registry key System\CurrentControlSet\Control\‌Network\allow to 1 and exit. N/A

O comando GetSystemInfo coleta extensas informações sobre o sistema, conforme detalhado na Tabela 4. Se ele ainda não existir, a chave de registro do Software\CLASSES\Pu\CLSID é definida para a marca de tempo atual, tentando primeiro com o HKLM e depois com o HKCU. O valor desta chave é então enviado na resposta.

Tabela 4. Formato do corpo de resposta para a resposta GetSystemInfo.

Offset Value Offset Value
0x00 Magic bytes 0x20190301 0x38 Suite mask
0x04 Client IP address of the C&C socket 0x3A Product type
0x08 Server IP address of the C&C socket 0x3C 0x01 if the process is running as WOW64
0x0C RAM in KB 0x40 System time – year
0x10 CPU clock rate in MHz 0x42 System time – month
0x14 Display width in pixels 0x44 Timestamp of first run (offset)
0x18 Display height in pixels 0x46 Service pack version string (offset)
0x1C Default locale 0x48 Unknown
0x20 Current tick count 0x4A Username (offset)
0x24 OS major version 0x4C Computer name (offset)
0x28 OS minor version 0x4E Mutex name (offset)
0x2C OS build number 0x50 Unknown
0x30 OS platform ID 0x52 List of machine IP addresses (offset)
0x34 Service pack major version 0x54 Always two 0x00 bytes
0x36 Service pack minor version

O grupo 0x1002 contém comandos que fornecem a funcionalidade do RAT, como detalhado na Tabela 5. Alguns destes tomam parâmetros fornecidos no corpo de mensagens do comando. O comando FindFiles é descrito com mais detalhes abaixo. Novamente, observe que nenhum nome de comando está presente no RAT; eles foram retirados de análises anteriores ou fornecidos por nós.

Tabela 5. Comandos no grupo 0x1002.

ID Name Description Data in C&C request Data in client response
0x1002 Ping Sent by the client when it starts listening for commands from this group. N/A None
0x3000 ListDrives List all mapped drives (A: to Z:) and their properties.

All 26 entries are sent back in one message body. Drives that aren’t present have all fields set to 0x00.

None
  • Drive type
  • Total size
  • Space available to user
  • Free space
  • Volume name (offset)
  • File system name (offset)
0x3001 ListDirectory List the contents of the specified directory. The client sends one response message per entry. Directory path
  • Is a directory?
  • File attributes
  • File size
  • Creation time
  • Last write time
  • Filename (offset)
  • 8.3 filename (offset)
0x3002 #rowspan# Sent by the client when it has finished executing the ListDirectory command. N/A None
0x3004 ReadFile Read a file in chunks of 0x4000 bytes.
  • Creation time
  • Last access time
  • Last write time
  • Has offset
  • Offset in file
  • File size
  • File path
0x10003005 #rowspan# Chunk of read file data. N/A Read data
0x10003006 #rowspan# Sent by the client when it has finished executing the ReadFile command. N/A None
0x3007 WriteFile Write to a file and restore previous timestamp.

Creates parent directories if they don’t exist.

  • Creation time
  • Last access time
  • Last write time
  • Has offset
  • Offset in file
  • File path (offset)
None
0x10003008 #rowspan# Sent by the server with data to write to the file. Data to write N/A
0x10003009 #rowspan# Sent by the server when the WriteFile operation is complete. None N/A
0x300A CreateDirectory Create a directory. Directory path None
0x300B CanReadFile Try to open a file with read permissions. File path None
0x300C DesktopExecute Execute a command on a hidden desktop. Command line to execute PROCESS_INFORMATION structure for the created process.
0x300D FileOperation Perform a file operation using SHFileOperation.
  • wFunc
  • fFlags
  • pFrom (offset)
  • pTo (offset)
None
0x300E GetEnvValue Get the value of an environment variable. Environment variable Environment variable value.
0x300F CreateProgramDataDir Creates the directory %SYSTEM%\ProgramData, optionally with a subdirectory. Subdirectory relative path (optional) None
0x3102 FindFiles Recursively search a directory for files matching a given pattern.
  • Starting directory
  • Search pattern
See response body format in Table 6.
0x7002 RemoteShell Start an interactive remote cmd.exe session. None None
0x7003 #rowspan# Result of the last command run. N/A Command output

Comando FindFiles

A partir do diretório fornecido, este comando procura por arquivos cujos nomes correspondem ao padrão dado. Este padrão suporta os mesmos caracteres curinga que a API FindFirstFile do Windows. Para cada arquivo correspondente, o cliente envia uma mensagem de resposta com seu corpo no formato descrito na Tabela 6.

Tabela 6. Formato do corpo de resposta para o comando FindFiles.

Offset Value Offset Value
0x00 File attributes 0x24 Folder path (offset)
0x04 File size in bytes 0x26 Filename (offset)
0x0C Creation time 0x28 8.3 filename (offset)
0x1C Last write time

Uma mensagem de resposta com um corpo vazio é enviada assim que a busca é concluída.

Conclusão

As iscas usadas nesta campanha mostram mais uma vez quão rapidamente o Mustang Panda é capaz de reagir aos acontecimentos mundiais. Por exemplo, um regulamento da UE sobre a Covid-19 foi usado como isca apenas duas semanas após sua divulgação, e documentos sobre a guerra na Ucrânia começaram a ser usados nos dias posteriores ao início da invasão. Este grupo também demonstra uma capacidade de melhorar iterativamente suas ferramentas, incluindo o uso de downloaders tridentes para implantar o Korplug.

Para quaisquer perguntas sobre nossas pesquisas publicadas no WeLiveSecurity, por favor, entre em contato conosco através do e-mail threatintel@eset.com A equipe do ESET Research agora também oferece relatórios privados de inteligência de APT e feeds de dados. Para quaisquer perguntas sobre este serviço, visite a página ESET Threat Intelligence

Indicadores de Comprometimento

SHA-1 Filename ESET detection name Description
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B coreclr.dll Win32/Agent.ADMW Korplug loader.
10AE4784D0FFBC9CD5FD85B150830AEA3334A1DE N/A Win32/Korplug.TC Decrypted Korplug (dumped from memory).
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B coreclr.dll Win32/Agent.ADMW Korplug loader.
4EBFC035179CD72D323F0AB357537C094A276E6D PowerDVD18.exe Win32/Delf.UTN Korplug loader.
FDBB16B8BA7724659BAB5B2E1385CFD476F10607 N/A Win32/Korplug.TB Decrypted Korplug (dumped from memory).
7E059258CF963B95BDE479D1C374A4C300624986 N/A Win32/Korplug.TC Decrypted Korplug (dumped from memory).
7992729769760ECAB37F2AA32DE4E61E77828547 SHELLSEL.ocx Win32/Agent.ADMW Korplug loader.
F05E89D031D051159778A79D81685B62AFF4E3F9 SymHp.exe Win32/Delf.UTN Korplug loader.
AB01E099872A094DC779890171A11764DE8B4360 BoomerangLib.dll Win32/Korplug.TH Korplug loader.
CDB15B1ED97985D944F883AF05483990E02A49F7 PotPlayer.dll Win32/Agent.ADYO Korplug loader.
908F55D21CCC2E14D4FF65A7A38E26593A0D9A70 SmadHook32.dll Win32/Agent.ADMW Korplug loader.
477A1CE31353E8C26A8F4E02C1D378295B302C9E N/A Win32/Agent.ADMW Korplug loader.
52288C2CDB5926ECC970B2166943C9D4453F5E92 SmadHook32c.dll Win32/Agent.ADMW Korplug loader.
CBD875EE456C84F9E87EC392750D69A75FB6B23A SHELLSEL.ocx Win32/Agent.ADMW Korplug loader.
2CF4BAFE062D38FAF4772A7D1067B80339C2CE82 Adobe_Caps.dll Win32/Agent.ADMW Korplug loader.
97C92ADD7145CF9386ABD5527A8BCD6FABF9A148 DocConvDll.dll Win32/Agent.ADYO Korplug loader.
39863CECA1B0F54F5C063B3015B776CDB05971F3 N/A Win32/Korplug.TD Decrypted Korplug (dumped from memory).
0D5348B5C9A66C743615E819AEF152FB5B0DAB97 FontEDL.exe clean Vulnerable legitimate Font File Generator executable.
C8F5825499315EAF4B5046FF79AC9553E71AD1C0 Silverlight.Configuration.exe clean Vulnerable legitimate Microsoft Silverlight Configuration Utility executable.
D4FFE4A4F2BD2C19FF26139800C18339087E39CD PowerDVDLP.exe clean Vulnerable legitimate PowerDVD executable.
65898ACA030DCEFDA7C970D3A311E8EA7FFC844A Symantec.exe clean Vulnerable legitimate Symantec AntiVirus executable.
7DDB61872830F4A0E6BF96FAF665337D01F164FC Adobe Stock Photos CS3.exe clean Vulnerable legitimate Adobe Stock Photos executable.
C13D0D669365DFAFF9C472E615A611E058EBF596 COVID-19 travel restrictions EU reviews list of third countries.exe Win32/Agent_AGen.NJ Downloader.
062473912692F7A3FAB8485101D4FCF6D704ED23 REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe Win32/TrojanDownloader.Agent.GDL Downloader.
2B5D6BB5188895DA4928DD310C7C897F51AAA050 log.dll Win32/Agent.ACYW Korplug loader.
511DA645A7282FB84FF18C33398E67D7661FD663 2.exe Win32/Agent.ADPL Korplug loader.
59002E1A58065D7248CD9D7DD62C3F865813EEE6 log.dll Win32/Agent.ADXE Korplug loader.
F67C553678B7857D1BBC488040EA90E6C52946B3 KINGSTON.exe Win32/Agent.ADXZ Korplug Loader.
58B6B5FD3F2BFD182622F547A93222A4AFDF4E76 PotPlayer.exe clean Vulnerable legitimate executable.

Rede

Domain IP First seen Notes
103.56.53[.]120 2021‑06‑15 Korplug C&C
154.204.27[.]181 2020‑10‑05 Korplug C&C.
43.254.218[.]42 2021‑02‑09 Download server.
45.131.179[.]179 2020‑10‑05 Korplug C&C.
176.113.69[.]91 2021-04-19 Korplug C&C.
upespr[.]com 45.154.14[.]235 2022-01-17 Download server.
urmsec[.]com 156.226.173[.]23 2022‑02‑23 Download server.
101.36.125[.]203 2021-06-01 Korplug C&C.
185.207.153[.]208 2022‑02‑03 Download server.
154.204.27[.]130 2021-12-14 Korplug C&C.
92.118.188[.]78 2022-01-27 Korplug C&C.
zyber-i[.]com 107.178.71[.]211 2022-03-01 Download server.
locvnpt[.]com 103.79.120[.]66 2021-05-21 Download server. This domain was previously used in a 2020 campaign documented by Recorded Future.

Técnicas do MITRE ATT&CK

Esta tabela foi criada utilizando a versão 10 do framework do MITRE ATT&CK.

Tactic ID Name Description
Resource Development T1583.001 Acquire Infrastructure: Domains Mustang Panda has registered domains for use as download servers.
T1583.003 Acquire Infrastructure: Virtual Private Server Some download servers used by Mustang Panda appear to be on shared hosting.
T1583.004 Acquire Infrastructure: Server Mustang Panda uses servers that appear to be exclusive to the group.
T1587.001 Develop Capabilities: Malware Mustang Panda has developed custom loader and Korplug versions.
T1588.006 Obtain Capabilities: Vulnerabilities Multiple DLL hijacking vulnerabilities are used in the deployment process.
T1608.001 Stage Capabilities: Upload Malware Malicious payloads are hosted on the download servers.
Execution T1059.003 Command and Scripting Interpreter: Windows Command Shell Windows command shell is used to execute commands sent by the C&C server.
T1106 Native API Mustang Panda uses CreateProcess and ShellExecute for execution.
T1129 Shared Modules Mustang Panda uses LoadLibrary to load additional DLLs at runtime. The loader and RAT are DLLs.
T1204.002 User Execution: Malicious File Mustang Panda relies on the user executing the initial downloader.
T1574.002 Hijack Execution Flow: DLL Side-Loading The downloader obtains and launches a vulnerable application so it loads and executes the malicious DLL that contains the second stage.
Persistence T1547.001 Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder Korplug can persist via registry Run keys.
T1053.005 Scheduled Task/Job: Scheduled Task Korplug can persist by creating a scheduled task that runs on startup.
Defense Evasion T1140 Deobfuscate/Decode Files or Information The Korplug file is encrypted and only decrypted at runtime, and its configuration data is encrypted with XOR.
T1564.001 Hide Artifacts: Hidden Files and Directories Directories created during the installation process are set as hidden system directories.
T1564.003 Hide Artifacts: Hidden Window Korplug can run commands on a hidden desktop. Multiple hidden windows are used during the deployment process.
T1070 Indicator Removal on Host Korplug’s uninstall command deletes registry keys that store data and provide persistence.
T1070.004 Indicator Removal on Host: File Deletion Korplug can remove itself and all created directories.
T1070.006 Indicator Removal on Host: Timestomp When writing to a file, Korplug sets the file’s timestamps to their previous values.
T1036.004 Masquerading: Masquerade Task or Service Scheduled tasks created for persistence use legitimate-looking names.
T1036.005 Masquerading: Match Legitimate Name or Location File and directory names match expected values for the legitimate app that is abused by the loader.
T1112 Modify Registry Korplug can create, modify, and remove registry keys.
T1027 Obfuscated Files or Information Some downloaded files are encrypted and stored as hexadecimal strings.
T1027.005 Obfuscated Files or Information: Indicator Removal from Tools Imports are hidden by dynamic resolution of API function names.
T1055.001 Process Injection: Dynamic-link Library Injection Some versions of the Korplug loader inject the Korplug DLL into a newly launched process.
T1620 Reflective Code Loading Korplug parses and loads itself into memory.
Discovery T1083 File and Directory Discovery Korplug can list files and directories along with their attributes and content.
T1082 System Information Discovery Korplug collects extensive information about the system including uptime, Windows version, CPU clock rate, amount of RAM and display resolution.
T1614 System Location Discovery Korplug retrieves the system locale using GetSystemDefaultLCID.
T1016 System Network Configuration Discovery Korplug collects the system hostname and IP addresses.
T1016.001 System Network Configuration Discovery: Internet Connection Discovery The downloader pings Google’s DNS server to check internet connectivity.
T1033 System Owner/User Discovery Korplug obtains the current user’s username.
T1124 System Time Discovery Korplug uses GetSystemTime to retrieve the current system time.
Collection T1005 Data from Local System Korplug collects extensive data about the system it’s running on.
T1025 Data from Removable Media Korplug can collect metadata and content from all mapped drives.
T1039 Data from Network Shared Drive Korplug can collect metadata and content from all mapped drives.
Command and Control T1071.001 Application Layer Protocol: Web Protocols Korplug can make the initial handshake over HTTPS.
T1095 Non-Application Layer Protocol C&C communication is done over a custom TCP-based protocol.
T1573.001 Encrypted Channel: Symmetric Cryptography C&C communication is encrypted using RC4.
T1008 Fallback Channels The Korplug configuration contains fallback C&C servers.
T1105 Ingress Tool Transfer Korplug can download additional files from the C&C server.
T1571 Non-Standard Port When Hodur performs its initial handshake over HTTPS, it uses the same port (specified in the configuration) as for the rest of the communication.
T1132.001 Data Encoding: Standard Encoding Korplug compresses transferred data using LZNT1.
Exfiltration T1041 Exfiltration Over C2 Channel Data exfiltration is done via the same custom protocol used to send and receive commands.