Let’s talk about the identity gaps every team has to close. Join the convo.
Utility navigation bar redirect icon
Portal LoginSupportBlogContact
Search
Close search
Huntress Logo in Teal
  • Platform Overview
    Managed EDR

    Get full endpoint visibility, detection, and response.

    Managed EDR

    Get full endpoint visibility, detection, and response.

    Managed ITDR: Identity Threat Detection and Response

    Protect your Microsoft 365 and Google Workspace identities and email environments.

    Managed ITDR: Identity Threat Detection and Response

    Protect your Microsoft 365 and Google Workspace identities and email environments.

    Managed SIEM

    Managed threat response and robust compliance support at a predictable price.

    Managed SIEM

    Managed threat response and robust compliance support at a predictable price.

    Managed Security Awareness Training Software

    Empower your teams with science-backed security awareness training.

    Managed Security Awareness Training Software

    Empower your teams with science-backed security awareness training.

    Managed ISPM

    Continuous Microsoft 365 and identity hardening, managed and enforced by Huntress experts.

    Managed ISPM

    Continuous Microsoft 365 and identity hardening, managed and enforced by Huntress experts.

    Managed ESPM

    Proactively secure endpoints against attacks.

    Managed ESPM

    Proactively secure endpoints against attacks.

    Integrations
    Integrations
    Support Documentation
    Support Documentation
    See Huntress in Action

    Quickly deploy and manage real-time protection for endpoints, email, and employees - all from a single dashboard.

    Huntress Cybersecurity
    See Huntress in Action

    Quickly deploy and manage real-time protection for endpoints, email, and employees - all from a single dashboard.

    Huntress Cybersecurity
  • Threats We Stop
    Phishing
    Phishing
    Business Email Compromise
    Business Email Compromise
    Ransomware
    Ransomware
    Infostealers
    Infostealers
    Living off the Land
    Living off the Land
    Initial Access & RaaS
    Initial Access & RaaS
    View Allright arrowView Allright arrow
    Industries We Serve
    Education
    Education
    Financial Services
    Financial Services
    State and Local Government
    State and Local Government
    Healthcare
    Healthcare
    Law Firms
    Law Firms
    Manufacturing
    Manufacturing
    Utilities
    Utilities
    View Allright arrowView Allright arrow
    Tailored Solutions
    MSPs
    MSPs
    Resellers
    Resellers
    SMBs
    SMBs
    Compliance
    Compliance
    Disrupting your business is Big Cybercrime’s business model

    Stop unwanted interruptions before they stop your workflow.



    Huntress Cybersecurity
    Cybercriminals Have Evolved

    Get the intel on today’s cybercriminal groups and learn how to protect yourself.

    Huntress Cybersecurity
  • Pricing
  • Community Series
    The Product Lab

    Shape the next big thing in cybersecurity together.

    The Product Lab

    Shape the next big thing in cybersecurity together.

    Fireside Chat

    Real people. Real perspectives. Better conversations.

    Fireside Chat

    Real people. Real perspectives. Better conversations.

    Tradecraft Tuesday

    No products, no pitches – just tradecraft.

    Tradecraft Tuesday

    No products, no pitches – just tradecraft.

    _declassified

    Exposing hidden truths in the world of cybersecurity.

    _declassified

    Exposing hidden truths in the world of cybersecurity.

    Resources
    Upcoming Events
    Upcoming Events
    Ebooks
    Ebooks
    On-Demand Webinars
    On-Demand Webinars
    Videos
    Videos
    Whitepapers
    Whitepapers
    Datasheets
    Datasheets
    Cybersecurity Education
    Cybersecurity 101
    Cybersecurity 101
    Cybersecurity Guides
    Cybersecurity Guides
    Threat Library
    Threat Library
    Real Tradecraft, Real Results
    Real Tradecraft, Real Results
    2026 Cyber Threat Report
    2026 Cyber Threat Report
    The Huntress Blog
    From Malspam to DesckVB RAT Deployment
    Huntress Cybersecurity
    From Malspam to DesckVB RAT Deployment
    Huntress Cybersecurity
    When "Moderate" Means "Sometimes"
    Huntress Cybersecurity
    When "Moderate" Means "Sometimes"
    Huntress Cybersecurity
    Your Profile Is a Dossier. Here's Who's Reading It.
    Huntress Cybersecurity
    Your Profile Is a Dossier. Here's Who's Reading It.
    Huntress Cybersecurity
  • Why Huntress

    Go beyond AI in the fight against today’s hackers with Huntress Managed EDR purpose-built for your needs

    Huntress Cybersecurity
    Why Huntress

    Go beyond AI in the fight against today’s hackers with Huntress Managed EDR purpose-built for your needs

    Huntress Cybersecurity
    The Huntress SOC

    24/7 Security Operations Center

    The Huntress SOC

    24/7 Security Operations Center

    Reviews

    Why businesses of all sizes trust Huntress to defend their assets

    Reviews

    Why businesses of all sizes trust Huntress to defend their assets

    Case Studies

    Learn directly from our partners how Huntress has helped them

    Case Studies

    Learn directly from our partners how Huntress has helped them

    Community

    Get in touch with the Huntress Community team

    Community

    Get in touch with the Huntress Community team

    Compare Huntress
    Bitdefender
    Bitdefender
    Blackpoint
    Blackpoint
    Breach Secure Now!
    Breach Secure Now!
    Crowdstrike
    Crowdstrike
    SentinelOne
    SentinelOne
    Sophos
    Sophos
    Compare Allright arrowCompare Allright arrow
  • HUNTRESS HUB

    Login to access top-notch marketing resources, tools, and training.

    Huntress Cybersecurity
    HUNTRESS HUB

    Login to access top-notch marketing resources, tools, and training.

    Huntress Cybersecurity
    Partners
    MSPs

    Join our partner community to deliver expert-led managed security.

    MSPs

    Join our partner community to deliver expert-led managed security.

    Resellers

    Partner program designed to grow your cybersecurity business.

    Resellers

    Partner program designed to grow your cybersecurity business.

    Tech Alliances

    Driving innovation through global technology Partnerships

    Tech Alliances

    Driving innovation through global technology Partnerships

    Microsoft Partnership

    A Level-Up for Your Business Security

    Microsoft Partnership

    A Level-Up for Your Business Security

  • Press Release
    Huntress Announces Collaboration with Microsoft to Strengthen Cybersecurity for Businesses of All Sizes
    Huntress Cybersecurity
    Press Release
    Huntress Announces Collaboration with Microsoft to Strengthen Cybersecurity for Businesses of All Sizes
    Huntress Cybersecurity
    Our Story

    We're on a mission to shatter the barriers to enterprise-level security.

    Our Story

    We're on a mission to shatter the barriers to enterprise-level security.

    Newsroom

    Explore press releases, news articles, media interviews and more.

    Newsroom

    Explore press releases, news articles, media interviews and more.

    Meet the Team

    Founded by former NSA Cyber Operators. Backed by security researchers.

    Meet the Team

    Founded by former NSA Cyber Operators. Backed by security researchers.

    Careers

    Ready to shake up the cybersecurity world? Join the hunt.

    Careers

    Ready to shake up the cybersecurity world? Join the hunt.

    Awards
    Awards
    Contact Us
    Contact Us
  • Portal Login
  • Support
  • Blog
  • Contact
  • Search
  • Get a Demo
  • Start for Free
Portal LoginSupportBlogContact
Search
Close search
Get a Demo
Start for Free
HomeBlog
From Malspam to DesckVB RAT Deployment
Published:
June 3, 2026

From Malspam to DesckVB RAT Deployment

By:
Anna Pham
Adam Mooney
Share icon
Glitch effectGlitch effectGlitch effect

Key Takeaways

  • DesckVB RAT first emerged around February 2026 and has been making the rounds ever since. The activity originated from a malspam kit.

  • What makes the malspam kit clever is that it doesn't need to be customised for each target. It reads the victim's email from the URL, rebuilds the page on the fly, and pulls in the company logo live, no org-specific content hardcoded anywhere.

  • Before the malspam link gets close to a malicious domain, it routes through ad.doubleclick[.]net, a legitimate, high-reputation Google-owned domain that most email gateways won't blink at. A gateway that inspects attachments before delivery has an opportunity to stop the chain before it starts.

  • The attack never really touches the disk in any meaningful way. It's a five-stage chain. HTML, JScript, PowerShell, .NET loader, then the RAT, leaning heavily on in-memory execution and .NET reflection to stay under the radar.

  • If the loader detects a sandbox or analysis tool, it quits and reboots the machine. That's a deliberate move to complicate triage.

  • Once it lands, the RAT actively patches AMSI and ETW at the native API level, effectively blinding Windows telemetry before it even sets up persistence.

  • Rather than dropping its own unsigned binary, the RAT hides inside legitimate Microsoft-signed processes. InstallUtil.exe and MSBuild.exe are both hardcoded injection targets, giving it cover under trusted system tools.

  • The RAT phones home to DDNS domains on a non-standard port, keeping infrastructure cheap and easy to rotate. Blocking an IP gets you nowhere when the operator can swap it out in minutes.


Background

In May 2026, the Huntress SOC responded to a DesckVB RAT infection that began with a malspam. Short for “malicious spam,” malspam is email crafted to deliver malware or trick a user into taking an action that starts the infection chain, whether that is opening a booby-trapped attachment, clicking a malicious link, or handing over credentials on a fake login page. Still to this day, malspam remains one of the most prolific initial access vectors for attackers. At first glance, this case could be mistaken for just another malspam infection, but the delivery chain tells a more interesting story.

Before the victim ever reaches attacker-controlled infrastructure, the lure routes through DoubleClick, a legitimate Google-owned domain that many security tools are less likely to treat as suspicious. From there, the victim is passed into a malspam kit that personalizes itself on the fly using the victim’s email address, dynamically pulling in company branding and location details to make the page feel convincing without requiring the operators to handcraft a lure for each target.

That matters because it shows how malspam operations are becoming more scalable without becoming less believable. The attackers do not need a bespoke kit for every organization. They can reuse the same infrastructure and still give each victim a page that looks specific to them, which lowers the cost of the campaign while increasing the odds that someone clicks.

Once the victim interacts with the lure, the operation shifts from social engineering to layered malware staging. DesckVB RAT has been making the rounds throughout 2026, and it’s not slowing down. At its core, it’s a JavaScript-based Trojan, but what makes it nasty is the chain it kicks off once it lands on a machine. Rather than dropping one obvious payload, the chain moves through JScript, PowerShell, and .NET components that work together to retrieve, assemble, and run the final malware largely in memory. 

From there, the RAT phones home to a C2 server, handing the attacker full remote control of the box. At that point, the attacker can pull data, run commands, or use the foothold however they see fit, all while keeping a minimal detection footprint. 

The RAT enumerates installed AV products via WMI on the first beacon, which is standard profiling before deciding what to drop next. It also goes out of its way to specifically detect NVIDIA (GTX/RTX) and AMD (Radeon) GPUs through both WMI and direct registry reads. That level of GPU-specific interest could point toward crypto mining as a follow-on goal, or it may be used for masquerading purposes.

For defenders, that is what makes this worth paying attention to: the malspam is only the opening move, and everything behind it is built to land quietly, stay hidden, and give the attacker room to operate.


Timeline

Figure 1: Diagram showing attack path


Initial discovery

Our investigation began with a process execution signal indicating the execution of a suspicious JavaScript file via WScript.exe.

Figure 2: Initial detections for WScript


The next clue was heavily encoded, obfuscated PowerShell code that, when decoded and deobfuscated, revealed it to be a PowerShell dropper.

Figure 3: Encoded and obfuscated PowerShell


Malspam analysis

Initial access occurred via a malspam email containing a malicious HTML attachment, Bestellung_2026.html (“Bestellung” = German for “order/purchase order”). The attachment is a minimal HTML file whose entire content is a zero-second meta-refresh redirect. The meta-refresh sends the browser to a Google DoubleClick Campaign Manager click-tracking URL (ad.doubleclick[.]net/ddm/trackclk/N4892.5020.4774291382421/B23999293.271539123), bearing campaign and creative identifiers (dc_trk_aid=466016770, dc_trk_cid=131101292). The next destination is appended after the ?, with the recipient's email base64-encoded in that destination's URL fragment. Why do threat actors route through DoubleClick? The likely rationale is filter and reputation evasion. ad.doubleclick[.]net is a high-reputation Google-owned domain that is rarely blocklisted and is frequently allowlisted by email security gateways, web proxies, and URL-reputation services - so the only domain visible in the email body and at the front of the chain is one defenders are unlikely to flag, deny, or sandbox.

Figure 4: Malicious HTML attachment


DoubleClick forwards to fostercareintheus.optimizationprime[.]com/b#<base64-email>. This host does not serve the kit, it is a redirector stage. It decodes the base64 email and forwards the browser to the kit host, carrying the email as a plaintext fragment. This stage adds a domain layer between the trusted DoubleClick front and the actual kit host. The chain lands on the delivery kit at hxxps://bth.startthewave[.]org/a/#<plaintext-email> (e.g. bth.startthewave[.]org/a/#<email_address>). Clicking “PDF herunterladen” (“Download PDF”) triggers downloadFile(), which builds a hidden HTML form and POSTs email=<address> to hxxps://pengajian.muliastudy[.]com/images/edu/u.php. The server responds with a ZIP archive (A021185521S210008-11521.zip) as the response body. 

The lure page (served from bth.startthewave[.]org/a/) is a single self-contained HTML file. setupEmailAndUI() reads the recipient's email from the URL fragment (window.location.hash), extracts the domain, and rewrites the page title, header logo text, and footer to impersonate the recipient's employer. The company logo is fetched live at runtime via a fallback chain - Clearbit, logo.dev, Google favicons, favicone, DuckDuckGo, then the company's own /favicon.ico. The kit contains no organization-specific content; swapping the email rebrands it instantly. 

fetchLocationAndTime() calls ipapi[.]co/json/ and prints the viewer's city, region, country, and local time into the header - social engineering to make the page feel personalized and “secure”.

The kit only renders if a #email URL fragment is present; setupEmailAndUI() builds the entire page from it. With no fragment, the page shows “E-Mail nicht gefunden. Weiterleitung…” (”Email not found. Redirecting…”) and redirects to bing[.]com after two seconds.


JScript multi-stage loader

The ZIP archive delivered by u.php contains a JScript file named A021185521S210008-11521.js. It is not the final malware itself but a multi-stage loader whose job is to retrieve and execute a .NET RAT while evading analysis. The file is heavily padded with junk—hundreds of repeated dead functions, garbage Unicode strings, ;;;;; filler, and Portuguese-language comments.

Figure 5: Contents of A021185521S210008-11521.js

On execution, the script checks its own path via WScript.ScriptFullName. If it is running from a Temp or Downloads folder - i.e. it has just been extracted from the ZIP by the victim—it copies itself to C:\Users\Public\ktncm.js, relaunches that copy with wscript.exe //nologo, and exits the current instance. If it is running from anywhere else, the relocation is skipped (the else branch is empty) and execution proceeds directly to the payload-staging logic. The net effect is that the first run relocates the script to a stable, world-writable directory, and the relocated copy, no longer in a Temp/Downloads path, falls through on its second run and proceeds to detonate.

The script holds a large base64 blob mangled with literal A characters and the token 9999 inserted throughout to defeat static detection. The function vjwNvhDoHz() repairs the blob with string replacements, base64-decodes it into a PowerShell script, writes it to C:\Users\Public\nlbzl.ps1, and executes it hidden with powershell -ExecutionPolicy Bypass -file.

The dropped PowerShell performs, in order: a connectivity check (Test-Connection to www.google.com)—if offline, it does not simply exit but invokes a function that runs Restart-Computer -Force, rebooting the machine; an anti-analysis sweep that enumerates running processes against a blocklist of debugging and sandbox tooling (Dbgview, tcpvcon, tcpview, OLLYDBG, ImmunityDebugger, Wireshark, an autoruns/runsc reference, apateDNS, and the strings any.run, sandbox, analyze), with the same Restart-Computer response if any are found; and a payload download via WebClient. For the download, the script decodes an embedded base64 string to a URL on hxxps://andrefelipedonascime1778799406970.2241107.meusitehostgator[.]com[.]br/GpazlLUWIJ_14_05_Meus_ArquivosDeTexto/03.txt, writes it to C:\Users\Public\zkrbx.txt, then reads that file back and uses its contents as the target for WebClient.DownloadData; the response is split on a %x% delimiter, and the second chunk is written to C:\Users\Public\gglhn.txt.

The dropped PowerShell (nlbzl.ps1) does not itself perform the reflective load - it acts as a builder, assembling a further PowerShell script as a string and writing it to C:\Users\Public\shmvg_01.ps1, which it then launches with powershell -ExecutionPolicy bypass -File. It is this generated script that performs the .NET reflective load ([Reflection.Assembly]::Load), resolves the type ClassLibrary3.Class1, and invokes the method prFVI. The signed Microsoft binary InstallUtil.exe (C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil) is passed as one of the arguments to prFVI for signed-binary proxy execution. Two URLs - hxxps://andrefelipedonascime1778799406970.2241107.meusitehostgator[.]com[.]br/GpazlLUWIJ_14_05_Meus_ArquivosDeTexto/PeNo and hxxp://catalogo.castrouria[.]com/c84da/bl.txt - are also passed as arguments to prFVI; they are consumed by the final .NET payload rather than fetched by any PowerShell stage.


The .NET loader (03.txt)

The retrieved 03.txt payload is not the final malware—it is a stager whose job is to verify it is not being analyzed, disable the machine's defenses, download and assemble the next stages, establish persistence, and execute the final payload.

Figure 6: Hardcoded configuration fields in the .NET loader

When the loader runs, the PowerShell stage passes it two web addresses. The first, after the loader decodes it, points to hxxp://catalogo.castrouria[.]com/c84da/bl.txt. The second one is on hxxps://andrefelipedonascime1778799406970.2241107.meusitehostgator.com[.]br/GpazlLUWIJ_14_05_Meus_ArquivosDeTexto/PeNo. PeNo is not a file - it is a configuration flag. The loader reads that flag, strips it off the end of the URL, and treats what remains as a base path, appending 01.txt and 02.txt to build the two URLs it actually downloads from.

Anti-analysis checks

Before doing anything else, the loader sweeps the environment and aborts—deleting its files and, in most cases, rebooting the machine—if it detects analysis. It checks for virtual machines and sandboxes (VirtualBox, VMware, Hyper-V, Parallels, QEMU, and Sandboxie artifacts, including SbieDll.dll, vmhgfs.dll, the VirtualBox Guest Additions directory, and the Sandboxie registry key); sandbox and triage services (mksSandbox, joeboxserver, triage); cloud and RDP host indicators (WindowsAzureGuestAgent, azurearcsystray, rdpclip, Servermanager); BIOS registry values containing “virtual” or “Hyper-V”; the presence of Desktop\scan.7z; an attached debugger; and analysis tooling by process and window title (Wireshark, OllyDbg, ImmunityDebugger, apateDNS, Process Monitor, tcpvcon, handle, autorunsc, Dbgview, any.run). When a trigger fires, the loader writes a marker file describing it—vm.txt for a VM or sandbox hit, Debugger.txt for an attached debugger, 01_detect_analisse_process.txt for an analysis tool (this one records the offending process name and window title in its content) then exits. 

Environment cleanup and staging directory

The loader deletes all .txt and .ps1 files from %TEMP% and C:\Users\Public, removing earlier-stage artifacts. It then creates a deeply nested working directory under %UserProfile%\AppData\LocalLow\, using NVIDIA-themed folder names (LocalLow Windows, Program Rules, Program Rules NVIDEO) repeated across multiple levels to mimic a legitimate driver installation path. 

Defender tampering and AV handling

If no Avast, AVG, or Malwarebytes (MBAMService) process is running, the loader executes a PowerShell command to disable Microsoft Defender protections - real-time monitoring, intrusion prevention, MAPS reporting, and sample submission - and adds the entire system drive as a Defender exclusion path. It also terminates the security product QHActiveDefense (Qihoo 360) if present.

Payload retrieval

The loader downloads three remote files using a hardcoded legacy Internet Explorer 8 User-Agent “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.0.0”:

  • hxxp://catalogo.castrouria[.]com/c84da/bl.txt

  • hxxps://andrefelipedonascime1778799406970.2241107.meusitehostgator.com[.]br/GpazlLUWIJ_14_05_Meus_ArquivosDeTexto/01.txt

  • hxxps://andrefelipedonascime1778799406970.2241107.meusitehostgator.com[.]br/GpazlLUWIJ_14_05_Meus_ArquivosDeTexto/02.txt

The 01.txt and 02.txt URLs are built at runtime from the base path described above. 

Each downloaded file is processed through several layers: a split on a multi-byte delimiter, string reversal, base64 decoding, and a character-substitution routine. The loader then substitutes a set of placeholder tokens with runtime values, assembling the final script.

Persistence

Persistence is established in three ways: a Run registry entry and a RunOnce registry entry under HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\, each named Update Drivers NVIDEO_<random> and configured to launch the staged script hidden via powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass; and a copy of the loader placed in the user's Startup folder. The NVIDIA-themed naming and randomized registry value names are intended to evade casual inspection.

Final execution

The assembled payload is written as a randomly-named .ps1 into the NVIDIA-themed LocalLow directory and executed with powershell.exe -ExecutionPolicy Bypass -File, hidden and with no window. The loader toggles WOW64 filesystem redirection around execution depending on whether the final payload targets a 64-bit or 32-bit .NET framework path - behavior consistent with a process-injection (RunPE) final stage that loads code into a target process.


The template script (02.txt)

The 02.txt file is not a standalone payload but a PowerShell template containing placeholder tokens. After the loader fills in the token values, the resulting script performs one operation: it takes the decoded 01.txt bytes and reflectively loads them as a .NET assembly (ClassLibrary1.dll), resolves the Run method through reflection, splitting the class name across string concatenations to break static signatures—and invokes it statically with three arguments:

  • A string containing the InstallUtil.exe target path concatenated with delimiter-separated metadata values (staging directory path, process IDs, and configuration flags).

  • A byte array containing the decoded bl.txt content - the packed VenomRAT payload.

  • A boolean selecting the 32-bit or 64-bit injection path.

The template before token substitution:

Loading Gist...

The %qlxKP% token is replaced with the decoded 01.txt byte array (the RunPE injector), %nkGMv% with the decoded bl.txt byte array, %yzXVM% with the InstallUtil.exe path, and %trueorfalse% with the 32/64-bit flag. The NhqIM string serves as a delimiter that the injector's Run method parses to extract the metadata fields. 

The injection target is operator-configurable—the %yzXVM% token is filled at build time by ClassLibrary3. In the sample analyzed statically, InstallUtil.exe was the configured target. In telemetry from a live intrusion, we observed MSBuild.exe being used instead.


The RunPE injector (01.txt - ClassLibrary1.dll)

The decoded 01.txt content is a .NET DLL. Its purpose is process hollowing: it takes a payload, a target process, and injects one into the other.

The payload implements the actual process hollowing using the standard RunPE API chain: CreateProcessA (create target suspended), ZwUnmapViewOfSection (unmap the original image), VirtualAllocEx (allocate new memory), WriteProcessMemory (write the payload), GetThreadContext/SetThreadContext (fix the entry point), and ResumeThread (start execution). It also handles Wow64GetThreadContext/Wow64SetThreadContext for cross-architecture injection. All API names are mangled in the binary. Notably, the CreateProcessA wrapper retains the Portuguese word “criando” (meaning “creating”) in its mangled name.

Figure 7: The VirteyQDs64x method revealed - a DllImport for VirtualAllocEx from kernel32.dll, with obfuscated parameter names

Anti-analysis

The assembly checks for attached debuggers at runtime and enumerates running processes against a hardcoded blocklist: debugger, Wireshark, apateDNS, analyze, Analysis, any.run, anyrun, and tcpvcon. If any match is found, the injector will not proceed with execution.


DesckVB RAT (bl.txt)

The bl.txt content, injected into InstallUtil.exe by the RunPE injector, is not the RAT itself but another packing layer. The injected assembly triggers a multi-step unpacking chain before the actual malware executes.

When the assembly loads, a static constructor reads an embedded resource and decrypts it using a custom stream cipher. A 32-byte key and a 16-byte IV are loaded, in this sample the IV is identical to the first 16 bytes of the key, so XOR'ing the key with the IV zeros out the first half, leaving only the last 16 bytes as the effective key. The cipher processes the resource data in 4-byte blocks: for each block, a running accumulator is fed through a scramble function that generates a keystream dword via byte-swapping, multiply-accumulate operations with magic constants (9495, 10476, 22014), shift-XOR mixing (<< 9, << 1, >> 5), and cross-term combination. The resulting keystream is XOR'd against the ciphertext block to produce plaintext. The decrypted output is optionally LZX-decompressed, then reflectively loaded via Assembly.Load. 

The embedded resource is accessed through a ResourceResolve hook registered on the AppDomain. The resource is then passed through two transforms: TripleDES decryption in CBC mode with PKCS7 padding, followed by GZip decompression. The TripleDES parameters:

  • Key: lHxoBf+5Ft6YrDx4FyDWwg==

  • IV: nFukcUaa5h0=

The decrypted payload is a .NET assembly that is itself protected by another instance of the same XOR/LZX encryption to protect its embedded protobuf-net dependency.

DesckVB RAT packs the entire configuration into a single protobuf-serialized message, base64-encodes it, and stores it as one string literal. At startup, the config blob is decoded from base64, deserialized via protobuf, and loaded as the active settings:

Loading Gist...


Figure 8: DesckVB RAT configuration

The RAT communicates over raw TCP sockets using AES-encrypted, protobuf-serialized messages. The AES key is derived from the P@55w0rd! password using Rfc2898DeriveBytes (PBKDF2). RSA is used for the initial key exchange, and the RAT pins the server's identity using five embedded SHA-256 certificate hashes:

  • D5B7247C497788CF0031CEB06E3DF77A45FEF59F1E49633DC7159816D64759B5

  • C61B1941CF756EB7551F7C661743802362728B785ADC22E860D269713DFB01A6

  • C356AFF1A01C2B0DA472E584C8E3C8F875B9A24280435D42836A77B19F5A8C18

  • F1C3EBE78BD8C38559BF3CFCC9A9FA37D221E31780774A3787E26160A61F5348

  • E91FB249AA97BE5C7931E430781167EDFE7BA804720B5F643E6AB70B7E6E74DD

System reconnaissance

On initial beacon, the RAT collects a hardware fingerprint via WMI queries for Win32_Processor (ProcessorId), Win32_DiskDrive (SerialNumber), Win32_BaseBoard, Win32_VideoController, and Win32_OperatingSystem. It specifically detects NVIDIA (GTX/RTX) and AMD (Radeon) GPUs through both WMI and direct registry reads (HardwareInformation.AdapterString, HardwareInformation.qwMemorySize). It enumerates installed AV products via WMI (Select * from AntivirusProduct against the SecurityCenter2 namespace).

Process injection

DesckVB RAT uses its own RunPE implementation (separate from the 01.txt injector), resolving Win32 APIs at runtime through an obfuscation technique: each API name is base64-encoded with @ characters inserted at random positions to break static signatures. At runtime, the @ characters are stripped and the string is base64-decoded to recover the real function name, which is then resolved via GetProcAddress:

  • CreateProcessA 

  • ZwUnmapViewOfSection 

  • VirtualAllocEx 

  • WriteProcessMemory 

  • GetThreadContext 

  • SetThreadContext 

  • Wow64SetThreadContext 

  • ResumeThread 

  • ReadProcessMemory 

  • CloseHandle

Figure 9: Each Win32 function name is stored as a base64 string with @ characters inserted at random positions

Both MSBuild.exe and InstallUtil.exe are hardcoded in the RAT's string table as injection targets. Which one is used on a given victim is operator-configurable: the 02.txt template's %yzXVM% token is filled at build time by ClassLibrary3. 

Installation and persistence

Before establishing persistence, DesckVB RAT runs a self-install routine. It first checks whether it is already running from its intended install location under LocalApplicationData. If not, it checks whether it has administrative privileges. If running as a standard user, it relaunches itself elevated via cmd /k START “” “<self>” & EXIT with Verb = “runas”, triggering the UAC elevation prompt then exits the current instance. Once elevated, it sleeps for a randomized delay (4-7 seconds), adds Defender exclusions (described below), copies itself to the install path under a randomly generated .exe filename, registers persistence, and exits. The new copy starts on the next boot or logon via the registered persistence mechanism.

Persistence is established through registry Run and RunOnce keys (HKCU\Software\Microsoft\Windows\CurrentVersion\Run and \RunOnce) and two types of scheduled tasks. The first is a one-shot launcher: it creates a task that triggers 5 seconds after creation and expires after 20 seconds, a run-once-soon mechanism to start the newly installed copy. The second is the real persistence: a repeating task with a randomized interval of 8-11 minutes (PT{8-11}M) and no expiry, ensuring the RAT restarts if terminated. Both tasks are created by writing a full XML task definition to a temp file ({GUID}.xml), executing schtasks /Create /TN “<name>” /XML “<path>” /F, waiting up to 5 seconds for completion, then deleting the XML file. The privilege level is set dynamically - HighestAvailable if the RAT is running as admin, LeastPrivilege otherwise. A mutex (configurable via the config) prevents multiple instances from running simultaneously, with a 30-second acquisition timeout.

Defense evasion

During the install routine, the RAT builds a PowerShell command that adds multiple Defender exclusions in a single execution: path exclusions for LocalApplicationData, the system temp directory, and the RAT's own install path, plus a process exclusion for the RAT's executable. The command is run via powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile.

The RAT also patches AMSI and ETW at the native API level. It first checks the Windows build number from the registry—if the build is 26100 or higher (Windows 11 24H2), it resolves NtManageHotPatch from ntdll.dll and overwrites its prologue with a stub that returns STATUS_NOT_SUPPORTED (0xC00000BB). On 64-bit systems, the patch is mov eax, 0xC00000BB; ret; on 32-bit, mov eax, 0xC00000BB; ret 0x10. Before writing, it verifies the function prologue is intact by checking for 0x4C 0x8B (64-bit) or 0xB8 (32-bit) as the first bytes. This targets the hot-patch-based AMSI loading mechanism introduced in Windows 11 24H2.

Separately, on 64-bit systems, the RAT patches EtwEventWrite by pattern-scanning ntdll.dll for its function prologue signature (with wildcard bytes for relocatable offsets) and overwriting the entry point with xor rax, rax; ret, making all ETW event logging a no-op. Both patches use VirtualProtectEx to change memory protection, WriteProcessMemory to apply the patch, and FlushInstructionCache to ensure the modified code takes effect.

Additional payload delivery

The RAT can receive additional payloads from the C2 and execute them in three different modes depending on flags set by the operator.

In-memory injection mode downloads the payload bytes directly into memory, randomly selects between MSBuild.exe and InstallUtil.exe as the injection target, and performs RunPE process hollowing to execute the payload without writing it to disk. The PID of the injected process is tracked so the RAT can manage or kill it later.

PowerShell mode downloads the payload to a temp file with a .ps1 extension, waits 2 seconds, then executes it via powershell.exe -NoProfile -ExecutionPolicy ByPass -File and registers it as a one-shot scheduled task.

File-drop mode downloads the payload, decrypts it (AES), writes it to disk, and registers it as a scheduled task for execution.

Self-cleanup

The RAT can kill processes by PID with a configurable delay (cmd /c timeout 10 && taskkill /F /PID), delete itself (cmd /c timeout 15 && del /a /q /f), and remove its scheduled tasks (schtasks /Delete /TN).


Conclusion

What started as a malspam email quickly evolved into a more deliberate attack, likely with data exfiltration as the end goal, and, if left unchecked, a full hands-on intrusion.

This is a strong reminder of why defence in depth matters. Configuring a Group Policy Object (GPO) in Active Directory to force script files such as .vbs, .hta, and .js to open in Notepad by default can stop a threat actor at the very first stage, preventing additional payloads from ever being dropped.

On the email security front, organizations should consider deploying DMARC, DKIM, and SPF records to reduce the likelihood of spoofed or malicious emails reaching end users. Beyond that, an email gateway solution capable of sandboxing attachments and links before delivery adds another meaningful layer of protection. Blocking or quarantining macro-enabled Office documents and script-based attachments at the mail gateway is a low-effort control that pays dividends. Where feasible, enabling Safe Links and Safe Attachments (or equivalent) ensures URLs and files are inspected at time-of-click rather than time-of-delivery.


Recommendations

  • Configure a GPO that forces .js, .vbs, and .hta files to open in Notepad or Notepad++ by default, neutralising their ability to execute without additional user effort.

  • Run regular phishing awareness training and conduct internal simulated phishing campaigns to build a more resilient workforce. The human layer remains the most consistently exploited entry point.

  • Deploy email authentication controls, including SPF, DKIM, and DMARC to harden the email perimeter and reduce exposure to spoofing and impersonation attacks.

  • Implement an email security gateway with sandboxing capability and consider blocking or quarantining script-based and macro-enabled attachments at the mail layer before they reach the endpoint.


Detections

  • Alert on .js, .vbs. Hta files as a child process of explorer.exe.

  • Monitor for wscript.exe invoking the following directory "C:\Users\Public\ and spawning encoded and obfuscated PowerShell.



Indicators of Compromise (IoCs)

Indicator

Description

Bestellung_2026.html

Malicious HTML attachment

fostercareintheus.optimizationprime[.]com

Redirector stage

bth.startthewave[.]org

Delivery kit

pengajian.muliastudy[.]com/images/edu/u.php

This serves the ZIP archive it's payload delivery

A021185521S210008-11521.zip

Delivery ZIP archive served by malspam kit (u.php)

A021185521S210008-11521.js

JavaScript loader

ktncm.js

JavaScript loader

zkrbx.txt

Staging file

gglhn.txt

Staging file

nlbzl.ps1

PowerShell dropper

shmvg_01.ps1

PowerShell stager

andrefelipedonascime1778799406970.2241107.meusitehostgator[.]com[.]br

Serves 01.txt, 02.txt, 03.txt staging files

%USERPROFILE%\AppData\LocalLow\LocalLow Windows\Program Rules\Program Rules NVIDEO\Program Rules\Program Rules NVIDEO

DesckVB RAT staging directory — NVIDIA-themed nested path used to mimic a legitimate driver install path

catalogo.castrouria[.]com

Serves bl.txt (the packed RAT), payload delivery

SHA256:

D5B7247C497788CF0031CEB06E3DF77A45FEF59F1E49633DC7159816D64759B5

C61B1941CF756EB7551F7C661743802362728B785ADC22E860D269713DFB01A6

C356AFF1A01C2B0DA472E584C8E3C8F875B9A24280435D42836A77B19F5A8C18

F1C3EBE78BD8C38559BF3CFCC9A9FA37D221E31780774A3787E26160A61F5348

E91FB249AA97BE5C7931E430781167EDFE7BA804720B5F643E6AB70B7E6E74DD

DesckVB RAT hardcoded C2 certificate pin

P@55w0rd! 

Hardcoded AES password used by the RAT for C2 comms derivation via PBKDF2

xtadts.ddns[.]net

DesckVB RAT C2 server

afxwd.ddns[.]net

DesckVB RAT C2 server

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)

Hardcoded IE8 User-Agent used by DesckVB .NET loader for payload retrieval




Categories
Threat Analysis
ChatGPT logoChatGPTOpens in new tabClaude logoClaudeOpens in new tabPerplexity logoPerplexityOpens in new tabGoogle Gemini logoGoogle AIOpens in new tab
AI sparkle iconSummarize This Page
ChatGPT logoChatGPTOpens in new tabClaude logoClaudeOpens in new tabPerplexity logoPerplexityOpens in new tabGoogle Gemini logoGoogle AIOpens in new tab

Curious how cybercriminals think?

Join John Hammond and former cybercriminal Jesse McGraw for the latest edition of declassified and learn how attackers turn timing into business disruption.
Grab your spot
Share
Facebook iconTwitter X iconLinkedin iconDownload icon
Glitch effect

You Might Also Like

  • How do you protect computers from attackers if you’re not familiar with hacking techniques?

    How do you protect computers from attackers if you’re not familiar with hacking techniques? The historical answer to this question has been antivirus and firewalls. However, the last several years have demonstrated hackers can slip past these preventative technologies and cause devastating results to the victims.
  • Spidering Through Identity for Profit and Disruption

    Dive into the recent Las Vegas casino cyberattacks linked to Scattered Spider, and learn how organizations can defend against such identify-based attacks.
  • CVE-2025-30406 - Critical Gladinet CentreStack & Triofox Vulnerability Exploited In The Wild

    Huntress has observed in the wild exploitation against CVE-2025-30406, a weakness due to hardcoded cryptographic keys.
  • Huntress MDR for Microsoft 365: The Full Story

    Read up on how and why Huntress built its Managed ITDR (formerly MDR for Microsoft 365) solution to help combat the growing threat of business email compromise (BEC).
  • Credential Theft Prevention: What Attackers Do Next

    What is credential theft? Learn how threat actors use phishing, brute force, and tools like Mimikatz or Registry hive dumps to gain initial access and move laterally.
  • How Huntress Uses Managed SIEM to Detect Faster and Hunt Smarter

    See how Huntress uses Managed SIEM to detect threats faster, hunt smarter, and deliver comprehensive protection across endpoints, identities, and infrastructure.
  • Cephalus Ransomware: Don’t Lose Your Head

    In mid-August, Huntress saw two incidents that linked back to a ransomware variant called Cephalus, which included DLL sideloading via a legitimate SentinelOne executable.
  • Healthcare Held Hostage: Fighting the Plague of Ransomware

    Ransomware is spreading like wildfire. Learn about its growing threat to healthcare, its impact on patient care, and how Huntress managed solutions can better protect your organization from cyberattacks.

Sign Up for Huntress Updates

Get insider access to Huntress tradecraft, killer events, and the freshest blog updates.
Privacy • Terms
By submitting this form, you accept our Terms of Service & Privacy Policy
Huntress Managed Security PlatformManaged EDRManaged EDR for macOSManaged EDR for LinuxManaged ITDRManaged SIEMManaged Security Awareness TrainingManaged ISPMManaged ESPMBook a Demo
PhishingComplianceBusiness Email CompromiseEducationFinanceHealthcareManufacturingState & Local Government
Managed Service ProvidersResellersIT & Security Teams24/7 SOCCase Studies
BlogResource CenterCybersecurity 101Upcoming EventsSupport Documentation
Our CompanyLeadershipNews & PressCareersContact Us
Huntress white logo

Protecting 250k+ customers like you with enterprise-grade protection.

Privacy PolicyCookie PolicyTerms of UseCookie Consent
Linkedin iconTwitter X iconYouTube iconInstagram icon
© 2025 Huntress All Rights Reserved.

Join the Hunt

Get insider access to Huntress tradecraft, killer events, and the freshest blog updates.

By submitting this form, you accept our Terms of Service & Privacy Policy