Tracciamento di PavinLoader su ClickFix e falsi download campagne

| 24 agosto 2026
Tracciamento di PavinLoader su ClickFix e falsi download campagne

Nella nostra precedente analisi delle campagne dannose basate su RenPy, abbiamo identificato un loader a più fasi distribuito come parte della catena di infezione.

Ulteriori indagini sulle minacce hanno successivamente dimostrato che lo stesso loader, che monitoriamo con il nome di PavinLoader , viene utilizzato in diverse campagne, tra cui attacchi ClickFix e download di software fasulli. 

Nonostante le differenze nel modo in cui queste campagne raggiungono le vittime, abbiamo trovato diversi elementi comuni. Questi includono catene di infezione a più fasi che coinvolgono DLL .NET fortemente offuscate e infettate da trojan; abuso di MSBuild, .csproj, e .bat file per eseguirli; e EtherHiding per recuperare il dominio di comando e controllo (C2). 

Come si presenta un attacco

Le campagne non iniziano tutte allo stesso modo. Una vittima potrebbe imbattersi in un CAPTCHA falso che le dice di eseguire un comando, download quello che sembra essere un software legittimo, oppure installare un gioco dannoso.

Ciò che accade dopo è molto più coerente. PavinLoader utilizza legittimo Windows Utilizza strumenti insieme a file .NET dannosi per eseguire diverse fasi del malware. Inoltre, si avvale di EtherHiding, una tecnica che utilizza una blockchain per nascondere informazioni sulla propria infrastruttura, al fine di individuare il server da cui scaricare ulteriore malware.

Nella campagna RenPy che abbiamo analizzato, tale processo ha portato in definitiva ad Amatera Stealer , un malware progettato per rubare informazioni da un computer infetto. Abbiamo anche osservato che le infezioni da PavinLoader diffondevano ulteriore malware.

PavinLoader compare in diverse campagne

Abbiamo identificato PavinLoader in diversi gruppi di campagne: 

  • Campagne RenPy dannose, come analizzato nel nostro precedente post del blog
  • Diverse campagne ClickFix, comprese le attività recenti dell'operatore/degli operatori trattati nella nostra precedente analisi
  • False campagne software che utilizzavano Dropbox per download PavinLoader. 

L'utilizzo del loader in diverse campagne fa pensare che PavinLoader venga offerto come Loader-as-a-Service.

Abbiamo inoltre trovato diversi artefatti che supportano questa possibilità, sebbene non siano sufficienti a confermarla. Un artefatto specifico su VirusTotal è condiviso da più di 200 file associati a PavinLoader, il che suggerisce che potrebbe trattarsi di un artefatto di compilazione del processo di build.

Abbiamo anche trovato uno script PowerShell caricato su VirusTotal contenente commenti come EDIT HERE e REPLACE with a real direct link to your .bat. Il file BAT associato contiene la stringa Automated builder helper.

Tuttavia, non abbiamo trovato alcun pannello di sviluppo o canale di vendita che confermi che PavinLoader sia offerto commercialmente.

Sebbene PavinLoader si sia evoluto nel tempo, le campagne che abbiamo analizzato condividono diverse caratteristiche:

  • I programmi di installazione Inno Setup o MSI generati con diversi costruttori che eseguono il .bat e/o .csproj file
  • DLL .NET infettate da trojan, tra cui DotNetZip, Nancy, Renci.SshNet e OpenXML. Nella maggior parte dei casi analizzati, i metodi dannosi inseriti seguono un TwoWords o TwoWordsNumber schema di denominazione, come ad esempio DefaultEvaluator5, E FallbackFactory5
  • Una tecnica di offuscamento comune utilizzata nelle DLL .NET
  • Una convenzione di denominazione basata su due parole casuali, come ad esempio GollopDevest, UnbrandRunover, e PavinWideper nomi di DLL, funzioni, stringhe, percorsi C2 e altri artefatti
  • EtherHiding per ottenere il dominio C2, seguito da richieste HTTP utilizzando percorsi come assets/{two random words}.json per recuperare le fasi successive. I domini C2 utilizzano comunemente il .lat, .icu, .shop, e .cfd domini di primo livello
  • Meccanismi MSBuild per il caricamento e l'esecuzione di codice da DLL, comprese funzioni di proprietà come [System.Reflection.Assembly]::Load(...) e UsingTask
  • Modelli di nomi di file ricorrenti come name_4characters.cmd/bat/msi/exe-Per esempio, prefetch_9a59.cmd, telemetry_55db.cmd, e bootstrap_64be.cmd—oppure nomi casuali di nove caratteri come aegZpQ4C7.batAbbiamo anche osservato nomi brevi tra cui Small.msi, small.bat, e small.cmd

PavinLoader è costituito da diverse DLL .NET e, nei casi analizzati, abbiamo identificato le seguenti fasi: 

  • DLL di caricamento : una DLL infettata da trojan, come quella Nancy analizzata nel nostro precedente articolo su RenPy, oppure una DLL personalizzata. Esegue operazioni anti-forensi e anti-analisi, modifica le impostazioni di rete necessarie per le operazioni successive e carica l'EtherHiding Loader.
  • DLL di caricamento di EtherHiding : ottiene il C2 tramite EtherHiding e scarica le fasi successive da esso 
  • DLL anti-analisi : esegue controlli anti-analisi approfonditi per rilevare ambienti virtualizzati. 
  • DLL PE Loader : carica il payload PE finale.

I payload intermedi possono variare a seconda della configurazione della campagna. Innanzitutto, esamineremo alcuni dei metodi utilizzati per distribuire le fasi iniziali di PavinLoader. Successivamente, torneremo alla campagna del loader RenPy che abbiamo analizzato nel nostro articolo precedente per esaminare le fasi successive del loader. 

Analisi tecnica

Il resto di questo articolo esamina più nel dettaglio le modalità di distribuzione di PavinLoader e il funzionamento di ciascuna fase del caricatore.

Come viene distribuito PavinLoader

Abbiamo osservato che PavinLoader viene distribuito tramite diverse campagne ClickFix.

In particolare, abbiamo rilevato che il cluster ClickFix analizzato in un precedente articolo ha recentemente iniziato a utilizzare PavinLoader. Abuso di MSBuild e utilizzo di .csproj e .bat I file rimangono comuni in tutte le catene di infezione che abbiamo osservato.

Nella nostra precedente analisi di RenPy abbiamo trattato un esempio. Qui esamineremo diversi altri metodi di distribuzione. 

Come abbiamo visto nella nostra precedente analisi di queste campagne ClickFix, gli script PowerShell associati cambiano frequentemente. Abbiamo trovato diverse versioni in questa attività, inclusi script sia offuscati che non offuscati.

In questo esempio, il file MSI scaricato dal bucket Cloudflare viene chiamato Installer_57be78.msi. 

La confezione contiene:

  • prefetch_2f76.exe: L'eseguibile legittimo di MSBuild
  • prefetch_2f76.csproj: Utilizzato per eseguire la DLL del caricatore tramite UsingTask
  • DotNetZip.dll: La DLL del caricatore

Il .csproj Il file viene eseguito con:

"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

La DLL Loader è una versione trojanizzata di DotNetZip e viene eseguita utilizzando il UsingTask elemento.

A differenza dell'esempio RenPy discusso nel nostro precedente articolo, l'EtherHiding Loader viene estratto dalla DLL stessa. Una risorsa incorporata viene utilizzata come indice per estrarre i byte direttamente dalla DLL, anziché ottenere tali indici da .csproj file.

Abbiamo rilevato un'altra campagna che utilizza file BAT contenenti falsi BUILD VERIFICATION REPORT commenti, apparentemente intesi a rendere più difficile l'analisi e l'individuazione.

In questo caso, l'MSI CustomAction esegue lo script BAT con:

cmd.exe /c C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd /launched

Il codice offuscato appare sotto i commenti falsi. Concatena più stringhe e utilizza indici generati tramite semplici operazioni matematiche per ricostruirle. Abbiamo riscontrato questo tipo di offuscamento nella maggior parte dei file BAT che abbiamo analizzato.

Il file BAT individua conhost.exe e si rilancia con:

"C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd" /launched

Imposta quindi il MSBUILDENABLEALLPROPERTYFUNCTIONS=1 variabile d'ambiente, individua MSBuild.exee lo esegue utilizzando lo stesso file come input:

"C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd"

In questo caso, la DLL del caricatore viene ricostruita concatenando e decodificando quattro variabili codificate in Base64.

La DLL del caricatore ha un nome casuale e sembra essere una versione precedente perché non contiene il bytecode personalizzato e le stringhe crittografate nelle sue risorse.

Come nella campagna RenPy analizzata in precedenza, questa fase recupera l'EtherHiding Loader memorizzato tra un Build-... marcatore nel file CMD attraverso il _vezr variabile d'ambiente, quindi la decodifica utilizzando XOR con una chiave a 32 byte.

Dopo aver esaminato diversi metodi utilizzati per distribuire le prime due fasi di PavinLoader, torneremo ora alla catena di infezione di RenPy analizzata in precedenza ed esamineremo il loader stesso più nel dettaglio.

Analisi di PavinLoader

Le DLL .NET associate a PavinLoader sono fortemente offuscate utilizzando l'appiattimento del flusso di controllo, bytecode personalizzato, chiamate indirette tramite calli/ldftn, crittografia di stringhe con diversi algoritmi, hashing API e delegati, metodi ridondanti e codice e stringhe spazzatura.

Non abbiamo identificato alcun sistema di offuscamento noto associato ai campioni, quindi, per quanto ne sappiamo, PavinLoader utilizza un sistema di offuscamento personalizzato.

Poiché la completa decodifica dei campioni sarebbe complessa, abbiamo utilizzato un approccio ibrido che combina l'analisi dinamica con l'invocazione di metodi tramite riflessione. Abbiamo identificato i metodi importanti in base alle loro importazioni e ai loro parametri, li abbiamo invocati e abbiamo analizzato l'output risultante.

Questo approccio non fornisce una copertura completa del flusso di esecuzione, ma ci ha permesso di identificare la funzionalità principale del caricatore ed estrarne le fasi intermedie. Poiché diverse funzioni spesso condividono gli stessi nomi, utilizziamo token di metadati per identificare i metodi durante l'analisi.

Nancy ha trojanizzato la DLL: Loader DLL 

Abbiamo trattato questa fase in dettaglio nel nostro precedente articolo del blog, quindi qui forniremo solo una panoramica.

Nella maggior parte dei casi analizzati, la DLL Loader è una DLL legittima infettata da trojan. Il metodo dannoso in genere utilizza un {RandomWord} o {RandomWord_Number} convenzione di denominazione.

La DLL contiene una risorsa associata al bytecode personalizzato interpretato dal metodo main, due risorse contenenti stringhe crittografate e, in alcuni casi, risorse aggiuntive utilizzate come indice per estrarre la fase successiva. Altre risorse sembrano essere dei depistaggi progettati per rallentare l'analisi. Nei campioni che abbiamo analizzato, questa DLL in genere:

  • Decifra le stringhe dalle risorse utilizzando l'operazione XOR a chiavi multiple.
  • Risolve le API utilizzando l'hashing delle API e GetDelegateForFunctionPointer()
  • Modifica le impostazioni di rete, inclusa la disabilitazione della convalida del certificato TLS e l'impostazione del proxy di sistema predefinito.
  • Esegue un controllo temporale anti-analisi utilizzando CreateEventW(), GetTickCount(), e WaitForSingleObject()
  • Esegue operazioni antiforensi
  • Carica l'EtherHiding Loader estraendolo da un marcatore all'interno .csproj o file BAT, oppure utilizzando una risorsa come indice per recuperare i byte direttamente dalla DLL

GollopDevest: caricatore EtherHiding 

L'EtherHiding Loader ha due funzioni principali: ottenere il dominio C2 tramite EtherHiding e scaricare e caricare le fasi successive da tale dominio C2.

Classe 0x02000762 è responsabile della decrittazione delle stringhe associate alla blockchain e alla comunicazione di rete.

Le stringhe vengono decifrate da 0x060027BD come segue: 

  • Funzione 0x060027BB Inizializza la S-box utilizzando l'operazione XOR della chiave master. activeValues e decodificato in Base64 optionsCollection corda
  • Funzione 0x060027BE ordini childSyncObject come input e restituisce byte indice utilizzando XOR e permutazioni basate sui valori dell'intestazione codificati nei primi due caratteri della stringa
  • Funzione 0x060027B9 restituisce la stringa decrittografata utilizzando gli indici e la S-box generata in precedenza

Questa è stata l'unica classe che abbiamo trovato con parametri di crittografia codificati in questo formato.

Per le stringhe rimanenti, abbiamo identificato le funzioni che restituivano dati decrittografati in base alle firme dei loro parametri, ad esempio metodi che restituivano stringhe o byte, e le abbiamo invocate tramite reflection. Questo ci ha permesso di recuperare più di 1.300 stringhe.

Tra queste figuravano stringhe associate alle patch AMSI ed ETW:

AmsiScanString
System.Management.Automation.AmsiUtils
System.Management.Automation.AmsiUtils+AmsiNativeMethods
ntdll
EtwEventWrite

NtQueryInformationProcess
NtSetInformationThread
VirtualProtect

Oltre 100 URL appartenenti a servizi legittimi vengono decrittografati e utilizzati per generare richieste HTTP e rumore di rete. Non abbiamo osservato questo comportamento in tutti i campioni, il che suggerisce che potrebbe essere specifico di una determinata build.

La classe Server (0x02000052) genera il X-Timestamp, X-Nonce, e X-Signature Intestazioni HTTP ed effettua richieste utilizzate per recuperare le fasi successive.

Vengono effettuate due richieste HTTP per sincronizzare i parametri e ottenere il payload, con HMAC utilizzato per convalidare le richieste. Utilizzando la riflessione, abbiamo eseguito il metodo 0x06000A77 per ottenere i valori di intestazione necessari per recuperare le fasi successive.

Il dominio C2 si ottiene effettuando una chiamata di procedura remota (RPC) ETH a bsc-dataseed.binance.org con il seguente corpo JSON-RPC:

{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x328a1fadff154290f0ce1389a4e633698cdfdaa7","data":"0x06fdde03"},"latest"],"id":1783436775} 

Le fasi successive vengono scaricate dal dominio C2 risultante. Il payload codificato XOR viene memorizzato nella risposta JSON sotto cache.content:

{"type":"cache-binary","meta":{"version":"2.3.1","timestamp":"…","platform":"win32-x64"},"cache":{"id":"e2b69…","content":"1c.."}} 

In questo caso, i percorsi C2 e le chiavi XOR decrittografate da questa fase e la DLL anti-analisi sono:

Sentiero Chiave XOR Tipo/Funzione 
/assets/ExponeAboard.json QBBBfWow4lb PavinWride .NET DLL, Anti-analisi  
/assets/MailersKogasin.json WjcsVTKmuoBRqe GollopDevest .NET DLL, PE Loader 
/assets/LanoseThrip.json WwUX66Br Eseguibile WPA.exe PE, Amatera Stealer 

La fase successiva eseguita è la DLL anti-analisi. 

PavinWride: DLL anti-analisi 

Questa DLL è responsabile dell'esecuzione di diversi controlli anti-analisi. 

La DLL anti-analisi esegue le chiamate di sistema in modi diversi: 

  • Standard Chiamate alla libreria di classi base (BCL) di .NET, incluse quelle per le operazioni di registro e di rete.
  • Chiamate Win32 P/Invoke, incluse GetCurrentThread, NtQueryInformationThread, NtQueryInformationProcess, e NtCurrentTeb
  • Le API Win32 vengono risolte tramite hashing API e una scansione della tabella di esportazione del Process Environment Block (PEB).

La funzione MenuItemService.ProcessDirectory (0x06000151) è il metodo principale responsabile della memorizzazione nella cache dei delegati e della risoluzione delle API Win32:  

  • Controlla se il delegato è già stato risolto utilizzando managerMap.TryGetValue() 
  • Altrimenti chiama ProcessDirectory (0x06000150) per ottenere l'handle HMODULE
  • Chiama ProcessDirectory (0x0600003A) che esegue la scansione della tabella di esportazione PE e corrisponde all'hash. Abbiamo rilevato che lo stesso output di hashing viene ottenuto in diversi altri metodi (ad esempio, 0x06000039, 0x0600003B, 0x0600004E)
  • Ottiene il delegato con GetDelegateForFunctionPointer() e lo salva nel dizionario

Abbiamo utilizzato lo stesso approccio di riflessione per ottenere le stringhe. Molte stringhe sono crittografate con la chiave XOR 4B729A1F5CE387D6

Il caricatore ottiene l'LCID del sistema utilizzando GetKeyboardLayoutList() e lo confronta con più di 17 lingue, tra cui russo, ucraino, bielorusso e armeno.

Esegue inoltre un'ampia ricognizione del sistema, compresa l'enumerazione delle chiavi di registro e la chiamata di API Win32 come GetSystemFirmwareTable() e EnumSystemFirmwareTables() per identificare gli ambienti virtualizzati.

Categoria Valore 
ID fornitore/dispositivo PCI VEN_80EE, VEN_15AD, VEN_1AB8, VEN_5853, VEN_1AF4, VEN_1234&DEV_111, …
ID OEM SMBIOS/ACPI VMWARE, VBOX, BOCHS, VRTUAL, MSFTVM, MSHYPR, Xen, Parall, BHYVE, AMAZON, Google
Firme delle tabelle ACPI VBOX, BXPC, VMW, Xen, PRLS, AMZN, MICR
Stringhe BIOS/produttore/prodotto vmware, vmw, innotek, virtualbox, vbox, qemu, seabios, bochs, standard pc, kvm virtual machine, xen, hvm domu, parallels
Stringhe associate ai controlli anti-analisi

Abbiamo inoltre osservato riferimenti decrittografati ad API tra cui GetCurrentProcess(), CreateToolhelp32Snapshot(), Process32First(), Process32Next(), e OpenMutex(), sebbene non abbiamo osservato la chiamata di queste funzioni durante il nostro flusso di esecuzione.

Viene inoltre effettuata una richiesta HTTP a uno di questi servizi: 

  • https://ipv4[.]ipleak[.]net/json/
  • https://get[.]geojs[.]io/v1/ip/geo[.]json
  • https://ipapi[.]co/json/
  • https://api[.]ipapi[.]is/
  • https://ipinfo[.]io/json

Inoltre, confronta i dati restituiti con quelli di 96 provider di hosting o infrastrutture e verifica se il codice della regione è uno dei seguenti: RU, UA, BY, AM, KZ, KG, TJ, UZ, GE, AZ, o MD.

Stringhe decifrate associate ai provider . Clicca per ingrandire.

Se i controlli anti-analisi hanno esito positivo, le due fasi successive vengono scaricate e decrittografate utilizzando chiavi XOR.

Abbiamo riparato SelectionScope.ProcessDirectory (0x06000014) per recuperare i percorsi C2 e le chiavi XOR per tali fasi:

/assets/MailersKogasin.json|WjcsVTKmuoBRqe|/assets/LanoseThrip.json|WwUX66Br

GollopDevest: PE Loader DLL e Amatera Stealer

La terza DLL ha lo stesso nome della seconda, GollopDevestma esegue il caricamento PE.

Tra le stringhe decifrate figurano:

'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)

Il ServerEditor.SortMemory metodo (0x06000014) verifica la struttura PE e i flag prima di caricare il payload.

Per confermare questo comportamento, abbiamo invocato il metodo tramite riflessione utilizzando il file scaricato WPA.exe file come input. Il PE è stato caricato correttamente.

Il PE compilato in C++ si maschera come WPA.exe Windows Analizzatore delle prestazioni). Abbiamo identificato il payload come una versione offuscata di Amatera Stealer 4.2.3-alpha1.

Utilizza l'appiattimento del flusso di controllo, l'hashing delle API, i controlli anti-debugging e i predicati opachi per complicare l'analisi. Abbiamo anche rilevato l'uso della tecnica Heaven's Gate, la risoluzione DNS-over-HTTPS (DoH) tramite Google DNS e i socket raw utilizzando \Device\Afd\Endpoint per la comunicazione di rete. 

Dopo l'esecuzione di questa fase, abbiamo anche osservato il download e l'esecuzione di ulteriori payload dagli indirizzi IP del C2.

In alcuni casi, i pacchetti WiX Burn hanno scaricato un altro payload associato a PavinLoader. In altri, abbiamo rilevato HijackLoader. Ciò consente agli operatori della campagna di distribuire più payload su una macchina compromessa.

CIO 

Hash SHA-256

bdf313a019e025ebf58ccef4619444ee70e661bd444e0644ebeabd8f5caad14c 

e3830f5747e3f46537d217124d80c9f3bb4d89f8d4f5138dce69ee54ea4fb6b9 

a4f03272cf96732dc9f58bb466d16f358e7f50d46dba30526a9fbebfec11717b 

bf04160dd1ce3571e0eb6d6dda1713c788797b5599399d4a93665a757eec376e 

54fa8083c05334aa360256fbbb0ca901ce7e244a0359dd664cae78977371ec91 

c1ea6d169565c70ac5d812e73483814929e9b3548ead6633595937e71a334adb 

001337488c32d8610c2aef6f9330acca825f0afacd071bf6ebfc06b5a1a69f09 

2837099af431e9afee76ce5e6ab5cb86bedce06e31c22be46250cb453cfdb978 

252c5a3d150275013f52b4820097d7163ced4aa2f1be0fca032f8a5017673816 

0c9c64b7383ec249bcf6271a4b73206d94de130ca401d16ab77fe01e5193a312 

6700f62e1a3b33340cd678c388ecc8bac2e5943c0627df5d1b99b879c3ca42c9 

indirizzi IP 

93.152.224[.]75: download PavinLoader 

65.21.80[.]170: download PavinLoader 

195.63.142[.]49: download PavinLoader 

Domini 

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 

URL 

telegra[.]ph/Project-PySynth-06-28: Punto di consegna segreto di Amatera 

Ringraziamenti   


Dalla segnalazione delle minacce alla loro rimozione.

I rischi per la sicurezza informatica non dovrebbero mai diffondersi al di là di un titolo di giornale. Tenete le minacce lontane dai vostri dispositivi scaricando Malwarebytes oggi stesso.

Informazioni sull'autore

Gabriele è un ingegnere specializzato nella ricerca sul malware che ama combattere il malware. Quando non è impegnato in questo, lo si può trovare a godersi la natura, l'arte e gli animali.