PHÂN TÍCH MÃ ĐỘC TONRAT TRONG CHIẾN DỊCH PHOTO ZIP SỬ DỤNG CHUỖI LÂY NHIỄM ĐA GIAI ĐOẠN
NCS Threat Intelligence ghi nhận một chiến dịch phát tán mã độc TonRAT, trong đó kẻ tấn công lợi dụng các file shortcut (.LNK) giả mạo hình ảnh được đính kèm trong tệp nén ZIP để triển khai implant dựa trên nền tảng Node.js, nhằm duy trì quyền truy cập lâu dài trên hệ thống nạn nhân. Chiến dịch được xác định chủ yếu nhắm mục tiêu tới các tổ chức tại khu vực châu Âu và châu Á thông qua hình thức email lừa đảo (phishing).
Qua quá trình phân tích, xác định chuỗi tấn công được triển khai theo nhiều giai đoạn, từ việc lừa người dùng thực thi file LNK, tải xuống các thành phần trung gian bằng PowerShell, chuẩn bị môi trường Node.js, triển khai payload JavaScript đến thiết lập kết nối với máy chủ điều khiển (C2).

| MD5 | 279a63896adb7ee1534532a4d3d94ff7 |
| Tên file | PHOTO-112201395.png.lnk |
| Kích thước file | 2.22 KB |
| Loại file | MS Windows shortcut (.LNK file) |
3. Phân tích mã độc
Sau khi nạn nhân giải nén tệp ZIP và mở file shortcut PHOTO-112201395.png.lnk, file LNK sẽ kích hoạt chuỗi lệnh PowerShell được nhúng trong thuộc tính Target thông qua powershell.exe.
Kỹ thuật này giúp kẻ tấn công che giấu hành vi độc hại dưới vỏ bọc của một file hình ảnh thông thường. Do Windows mặc định ẩn phần mở rộng của một số loại tệp, người dùng có thể dễ dàng nhầm lẫn file .LNK với một file ảnh PNG hợp lệ.

Đoạn mã PowerShell được nhúng trong file LNK đóng vai trò là loader ban đầu, chịu trách nhiệm giải mã thông tin cấu hình, tải xuống và thực thi payload của giai đoạn tiếp theo.
Trước tiên, mã độc gọi PowerShell với tham số “-ep bypass” (ExecutionPolicy Bypass) nhằm bỏ qua chính sách thực thi script của Windows, cho phép các đoạn mã PowerShell không được xác thực tiếp tục được thực thi trên hệ thống nạn nhân.
Trong câu lệnh PowerShell, mã độc sử dụng hai biến “$uxOXs” và “$Tdfm3fB” để lưu trữ dữ liệu dưới dạng các số nguyên lớn (Big Integer). Đây là một kỹ thuật obfuscation nhằm che giấu dữ liệu thực tế, gây khó khăn cho quá trình phân tích mã độc cũng như hạn chế khả năng phát hiện của các giải pháp bảo mật dựa trên chữ ký (signature-based detection).
Để khôi phục dữ liệu gốc, mã độc thực hiện phép trừ giữa hai giá trị Big Integer, sau đó sử dụng vòng lặp với phép toán chia lấy dư cho 256 để chuyển đổi kết quả thành các ký tự trong bảng mã ASCII, từ đó tái tạo URL của máy chủ tải payload. Qua phân tích, NCS xác định domain được sử dụng trong giai đoạn này là: “reservphotoinstaynow[.]shop”
Sau khi giải mã thành công địa chỉ máy chủ, mã độc kết nối tới hạ tầng của kẻ tấn công để tải payload phục vụ cho giai đoạn tiếp theo. Payload được lưu trong thư mục tạm của hệ thống (%TEMP%) với tên oHaPHq.ps1 và được thực thi bằng lệnh: “powershell -ep bypass -File $env:TEMP\oHaPHq.ps1″
Cơ chế triển khai theo nhiều giai đoạn giúp mã độc hạn chế khả năng bị phát hiện ngay từ bước đầu, đồng thời tạo điều kiện để kẻ tấn công tiếp tục triển khai các thành phần độc hại phức tạp hơn trên hệ thống nạn nhân.
Phân tích cho thấy script PowerShell được tải xuống ở giai đoạn này hoạt động như một dropper/loader đa giai đoạn, có nhiệm vụ chuẩn bị môi trường thực thi và triển khai payload JavaScript trên hệ thống nạn nhân.
Script PowerShell được tải về tiếp tục được bảo vệ bằng nhiều lớp obfuscation và mã hóa nhằm né tránh sự phát hiện của các giải pháp bảo mật cũng như gây khó khăn cho quá trình phân tích. Trước hết, mã độc sử dụng các tên biến và tên hàm được sinh ngẫu nhiên, khiến việc xác định chức năng của từng thành phần trở nên phức tạp.
Bên cạnh đó, script áp dụng nhiều lớp obfuscation chồng lên nhau. Lớp đầu tiên là kỹ thuật String Concatenation, trong đó các chuỗi dữ liệu quan trọng được chia nhỏ và chỉ được ghép lại trong quá trình thực thi, qua đó che giấu thông tin nhạy cảm và hạn chế khả năng phát hiện của các giải pháp antivirus dựa trên chữ ký (signature-based detection).

Lớp tiếp theo sử dụng cơ chế mã hóa Base64 để bảo vệ các dữ liệu thô như khóa mã hóa (Key), vector khởi tạo (Initialization Vector – IV), payload chính và các đối số dòng lệnh trước khi tiếp tục được xử lý bởi lớp mã hóa tiếp theo.

Lớp bảo vệ cuối cùng cũng là lớp mã hóa chính của mẫu mã độc sử dụng thuật toán AES-256-CBC (Rijndael). Quá trình giải mã được triển khai thông qua hàm “l3woUwq46zXw”, sử dụng lớp System.Security.Cryptography.RijndaelManaged với KeySize 256 bit, BlockSize 128 bit và chế độ hoạt động CBC (Cipher Block Chaining). Khóa mã hóa (Key) và Initialization Vector (IV) lần lượt có kích thước 32 byte và 16 byte, được nhúng sẵn trong mã nguồn dưới dạng Base64. Sau khi giải mã, script thu được các thành phần quan trọng như tên Mutex, payload JavaScript và các đối số dòng lệnh trước khi chuyển sang giai đoạn thực thi.

Sau khi loại bỏ các lớp làm rối mã, xác định script lần lượt thực hiện nhiều bước nhằm chuẩn bị môi trường trước khi triển khai payload.
Đầu tiên, script gọi hàm ShowWindow trong user32.dll với tham số SW_HIDE (0) để ẩn cửa sổ PowerShell đang chạy. Tiếp đó, script truy vết chuỗi tiến trình cha đến explorer.exe và tiếp tục ẩn các cửa sổ trung gian nhằm giảm khả năng người dùng phát hiện hoạt động bất thường.
Tiếp theo, mã độc kiểm tra sự tồn tại của Mutex để xác định liệu payload đã được thực thi trên hệ thống hay chưa. Nếu Mutex đã tồn tại, script sẽ kết thúc ngay nhằm tránh việc khởi chạy nhiều phiên bản của mã độc trên cùng một thiết bị.
Sau bước kiểm tra này, script xác minh sự tồn tại của môi trường Node.js thông qua đường dẫn:
%USERPROFILE%\AppData\Local\NodeJS\node-v26.4.0-win-x64\node.exe
Nếu Node.js chưa được cài đặt, mã độc sẽ tự động tải bản phân phối từ trang chính thức nodejs.org, giải nén vào thư mục AppData\Local\NodeJS và sử dụng cơ chế retry để đảm bảo quá trình tải xuống hoàn tất ngay cả khi kết nối mạng không ổn định.
Sau khi đáp ứng đầy đủ các điều kiện, script tiến hành giải mã payload bằng Base64 kết hợp AES-256-CBC, ghi payload ra đĩa dưới dạng file JavaScript pvxmbSUkz.js, sau đó khởi chạy node.exe với tham số WindowStyle Hidden để chuyển sang giai đoạn thực thi chính của mã độc.
Sau khi hoàn tất quá trình chuẩn bị môi trường thực thi và giải mã payload, mã độc chuyển sang giai đoạn thực thi chính. Thay vì tiếp tục sử dụng PowerShell, dropper tận dụng môi trường Node.js đã được cài đặt để khởi chạy payload JavaScript, từ đó triển khai các chức năng điều khiển từ xa trên hệ thống nạn nhân. Payload pvxmbSUkz.js sau khi được giải mã bằng Base64 kết hợp AES-256-CBC có nội dung như sau:

Mặc dù đã được giải mã ở giai đoạn trước, payload JavaScript vẫn tiếp tục được bảo vệ bằng nhiều lớp obfuscation. Kết quả phân tích cho thấy mã độc sử dụng kỹ thuật VM-based obfuscation, trong đó toàn bộ logic của chương trình được biên dịch thành bytecode và thực thi thông qua hàm vmI_20d6f5. Đồng thời, hàm vms() thực hiện giải mã các chuỗi dữ liệu tại thời điểm chạy (runtime) bằng thuật toán RC4.
Bên cạnh đó, payload còn tích hợp các kỹ thuật Anti-debug, bao gồm việc sử dụng câu lệnh debugger kết hợp với cơ chế kiểm tra thời gian thực thi thông qua process.hrtime() để phát hiện breakpoint và gây khó khăn cho quá trình phân tích động. Việc kết hợp nhiều lớp bảo vệ xuyên suốt toàn bộ chuỗi lây nhiễm cho thấy kẻ tấn công đã đầu tư đáng kể vào các kỹ thuật chống phân tích và né tránh phát hiện.
Sau khi loại bỏ các lớp làm rối mã, nhiều chuỗi dữ liệu quan trọng trong payload đã được khôi phục.

Mặc dù phần lớn chuỗi đã được giải mã, một số dữ liệu nhạy cảm vẫn tiếp tục được bảo vệ bằng Base64 trước khi được sử dụng trong quá trình thực thi.

Dựa trên kết quả phân tích, xác định pvxmbSUkz.js là một NodeJS Remote Access Trojan (RAT) được bảo vệ bởi hai lớp obfuscation. Lớp ngoài sử dụng RC4 kết hợp với Base64 để che giấu tên hàm, chuỗi và các hằng số, trong khi lớp trong sử dụng trình thông dịch bytecode tự xây dựng kết hợp với các kỹ thuật Anti-debug nhằm bảo vệ toàn bộ logic thực thi của mã độc.
Về cơ chế kết nối Command and Control (C2), mã độc không hardcode domain trong mã nguồn mà truy vấn thông tin thông qua TON Blockchain. Cụ thể, mẫu mã độc gọi API: “https://tonapi.io/v2/blockchain/accounts/{contractAccountId}/methods/get_domain”
để truy vấn smart contract, lấy domain thực từ trường “decoded.domain” trong response. Sau khi thu được domain, mã độc thiết lập WebSocket tới máy chủ C2 trong đó toàn bộ lưu lượng trao đổi đều được mã hóa. Việc lưu trữ thông tin C2 trên blockchain giúp kẻ tấn công dễ dàng thay đổi domain bằng cách cập nhật smart contract, đồng thời gây khó khăn cho việc chặn hoặc gỡ bỏ hạ tầng điều khiển. Tại thời điểm phân tích, NCS xác định domain C2 được trả về là njzlopghznkamkl[.]cfd.

Sau khi thiết lập kết nối WebSocket với máy chủ Command and Control (C2), NodeJS RAT xử lý các lệnh điều khiển dựa trên trường type trong từng thông điệp nhận được. Kết quả phân tích cho thấy mã độc hỗ trợ 8 loại lệnh, bao gồm duy trì kết nối (heartbeat keepalive), đăng ký thiết bị với máy chủ C2, thực thi mã JavaScript tùy ý (Remote Code Execution – RCE), truyền tải tệp hai chiều, thực thi lệnh hệ thống, cập nhật malware từ xa và khởi động lại tiến trình.
Đáng chú ý, lệnh type 1 gửi về C2 các thông tin định danh của nạn nhân như userId, domain, version (hardcode 1.2.1), UUID (61fc5f6f-4bdc-47e7-a533-c6f920059411) cùng nhiều thông tin hệ thống. Trong khi đó, type 2 cho phép thực thi mã JavaScript tùy ý thông qua new Function(), cung cấp cho kẻ tấn công khả năng Remote Code Execution (RCE) trên hệ thống nạn nhân. Ngoài ra, type 5 sử dụng child_process.exec với tham số windowsHide để thực thi lệnh hệ thống mà không hiển thị cửa sổ tiến trình, type 6 hỗ trợ cập nhật malware bằng cách ghi đè payload hiện tại và khởi động lại tiến trình và type 7 đơn thuần khởi động lại tiến trình malware.
Một trong những chức năng nổi bật của NodeJS RAT là khả năng thực thi file PE (.exe/.dll) theo phương thức fileless, không ghi dữ liệu ra đĩa. Malware sử dụng module node để tương tác trực tiếp với các Win32 API, từ đó triển khai chuỗi thực thi như sau:

Ngoài ra, malware còn triển khai kỹ thuật bypass AMSI (Antimalware Scan Interface) bằng cách nạp amsi.dll, thay đổi quyền truy cập bộ nhớ thông qua VirtualProtect và vá trực tiếp hàm quét của AMSI. Song song đó, mã độc cũng tác động tới Common Language Runtime (CLR) bằng cách sửa đổi các cấu trúc Cor_Private_IPCBlock_v4_%d và Cor_SxSPublic_IPCBlock nhằm vô hiệu hóa CLR Profiling và Event Tracing for Windows (ETW), làm suy giảm khả năng giám sát của các giải pháp EDR dựa trên .NET Instrumentation. Ngay cả khi VirtualProtect thất bại, malware vẫn tiếp tục thực thi, cho thấy cơ chế xử lý lỗi đã được xây dựng ngay từ giai đoạn thiết kế.
Để duy trì truy cập, mã độc tạo Run Registry Key nhằm tự động khởi chạy thông qua Node.js mỗi khi người dùng đăng nhập Windows. Đồng thời, malware có khả năng tự cài đặt môi trường Node.js nếu chưa tồn tại và hỗ trợ cập nhật payload từ xa, giúp duy trì hoạt động lâu dài trên hệ thống nạn nhân.

Cuối cùng chức năng thu thập thông tin hệ thống tổng hợp một tập dữ liệu toàn diện về máy nạn nhân, bao gồm: hostname, username, platform, kiến trúc CPU, phiên bản hệ điều hành, số lượng CPU, tổng dung lượng RAM, và địa chỉ MAC. Ngoài ra, mã độc còn trích xuất MachineGuid từ “HKLM:\SOFTWARE\Microsoft\Cryptography” và MachineId từ “HKLM:\SOFTWARE\Microsoft\SQMClient” – hai giá trị định danh duy nhất của máy tính Windows. Toàn bộ dữ liệu được hash SHA-256 để tạo device fingerprint trước khi gửi về C2. Mã độc cũng thực hiện kiểm tra singleton bằng cách đếm số tiến trình đang chạy có cùng đường dẫn nhằm tránh chạy nhiều instance trùng lặp trên cùng một máy.

Chiến dịch phát tán mã độc TonRAT cho thấy mức độ tinh vi cao khi kết hợp chuỗi lây nhiễm đa giai đoạn với nhiều kỹ thuật né tránh phát hiện và duy trì truy cập trên hệ thống nạn nhân. Điểm nổi bật của chiến dịch là cơ chế Command and Control (C2) thông qua TON Blockchain, cho phép malware truy vấn smart contract để lấy domain C2 tại thời điểm thực thi thay vì hardcode trong mã nguồn. Kết hợp với các kỹ thuật obfuscation đa lớp, mã hóa AES-256-CBC, RC4, Base64, VM-based obfuscation, vô hiệu hóa AMSI/ETW và thực thi PE file trực tiếp trong bộ nhớ (fileless execution), TonRAT có khả năng né tránh nhiều giải pháp bảo mật truyền thống và duy trì hiện diện lâu dài trên hệ thống bị xâm nhập.
Để giảm thiểu nguy cơ từ chiến dịch TonRAT và các chiến dịch có kỹ thuật tương tự, NCS khuyến nghị các tổ chức triển khai đồng thời nhiều biện pháp phòng vệ. Trên máy trạm, cần bật hiển thị phần mở rộng tệp trong Windows để hạn chế nguy cơ người dùng nhầm lẫn file .LNK với tệp hình ảnh, đồng thời kiểm soát việc thực thi PowerShell, hạn chế cài đặt Node.js ngoài chính sách quản lý và theo dõi các tiến trình PowerShell hoặc Node.js bất thường.
Ở cấp độ mạng, cần giám sát các kết nối WebSocket bất thường, theo dõi truy vấn tới các dịch vụ blockchain như tonapi.io, đồng thời cập nhật các IOC (hash, domain, IP nếu có) vào hệ thống Firewall, EDR và SIEM để phát hiện và ngăn chặn sớm.
Bên cạnh các biện pháp kỹ thuật, các tổ chức cần tăng cường đào tạo nhận thức an toàn thông tin cho người dùng, đặc biệt về nguy cơ từ email lừa đảo đính kèm tệp ZIP chứa file shortcut (.LNK) giả mạo hình ảnh.
Tại thời điểm công bố báo cáo, hạ tầng C2 của chiến dịch vẫn đang hoạt động. Do đó, các tổ chức cần chủ động triển khai các biện pháp giám sát và phòng vệ để giảm thiểu nguy cơ bị khai thác.
| SHA-256 | SHA-1 |
| 904a8f66d8c6c26c86d9a698918b456943da3e5f6ba46897c59fb9670941ceab | 131b9a39e5d61128b50e195b6d00cda5e68b6db6 |
| 507b6dad4aae5bff6ffec3b5b502a9715f813aab2f232bdea4147a7272615ee5 | a019d85757467d32f07e3fd4ee9f9a3d835a63d0 |
| D69C5FFA0F1D6A11F20501E8C07126391FEAC5DBAED3C2A42487D9D5455E5E9E | 16F2CC5F9E184A8FD47243893EA1DEE88742113A |
Network Indicators
reservphotoinstaynow[.]shop
njzlopghznkamkl[.]c
Nguồn tham chiếu: Microsoft
Tác giả: TheWantedX