Search/medium[.]com
● IOC

medium[.]com

Type
DOMAIN
Source
News extraction
First seen
Feb 3, 2026
Last seen
Aug 24, 2026
Look up on VirusTotal
Related Stories
1
Tracking PavinLoader across ClickFix and fake download campaigns
In our previous analysis of the malicious RenPy campaigns, we identified a multi-stage loader deployed as part of the infection chain. Further threat hunting has since shown that the same loader, which we track as PavinLoader , is being used across several different campaigns, including ClickFix attacks and fake software downloads.  Despite differences in how these campaigns reach victims, we found several common elements. These include multi-stage infection chains involving heavily obfuscated and trojanized .NET DLLs; abuse of MSBuild, .csproj , and .bat files to execute them; and EtherHiding to retrieve the command-and-control (C2) domain.  What an attack looks like The campaigns don’t all start the same way. A victim might encounter a fake CAPTCHA that tells them to run a command, download what appears to be legitimate software, or install a malicious game. What happens next is much more consistent. PavinLoader uses legitimate Windows tools alongside malicious .NET files to run several stages of malware. It also uses EtherHiding, a technique that uses a blockchain to hide information about its infrastructure, to find the server from which it should retrieve additional malware. In the RenPy campaign we analyzed, that process ultimately led to Amatera Stealer , malware designed to steal information from an infected computer. We also observed PavinLoader infections delivering additional malware. PavinLoader appears across multiple campaigns We have identified PavinLoader in several campaign clusters:  Malicious RenPy campaigns, as analyzed in our earlier blog post Several ClickFix campaigns, including recent activity from the operator(s) covered in our previous analysis Fake software campaigns that used Dropbox to download PavinLoader.  The loader’s use across multiple campaigns raises the possibility that PavinLoader is offered as a Loader-as-a-Service. We also found several artifacts that support this possibility, although they are not enough to confirm it. One specific artifact on VirusTotal is shared by more than 200 files associated with PavinLoader, suggesting it may be a compilation artifact of the build process. We also found a PowerShell script uploaded to VirusTotal containing comments such as EDIT HERE and REPLACE with a real direct link to your .bat . The associated BAT file contains the string Automated builder helper . However, we haven’t found a build panel or sales channels that would confirm PavinLoader is being offered commercially. The PowerShell script . Click to enlarge Part of the BAT file . Click to enlarge   Although PavinLoader has changed over time, the campaigns we analyzed share several characteristics: Inno Setup or MSI installers generated with different builders that run the .bat and/or .csproj files Trojanized .NET DLLs, including DotNetZip, Nancy, Renci.SshNet, and OpenXML. In most of the cases analyzed, the inserted malicious methods follow a TwoWords or TwoWordsNumber naming pattern, such as DefaultEvaluator5 , and FallbackFactory5 A common obfuscation technique used across the .NET DLLs A naming convention based on two random words, such as  GollopDevest , UnbrandRunover , and PavinWide , for DLL names, functions, strings, C2 paths, and other artifacts EtherHiding to obtain the C2 domain, followed by HTTP requests using paths such as assets/{two random words}.json to retrieve subsequent stages. C2 domains commonly use the .lat , .icu , .shop , and .cfd top-level domains MSBuild mechanisms for loading and executing code from DLLs, including property functions such as [System.Reflection.Assembly]::Load(...) and UsingTask Recurring filename patterns such as name_4characters.cmd/bat/msi/exe —for example, prefetch_9a59.cmd , telemetry_55db.cmd , and bootstrap_64be.cmd —or random nine-character names such as aegZpQ4C7.bat . We also observed short names including Small.msi , small.bat , and small.cmd PavinLoader consists of several .NET DLLs, and in the cases analyzed we identified the following stages:  Loader DLL : A trojanized DLL—such as the Nancy one analyzed in our previous RenPy article—or a custom DLL. It performs anti-forensics and anti-analysis operations, changes network settings needed for the next operations, and loads the EtherHiding Loader EtherHiding Loader DLL : Obtains the C2 through EtherHiding and downloads the next stages from it  Anti-Analysis DLL : Performs extensive anti-analysis checks to detect virtualized environments.  PE Loader DLL : Loads the final PE payload. Intermediate payloads can vary depending on the campaign configuration. First, we’ll look at some of the methods used to distribute the initial PavinLoader stages. We’ll then return to the RenPy loader campaign we analyzed in our previous article to examine the loader’s later stages.  Technical analysis The rest of this article takes a closer look at how PavinLoader is distributed and how each stage of the loader works. How PavinLoader is delivered We have observed PavinLoader being delivered through several ClickFix campaigns. In particular, we detected that the ClickFix cluster analyzed in a previous article has recently started using PavinLoader. Abuse of MSBuild and the use of .csproj and .bat files remain common across the infection chains we observed. We covered one example in our previous RenPy analysis. Here, we’ll look at several other distribution methods.  The ClickFix Cloudflare page associated with this campaign . Click to enlarge   As we saw in our previous analysis of these ClickFix campaigns, the associated PowerShell scripts change frequently. We found several versions in this activity, including both obfuscated and unobfuscated scripts. The PowerShell script associated with the ClickFix campaign. Click to enlarge In this example, the downloaded MSI from the Cloudflare bucket is called Installer_57be78.msi.  MSI content . Click to enlarge The package contains: prefetch_2f76.exe : The legitimate MSBuild executable prefetch_2f76.csproj : Used to execute the Loader DLL through UsingTask DotNetZip.dll : The Loader DLL The .csproj file is executed with: "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 The Loader DLL is a trojanized version of DotNetZip and is executed using the UsingTask element. “UsingTask” used to execute the DLL . Click to enlarge The malicious method inserted in the trojanized DLL. Click to enlarge.  Unlike the RenPy example discussed in our previous article, the EtherHiding Loader is extracted from the DLL itself. An embedded resource is used as an index to extract bytes directly from the DLL, rather than obtaining those indexes from the .csproj file. We detected another campaign that uses BAT files containing fake BUILD VERIFICATION REPORT comments, apparently intended to make analysis and detection more difficult. In this case, the MSI CustomAction executes the BAT script with: cmd.exe /c C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd /launched Fake comments inserted in the updater_8219.cmd . Click to enlarge The obfuscated code appears below the fake comments. It concatenates multiple strings and uses indices generated through simple mathematical operations to reconstruct them. We found this type of obfuscation in most of the BAT files we analyzed. The obfuscated part of the .cmd file . Click to enlarge The BAT file locates conhost.exe and relaunches itself with: "C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd" /launched It then sets the MSBUILDENABLEALLPROPERTYFUNCTIONS=1 environment variable, locates MSBuild.exe , and executes it using the same file as 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 this case, the Loader DLL is reconstructed by concatenating and decoding four Base64-encoded variables. Part of the CMD file showing the loading process. Click to enlarge The Loader DLL has a random name and appears to be an older version because it does not contain the custom bytecode and encrypted strings in its resources. As in the RenPy campaign analyzed previously, this stage retrieves the EtherHiding Loader stored between a Build-... marker in the CMD file through the _vezr environment variable, then decodes it using XOR with a 32-byte key. The extracted Loader DLL. Click to enlarge Having looked at several methods used to distribute PavinLoader’s first two stages, we will now return to the RenPy infection chain from our previous analysis and examine the loader itself in more detail. Analyzing PavinLoader The .NET DLLs associated with PavinLoader are heavily obfuscated using control-flow flattening, custom bytecode, indirect calls through calli / ldftn , string encryption with different algorithms, API hashing and delegates, redundant methods, and junk code and strings. We did not identify a known obfuscator associated with the samples, so to the best of our knowledge, PavinLoader uses a custom obfuscator. Because fully deobfuscating the samples would be complex, we used a hybrid approach combining dynamic analysis with method invocation through reflection. We identified important methods based on their imports and parameters, invoked them, and analyzed the resulting output. This approach does not provide complete coverage of the execution flow, but it allowed us to identify the loader’s core functionality and extract its intermediate stages. Because different functions frequently share the same names, we use metadata tokens to identify methods throughout the analysis. Nancy trojanized DLL: Loader DLL  We covered this stage in detail in our previous blog post, so we’ll provide only an overview here. In most of the cases analyzed, the Loader DLL is a trojanized legitimate DLL. The malicious method typically uses a {RandomWord} or {RandomWord_Number} naming convention. The DLL contains a resource associated with the custom bytecode interpreted by the main method, two resources containing encrypted strings, and, in some cases, additional resources used as an index for extracting the next stage. Other resources appear to be decoys designed to slow analysis. In the samples we analyzed, this DLL typically: Decrypts strings from resources using multi-key XOR Resolves APIs using API hashing and GetDelegateForFunctionPointer() Changes network settings, including disabling TLS certificate validation and setting the default system proxy Performs an anti-analysis timing check using CreateEventW() , GetTickCount() , and WaitForSingleObject() Performs anti-forensics operations Loads the EtherHiding Loader either by extracting it from a marker inside .csproj or BAT files, or by using a resource as an index to retrieve bytes directly from the DLL GollopDevest: EtherHiding Loader  The EtherHiding Loader has two main functions: obtaining the C2 domain through EtherHiding, and downloading and loading subsequent stages from that C2. Class 0x02000762 is responsible for decrypting strings associated with blockchain and network communication. The strings are decrypted by 0x060027BD as follows:  Function 0x060027BB initializes the S-box using the XOR of the master key activeValues and the Base64-decoded optionsCollection string Function 0x060027BE takes childSyncObject as input and returns index bytes using XOR and permutations based on header values encoded in the first two characters of the string Function 0x060027B9 returns the decrypted string using the indexes and the previously generated S-box This was the only class we found with encryption parameters encoded in this format. For the remaining strings, we identified functions that returned decrypted data based on their parameter signatures—for example, methods returning strings or bytes—and invoked them through reflection. This allowed us to recover more than 1,300 strings. Part of the decrypted strings . Click to enlarge   Among them were strings associated with AMSI and ETW patching: AmsiScanString System.Management.Automation.AmsiUtils System.Management.Automation.AmsiUtils+AmsiNativeMethods ntdll EtwEventWrite NtQueryInformationProcess NtSetInformationThread VirtualProtect More than 100 URLs belonging to legitimate services are also decrypted and used to generate HTTP requests and network noise. We did not observe this behavior in every sample, suggesting it may be build-specific. The Server class ( 0x02000052 ) generates the X-Timestamp , X-Nonce , and X-Signature HTTP headers and makes requests used to retrieve subsequent stages. Two HTTP requests are made to synchronize parameters and obtain the payload, with HMAC used to validate the requests. Using reflection, we executed method 0x06000A77 to obtain the header values needed to retrieve the subsequent stages. The C2 domain is obtained by making an ETH RPC (Remote Procedure Call) to bsc-dataseed.binance.org with the following JSON-RPC body: {"jsonrpc":"2.0","method":"eth_call","params":[{"to":" 0x328a1fadff154290f0ce1389a4e633698cdfdaa7 ","data":"0x06fdde03"},"latest"],"id":1783436775}  The next stages are downloaded from the resulting C2 domain. The XOR-encoded payload is stored in the JSON response under cache.content : {"type":"cache-binary","meta":{"version":"2.3.1","timestamp":"…","platform":"win32-x64"},"cache":{"id":"e2b69…"," content ":" 1c.. "}}  In this case, the C2 paths and XOR keys decrypted from this stage and the anti-analysis DLL are: Path   XOR key   Type/Function   /assets/ExponeAboard.json  QBBBfWow4lb  PavinWride .NET DLL, Anti-analysis   /assets/MailersKogasin.json  WjcsVTKmuoBRqe  GollopDevest .NET DLL, PE Loader  /assets/LanoseThrip.json  WwUX66Br  WPA.exe PE executable, Amatera Stealer  The next stage executed is the anti-analysis DLL.  PavinWride: Anti-analysis DLL  This DLL is responsible for performing several anti-analysis checks.  The anti-analysis DLL executes system calls in different ways:  Standard .NET Base Class Library (BCL) calls, including for registry and network operations Win32 P/Invoke calls, including GetCurrentThread , NtQueryInformationThread , NtQueryInformationProcess , and NtCurrentTeb Win32 APIs resolved through API hashing and a Process Environment Block (PEB) export table walk The function MenuItemService . ProcessDirectory ( 0x06000151 ) is the main method responsible for delegate caching and Win32 API resolution:   It checks if the delegate is already resolved using managerMap.TryGetValue()  If not, it calls ProcessDirectory (0x06000150) to obtain the HMODULE handle It calls ProcessDirectory (0x0600003A) that performs the PE export table walk and matches the hash. We detected that the same hashing output is obtained in several other methods (e.g., 0x06000039 , 0x0600003B , 0x0600004E ) It obtains the delegate with GetDelegateForFunctionPointer() and saves it in the dictionary Results of the API hashing script . Click to enlarge   We used the same reflection approach to get the strings.  Many strings are encrypted with the XOR key 4B729A1F5CE387D6 .  Part of decrypted strings. Click to enlarge   The loader obtains the system’s LCID using GetKeyboardLayoutList() and compares it against more than 17 languages, including Russian, Ukrainian, Belarusian, and Armenian. It also performs extensive system reconnaissance, including enumerating registry keys and calling Win32 APIs such as GetSystemFirmwareTable() and EnumSystemFirmwareTables() to identify virtualized environments. Category   Value   PCI vendor / device IDs   VEN_80EE , VEN_15AD , VEN_1AB8 , VEN_5853 , VEN_1AF4 , VEN_1234&DEV_111 , … SMBIOS/ACPI OEM IDs   VMWARE , VBOX , BOCHS , VRTUAL , MSFTVM , MSHYPR , Xen , Parall , BHYVE , AMAZON , Google ACPI table signatures   VBOX , BXPC , VMW , Xen , PRLS , AMZN , MICR BIOS/manufacturer/product strings   vmware , vmw , innotek , virtualbox , vbox , qemu , seabios , bochs , standard pc , kvm virtual machine , xen , hvm domu , parallels Strings associated with anti-analysis checks Part of the registry key enumeration . Click to enlarge We also observed decrypted references to APIs including GetCurrentProcess() , CreateToolhelp32Snapshot() , Process32First() , Process32Next() , and OpenMutex() , although we did not observe these functions being called during our execution flow. An HTTP request is also made to one of these services:  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 It also checks the returned data against 96 hosting or infrastructure providers and tests whether the region code is one of: RU , UA , BY , AM , KZ , KG , TJ , UZ , GE , AZ , or MD . Decrypted strings associated with providers . Click to enlarge If the anti-analysis checks pass, the next two stages are downloaded and decrypted using XOR keys. We patched SelectionScope.ProcessDirectory ( 0x06000014 ) to recover the C2 paths and XOR keys for those stages: /assets/MailersKogasin.json|WjcsVTKmuoBRqe|/assets/LanoseThrip.json|WwUX66Br GollopDevest: PE Loader DLL and Amatera Stealer The third DLL has the same name as the second, GollopDevest , but performs PE loading. Among its decrypted strings are: '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) The ServerEditor.SortMemory method ( 0x06000014 ) checks the PE structure and flags before loading the payload. To confirm this behavior, we invoked the method through reflection using the downloaded WPA.exe file as input. The PE loaded successfully. The C++-compiled PE disguises itself as WPA.exe (Windows Performance Analyzer). We identified the payload as an obfuscated version of Amatera Stealer 4.2.3-alpha1 . It uses control-flow flattening, API hashing, anti-debugging checks, and opaque predicates to complicate analysis. We also detected use of the Heaven’s Gate technique, DNS-over-HTTPS (DoH) resolution through Google DNS, and raw sockets using \Device\Afd\Endpoint for network communication.  Part of the decrypted strings associated with Amatera . Click to enlarge After this stage executes, we also observed additional payloads being downloaded and run from C2 IP addresses. In some cases, WiX Burn bundles downloaded another payload associated with PavinLoader. In others, we detected HijackLoader. This gives the campaign operators the ability to deploy multiple payloads on a compromised machine. IOCs  SHA-256 hashes bdf313a019e025ebf58ccef4619444ee70e661bd444e0644ebeabd8f5caad14c  e3830f5747e3f46537d217124d80c9f3bb4d89f8d4f5138dce69ee54ea4fb6b9  a4f03272cf96732dc9f58bb466d16f358e7f50d46dba30526a9fbebfec11717b  bf04160dd1ce3571e0eb6d6dda1713c788797b5599399d4a93665a757eec376e  54fa8083c05334aa360256fbbb0ca901ce7e244a0359dd664cae78977371ec91  c1ea6d169565c70ac5d812e73483814929e9b3548ead6633595937e71a334adb  001337488c32d8610c2aef6f9330acca825f0afacd071bf6ebfc06b5a1a69f09  2837099af431e9afee76ce5e6ab5cb86bedce06e31c22be46250cb453cfdb978  252c5a3d150275013f52b4820097d7163ced4aa2f1be0fca032f8a5017673816  0c9c64b7383ec249bcf6271a4b73206d94de130ca401d16ab77fe01e5193a312  6700f62e1a3b33340cd678c388ecc8bac2e5943c0627df5d1b99b879c3ca42c9  IP addresses   93.152.224[.]75 : downloads PavinLoader  65.21.80[.]170 : downloads PavinLoader  195.63.142[.]49 : downloads PavinLoader  Domains   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 : Amatera dead drop  Acknowledgements   Previous analysis of the loader: https://www.derp.ca/research/hellsuchecker-clickfix-etherhiding/#26-anti-sandbox-checks-and-a-nintendo-bypass (possible AI-generated content)  Possible related activity: https://cyberowi.pl/lumma-stealer-renpy-fitgirl-osmiowarstwowy-loader/   Possible related activity: https://medium.com/@djordje.brankovic/from-fake-captcha-to-in-memory-execution-unraveling-a-multi-stage-malware-chain-part-1-496c603f3641   Analysis of a forum user: https://forums.malwarebytes.com/topic/338102-solution-of-gollopdevestdll-renpy-loader-malware-from-malwarebytes-blog/   From reporting threats to removing them. Cybersecurity risks should never spread beyond a headline. Keep threats off your devices by  downloading Malwarebytes today .
1 shared
Aug 26, 2026
Connections
2 relationships
Tracking PavinLoader across ClickFix and fake download campaigns
In our previous analysis of the malicious RenPy campaigns, we identified a multi-stage loader deployed as part of the infection chain. Further threat hunting has since shown that the same loader, which we track as PavinLoader , is being used across several different campaigns, including ClickFix attacks and fake software downloads.  Despite differences in how these campaigns reach victims, we found several common elements. These include multi-stage infection chains involving heavily obfuscated and trojanized .NET DLLs; abuse of MSBuild, .csproj , and .bat files to execute them; and EtherHiding to retrieve the command-and-control (C2) domain.  What an attack looks like The campaigns don’t all start the same way. A victim might encounter a fake CAPTCHA that tells them to run a command, download what appears to be legitimate software, or install a malicious game. What happens next is much more consistent. PavinLoader uses legitimate Windows tools alongside malicious .NET files to run several stages of malware. It also uses EtherHiding, a technique that uses a blockchain to hide information about its infrastructure, to find the server from which it should retrieve additional malware. In the RenPy campaign we analyzed, that process ultimately led to Amatera Stealer , malware designed to steal information from an infected computer. We also observed PavinLoader infections delivering additional malware. PavinLoader appears across multiple campaigns We have identified PavinLoader in several campaign clusters:  Malicious RenPy campaigns, as analyzed in our earlier blog post Several ClickFix campaigns, including recent activity from the operator(s) covered in our previous analysis Fake software campaigns that used Dropbox to download PavinLoader.  The loader’s use across multiple campaigns raises the possibility that PavinLoader is offered as a Loader-as-a-Service. We also found several artifacts that support this possibility, although they are not enough to confirm it. One specific artifact on VirusTotal is shared by more than 200 files associated with PavinLoader, suggesting it may be a compilation artifact of the build process. We also found a PowerShell script uploaded to VirusTotal containing comments such as EDIT HERE and REPLACE with a real direct link to your .bat . The associated BAT file contains the string Automated builder helper . However, we haven’t found a build panel or sales channels that would confirm PavinLoader is being offered commercially. The PowerShell script . Click to enlarge Part of the BAT file . Click to enlarge   Although PavinLoader has changed over time, the campaigns we analyzed share several characteristics: Inno Setup or MSI installers generated with different builders that run the .bat and/or .csproj files Trojanized .NET DLLs, including DotNetZip, Nancy, Renci.SshNet, and OpenXML. In most of the cases analyzed, the inserted malicious methods follow a TwoWords or TwoWordsNumber naming pattern, such as DefaultEvaluator5 , and FallbackFactory5 A common obfuscation technique used across the .NET DLLs A naming convention based on two random words, such as  GollopDevest , UnbrandRunover , and PavinWide , for DLL names, functions, strings, C2 paths, and other artifacts EtherHiding to obtain the C2 domain, followed by HTTP requests using paths such as assets/{two random words}.json to retrieve subsequent stages. C2 domains commonly use the .lat , .icu , .shop , and .cfd top-level domains MSBuild mechanisms for loading and executing code from DLLs, including property functions such as [System.Reflection.Assembly]::Load(...) and UsingTask Recurring filename patterns such as name_4characters.cmd/bat/msi/exe —for example, prefetch_9a59.cmd , telemetry_55db.cmd , and bootstrap_64be.cmd —or random nine-character names such as aegZpQ4C7.bat . We also observed short names including Small.msi , small.bat , and small.cmd PavinLoader consists of several .NET DLLs, and in the cases analyzed we identified the following stages:  Loader DLL : A trojanized DLL—such as the Nancy one analyzed in our previous RenPy article—or a custom DLL. It performs anti-forensics and anti-analysis operations, changes network settings needed for the next operations, and loads the EtherHiding Loader EtherHiding Loader DLL : Obtains the C2 through EtherHiding and downloads the next stages from it  Anti-Analysis DLL : Performs extensive anti-analysis checks to detect virtualized environments.  PE Loader DLL : Loads the final PE payload. Intermediate payloads can vary depending on the campaign configuration. First, we’ll look at some of the methods used to distribute the initial PavinLoader stages. We’ll then return to the RenPy loader campaign we analyzed in our previous article to examine the loader’s later stages.  Technical analysis The rest of this article takes a closer look at how PavinLoader is distributed and how each stage of the loader works. How PavinLoader is delivered We have observed PavinLoader being delivered through several ClickFix campaigns. In particular, we detected that the ClickFix cluster analyzed in a previous article has recently started using PavinLoader. Abuse of MSBuild and the use of .csproj and .bat files remain common across the infection chains we observed. We covered one example in our previous RenPy analysis. Here, we’ll look at several other distribution methods.  The ClickFix Cloudflare page associated with this campaign . Click to enlarge   As we saw in our previous analysis of these ClickFix campaigns, the associated PowerShell scripts change frequently. We found several versions in this activity, including both obfuscated and unobfuscated scripts. The PowerShell script associated with the ClickFix campaign. Click to enlarge In this example, the downloaded MSI from the Cloudflare bucket is called Installer_57be78.msi.  MSI content . Click to enlarge The package contains: prefetch_2f76.exe : The legitimate MSBuild executable prefetch_2f76.csproj : Used to execute the Loader DLL through UsingTask DotNetZip.dll : The Loader DLL The .csproj file is executed with: "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 The Loader DLL is a trojanized version of DotNetZip and is executed using the UsingTask element. “UsingTask” used to execute the DLL . Click to enlarge The malicious method inserted in the trojanized DLL. Click to enlarge.  Unlike the RenPy example discussed in our previous article, the EtherHiding Loader is extracted from the DLL itself. An embedded resource is used as an index to extract bytes directly from the DLL, rather than obtaining those indexes from the .csproj file. We detected another campaign that uses BAT files containing fake BUILD VERIFICATION REPORT comments, apparently intended to make analysis and detection more difficult. In this case, the MSI CustomAction executes the BAT script with: cmd.exe /c C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd /launched Fake comments inserted in the updater_8219.cmd . Click to enlarge The obfuscated code appears below the fake comments. It concatenates multiple strings and uses indices generated through simple mathematical operations to reconstruct them. We found this type of obfuscation in most of the BAT files we analyzed. The obfuscated part of the .cmd file . Click to enlarge The BAT file locates conhost.exe and relaunches itself with: "C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c "C:\Users\{USER}\AppData\Local\Conexant\lite_bootstrap_2.1.7\updater_8219.cmd" /launched It then sets the MSBUILDENABLEALLPROPERTYFUNCTIONS=1 environment variable, locates MSBuild.exe , and executes it using the same file as 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 this case, the Loader DLL is reconstructed by concatenating and decoding four Base64-encoded variables. Part of the CMD file showing the loading process. Click to enlarge The Loader DLL has a random name and appears to be an older version because it does not contain the custom bytecode and encrypted strings in its resources. As in the RenPy campaign analyzed previously, this stage retrieves the EtherHiding Loader stored between a Build-... marker in the CMD file through the _vezr environment variable, then decodes it using XOR with a 32-byte key. The extracted Loader DLL. Click to enlarge Having looked at several methods used to distribute PavinLoader’s first two stages, we will now return to the RenPy infection chain from our previous analysis and examine the loader itself in more detail. Analyzing PavinLoader The .NET DLLs associated with PavinLoader are heavily obfuscated using control-flow flattening, custom bytecode, indirect calls through calli / ldftn , string encryption with different algorithms, API hashing and delegates, redundant methods, and junk code and strings. We did not identify a known obfuscator associated with the samples, so to the best of our knowledge, PavinLoader uses a custom obfuscator. Because fully deobfuscating the samples would be complex, we used a hybrid approach combining dynamic analysis with method invocation through reflection. We identified important methods based on their imports and parameters, invoked them, and analyzed the resulting output. This approach does not provide complete coverage of the execution flow, but it allowed us to identify the loader’s core functionality and extract its intermediate stages. Because different functions frequently share the same names, we use metadata tokens to identify methods throughout the analysis. Nancy trojanized DLL: Loader DLL  We covered this stage in detail in our previous blog post, so we’ll provide only an overview here. In most of the cases analyzed, the Loader DLL is a trojanized legitimate DLL. The malicious method typically uses a {RandomWord} or {RandomWord_Number} naming convention. The DLL contains a resource associated with the custom bytecode interpreted by the main method, two resources containing encrypted strings, and, in some cases, additional resources used as an index for extracting the next stage. Other resources appear to be decoys designed to slow analysis. In the samples we analyzed, this DLL typically: Decrypts strings from resources using multi-key XOR Resolves APIs using API hashing and GetDelegateForFunctionPointer() Changes network settings, including disabling TLS certificate validation and setting the default system proxy Performs an anti-analysis timing check using CreateEventW() , GetTickCount() , and WaitForSingleObject() Performs anti-forensics operations Loads the EtherHiding Loader either by extracting it from a marker inside .csproj or BAT files, or by using a resource as an index to retrieve bytes directly from the DLL GollopDevest: EtherHiding Loader  The EtherHiding Loader has two main functions: obtaining the C2 domain through EtherHiding, and downloading and loading subsequent stages from that C2. Class 0x02000762 is responsible for decrypting strings associated with blockchain and network communication. The strings are decrypted by 0x060027BD as follows:  Function 0x060027BB initializes the S-box using the XOR of the master key activeValues and the Base64-decoded optionsCollection string Function 0x060027BE takes childSyncObject as input and returns index bytes using XOR and permutations based on header values encoded in the first two characters of the string Function 0x060027B9 returns the decrypted string using the indexes and the previously generated S-box This was the only class we found with encryption parameters encoded in this format. For the remaining strings, we identified functions that returned decrypted data based on their parameter signatures—for example, methods returning strings or bytes—and invoked them through reflection. This allowed us to recover more than 1,300 strings. Part of the decrypted strings . Click to enlarge   Among them were strings associated with AMSI and ETW patching: AmsiScanString System.Management.Automation.AmsiUtils System.Management.Automation.AmsiUtils+AmsiNativeMethods ntdll EtwEventWrite NtQueryInformationProcess NtSetInformationThread VirtualProtect More than 100 URLs belonging to legitimate services are also decrypted and used to generate HTTP requests and network noise. We did not observe this behavior in every sample, suggesting it may be build-specific. The Server class ( 0x02000052 ) generates the X-Timestamp , X-Nonce , and X-Signature HTTP headers and makes requests used to retrieve subsequent stages. Two HTTP requests are made to synchronize parameters and obtain the payload, with HMAC used to validate the requests. Using reflection, we executed method 0x06000A77 to obtain the header values needed to retrieve the subsequent stages. The C2 domain is obtained by making an ETH RPC (Remote Procedure Call) to bsc-dataseed.binance.org with the following JSON-RPC body: {"jsonrpc":"2.0","method":"eth_call","params":[{"to":" 0x328a1fadff154290f0ce1389a4e633698cdfdaa7 ","data":"0x06fdde03"},"latest"],"id":1783436775}  The next stages are downloaded from the resulting C2 domain. The XOR-encoded payload is stored in the JSON response under cache.content : {"type":"cache-binary","meta":{"version":"2.3.1","timestamp":"…","platform":"win32-x64"},"cache":{"id":"e2b69…"," content ":" 1c.. "}}  In this case, the C2 paths and XOR keys decrypted from this stage and the anti-analysis DLL are: Path   XOR key   Type/Function   /assets/ExponeAboard.json  QBBBfWow4lb  PavinWride .NET DLL, Anti-analysis   /assets/MailersKogasin.json  WjcsVTKmuoBRqe  GollopDevest .NET DLL, PE Loader  /assets/LanoseThrip.json  WwUX66Br  WPA.exe PE executable, Amatera Stealer  The next stage executed is the anti-analysis DLL.  PavinWride: Anti-analysis DLL  This DLL is responsible for performing several anti-analysis checks.  The anti-analysis DLL executes system calls in different ways:  Standard .NET Base Class Library (BCL) calls, including for registry and network operations Win32 P/Invoke calls, including GetCurrentThread , NtQueryInformationThread , NtQueryInformationProcess , and NtCurrentTeb Win32 APIs resolved through API hashing and a Process Environment Block (PEB) export table walk The function MenuItemService . ProcessDirectory ( 0x06000151 ) is the main method responsible for delegate caching and Win32 API resolution:   It checks if the delegate is already resolved using managerMap.TryGetValue()  If not, it calls ProcessDirectory (0x06000150) to obtain the HMODULE handle It calls ProcessDirectory (0x0600003A) that performs the PE export table walk and matches the hash. We detected that the same hashing output is obtained in several other methods (e.g., 0x06000039 , 0x0600003B , 0x0600004E ) It obtains the delegate with GetDelegateForFunctionPointer() and saves it in the dictionary Results of the API hashing script . Click to enlarge   We used the same reflection approach to get the strings.  Many strings are encrypted with the XOR key 4B729A1F5CE387D6 .  Part of decrypted strings. Click to enlarge   The loader obtains the system’s LCID using GetKeyboardLayoutList() and compares it against more than 17 languages, including Russian, Ukrainian, Belarusian, and Armenian. It also performs extensive system reconnaissance, including enumerating registry keys and calling Win32 APIs such as GetSystemFirmwareTable() and EnumSystemFirmwareTables() to identify virtualized environments. Category   Value   PCI vendor / device IDs   VEN_80EE , VEN_15AD , VEN_1AB8 , VEN_5853 , VEN_1AF4 , VEN_1234&DEV_111 , … SMBIOS/ACPI OEM IDs   VMWARE , VBOX , BOCHS , VRTUAL , MSFTVM , MSHYPR , Xen , Parall , BHYVE , AMAZON , Google ACPI table signatures   VBOX , BXPC , VMW , Xen , PRLS , AMZN , MICR BIOS/manufacturer/product strings   vmware , vmw , innotek , virtualbox , vbox , qemu , seabios , bochs , standard pc , kvm virtual machine , xen , hvm domu , parallels Strings associated with anti-analysis checks Part of the registry key enumeration . Click to enlarge We also observed decrypted references to APIs including GetCurrentProcess() , CreateToolhelp32Snapshot() , Process32First() , Process32Next() , and OpenMutex() , although we did not observe these functions being called during our execution flow. An HTTP request is also made to one of these services:  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 It also checks the returned data against 96 hosting or infrastructure providers and tests whether the region code is one of: RU , UA , BY , AM , KZ , KG , TJ , UZ , GE , AZ , or MD . Decrypted strings associated with providers . Click to enlarge If the anti-analysis checks pass, the next two stages are downloaded and decrypted using XOR keys. We patched SelectionScope.ProcessDirectory ( 0x06000014 ) to recover the C2 paths and XOR keys for those stages: /assets/MailersKogasin.json|WjcsVTKmuoBRqe|/assets/LanoseThrip.json|WwUX66Br GollopDevest: PE Loader DLL and Amatera Stealer The third DLL has the same name as the second, GollopDevest , but performs PE loading. Among its decrypted strings are: '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) The ServerEditor.SortMemory method ( 0x06000014 ) checks the PE structure and flags before loading the payload. To confirm this behavior, we invoked the method through reflection using the downloaded WPA.exe file as input. The PE loaded successfully. The C++-compiled PE disguises itself as WPA.exe (Windows Performance Analyzer). We identified the payload as an obfuscated version of Amatera Stealer 4.2.3-alpha1 . It uses control-flow flattening, API hashing, anti-debugging checks, and opaque predicates to complicate analysis. We also detected use of the Heaven’s Gate technique, DNS-over-HTTPS (DoH) resolution through Google DNS, and raw sockets using \Device\Afd\Endpoint for network communication.  Part of the decrypted strings associated with Amatera . Click to enlarge After this stage executes, we also observed additional payloads being downloaded and run from C2 IP addresses. In some cases, WiX Burn bundles downloaded another payload associated with PavinLoader. In others, we detected HijackLoader. This gives the campaign operators the ability to deploy multiple payloads on a compromised machine. IOCs  SHA-256 hashes bdf313a019e025ebf58ccef4619444ee70e661bd444e0644ebeabd8f5caad14c  e3830f5747e3f46537d217124d80c9f3bb4d89f8d4f5138dce69ee54ea4fb6b9  a4f03272cf96732dc9f58bb466d16f358e7f50d46dba30526a9fbebfec11717b  bf04160dd1ce3571e0eb6d6dda1713c788797b5599399d4a93665a757eec376e  54fa8083c05334aa360256fbbb0ca901ce7e244a0359dd664cae78977371ec91  c1ea6d169565c70ac5d812e73483814929e9b3548ead6633595937e71a334adb  001337488c32d8610c2aef6f9330acca825f0afacd071bf6ebfc06b5a1a69f09  2837099af431e9afee76ce5e6ab5cb86bedce06e31c22be46250cb453cfdb978  252c5a3d150275013f52b4820097d7163ced4aa2f1be0fca032f8a5017673816  0c9c64b7383ec249bcf6271a4b73206d94de130ca401d16ab77fe01e5193a312  6700f62e1a3b33340cd678c388ecc8bac2e5943c0627df5d1b99b879c3ca42c9  IP addresses   93.152.224[.]75 : downloads PavinLoader  65.21.80[.]170 : downloads PavinLoader  195.63.142[.]49 : downloads PavinLoader  Domains   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 : Amatera dead drop  Acknowledgements   Previous analysis of the loader: https://www.derp.ca/research/hellsuchecker-clickfix-etherhiding/#26-anti-sandbox-checks-and-a-nintendo-bypass (possible AI-generated content)  Possible related activity: https://cyberowi.pl/lumma-stealer-renpy-fitgirl-osmiowarstwowy-loader/   Possible related activity: https://medium.com/@djordje.brankovic/from-fake-captcha-to-in-memory-execution-unraveling-a-multi-stage-malware-chain-part-1-496c603f3641   Analysis of a forum user: https://forums.malwarebytes.com/topic/338102-solution-of-gollopdevestdll-renpy-loader-malware-from-malwarebytes-blog/   From reporting threats to removing them. Cybersecurity risks should never spread beyond a headline. Keep threats off your devices by  downloading Malwarebytes today .
malwarebytes.comAug 24, 2026extracted
Threat Hunting oltre gli alert: principi e modelli operativi
La pratica del Threat Hunting esiste da molti anni, ben prima di essere formalizzata con questa denominazione. Prima di fornirne una definizione, è opportuno chiarire alcuni fraintendimenti, specificando innanzitutto che cosa non è. In primo luogo, non coincide con la Cyber Threat Intelligence (CTI), che si focalizza prevalentemente sull’analisi e sulla profilazione delle minacce emergenti, né con l’Incident Response (IR), il cui obiettivo è la gestione di un incidente già in corso. Pur essendo strettamente correlate, queste discipline perseguono finalità differenti. Quali sono dunque le relazioni tra queste attività? La CTI può rappresentare un valido punto di partenza per il Threat Hunting, fornendo contesto e ipotesi sulle possibili minacce da ricercare. L’Incident Response, invece, costituisce spesso la fase successiva, avviata da un’organizzazione in seguito all’individuazione di una compromissione attraverso un’attività di Threat Hunting condotta con successo. È importante sottolineare che il Threat Hunting è un’attività human-driven, guidata dall’analisi, dall’esperienza e dal giudizio umano. Analogamente alla Threat Intelligence, adotta un approccio proattivo alla sicurezza, poiché mira a individuare le minacce prima che sia troppo tardi; non si tratta, quindi, di una misura reattiva come l’Incident Response. Che cos’è il Threat Hunting? Il Threat Hunting è un approccio proattivo orientato alla ricerca di minacce già presenti all’interno di una rete aziendale e che sono riuscite ad eludere i controlli dei sistemi di sicurezza implementati. Tale attività si basa sull’assunto che una violazione sia già avvenuta e prevede una ricerca continua di segnali di compromissione all’interno dell’ambiente organizzativo. L’obiettivo principale di un threat hunter è identificare una compromissione nel minor tempo possibile, al fine di ridurne l’impatto e minimizzare il dwell time. Quest’ultimo rappresenta l’intervallo di tempo che intercorre tra il momento in cui un attaccante riesce a infiltrarsi in una organizzazione e quello in cui viene rilevato. Secondo Mandiant nel 2024 il dwell time è stato di 11 giorni (https://cloud.google.com/blog/topics/threat-intelligence/m-trends-2025 ). Un aspetto fondamentale da comprendere è che la riduzione del dwell time rappresenta una sfida continua e potenzialmente senza fine. È ampiamente riconosciuto che quanto più a lungo un attaccante riesce a rimanere all’interno di un’organizzazione senza essere individuato, tanto maggiori saranno le opportunità di occultare le proprie attività e più gravi i danni che potrà causare. Il dwell time costituisce pertanto un fattore di rischio critico, poiché: una permanenza prolungata consente all’attaccante di esplorare l’infrastruttura e compromettere ulteriori asset. aumenta la probabilità di esfiltrazione dei dati, della creazione di backdoor persistenti o della preparazione di attacchi futuri. una mancata rilevazione per un lungo periodo riduce l’efficacia delle contromisure difensive e rende la risposta all’incidente più complessa e costosa. Di conseguenza, un Threat Hunter deve mantenersi costantemente aggiornato, acquisendo conoscenze sulle nuove tecniche adottate dagli avversari, così da migliorare progressivamente le capacità di rilevamento e ridurre il dwell time. In sintesi, il Threat Hunting è un’attività human-driven che consiste nella ricerca proattiva di segnali di compromissione all’interno di un’organizzazione con l’obiettivo di ridurre il dwell time e minimizzare l’impatto di una violazione. Costruzione dell’ipotesi Sebbene l’esperienza abbia un peso rilevante, ciò non implica che solo professionisti altamente specializzati possano svolgere attività di Threat Hunting. Va tuttavia considerato che alcune tecniche richiedono anni di pratica per essere pienamente padroneggiate. Una delle competenze fondamentali di un buon threat hunter è la capacità di porsi le domande giuste al fine di formulare un’ipotesi di caccia, ovvero una supposizione strutturata e motivata sull’esistenza di una possibile attività malevola all’interno dell’ambiente dell’organizzazione. Il threat hunter deve inoltre essere in grado di trovare risposte a tali domande, attraverso l’analisi dei dati disponibili, per confermare o smentire l’ipotesi formulata. L’ipotesi è al centro di ogni processo di Threat Hunting e si basa in parte sull’osservazione di eventi anomali rispetto alla baseline dell’ambiente e in parte su informazioni che possono derivare dall’esperienza del threat hunter o da altre fonti, come la threat intelligence. La corretta formulazione dell’ipotesi è cruciale per condurre attività di caccia efficaci, un’ipotesi poco definita può condurre a risultati fuorvianti o a conclusioni errate, con potenziali conseguenze negative per l’organizzazione. Un’ipotesi ben definita deve essere concisa, concreta e testabile, senza presupporre una disponibilità illimitata di tempo e risorse. Un’ipotesi che il threat hunter non è in grado di verificare non è utile; pertanto, nella sua formulazione devono essere considerate le strumentazioni disponibili e i dati necessari. L’ipotesi non deve essere né troppo ampia né eccessivamente specifica, ma deve indicare chiaramente le fonti dei dati da analizzare e ciò che si intende cercare. Robert M. Lee e David Bianco hanno scritto un whitepaper per SANS intitolato Generating Hypotheses for Successful Threat Hunting. In questo documento, essi distinguono tre principali tipi di ipotesi: Basata sulla Threat Intelligence: questo tipo di ipotesi prende in considerazione gli Indicatori di compromissione (IOC) correttamente contestualizzati. Il principale rischio associato a questo tipo di ipotesi è l’eccessivo focus sugli IOC, che può generare corrispondenze di bassa qualità. È preferibile concentrarsi sulle TTP dell’attaccante piuttosto che su feed contenenti centinaia di indicatori. Basata sulla Situational Awareness: questo tipo di ipotesi si basa sull’identificazione degli asset più importanti all’interno dell’organizzazione, noto anche come Crown Jewels Analysis. L’hunter cerca di determinare cosa l’avversario potrebbe ricercare nell’ambiente dell’organizzazione, compresi i suoi obiettivi. Da questo punto di partenza, il threat hunter deve riflettere su quali dati e attività sarà necessario monitorare. È importante ricordare che non tutto deve rimanere confinato al dominio cyber: quando si formulano ipotesi basate sulla situational awareness, devono essere considerati anche persone, processi e requisiti di business. Basata sull’Expertise di Dominio: questo tipo di ipotesi deriva dall’esperienza e competenza del threat hunter. L’ipotesi generata è condizionata dal background e dalle esperienze del singolo hunter. Le cacce svolte in passato influenzeranno anch’esse le ipotesi future. In questo contesto, il processo di documentazione è particolarmente importante per registrare le lezioni apprese e condividerle con gli altri membri del team Le ipotesi migliori e di maggior successo sono quelle che combinano questi tre tipologie Tipologie di Threat Hunting Il team di Sqrrl ha individuato cinque differenti tipologie di Threat Hunting: data-driven, intel-driven, entity-driven, TTP-driven e hybrid. Contestualmente, tali tipologie possono essere ulteriormente classificate in strutturate (basate su un’ipotesi preliminare) e non strutturate (basate sull’osservazione di anomalie nei dati): L’approccio data-driven si basa sull’analisi approfondita dei dati di sicurezza disponibili (log, eventi di rete, endpoint telemetry), con l’obiettivo di individuare pattern anomali o comportamenti sospetti. L’approccio intel-driven è guidato da informazioni di Cyber Threat Intelligence, come indicatori di compromissione (IoC), report su campagne attive o profili di attaccanti, che orientano la ricerca verso minacce note o emergenti. L’approccio entity-driven si concentra sull’analisi del comportamento di specifiche entità (utenti, host, account di servizio), ricercando anomalie rispetto alla loro baseline. Il Threat Hunting TTP-driven prende come riferimento le Tactics, Techniques and Procedures degli attaccanti, spesso mappate tramite framework come MITRE ATT&CK, al fine di individuare segnali di compromissione anche in assenza di indicatori noti. Infine, l’approccio hybrid combina più metodologie, sfruttando simultaneamente dati, intelligence e modelli comportamentali per aumentare l’efficacia dell’attività di hunting. Le Competenze di un Threat Hunter Abbiamo già evidenziato che il Threat Hunting non è un’attività riservata esclusivamente ad analisti di sicurezza con elevata esperienza. Tuttavia, poiché la threat intelligence rappresenta uno dei principali elementi che attivano le attività di hunting, un buon threat hunter deve possedere almeno una conoscenza di base dei concetti fondamentali della Cyber Threat Intelligence, conoscere le tipologie di malware, le motivazioni o gli obiettivi dei threat actor, ecc… Inoltre, un threat hunter deve comprendere le modalità con cui un attaccante conduce un attacco, di conseguenza avere familiarità con il framework MITRE ATT&CK. Deve conoscere l’architettura di rete su cui si focalizza l’attività di hunting e avere dimestichezza con un SIEM, così da poter analizzare i log e individuare eventuali pattern anomali. Infine, il threat hunter deve saper comunicare in modo chiaro e strutturato i risultati delle proprie attività, affinché le evidenze emerse possano essere valorizzate e contribuiscano al miglioramento continuo del programma di Threat Hunting. La Pyramid of Pain La Pyramid of Pain di David Bianco è un modello utilizzato sia nella Cyber Threat Intelligence sia nel Threat Hunting. Rappresenta il livello di “dolore” che viene inflitto agli attaccanti quando sono costretti a modificare le proprie modalità operative a seguito dell’identificazione dei loro Indicatori di Compromissione, dell’infrastruttura di rete e degli strumenti utilizzati. I tre livelli inferiori della piramide (hash, indirizzi IP e nomi di dominio): sono principalmente rilevanti per i sistemi di rilevamento automatico. Si tratta di indicatori che un threat actor può modificare con relativa facilità e a costi contenuti. Ad esempio, se viene individuato l’hash di un malware o di uno strumento utilizzato dall’attaccante, quest’ultimo può aggirare il blocco semplicemente modificando il file, anche con cambiamenti minimi, ottenendo così un nuovo hash. Allo stesso modo, quando un nome di dominio viene scoperto e bloccato, l’attaccante può registrarne rapidamente un altro. Il cambio di indirizzi IP risulta ancora più semplice, mentre la registrazione e configurazione di nuovi domini richiede uno sforzo leggermente maggiore, poiché comporta costi e attività amministrative. I livelli intermedi della piramide, rappresentati dagli artefatti di rete e di host, richiedono invece un impegno più significativo per essere modificati dall’ attaccante. Rientrano in questa categoria indicatori come chiavi di registro, user agent o nomi di file. Se il team di Incident Response riesce a individuare e rilevare un numero elevato di questi indicatori, l’avversario può essere costretto a modificare in modo sostanziale o addirittura a riscrivere i propri strumenti di attacco. Un esempio utile è immaginare di aver investito tempo e risorse nello sviluppo di un software, adattandolo alle proprie esigenze, per poi doverlo abbandonare e ricominciare da zero. Pur sembrando un caso limite, rende bene l’idea della complessità che un attaccante deve affrontare Al vertice della piramide si collocano le tattiche, tecniche e procedure (TTP). In questo caso, la difesa non si concentra sugli strumenti utilizzati dall’attaccante, ma sulle modalità operative con cui viene condotto l’attacco. Il rilevamento delle TTP rappresenta l’azione più efficace, poiché obbliga l’avversario a cambiare il proprio modo di agire. Ciò comporta la necessità di ripensare le strategie adottate, apprendere nuovi metodi operativi e investire ulteriori risorse di tempo, di denaro e di competenze, rendendo l’attacco significativamente più costoso e complesso. Nella Pyramid of Pain, gli indicatori dei livelli inferiori sono più semplici da individuare, ma provocano un impatto limitato sull’attaccante, poiché possono essere modificati rapidamente e con poco sforzo. Man mano che si sale lungo la piramide, le informazioni diventano più complesse da ottenere, ma risultano anche molto più efficaci, in quanto costringono l’avversario a cambiare approccio, aumentando significativamente il costo e la difficoltà delle sue attività. Il Modello di maturità del Threat Hunting La composizione del team di Threat Hunting e il tempo dedicato all’attività di hunting dipendono dalle dimensioni e dalle esigenze dell’organizzazione. Quando non è disponibile un budget per un team dedicato, il tempo destinato al Threat Hunting viene ricavato dagli orari di lavoro di altri analisti di sicurezza. In questo scenario, gli analisti fanno generalmente parte del SOC (Security Operations Center) o del team di incident response. Tutte le organizzazioni possono svolgere attività di Threat Hunting, ma per farlo in modo efficace è necessario investire nelle infrastrutture e negli strumenti adeguati. Tuttavia, per ottenere un buon ritorno sull’investimento, l’organizzazione deve aver raggiunto un livello di maturità sufficiente nei propri processi. Gli effetti di un programma di Threat Hunting risultano limitati se il team non dispone delle competenze, degli strumenti e dei dati necessari. È in questo contesto che il Threat Hunting Maturity Model di David Bianco può aiutarci a determinare il livello di maturità di un programma di Threat Hunting considerando tre elementi: • competenze degli analisti • qualità e quantità dei dati raccolti • strumenti disponibili per analisi e accesso ai dati Tra questi, le competenze degli analisti sono il fattore più determinante, poiché trasformano i dati grezzi in capacità di rilevamento. Anche la qualità e la varietà dei dati influiscono fortemente sul livello di maturità: più dati affidabili sono disponibili, maggiore è la possibilità di individuare attività malevole. Il Threat Hunting Maturity Model può essere utilizzato per determinare lo stadio in cui si trova un’organizzazione e quali passi siano necessari per progredire verso un livello superiore. Il Hunting Maturity Model (HMM) descrive cinque livelli di maturità delle organizzazioni nel Threat Hunting, da HMM0 (minimo) a HMM4 (massimo). HMM0 – Initial Le organizzazioni a questo livello si affidano quasi esclusivamente a strumenti automatici (IDS, SIEM, antivirus) e a feed di threat intelligence per rilevare attività malevole. Il contributo umano è principalmente orientato alla gestione e risoluzione degli alert generati automaticamente. La raccolta dati è minima e sufficiente solo a supportare il rilevamento automatico; di conseguenza, queste organizzazioni non sono considerate in grado di svolgere attività di hunting. HMM1 – Minimal Oltre a usare sistemi automatici, le organizzazioni HMM1 iniziano a raccogliere sistematicamente dati dall’ambiente IT e punta un modello di rilevamento guidato dalla CTI (intel-driven). Quando emergono nuove minacce, gli analisti possono estrarre gli IOC dai report di Threat Intelligence ed effettuare ricerche retroattive sui dati raccolti per verificare se tali indicatori siano già comparsi in passato. Grazie a questa capacità di analisi, l’HMM1 costituisce il primo livello in cui si manifesta una forma, seppur limitata, di Threat Hunting. HMM2 – Procedural Le organizzazioni HMM2 applicano procedure di hunting sviluppate da terzi, adattandole se necessario. Queste procedure combinano dati specifici con tecniche di analisi per individuare particolari minacce (ad esempio malware o attività sospette). Le attività vengono eseguite regolarmente, anche se non sempre secondo una pianificazione rigorosa. HMM2 rappresenta il livello più comune tra le organizzazioni con programmi di hunting attivi. HMM3 – Innovative Le organizzazioni HMM3 creano e applicano procedure proprie, sfruttando tecniche analitiche avanzate come correlazioni di dati, visualizzazioni complesse o machine learning. La raccolta dati si evolve continuamente, integrando nuove fonti. Gli analisti trasformano le tecniche in processi ripetibili e documentati, aumentando notevolmente l’efficacia nel rilevare e contrastare le attività degli attaccanti. La crescita del numero di processi può però creare problemi di scalabilità. HMM4 – Leading Le organizzazioni HMM4 uniscono l’innovazione del livello precedente a un alto grado di automazione. I processi di hunting efficaci vengono automatizzati, liberando gli analisti dalle attività ripetitive e permettendo loro di sviluppare nuovi approcci o migliorare quelli esistenti. Questo approccio consente un miglioramento continuo del programma di Threat Hunting, rendendo l’organizzazione estremamente efficace nel contrastare le minacce. Automazione e Hunting Maturity Model Può apparire controintuitivo il fatto che sia HMM0 sia HMM4 facciano ampio uso dell’automazione, ma la differenza risiede nel modo in cui questa viene impiegata. Le organizzazioni HMM0 si affidano unicamente al rilevamento automatico, sia esso fornito dai vendor o sviluppato internamente. Anche se possono migliorare le proprie capacità introducendo nuove firme o feed di intelligence, il loro approccio alla scoperta delle minacce rimane sostanzialmente invariato. Anche in presenza di strumenti di analisi avanzati, se l’organizzazione si limita ad attendere la generazione di alert, non sta realmente svolgendo attività di hunting. Le organizzazioni HMM4, al contrario, sperimentano continuamente nuovi metodi per individuare i threat actor all’interno dei propri sistemi. Accettano che alcune iniziative possano non produrre risultati, mentre altre si rivelano efficaci. Questo tipo di approccio richiede creatività, curiosità e agilità, qualità che nessun prodotto di rilevamento completamente automatizzato può offrire. Una piattaforma di hunting può certamente rappresentare un valido supporto, ma la maturità necessaria per raggiungere il livello HMM4 non può essere acquistata. Processi di Threat Hunting All’interno di questo articolo verranno analizzati quattro processi di Threat Hunting: Threat Hunting Loop Threat Hunting Model Data-Driven Model TaHiTI – Targeted Hunting Integrating Threat Intelligence Threat Hunting Loop Il team Sqrrl ha definito uno dei primi processi di Threat Hunting il cosiddetto Threat Hunting Loop: Questo processo è ciclico ed è strutturato in quattro fasi. Nella prima fase il Threat Hunter formula un’ipotesi su una possibile minaccia che potrebbe impattare l’organizzazione. Una volta definita l’ipotesi, si passa alla seconda fase, in cui vengono avviate le indagini sull’ipotesi formulata attraverso ricerche sui dati raccolti da SIEM, EDR e altri strumenti di sicurezza. Nella terza fase si cerca di individuare attività anomale o sospette che normalmente non generano alert automatici, con l’obiettivo di confermare o smentire l’ipotesi iniziale. La fase finale del ciclo consiste nel raccogliere più informazioni possibili che possano arricchire l’analisi sull’ipotesi, ed infine cercare di automatizzare il più possibile l’intero processo. Ciò consentirà al team di concentrare i propri sforzi sulla ricerca di nuove minacce. Threat Hunting Model Dan Gunter e Marc Seitz, nel paper A Practical Model for Conducting Cyber Threat Hunting, propongono un modello pratico pensato per strutturare una processo di Threat Hunting. Questo modello è composto da sei fasi e mette in evidenza la natura iterativa del processo di hunting, sottolineando come ogni fase contribuisca al miglioramento continuo delle capacità di rilevamento: Scopo (Purpose): In questa fase si definisce l’obiettivo dell’attività di hunting, specificando quali dati sono necessari per svolgerla e quale risultato finale si intende ottenere. Lo scopo si articola in tre elementi principali: Scopo della ricerca: Indica la motivazione per cui l’attività di hunting viene avviata. Ambito della ricerca: Delinea l’ambiente in cui si svolgerà l’indagine, insieme alle assunzioni e alle eventuali limitazioni che ne influenzano il perimetro. Risultato desiderato: Specifica l’output atteso, che deve essere allineato agli obiettivi aziendali e mostrare in che modo il Threat Hunting contribuisce alla riduzione del rischio. Ambito (Scope): Questa fase prevede la definizione dell’ipotesi e l’identificazione della rete, dei sistemi, delle sottoreti o degli host dai quali si intende estrarre i dati. L’ambito deve essere definito in modo chiaro e preventivo, al fine di ridurre la quantità di “rumore” che potrebbe interferire con il successo dell’attività. Tuttavia, non deve essere eccessivamente specifico, poiché si rischierebbe di non rilevare la presenza dell’attaccante all’interno dell’ambiente. Equipaggiamento (Equip): Durante questa fase l’attenzione è focalizzata sulle modalità operative. In che modo verranno raccolti i dati? La raccolta è sufficientemente completa? Come verrà condotta l’analisi? In che modo verranno evitati eventuali bias? Al termine di questa fase, il threat hunter dovrebbe disporre di risposte approfondite a ciascuna di queste domande. L’implementazione di un Collection Management Framework (CMF) può supportare il tracciamento dei dati raccolti e della loro provenienza. Revisione del piano (Plan Review): Come suggerisce la denominazione, il responsabile del team o dell’attività di hunting esamina l’intera pianificazione svolta fino a quel momento, al fine di verificare che l’attività sia allineata agli obiettivi dell’organizzazione e che il team disponga di tutte le risorse necessarie (personale, dati, strumenti e tempo) per condurre con successo l’attività. Esecuzione (Execute): La fase di esecuzione si riferisce all’attività di hunting vera e propria, una volta che il piano è stato approvato. Feedback: Questa fase è correlata a tutte le fasi precedenti. L’analisi dei risultati consente al team di svolgere future attività di hunting con maggiore efficienza. L’obiettivo della fase di feedback è il miglioramento continuo di tutte le fasi precedenti; essa permette di identificare non solo se gli obiettivi siano stati raggiunti, ma anche eventuali bias in cui il team possa essere incorso, possibili lacune di visibilità e di raccolta dei dati da correggere, nonché la corretta allocazione delle risorse, e così via. Data-Driven Model Oltre ai modelli precedentemente descritti, i fratelli Roberto e José Luis Rodriguez hanno presentato una metodologia data-driven durante Insomni’hack 2019. Il loro processo prevede sei fasi distinte e, a beneficio della community, hanno sviluppato quattro progetti open source per strutturare e supportare le attività di Threat Hunting in ogni fase. Le sei fasi del modello Rodriguez sono: 1. Definizione dell’obiettivo di ricerca (Defining the research goal): Per un’attività di hunting data-driven, è essenziale comprendere i dati disponibili e mappare le informazioni sulle attività dell’avversario. Roberto Rodriguez suggerisce alcune domande chiave per definire correttamente l’obiettivo: Cosa stiamo cercando? Conosciamo i nostri dati? Esiste una data wiki? I dati sono archiviati correttamente? I log sono mappati alle azioni dell’avversario? Quanto deve essere specifica l’ipotesi? Quante tecniche o sotto-tecniche copre ciascuna ipotesi? 2. Modellazione dei dati (Modeling the data): Questa fase si concentra sulla comprensione dell’origine dei dati, sull’invio dei log a un data lake e sulla loro strutturazione tramite data dictionary, mappando ogni sorgente a un evento. OSSEM: progetto open source per documentare e standardizzare i log degli eventi di sicurezza. GitHub OSSEM 3. Emulazione dell’avversario (Emulating the adversary) Questa tecnica, tipica dei red team, replica i comportamenti degli avversari all’interno dell’organizzazione. È necessario mappare le loro azioni e concatenare le tecniche per creare un piano d’azione. Mordor: progetto open source che fornisce eventi di sicurezza simulati in formato JSON per testare le tecniche avversarie. GitHub Mordor Esempio: framework MITRE ATT&CK per la creazione di piani di emulazione basati su APT3. MITRE ATT&CK Plans 4. Definizione del modello di rilevamento (Defining the detection model) Basandosi sul modello dei dati, si definisce come condurre l’hunting. Il modello viene validato in laboratorio; in caso di risultati insoddisfacenti, si torna alle fasi precedenti per perfezionarlo. 5. Validazione del modello di rilevamento (Validating the detection model) Dopo aver testato il modello in laboratorio e verificato la qualità dei dati (completezza, coerenza, tempestività), si procede con l’ambiente di produzione. Possibili scenari: Assenza di risultati: comportamento dell’avversario non presente. Presenza di risultati: richiede approfondimenti per confermare la compromissione. Volume elevato di risultati: indica la necessità di affinamenti. The HELK: piattaforma open source basata su Elasticsearch, Logstash e Kibana, con funzionalità avanzate tramite Jupyter Notebook e Apache Spark. GitHub HELK 6. Documentazione e comunicazione dei risultati (Documenting and communicating findings) La documentazione deve procedere in parallelo all’attività di hunting e includere conclusioni, ipotesi sviluppate e concetti chiave. The Threat Hunter Playbook: progetto open source dei fratelli Rodriguez per supportare la documentazione, la condivisione di best practice e la costruzione di ipotesi di Threat Hunting. GitHub Threat Hunter Playbook TaHiTI – Targeted Hunting Integrating Threat Intelligence La metodologia Targeted Hunting Integrating Threat Intelligence (TaHiTI) è stata sviluppata congiuntamente da diverse istituzioni finanziarie olandesi per standardizzare l’approccio al Threat Hunting. Come suggerisce il nome, TaHiTI integra strettamente la threat intelligence, utilizzando informazioni sugli avversari per contestualizzare i dati rilevati durante le indagini o identificare TTP (Tactics, Techniques, and Procedures) note. Allo stesso tempo, il Threat Hunting secondo TaHiTI può arricchire la threat intelligence, permettendo di scoprire TTP e IoC (Indicators of Compromise) precedentemente sconosciuti. La metodologia è strutturata in otto passaggi, raggruppati in tre fasi principali: Fase 1 – Avvio Il trigger della caccia viene trasformato in un abstract per l’indagine, archiviato nel backlog. I principali trigger identificati da TaHiTI sono: Threat intelligence Altre indagini di hunting Security monitoring Security Incident Response (dati da incidenti storici o esercitazioni di red teaming) Altro L’abstract contiene una descrizione preliminare dell’ipotesi, la data di creazione, il trigger della caccia e il livello di priorità. Fase 2 – Hunting Questa fase comprende l’indagine vera e propria sull’ipotesi. L’abstract iniziale viene dettagliato con le nuove evidenze, le fonti dati, le tecniche di analisi, il perimetro dell’indagine, le risorse allocate e la threat intelligence disponibile. I risultati di ogni caccia possono essere: Ipotesi confermata: identificato un incidente di sicurezza. Ipotesi smentita: l’ipotesi viene confutata, dopo aver escluso ogni possibile scenario. Risultato inconcludente: informazioni insufficienti; l’ipotesi viene ulteriormente perfezionata fino a confermare o smentire. Fase 3 – Conclusione I risultati della caccia vengono documentati, includendo conclusioni, raccomandazioni di sicurezza e suggerimenti per ottimizzare il processo di hunting. I report sono adattati in base ai destinatari e ai livelli di autorizzazione. TaHiTI distingue cinque processi che possono essere attivati come risultato delle indagini di Threat Hunting: Security Incident Response: avvia un processo di IR. Security Monitoring: crea o aggiorna use case. Threat Intelligence: individua nuove TTP di un threat actor. Vulnerability Management: risolve le vulnerabilità scoperte. Raccomandazioni per altri team: vengono fornite indicazioni ad altri team per migliorare la postura di sicurezza complessiva dell’organizzazione Conclusioni Prima di iniziare l’attività di Threat Hunting vera e propria, è essenziale dedicare tempo a una fase approfondita di riflessione e pianificazione. In questo articolo abbiamo visto cos’è il Threat Hunting, i diversi approcci per implementarlo, le competenze chiave di un buon threat hunter e come formulare un’ipotesi efficace, elemento centrale di ogni processo di hunting. Alcuni concetti fondamentali da ricordare sono: Presumere che una violazione possa verificarsi. Il team di Threat Hunting deve avere una conoscenza approfondita dell’ambiente organizzativo per individuare eventuali anomalie. Dopo una caccia di successo, è importante automatizzare il processo il più possibile. Infine, è cruciale stabilire un processo standardizzato, documentarlo con cura e apprendere sia dai successi sia dagli insuccessi per migliorare continuamente le capacità di rilevamento. References “Practical Threat Intelligence and Data-Driven Threat Hunting: A hands-on guide to threat hunting with the ATT&CK™ Framework and open source tools” https://medium.com/@sqrrldata/the-cyber-hunting-maturity-model-6d506faa8ad5 https://www.aquasec.com/cloud-native-academy/application-security/threat-hunting/ https://detect-respond.blogspot.com/2015/10/a-simple-hunting-maturity-model.html https://sansorg.egnyte.com/dl/kJiJeYbCND https://www.sans.org/reading-room/whitepapers/threats/paper/37172 https://medium.com/@sqrrldata/the-hunting-loop-10c7d451dec8 https://www.betaalvereniging.nl/wp-content/uploads/TaHiTI-Threat-Hunting-Methodology-whitepaper.pdf
blog.8bitsecurity.comFeb 3, 2026extracted