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

Search for a command to run...

No comments yet. Be the first to comment.
Tổng Quan Một chiến dịch tấn công bằng dòng mã độc tống tiền mới mang tên Spirals đã ghi nhận vụ việc đầu tiên mã hóa thành công toàn bộ hệ thống của một công ty dịch vụ IT tại Nam Á chỉ trong vòng ch

Tóm tắt rủi ro Bạn bảo một web agent: "tóm tắt giúp tôi các review trên trang này". Một review giả do kẻ tấn công đăng lên khiến agent bấm nhầm nút "Buy Now", và đơn hàng được đặt. Không malware, khôn

Campaign Summary A Russian-speaking criminal group tracked by Cisco Talos as UAT-11795 has been running a continuous campaign since at least June 2025, distributing malware inside trojanized installer

Tóm tắt chiến dịch Nhóm tội phạm nói tiếng Nga được Cisco Talos theo dõi dưới định danh UAT-11795 đã hoạt động liên tục từ ít nhất tháng 06/2025, phát tán mã độc thông qua các bộ cài đặt phần mềm hợp

Tóm Tắt Chiến Dịch Vào ngày 14/07/2026, kẻ tấn công đã xâm nhập thành công tổ chức AsyncAPI trên npm — một trong những dự án mã nguồn mở phổ biến nhất cho các API event-driven, và tiêm mã độc vào 4 gó

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.
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.
| 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.
Bestellung_2026.html (lure tiếng Đức)
↓ad.doubleclick[.]net (URL click-tracking, được đánh giá uy tín Google)
↓fostercareintheus.optimizationprime[.]com (giải mã email base64)
↓bth.startthewave[.]org/a/#<email> (tự rebrand theo công ty nạn nhân)
↓pengajian.muliastudy[.]com/images/edu/u.php → trả về file ZIP
↓A021185521S210008-11521.js → self-copy C:\Users\Public\ktncm.js
↓nlbzl.ps1 → builder dựng shmvg_01.ps1 (reflective .NET load)
↓03.txt) — anti-analysis + tắt Defender + persistence (NVIDIA-themed)
↓01.txt) — process hollowing → InstallUtil.exe / MSBuild.exe
↓bl.txt) — patch AMSI/ETW (native), giải mã nhiều lớp
↓xtadts.ddns[.]net, afxwd.ddns[.]netInitial 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.
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".
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).
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.
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.
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.
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.
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.%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ệ.QHActiveDefense (Qihoo 360).bl.txt, 01.txt, 02.txt.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.02.txt là template 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) → ZwUnmapViewOfSection → VirtualAllocEx → WriteProcessMemory → GetThreadContext/SetThreadContext → ResumeThread (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").
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.
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.
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.
Loader vá AMSI và ETW ở mức native API để làm mù telemetry trước cả khi cắm persistence:
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.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.VirtualProtectEx → WriteProcessMemory → FlushInstructionCache.
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).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 |
| 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 |
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
Đ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.
.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.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.