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.
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.
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.
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.
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.
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.
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 |
|
0x3001 | ListDirectory | List the contents of the specified directory. The client sends one response message per entry. | Directory path |
|
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. |
|
|
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. |
|
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. |
|
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. |
|
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. |