Na nossa análise anterior das campanhas maliciosas do RenPy, identificámos um carregador de múltiplas etapas implantado como parte da cadeia de infeção.
Investigações adicionais sobre ameaças mostraram que o mesmo carregador, que rastreamos como PavinLoader , está a ser utilizado em diversas campanhas diferentes, incluindo ataques ClickFix e downloads de software falsos.
Apesar das diferenças na forma como estas campanhas chegam às vítimas, encontramos vários elementos em comum. Estes incluem cadeias de infeção em múltiplos estágios envolvendo DLLs .NET fortemente ofuscadas e trojanizadas; abuso do MSBuild, .csproj, e .bat ficheiros para os executar; e EtherHiding para recuperar o domínio de comando e controlo (C2).
Como é um ataque?
As campanhas não começam todas da mesma forma. Uma vítima pode deparar-se com um CAPTCHA falso que a instrui a executar um comando, descarregar o que parece ser software legítimo ou instalar um jogo malicioso.
O que acontece a seguir é muito mais consistente. O PavinLoader utiliza métodos legítimos. Windows Utiliza ferramentas juntamente com ficheiros .NET maliciosos para executar vários estágios de malware. Também utiliza o EtherHiding, uma técnica que utiliza uma blockchain para ocultar informações sobre a sua infraestrutura, de forma a encontrar o servidor a partir do qual deve obter malware adicional.
Na campanha RenPy que analisámos, este processo acabou por conduzir ao Amatera Stealer , um malware concebido para roubar informação de um computador infetado. Também observámos infeções por PavinLoader a distribuir malware adicional.
O PavinLoader aparece em diversas campanhas.
Identificámos o PavinLoader em diversos grupos de campanhas:
- Campanhas maliciosas do RenPy, conforme analisado no nosso post anterior no blog.
- Diversas campanhas da ClickFix, incluindo atividades recentes dos operadores abordados na nossa análise anterior.
- Campanhas fraudulentas de software que utilizavam o Dropbox para descarregar o PavinLoader.
A utilização do carregador em diversas campanhas levanta a possibilidade de o PavinLoader ser oferecido como um Carregador como Serviço (Loader-as-a-Service).
Encontrámos também diversos artefactos que corroboram esta possibilidade, embora não sejam suficientes para a confirmar. Um artefacto específico no VirusTotal é partilhado por mais de 200 ficheiros associados ao PavinLoader, sugerindo que possa ser um artefacto de compilação do processo de construção.
Também encontrámos um script PowerShell carregado no VirusTotal contendo comentários como: EDIT HERE e REPLACE with a real direct link to your .batO ficheiro BAT associado contém a string Automated builder helper.
No entanto, não encontramos nenhum painel de controlo ou canais de venda que confirmem que o PavinLoader está a ser oferecido comercialmente.


Embora o PavinLoader tenha mudado ao longo do tempo, as campanhas que analisámos partilham diversas características:
- Instaladores Inno Setup ou MSI gerados com diferentes compiladores que executam o
.bate/ou.csprojarquivos - DLLs .NET infetadas por Trojans, incluindo DotNetZip, Nancy, Renci.SshNet e OpenXML. Na maioria dos casos analisados, os métodos maliciosos inseridos seguem um padrão.
TwoWordsouTwoWordsNumberpadrão de nomenclatura, comoDefaultEvaluator5, eFallbackFactory5 - Uma técnica comum de ofuscação utilizada nas DLLs do .NET.
- Uma convenção de nomenclatura baseada em duas palavras aleatórias, como por exemplo
GollopDevest,UnbrandRunover, ePavinWide, para nomes de DLLs, funções, strings, caminhos C2 e outros artefactos - EtherHiding para obter o domínio C2, seguido de pedidos HTTP utilizando caminhos como
assets/{two random words}.jsonpara recuperar fases subsequentes. Os domínios C2 utilizam geralmente o.lat,.icu,.shop, e.cfddomínios de nível superior - Mecanismos do MSBuild para carregar e executar código de DLLs, incluindo funções de propriedade como
[System.Reflection.Assembly]::Load(...)eUsingTask - Padrões recorrentes em nomes de ficheiros, como
name_4characters.cmd/bat/msi/exe-Por exemplo,prefetch_9a59.cmd,telemetry_55db.cmd, ebootstrap_64be.cmd—ou nomes aleatórios de nove caracteres, comoaegZpQ4C7.batTambém observámos nomes abreviados, incluindoSmall.msi,small.bat, esmall.cmd
O PavinLoader é constituído por várias DLLs .NET e, nos casos analisados, identificámos os seguintes estágios:
- DLL de carregamento : Uma DLL trojanizada — como a Nancy analisada no nosso artigo anterior sobre RenPy — ou uma DLL personalizada. Realiza operações antiforense e antianálise, altera as definições de rede necessárias para as próximas operações e carrega o carregador EtherHiding.
- DLL do carregador EtherHiding : Obtém o C2 através do EtherHiding e descarrega os estágios seguintes a partir do mesmo.
- DLL Anti-Análise : Realiza verificações anti-análise abrangentes para detetar ambientes virtualizados.
- DLL do carregador PE : Carrega a carga útil PE final.
As cargas intermédias podem variar consoante a configuração da campanha. Primeiro, vamos analisar alguns dos métodos utilizados para distribuir os estágios iniciais do PavinLoader. Em seguida, voltaremos à campanha do carregador RenPy que analisámos no nosso artigo anterior para examinar as fases posteriores do carregador.
Análise técnica
O resto deste artigo analisa mais detalhadamente como o PavinLoader é distribuído e como funciona cada passo do carregador.
Como o PavinLoader é entregue
Observamos que o PavinLoader está a ser distribuído através de diversas campanhas ClickFix.
Em particular, detetámos que o cluster ClickFix analisado num estudo anterior artigo começou recentemente a utilizar o PavinLoader. Abuso do MSBuild e o uso de .csproj e .bat Os ficheiros continuam a ser comuns em todas as cadeias de infeção que observamos.
Já abordámos um exemplo na nossa análise anterior do RenPy. Aqui, vamos examinar vários outros métodos de distribuição.

Como vimos na nossa análise anterior destas campanhas ClickFix, os scripts PowerShell associados mudam frequentemente. Encontrámos diversas versões nesta atividade, incluindo scripts ofuscados e não ofuscados.

Neste exemplo, o MSI descarregado do bucket do Cloudflare é chamado Installer_57be78.msi.

O pacote contém:
prefetch_2f76.exeO executável MSBuild legítimoprefetch_2f76.csprojUtilizado para executar a DLL do carregador através deUsingTaskDotNetZip.dll: A DLL do carregador
O .csproj O ficheiro é executado com:
"C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.exe" /nologo "C:\Users\{USER}\AppData\Local\Logitech\Device Configuration Helper\prefetch_2f76.csproj" /nr:false
A DLL Loader é uma versão trojanizada do DotNetZip e é executada utilizando o UsingTask elemento.


Ao contrário do exemplo do RenPy discutido no nosso artigo anterior, o carregador EtherHiding é extraído da própria DLL. Um recurso incorporado é utilizado como índice para extrair bytes diretamente da DLL, em vez de obter esses índices do próprio ficheiro. .csproj ficheiro.
Detetámos outra campanha que utiliza ficheiros BAT contendo informações falsas. BUILD VERIFICATION REPORT comentários, aparentemente com o intuito de dificultar a análise e a deteção.
Neste caso, o MSI CustomAction Executa o script BAT com:
cmd.exe /c C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd /launched

updater_8219.cmd. Clique para ampliarO código ofuscado aparece por baixo dos comentários falsos. Concatena várias strings e utiliza índices gerados através de operações matemáticas simples para as reconstruir. Encontrámos este tipo de ofuscação na maioria dos ficheiros BAT que analisámos.

.cmd ficheiro. Clique para ampliarO ficheiro BAT localiza conhost.exe e relança-se com:
"C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd" /launched
Em seguida, define o MSBUILDENABLEALLPROPERTYFUNCTIONS=1 variável de ambiente, localiza MSBuild.exee executa-o usando o mesmo ficheiro como entrada:
"C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd"
Neste caso, a DLL do carregador é reconstruída concatenando e descodificando quatro variáveis codificadas em Base64.

A DLL do carregador tem um nome aleatório e parece ser uma versão mais antiga, uma vez que não contém o bytecode personalizado e as strings encriptadas nos seus recursos.
Tal como na campanha RenPy analisada anteriormente, esta etapa recupera o carregador EtherHiding armazenado entre um Build-... marcador no ficheiro CMD através do _vezr variável de ambiente e depois descodifica-a usando XOR com uma chave de 32 bytes.

Depois de termos analisado vários métodos utilizados para distribuir os dois primeiros estágios do PavinLoader, iremos agora regressar à cadeia de infecção do RenPy, analisada anteriormente, e examinar o próprio carregador com mais detalhe.
Analisando o PavinLoader
As DLLs . NET associadas ao PavinLoader são fortemente ofuscadas utilizando o achatamento do fluxo de controlo, bytecode personalizado e chamadas indiretas através de calli/ldftnEncriptação de strings com diferentes algoritmos, hashing de API e delegates, métodos redundantes e código e strings inúteis.
Não identificámos nenhum ofuscador conhecido associado às amostras, pelo que, tanto quanto sabemos, o PavinLoader utiliza um ofuscador personalizado.
Uma vez que a desofuscação completa das amostras seria complexa, utilizámos uma abordagem híbrida que combina a análise dinâmica com a invocação de métodos através da reflexão. Identificamos os métodos importantes com base nas suas importações e parâmetros, invocamo-los e analisamos a saída resultante.
Esta abordagem não oferece uma cobertura completa do fluxo de execução, mas permitiu-nos identificar a funcionalidade principal do carregador e extrair os seus estágios intermédios. Como diferentes funções partilham frequentemente os mesmos nomes, utilizamos tokens de metadados para identificar os métodos ao longo da análise.
Nancy trojanizou a DLL: DLL do carregador
Já abordámos esta etapa detalhadamente na nossa publicação anterior no blog, pelo que aqui forneceremos apenas uma visão geral.
Na maioria dos casos analisados, a DLL Loader é uma DLL legítima infetada por um trojan. O método malicioso utiliza normalmente um {RandomWord} ou {RandomWord_Number} convenção de nomenclatura.
A DLL contém um recurso associado ao bytecode personalizado interpretado pelo método principal, dois recursos contendo strings encriptadas e, em alguns casos, recursos adicionais utilizados como índice para extrair o próximo estágio. Outros recursos parecem ser iscos concebidos para dificultar a análise. Nas amostras que analisámos, esta DLL tipicamente:
- Descripta strings de recursos utilizando XOR com múltiplas chaves.
- Resolve APIs utilizando o hash de API e
GetDelegateForFunctionPointer() - Altera as definições de rede, incluindo a desativação da validação do certificado TLS e a definição do proxy predefinido do sistema.
- Executa uma verificação de temporização anti-análise utilizando
CreateEventW(),GetTickCount(), eWaitForSingleObject() - Executa operações antiforenses
- Carrega o carregador EtherHiding extraindo-o de um marcador dentro do jogo.
.csprojou ficheiros BAT, ou utilizando um recurso como índice para recuperar bytes diretamente da DLL.
GollopDevest: Carregador de Ocultação Éter
O carregador EtherHiding tem duas funções principais: obter o domínio C2 através do EtherHiding e descarregar e carregar os estágios subsequentes a partir desse C2.
Classe 0x02000762 É responsável por decifrar as sequências de caracteres associadas à blockchain e à comunicação em rede.
As strings são desencriptadas por 0x060027BD do seguinte modo:
- Função
0x060027BBInicializa a S-box utilizando o XOR da chave mestra.activeValuese o descodificado em Base64optionsCollectionfio - Função
0x060027BElevachildSyncObjectcomo entrada e devolve bytes de índice utilizando XOR e permutações baseadas em valores de cabeçalho codificados nos dois primeiros caracteres da string. - Função
0x060027B9Retorna a string desencriptada utilizando os índices e a S-box gerada anteriormente.
Esta foi a única classe que encontrámos com parâmetros de encriptação codificados neste formato.
Para as restantes strings, identificámos funções que retornavam dados desencriptados com base nas suas assinaturas de parâmetros — por exemplo, métodos que retornavam strings ou bytes — e invocámo-las através de reflexão. Isto permitiu-nos recuperar mais de 1.300 strings.

Entre elas, encontravam-se sequências associadas a patches AMSI e ETW:
AmsiScanStringSystem.Management.Automation.AmsiUtils
System.Management.Automation.AmsiUtils+AmsiNativeMethods
ntdll
EtwEventWriteNtQueryInformationProcess
NtSetInformationThread
VirtualProtect
Mais de 100 URLs pertencentes a serviços legítimos são também desencriptados e utilizados para gerar pedidos HTTP e ruído de rede. Não observámos este comportamento em todas as amostras, o que sugere que pode ser específico da versão do sistema.
A classe Server (0x02000052) gera o X-Timestamp, X-Nonce, e X-Signature Os cabeçalhos HTTP e os pedidos são utilizados para recuperar as etapas subsequentes.
São feitos dois pedidos HTTP para sincronizar os parâmetros e obter o payload, sendo o HMAC utilizado para validar os pedidos. Usando a reflexão, executamos o método. 0x06000A77 para obter os valores de cabeçalho necessários para recuperar as fases subsequentes.
O domínio C2 é obtido através de uma chamada de procedimento remoto (RPC) ETH para bsc-dataseed.binance.org com o seguinte corpo JSON-RPC:
{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x328a1fadff154290f0ce1389a4e633698cdfdaa7","data":"0x06fdde03"},"latest"],"id":1783436775}
As etapas seguintes são descarregadas do domínio C2 resultante. A carga útil codificada em XOR é guardada na resposta JSON em cache.content:
{"type":"cache-binary","meta":{"version":"2.3.1","timestamp":"…","platform":"win32-x64"},"cache":{"id":"e2b69…","content":"1c.."}}
Neste caso, os caminhos C2 e as chaves XOR desencriptadas nesta etapa e na DLL anti-análise são:
| Percurso | chave XOR | Tipo/Função |
/assets/ExponeAboard.json | QBBBfWow4lb | PavinWride .NET DLL, Anti-análise |
/assets/MailersKogasin.json | WjcsVTKmuoBRqe | GollopDevest .NET DLL, PE Loader |
/assets/LanoseThrip.json | WwUX66Br | Executável WPA.exe PE, Amatera Stealer |
A próxima etapa executada é a DLL anti-análise.
PavinWride: DLL anti-análise
Esta DLL é responsável por executar diversas verificações anti-análise.
A DLL anti-análise executa as chamadas de sistema de diferentes formas:
- Standard Chamadas da Biblioteca de Classes Base (BCL) do .NET, incluindo operações de registo e de rede.
- Chamadas Win32 P/Invoke, incluindo
GetCurrentThread,NtQueryInformationThread,NtQueryInformationProcess, eNtCurrentTeb - APIs Win32 resolvidas através de hash de API e uma análise da tabela de exportação do Bloco de Ambiente de Processo (PEB).
A função MenuItemService.ProcessDirectory (0x06000151) é o principal método responsável pela cache de delegados e pela resolução da API Win32:
- Verifica se o delegado já foi resolvido usando
managerMap.TryGetValue() - Caso contrário, liga.
ProcessDirectory (0x06000150)para obter o identificador HMODULE - Chama
ProcessDirectory (0x0600003A)que realiza a pesquisa na tabela de exportação PE e compara o hash. Detetámos que a mesma saída de hash é obtida em vários outros métodos (por ex.0x06000039,0x0600003B,0x0600004E) - Obtém o delegado com
GetDelegateForFunctionPointer()e guarda-o no dicionário.

Utilizámos a mesma abordagem de reflexão para obter as strings. Muitas strings estão encriptadas com a chave XOR. 4B729A1F5CE387D6.

O carregador obtém o LCID do sistema utilizando GetKeyboardLayoutList() e compara-o com mais de 17 línguas, incluindo o russo, o ucraniano, o bielorrusso e o arménio.
Também realiza um extenso reconhecimento do sistema, incluindo a enumeração de chaves de registo e a chamada de APIs Win32, como GetSystemFirmwareTable() e EnumSystemFirmwareTables() Identificar ambientes virtualizados.
| Categoria | Valor |
| IDs de fornecedor/dispositivo PCI | VEN_80EE, VEN_15AD, VEN_1AB8, VEN_5853, VEN_1AF4, VEN_1234&DEV_111, … |
| IDs OEM SMBIOS/ACPI | VMWARE, VBOX, BOCHS, VRTUAL, MSFTVM, MSHYPR, Xen, Parall, BHYVE, AMAZON, Google |
| assinaturas de tabelas ACPI | VBOX, BXPC, VMW, Xen, PRLS, AMZN, MICR |
| Cadeias de caracteres BIOS/fabricante/produto | vmware, vmw, innotek, virtualbox, vbox, qemu, seabios, bochs, standard pc, kvm virtual machine, xen, hvm domu, parallels |

Também observámos referências desencriptadas a APIs, incluindo GetCurrentProcess(), CreateToolhelp32Snapshot(), Process32First(), Process32Next(), e OpenMutex(), embora não tenhamos observado estas funções a serem chamadas durante o nosso fluxo de execução.
É também feita uma requisição HTTP para um destes serviços:
https://ipv4[.]ipleak[.]net/json/https://get[.]geojs[.]io/v1/ip/geo[.]jsonhttps://ipapi[.]co/json/https://api[.]ipapi[.]is/https://ipinfo[.]io/json
Verifica também os dados devolvidos em 96 fornecedores de alojamento ou infraestrutura e testa se o código da região é um dos seguintes: RU, UA, BY, AM, KZ, KG, TJ, UZ, GE, AZ, ou MD.

Se as verificações anti-análise forem aprovadas, os dois estágios seguintes são descarregados e desencriptados utilizando chaves XOR.
Remendamos SelectionScope.ProcessDirectory (0x06000014) para recuperar os caminhos C2 e as chaves XOR para estes estágios:
/assets/MailersKogasin.json|WjcsVTKmuoBRqe|/assets/LanoseThrip.json|WwUX66Br
GollopDevest: PE Loader DLL e Amatera Stealer
A terceira DLL tem o mesmo nome que a segunda. GollopDevest, mas realiza carregamento PE.
Entre as sequências decifradas estão:
'GollopMailers LDR DllBase VeneryCondole EdiyaFoully=0x{0:X} EdiyaStelae=0x{1:X}'
'GollopMailers LDR Flags missing IMAGE_DLL 0x{0:X8}'
'GollopMailers LDR SaranPisco invalid 0x{0:X}'
'GollopMailers LDR TlsIndex invalid {0}'
'GollopMailers LDR sanity exception: '
'HIGHLOW relocation'
'Import DLL name'
'Import FunctusAurata'
'Import INT'
'Import descriptor'
'Import hint/name'
'Import thunk'
'LdrpHandleTlsData outside ntdll .text'
'LdrpReleaseTlsEntry outside ntdll .text'
'LoadConfig32'
'OK'
'PE headers'
'Required API resolve failed: type={0}, FreshBubals={1}, module=0x{2:X}'
'TLS32'
'TLS64'
'x86 disabled until ABI proof'
ntdll.dll
kernel32.dll
LdrpInitializeTls
"STATUS_SUCCESS"
UNKNOWN(0x00000001)
UNKNOWN(0x00000002)
UNKNOWN(0x00000003)
O ServerEditor.SortMemory método (0x06000014) verifica a estrutura PE e os sinalizadores antes de carregar a carga útil.
Para confirmar este comportamento, invocamos o método através de reflexão usando o ficheiro descarregado. WPA.exe ficheiro como entrada. O PE foi carregado com sucesso.
O PE compilado em C++ disfarça-se de WPA.exe ( Windows Analisador de desempenho). Identificámos a carga útil como uma versão ofuscada de Amatera Stealer 4.2.3-alpha1.
Utiliza técnicas como o achatamento do fluxo de controlo, hashing de API, verificações anti-depuração e predicados opacos para complicar a análise. Detetámos também a utilização da técnica Heaven’s Gate, resolução de DNS sobre HTTPS (DoH) através do DNS da Google e sockets em bruto. \Device\Afd\Endpoint para comunicação em rede.

Após a execução deste passo, observámos também o download e a execução de payloads adicionais a partir de endereços IP do C2.
Em alguns casos, os pacotes WiX Burn descarregaram outro payload associado ao PavinLoader. Noutros, detectamos o HijackLoader. Isto permite que os operadores da campanha implementem vários payloads numa máquina comprometida.
COIs
hashes SHA-256
bdf313a019e025ebf58ccef4619444ee70e661bd444e0644ebeabd8f5caad14c
e3830f5747e3f46537d217124d80c9f3bb4d89f8d4f5138dce69ee54ea4fb6b9
a4f03272cf96732dc9f58bb466d16f358e7f50d46dba30526a9fbebfec11717b
bf04160dd1ce3571e0eb6d6dda1713c788797b5599399d4a93665a757eec376e
54fa8083c05334aa360256fbbb0ca901ce7e244a0359dd664cae78977371ec91
c1ea6d169565c70ac5d812e73483814929e9b3548ead6633595937e71a334adb
001337488c32d8610c2aef6f9330acca825f0afacd071bf6ebfc06b5a1a69f09
2837099af431e9afee76ce5e6ab5cb86bedce06e31c22be46250cb453cfdb978
252c5a3d150275013f52b4820097d7163ced4aa2f1be0fca032f8a5017673816
0c9c64b7383ec249bcf6271a4b73206d94de130ca401d16ab77fe01e5193a312
6700f62e1a3b33340cd678c388ecc8bac2e5943c0627df5d1b99b879c3ca42c9
endereços IP
93.152.224[.]75: downloads PavinLoader
65.21.80[.]170: downloads PavinLoader
195.63.142[.]49: downloads PavinLoader
Domínios
perfectverified[.]com: ClickFix
PavinLoader C2
catalyst-pro[.]lat
twigoamwu[.]cfd
trusaifi[.]cfd
stellar-minds[.]cfd
pinnacle-labs[.]lat
nexahub[.]lat
fimwoglea[.]shop
velodium[.]lat
rpcsecnoweb[.]pro
more-arpc[.]icu
echo-systems[.]cfd
kelemet[.]shop
zarwieciv[.]cfd
URLs
telegra[.]ph/Project-PySynth-06-28: Entrega morta de Amatera
Agradecimentos
- Análise anterior do carregador: https://www.derp.ca/research/hellsuchecker-clickfix-etherhiding/#26-anti-sandbox-checks-and-a-nintendo-bypass (possivelmente conteúdo gerado por IA)
- Possível atividade relacionada: https://cyberowi.pl/lumma-stealer-renpy-fitgirl-osmiowarstwowy-loader/
- Possível atividade relacionada: https://medium.com/@djordje.brankovic/from-fake-captcha-to-in-memory-execution-unraveling-a-multi-stage-malware-chain-part-1-496c603f3641
- Análise de um utilizador do fórum malwarebytes malwarebytes
Desde a denúncia de ameaças até à sua remoção.
Os riscos de cibersegurança nunca se devem propagar para além de uma manchete. Mantenha as ameaças longe dos seus dispositivos descarregando Malwarebytes hoje mesmo.




