Skip to main content

Command Palette

Search for a command to run...

Từ Malspam đến .NET Loader fileless: lạm dụng Google DoubleClick và chuỗi 5 tầng né tránh

Updated
14 min read
Từ Malspam đến .NET Loader fileless: lạm dụng Google DoubleClick và chuỗi 5 tầng né tránh

Một email "đơn đặt hàng" tiếng Đức với file HTML đính kèm là điểm khởi đầu của một chuỗi tấn công 5 tầng, trong đó liên kết độc hại đi xuyên qua ad.doubleclick[.]net — một domain Google uy tín mà hầu hết email gateway không hề chặn. Đội Huntress SOC ghi nhận ca lây nhiễm này vào tháng 5/2026 và phát hiện đích đến cuối cùng là một .NET loader, vô hiệu hóa telemetry của Windows rồi cắm rễ trên máy nạn nhân.

Sơ đồ đường tấn công từ malspam đến loader

Tóm tắt

Chiến dịch malspam này không phải một ca lây nhiễm tầm thường. Trước khi nạn nhân chạm tới hạ tầng của kẻ tấn công, lure đi qua Google DoubleClick — một domain hợp lệ, điểm tin cậy cao, hiếm khi bị blocklist và thường được allowlist bởi email gateway và URL-reputation service. Từ đó nạn nhân bị đẩy vào một malspam kit tự cá nhân hóa: đọc địa chỉ email từ URL, dựng lại trang ngay tại runtime, kéo logo công ty về theo thời gian thực — không cần soạn lure riêng cho từng tổ chức.

Khi nạn nhân tương tác, chiến dịch chuyển sang staging malware nhiều lớp: HTML → JScript → PowerShell → .NET loader → loader lõi, dựa nặng vào in-memory execution và .NET reflection để ở dưới radar. Loader vá AMSI và ETW ở tầng native API để "làm mù" telemetry Windows, ẩn mình bên trong tiến trình hợp lệ có chữ ký Microsoft (InstallUtil.exe, MSBuild.exe), và liên lạc C2 qua domain DDNS trên cổng phi tiêu chuẩn để dễ xoay vòng hạ tầng. Mục tiêu cuối nhiều khả năng là đánh cắp dữ liệu, với khả năng crypto-mining như follow-on. Với tổ chức tại Việt Nam, đây là lời nhắc rằng lọc email theo reputation của domain mặt tiền là không đủ — chuỗi chỉ lộ diện ở các tầng phía sau.

Timeline và đính chính attribution

Thời điểm Sự kiện
05/2026 Huntress SOC xử lý ca lây nhiễm .NET loader khởi đầu từ malspam
03/06/2026 Huntress công bố phân tích chuỗi giao payload
05/06/2026 Huntress đính chính: gỡ bỏ attribution "DesckVB RAT" sau review, xác định lại là .NET loader chưa định danh

Lưu ý về tên gọi: một số bản tin ban đầu (bao gồm tiêu đề của The Hacker News) gọi mã độc này là DesckVB RAT. Huntress đã rút lại attribution đó ngày 05/06/2026. Bài này dùng cách gọi trung lập ".NET loader" theo đánh giá mới nhất của nhóm nghiên cứu.

Kill Chain

  1. Email malspam — đính kèm Bestellung_2026.html (lure tiếng Đức) ↓
  2. meta-refresh 0 giâyad.doubleclick[.]net (URL click-tracking, được đánh giá uy tín Google) ↓
  3. Redirectorfostercareintheus.optimizationprime[.]com (giải mã email base64) ↓
  4. Delivery kitbth.startthewave[.]org/a/#<email> (tự rebrand theo công ty nạn nhân) ↓
  5. POST emailpengajian.muliastudy[.]com/images/edu/u.php → trả về file ZIP ↓
  6. JScript loaderA021185521S210008-11521.js → self-copy C:\Users\Public\ktncm.js
  7. PowerShell droppernlbzl.ps1 → builder dựng shmvg_01.ps1 (reflective .NET load) ↓
  8. .NET loader (03.txt) — anti-analysis + tắt Defender + persistence (NVIDIA-themed) ↓
  9. RunPE injector (01.txt) — process hollowing → InstallUtil.exe / MSBuild.exe
  10. Loader lõi (bl.txt) — patch AMSI/ETW (native), giải mã nhiều lớp ↓
  11. C2 — raw TCP + AES/RSA → xtadts.ddns[.]net, afxwd.ddns[.]net

Phân tích kỹ thuật

Lạm dụng DoubleClick + malspam kit động

Initial access đến từ email malspam đính kèm file HTML độc hại Bestellung_2026.html ("Bestellung" = "đơn đặt hàng" trong tiếng Đức). File này chỉ chứa một meta-refresh redirect 0 giây trỏ tới URL click-tracking của Google DoubleClick Campaign Manager (ad.doubleclick[.]net/ddm/trackclk/...), kèm các định danh campaign/creative. Điểm đến tiếp theo được nối sau dấu ?, với email người nhận được base64-encode trong URL fragment.

Lý do định tuyến qua DoubleClick là né lọc và mượn uy tín: ad.doubleclick[.]net là domain Google reputation cao, hiếm khi bị chặn — nên domain duy nhất lộ ra ở phần đầu chuỗi lại là thứ phòng thủ ít nghi ngờ nhất.

File HTML đính kèm độc hại

DoubleClick chuyển tiếp tới fostercareintheus.optimizationprime[.]com/b#<base64-email> — một tầng redirector (không phục vụ kit), giải mã email rồi đẩy sang kit host bth.startthewave[.]org/a/#<email>. Khi nạn nhân bấm "PDF herunterladen" ("Tải PDF"), hàm downloadFile() dựng một form ẩn và POST email=<address> tới pengajian.muliastudy[.]com/images/edu/u.php; server trả về một file ZIP (A021185521S210008-11521.zip).

Điểm "thông minh" của kit: trang lure là một file HTML tự chứa. Hàm setupEmailAndUI() đọc email từ window.location.hash, trích domain, rồi viết lại tiêu đề trang, logo header và footer để mạo danh chính công ty của nạn nhân. Logo được kéo về live qua chuỗi fallback (Clearbit → logo.dev → Google favicons → favicone → DuckDuckGo → /favicon.ico của công ty). Kit không hardcode nội dung riêng cho tổ chức nào — chỉ cần đổi email là rebrand tức thì. Hàm fetchLocationAndTime() gọi ipapi[.]co/json/ để in ra thành phố/khu vực/quốc gia/giờ địa phương, tăng cảm giác "trang được cá nhân hóa và an toàn".

JScript loader: né phân tích và self-relocate

ZIP chứa A021185521S210008-11521.js — không phải mã độc cuối mà là loader đa tầng, độn nặng junk (hàng trăm hàm chết lặp lại, chuỗi Unicode rác, filler ;;;;; và comment tiếng Bồ Đào Nha).

Nội dung file JScript loader

Khi chạy, script kiểm tra đường dẫn của chính nó qua WScript.ScriptFullName. Nếu đang chạy từ Temp/Downloads (tức vừa được giải nén), nó tự copy sang C:\Users\Public\ktncm.js, relaunch bản copy bằng wscript.exe //nologo rồi thoát. Lần chạy thứ hai (từ vị trí ổn định, world-writable) mới rơi vào logic staging payload. Hàm vjwNvhDoHz() sửa một blob base64 bị "bẻ" bằng ký tự A và token 9999 (chống static detection), giải mã thành PowerShell, ghi ra C:\Users\Public\nlbzl.ps1 và chạy ẩn với -ExecutionPolicy Bypass.

Các tầng PowerShell

nlbzl.ps1 thực hiện tuần tự: connectivity check (Test-Connection www.google.com) — nếu offline thì không thoát đơn thuần mà gọi Restart-Computer -Force để reboot máy; anti-analysis sweep đối chiếu tiến trình đang chạy với blocklist (Dbgview, tcpvcon, tcpview, OLLYDBG, ImmunityDebugger, Wireshark, apateDNS, và các chuỗi any.run, sandbox, analyze) — phát hiện là reboot; và tải payload qua WebClient.

PowerShell mã hóa và obfuscate

nlbzl.ps1 đóng vai builder: ráp thêm một script PowerShell dạng chuỗi, ghi ra C:\Users\Public\shmvg_01.ps1 rồi chạy. Chính script này thực hiện reflective .NET load ([Reflection.Assembly]::Load), resolve type ClassLibrary3.Class1, gọi method prFVI. Binary Microsoft có chữ ký InstallUtil.exe được truyền làm tham số cho prFVI để signed-binary proxy execution.

.NET loader (03.txt)

Payload 03.txt là một stager: xác minh không bị phân tích, tắt phòng thủ, tải/ráp các tầng tiếp, cắm persistence, rồi chạy payload cuối.

Cấu hình hardcode trong .NET loader

  • Anti-analysis: dò VM/sandbox (VirtualBox, VMware, Hyper-V, Parallels, QEMU, Sandboxie — gồm SbieDll.dll, vmhgfs.dll…), service triage (mksSandbox, joeboxserver, triage), chỉ dấu cloud/RDP, giá trị BIOS chứa "virtual"/"Hyper-V", debugger, và tooling theo tên tiến trình/tiêu đề cửa sổ. Khi trúng, loader ghi marker file (vm.txt, Debugger.txt, 01_detect_analisse_process.txt) rồi thoát.
  • Staging directory: tạo thư mục lồng sâu dưới %UserProfile%\AppData\LocalLow\ với tên **chủ đề NVIDIA** (LocalLow Windows, Program Rules, Program Rules NVIDEO) để giả dạng đường cài driver hợp lệ.
  • Tamper Defender: nếu không thấy Avast/AVG/Malwarebytes đang chạy, loader chạy PowerShell tắt real-time monitoring, IPS, MAPS, sample submission và add cả ổ hệ thống vào exclusion; đồng thời kill QHActiveDefense (Qihoo 360).
  • Tải payload: dùng User-Agent IE8 hardcode để kéo bl.txt, 01.txt, 02.txt.
  • Persistence: khóa Run + RunOnce dưới HKCU\...\CurrentVersion\ tên Update Drivers NVIDEO_<random>, chạy ẩn qua powershell.exe -WindowStyle Hidden; cộng thêm một bản copy trong Startup folder.

Injector (01.txt) + template (02.txt)

02.txttemplate PowerShell chứa token placeholder; sau khi loader điền giá trị, nó reflectively load 01.txt (ClassLibrary1.dll) và gọi method Run. 01.txt là DLL .NET thực hiện process hollowing bằng chuỗi RunPE API chuẩn: CreateProcessA (tạo tiến trình suspended) → ZwUnmapViewOfSectionVirtualAllocExWriteProcessMemoryGetThreadContext/SetThreadContextResumeThread (kèm biến thể Wow64 cho cross-architecture). Mọi tên API bị mangle; đáng chú ý wrapper CreateProcessA còn giữ từ tiếng Bồ Đào Nha "criando" ("đang tạo").

DllImport VirtualAllocEx với tham số bị obfuscate

Target inject là tùy cấu hình operator: trong sample phân tích tĩnh là InstallUtil.exe, nhưng trong telemetry thực địa Huntress quan sát thấy dùng MSBuild.exe.

Loader lõi (bl.txt) và C2

bl.txt (inject vào InstallUtil.exe) chưa phải loader cuối mà là thêm một lớp packing: static constructor đọc embedded resource, giải mã bằng stream cipher tùy biến (key 32-byte + IV 16-byte, mix bằng multiply-accumulate với hằng số magic 9495/10476/22014, shift-XOR), tùy chọn LZX-decompress rồi Assembly.Load. Một lớp nữa qua TripleDES-CBC (PKCS7) + GZip. Toàn bộ cấu hình được đóng gói thành một message protobuf, base64-encode, lưu dưới một string literal.

Cấu hình loader

Loader liên lạc C2 qua raw TCP socket, message protobuf mã hóa AES; khóa AES dẫn xuất từ mật khẩu P@55w0rd! bằng Rfc2898DeriveBytes (PBKDF2); RSA dùng cho key exchange ban đầu; và loader pin danh tính server bằng 5 hash SHA-256 chứng chỉ nhúng sẵn. Trên beacon đầu, loader thu thập fingerprint phần cứng (WMI: Win32_Processor, Win32_DiskDrive, Win32_BaseBoard, Win32_VideoController, Win32_OperatingSystem), enumerate AV qua SecurityCenter2, và đặc biệt dò GPU NVIDIA (GTX/RTX) và AMD (Radeon) qua cả WMI lẫn registry — mức quan tâm GPU này có thể gợi ý crypto-mining như follow-on, hoặc dùng để masquerade.

Patch AMSI và ETW ở tầng native

Loader vá AMSIETW ở mức native API để làm mù telemetry trước cả khi cắm persistence:

  • Đọc build number; nếu ≥ 26100 (Windows 11 24H2), resolve NtManageHotPatch từ ntdll.dll và ghi đè prologue bằng stub trả STATUS_NOT_SUPPORTED (0xC00000BB) — nhắm vào cơ chế nạp AMSI dựa trên hot-patch mới trong 24H2.
  • Trên 64-bit, pattern-scan ntdll.dll tìm EtwEventWrite và ghi đè entry point bằng xor rax, rax; ret, biến mọi ETW event logging thành no-op.
  • Cả hai dùng VirtualProtectExWriteProcessMemoryFlushInstructionCache. Loader có thể nhận payload bổ sung từ C2 theo 3 chế độ: in-memory injection (RunPE vào MSBuild.exe/InstallUtil.exe, không chạm đĩa), PowerShell (.ps1 qua scheduled task one-shot), hoặc file-drop (giải mã AES, ghi đĩa, scheduled task).

Indicators of Compromise (IOC)

IOC giữ ở dạng defanged. Huntress công bố IOC đầy đủ trên GitHub threat-intel.

Indicator Mô tả
Bestellung_2026.html HTML đính kèm độc hại
fostercareintheus.optimizationprime[.]com Tầng redirector
bth.startthewave[.]org Delivery kit
pengajian.muliastudy[.]com/images/edu/u.php Phục vụ ZIP payload
A021185521S210008-11521.zip ZIP giao bởi kit (u.php)
A021185521S210008-11521.js, ktncm.js JScript loader
nlbzl.ps1 PowerShell dropper
shmvg_01.ps1 PowerShell stager
zkrbx.txt, gglhn.txt File staging
andrefelipedonascime1778799406970.2241107.meusitehostgator[.]com[.]br Phục vụ 01/02/03.txt
catalogo.castrouria[.]com Phục vụ bl.txt (loader đóng gói)
%USERPROFILE%\AppData\LocalLow\LocalLow Windows\Program Rules\Program Rules NVIDEO\... Staging dir chủ đề NVIDIA
xtadts.ddns[.]net, afxwd.ddns[.]net C2 server (DDNS)
P@55w0rd! Mật khẩu AES (PBKDF2) cho C2
IE8 UA (Mozilla/4.0 ... MSIE 8.0 ... Trident/4.0 ...) User-Agent hardcode khi tải payload
SHA-256 cert pin (×5) D5B7247C...59B5, C61B1941...01A6, C356AFF1...8C18, F1C3EBE7...5348, E91FB249...74DD

MITRE ATT&CK Mapping

Tactic Technique ID
Initial Access Phishing: Spearphishing Attachment T1566.001
Execution User Execution: Malicious File/Link T1204.002 / .001
Execution Command & Scripting: PowerShell / JavaScript T1059.001 / .007
Defense Evasion Obfuscated Files or Information T1027
Defense Evasion Deobfuscate/Decode Files T1140
Defense Evasion System Binary Proxy Exec: InstallUtil T1218.004
Defense Evasion Trusted Developer Utilities: MSBuild T1127.001
Defense Evasion Process Injection: Process Hollowing T1055.012
Defense Evasion Reflective Code Loading T1620
Defense Evasion Impair Defenses: Disable/Modify Tools (AMSI/ETW/Defender) T1562.001
Defense Evasion Virtualization/Sandbox Evasion T1497
Persistence Registry Run Keys / Startup Folder T1547.001
Persistence Scheduled Task T1053.005
Discovery System Information Discovery T1082
Discovery Security Software Discovery T1518.001
C2 Non-Application Layer Protocol (raw TCP) T1095
C2 Encrypted Channel (AES/RSA) T1573

Detection

Hướng phát hiện nên thiên về behavior/telemetry, không trông vào signature của payload (vì chuỗi fileless + signed-binary proxy + AMSI/ETW blinding). Hai giả thuyết hunting cốt lõi của Huntress: cảnh báo khi .js/.vbs/.hta là tiến trình con của explorer.exe; và khi wscript.exe chạy từ C:\Users\Public\ rồi spawn PowerShell mã hóa/obfuscate.

KQL gợi ý cho Microsoft Sentinel / Defender XDR (DeviceProcessEvents, DeviceRegistryEvents, DeviceNetworkEvents):

// 1) Script engine chạy từ thư mục world-writable rồi spawn PowerShell ẩn
DeviceProcessEvents
| where InitiatingProcessFileName in~ ("wscript.exe","cscript.exe")
| where InitiatingProcessCommandLine has @"C:\Users\Public\"
| where FileName =~ "powershell.exe"
| where ProcessCommandLine has_any ("-ExecutionPolicy Bypass","-WindowStyle Hidden","-File","FromBase64String")
| project Timestamp, DeviceName, InitiatingProcessCommandLine, ProcessCommandLine
// 2) Signed-binary proxy: InstallUtil/MSBuild được khởi chạy bởi PowerShell (host inject)
DeviceProcessEvents
| where FileName in~ ("installutil.exe","msbuild.exe")
| where InitiatingProcessFileName =~ "powershell.exe"
| project Timestamp, DeviceName, FileName, FolderPath, InitiatingProcessCommandLine
// 3) Persistence: Run/RunOnce key tên chủ đề NVIDIA
DeviceRegistryEvents
| where RegistryKey has_any (@"\CurrentVersion\Run", @"\CurrentVersion\RunOnce")
| where RegistryValueName startswith "Update Drivers NVIDEO"
| project Timestamp, DeviceName, RegistryKey, RegistryValueName, RegistryValueData
// 4) Beacon tới C2 DDNS đã biết
DeviceNetworkEvents
| where RemoteUrl has_any ("xtadts.ddns.net","afxwd.ddns.net")
   or RemoteIPType == "Public" and InitiatingProcessFileName in~ ("installutil.exe","msbuild.exe")
| project Timestamp, DeviceName, RemoteUrl, RemoteIP, RemotePort, InitiatingProcessFileName

Nhận định chuyên gia

Điểm đáng chú ý nhất của chiến dịch không nằm ở loader — vốn dùng các kỹ thuật đã biết (process hollowing, AMSI/ETW patch, signed-binary proxy) — mà ở chiến lược "mượn lòng tin của domain mặt tiền". Dùng ad.doubleclick[.]net làm bước đầu chuỗi là một nước đi nhắm thẳng vào điểm yếu vận hành của phần lớn SOC: chính sách lọc URL/email dựa trên reputation domain. Khi domain đầu chuỗi là tài sản Google, gateway gần như chắc chắn cho qua, và toàn bộ phần độc hại nằm ở các tầng phía sau mà chỉ kiểm tra time-of-delivery sẽ bỏ lỡ.

Với môi trường khách hàng tại Việt Nam — nơi nhiều tổ chức dựa vào email gateway và proxy reputation-based làm tuyến phòng thủ chính — mô hình này đặc biệt nguy hiểm. Kết hợp fileless + reflective loading + blinding AMSI/ETW khiến EDR thuần signature rất dễ "mù". Theo quan điểm của đội ngũ phân tích, ba lớp kiểm soát có giá trị thực tế nhất ở đây là: chặn khả năng thực thi của script attachment ngay từ đầu (GPO), kiểm tra attachment/URL time-of-click chứ không phải time-of-delivery, và detection dựa trên chuỗi hành vi tiến trình (script engine → PowerShell mã hóa → InstallUtil/MSBuild làm host inject) thay vì IOC tĩnh — vì C2 dùng DDNS xoay vòng nhanh, chặn IP gần như vô nghĩa.

Lure tiếng Đức và comment tiếng Bồ Đào Nha trong code gợi ý đây là một kit thương mại hóa, tái sử dụng xuyên khu vực — phù hợp xu hướng malspam ngày càng scalable mà vẫn thuyết phục nhờ cá nhân hóa runtime. Việc Huntress phải rút lại attribution "DesckVB RAT" cũng là lời nhắc tốt: gắn tên họ mã độc quá sớm dễ sai, và một báo cáo TI tốt nên ưu tiên TTP/IOC có thể kiểm chứng hơn là một cái nhãn bắt mắt.

Khuyến nghị

  • Ép script mở bằng Notepad. Cấu hình GPO buộc .js, .vbs, .hta mở mặc định bằng Notepad/Notepad++ — vô hiệu hóa khả năng tự thực thi ngay ở tầng đầu tiên.
  • Kiểm tra time-of-click. Triển khai email gateway có sandbox attachment/URL; bật Safe Links/Safe Attachments (hoặc tương đương) để quét tại thời điểm click, không chỉ lúc nhận.
  • Chặn script attachment ở mail layer. Quarantine hoặc block file script và Office macro-enabled ngay tại gateway — kiểm soát ít công, lợi nhiều.
  • Củng cố vành đai email. Triển khai SPF, DKIM, DMARC để giảm spoofing/impersonation.
  • Detection theo hành vi, không theo IP. Cảnh báo theo chuỗi hành vi (script engine → PowerShell mã hóa từ C:\Users\Public\InstallUtil/MSBuild làm host inject) và đào tạo nhận thức phishing định kỳ — C2 DDNS xoay vòng quá nhanh để chặn theo IP.

Tài liệu tham khảo

More from this blog

F

FPT IS Security

841 posts

Dedicated to providing insightful articles on cybersecurity threat intelligence, aimed at empowering individuals and organizations to navigate the digital landscape safely.