Tổng quan
Sau khi được cài đặt, Maverick sử dụng WPPConnect để tự động gửi tin nhắn độc hại đến các liên hệ từ các tài khoản bị chiếm đoạt thông qua WhatsApp Web. Trojan mới có những điểm tương đồng về code với một Trojan ngân hàng khác là Coyote. Theo các nhà nghiên cứu, Maverick sẽ kiểm tra múi giờ, ngôn ngữ, khu vực và định dạng ngày giờ trên các máy tính bị nhiễm để đảm bảo nạn nhân ở Brazil, nếu không, phần mềm độc hại sẽ không được cài đặt.
Trojan ngân hàng có thể kiểm soát hoàn toàn máy tính bị nhiễm, chụp ảnh màn hình, theo dõi trình duyệt và trang web đang mở, cài đặt keylogger, điều khiển chuột, chặn màn hình khi truy cập trang web ngân hàng, chấm dứt các tiến trình và mở các trang lừa đảo trong lớp phủ. Mục đích của nó là đánh cắp thông tin đăng nhập ngân hàng. Khi hoạt động, Trojan sẽ theo dõi quyền truy cập của nạn nhân vào 26 trang web ngân hàng tại Brazil, 6 trang web giao dịch tiền điện tử và 1 nền tảng thanh toán.
Vectơ lây nhiễm
Quá trình lây nhiễm bắt đầu khi nạn nhân nhận được tệp .LNK độc hại bên trong tệp ZIP qua tin nhắn WhatsApp. Tên tệp có thể là một tên bất kỳ hoặc giả mạo đến từ một ngân hàng.
Hình 1. Ví dụ về tệp độc hại được gửi qua WhatsApp
Tệp LNK được mã hóa để thực thi CMD. Các nhà nghiên cứu cho biết, các lệnh giải mã chỉ ra việc thực thi một script PowerShell, lệnh sẽ tiếp tục liên hệ với máy chủ C2 để tải xuống một script PowerShell khác. Điều quan trọng cần lưu ý là C2 cũng xác thực “User-Agent” của yêu cầu HTTP để đảm bảo rằng nó đến từ lệnh PowerShell. Đây là lý do tại sao, nếu không có “User-Agent” chính xác, C2 sẽ trả về mã HTTP 401.
Script được sử dụng để giải mã một tệp .NET nhúng và tất cả quá trình này chỉ diễn ra trong bộ nhớ. Tệp .NET giải mã bằng cách chia mỗi byte cho một giá trị cụ thể; trong Hình 3, giá trị là 174. Tệp PE giải mã và sau đó được tải dưới dạng một tập hợp .NET trong tiến trình PowerShell, do đó không tạo ra tệp tin thực thi trên ổ đĩa (một dạng fileless).
Hình 2. Mã hóa và giải mã tệp .NET
Loader .NET
Loader .NET ban đầu được làm rối nghĩa rất nhiều bằng cách sử dụng Control Flow Flattening và các lệnh gọi hàm gián tiếp, lưu trữ chúng trong một hàm vectơ và gọi chúng từ đó. Ngoài việc làm rối nghĩa, nó còn sử dụng các phương thức và tên biến ngẫu nhiên để gây trở ngại cho việc phân tích. Tuy nhiên, các nhà nghiên cứu đã có thể tái hiện lại (ở một mức độ nhất định) luồng hoạt động chính của nó, bao gồm việc tải xuống và giải mã hai payload.
Hình 3. Sử dụng Control Flow Flattening và gọi hàm trực tiếp
Việc che giấu không ẩn tên biến của phương thức. Hầu hết các hàm được sử dụng trong giai đoạn này đều tương tự với các hàm trong giai đoạn cuối cùng của một Trojan ngân hàng điển hình. Mục đích là tải xuống hai shellcode mã hóa từ máy chủ C2. Để yêu cầu chúng, một API được lệnh C2 hiển thị trên các route “/api/v1/” như sau: “hxxps://sorvetenopote.com/api/v1/3d045ada0df942c983635e”. Loader gửi khóa API vào trường “X-Request-Headers” của tiêu đề yêu cầu HTTP. Khóa API tính toán bằng thuật toán sau: “Base64(HMAC256(Key))”.
Theo các nhà nghiên cứu, HMAC được sử dụng để ký các thông điệp bằng một khóa cụ thể, trong trường hợp này, kẻ tấn công sử dụng nó để tạo “API Key” bằng khóa HMAC “MaverickZapBot2025SecretKey12345”. Dữ liệu đã ký được gửi đến C2 là “3d045ada0df942c983635e|1759847631|MaverickBot”, trong đó mỗi phân đoạn được phân tách bằng dấu “|”.
Phân đoạn đầu tiên đề cập đến tài nguyên cụ thể được yêu cầu (shellcode mã hóa đầu tiên), phân đoạn thứ hai là timestamp của mã độc và phân đoạn cuối cùng - MaverickBot, cho biết giao thức C2 này có thể được sử dụng trong các chiến dịch tương lai với các biến thể khác nhau. Điều này đảm bảo rằng các công cụ như “wget” không thể tải xuống giai đoạn này, mà chỉ có mỗi phần mềm độc hại.
Khi phản hồi, shellcode mã hóa là một loader sử dụng Donut. Tại thời điểm này, loader .NET ban đầu sẽ khởi động và đi theo hai đường dẫn thực thi khác nhau: một loader khác cho quá trình lây nhiễm WhatsApp của nó và payload cuối cùng, “MaverickBanker”. Mỗi shellcode Donut nhúng một tệp thực thi .NET. Shellcode được mã hóa bằng cách sử dụng triển khai XOR, trong đó khóa lưu trữ trong các byte cuối cùng của tệp nhị phân do C2 trả về.
Downloader phần mềm lây nhiễm WhatsApp
Sau khi shellcode Donut thứ hai được giải mã và khởi động, nó tải một downloader khác bằng cùng phương pháp mã hóa như downloader trước đó, với hoạt động tương tự, nhưng lần này là tải xuống tệp PE thay vì shellcode Donut. Tệp PE này là một assembly .NET khác sẽ được tải vào quy trình dưới dạng một mô-đun.
Một trong những namespace được sử dụng bởi tệp thực thi .NET có tên là “Maverick.StageOne”. Giai đoạn này có nhiệm vụ tải xuống phần mềm lây nhiễm WhatsApp tương tự như giai đoạn trước. Điểm khác biệt chính đây là một tệp thực thi .NET: Phần mềm độc hại nhằm chiếm đoạt tài khoản của nạn nhân và sử dụng nó để spam danh bạ của họ để phát tán.
Hình 4. Namespace Maverick.StageOne
Mô-đun này bao gồm một tập lệnh từ WPPConnect, một dự án tự động hóa WhatsApp nguồn mở, cũng như tệp thực thi trình duyệt Selenium, được sử dụng cho tự động hóa web.
Tên namespace của tệp thực thi là “ZAP”, một từ rất phổ biến ở Brazil để chỉ WhatsApp. Các tệp này sử dụng các kỹ thuật che giấu gần như giống hệt các ví dụ trước, nhưng tên biến của phương thức vẫn nằm trong mã nguồn. Hành vi chính của giai đoạn này là định vị cửa sổ WhatsApp trong trình duyệt và sử dụng WPPConnect để theo dõi nó, khiến nạn nhân bị nhiễm gửi tin nhắn đến các liên hệ của họ và do đó lây lan trở lại. Tệp được gửi phụ thuộc vào tệp thực thi MaverickBot, sẽ được thảo luận trong phần tiếp theo.
Trojan ngân hàng Maverick
Maverick Banker đến từ một nhánh thực thi khác với phần mềm lây nhiễm WhatsApp, nó là kết quả của shellcode Donut thứ hai. Không có bước tải xuống bổ sung nào để thực thi nó. Đây là payload chính của chiến dịch này và được nhúng trong một tệp thực thi mã hóa khác có tên là “Maverick Agent”, thực hiện các hoạt động mở rộng trên máy tính nạn nhân, chẳng hạn như liên hệ với C2 và ghi lại thao tác bàn phím. Quá trình này sẽ được mô tả trong phần tiếp theo.
Khi Maverick được tải lần đầu, phần mềm độc hại sẽ cố gắng duy trì tính bền vững bằng cách sử dụng thư mục Startup. Tại thời điểm này, nếu tính duy trì không tồn tại, Trojan không chỉ kiểm tra tệp .bat mà còn thực hiện so khớp mẫu để xem chuỗi “for %%” có tồn tại hay không, đây là một phần của quá trình tải ban đầu. Nếu tệp như vậy có, Trojan sẽ tạo một GUID mới và xóa 6 ký tự đầu tiên. Tập lệnh batch sau đó sẽ được lưu trữ dưới dạng: “C:\Users\
Tiếp theo, phần mềm độc hại tạo lệnh bat bằng cách sử dụng URL mã hóa cứng, trong trường hợp này là: “hxxps://sorvetenopote.com” + “/api/itbi/startup/” + NEW_GUID.
Trong chức năng tạo lệnh, có thể thấy quá trình tạo một script PowerShell hoàn toàn mới được tối giản.
Hình 5. Quá trình tạo một script PowerShell
Theo Hình 6, đầu tiên sẽ tạo một biến có tên “$URL” và gán cho nó nội dung được truyền dưới dạng tham số, tạo một đối tượng “Net.WebClient” và gọi hàm “DownloadString.Invoke($URL)”. Ngay sau khi tạo các lệnh nhỏ này, phần mềm độc hại sẽ mã hóa chúng theo base64. Script sẽ móc nối lại tệp LNK ban đầu được sử dụng để bắt đầu chuỗi lây nhiễm.
Cơ chế duy trì này thoạt nhìn có vẻ hơi lạ, vì nó luôn phụ thuộc vào việc C2 có trực tuyến hay không. Tuy nhiên trên thực tế nó rất tinh vi, vì phần mềm độc hại sẽ không hoạt động nếu không có C2. Do đó, việc chỉ lưu tệp .bat bootstrap đảm bảo toàn bộ quá trình lây nhiễm vẫn nằm trong bộ nhớ. Nếu duy trì được, nó bắt đầu chức năng thực sự của mình, chủ yếu là giám sát các trình duyệt để kiểm tra xem họ có mở các trang ngân hàng hay không. Việc giám sát sẽ chỉ tiếp tục nếu nạn nhân đang sử dụng một trong các trình duyệt sau: Chrome, Firefox, MS Edge, Brave, Internet Explorer và trình duyệt web ngân hàng cụ thể.
Nếu bất kỳ trình duyệt nào trong danh sách trên đang chạy, phần mềm độc hại sẽ sử dụng UI Automation để trích xuất tiêu đề của tab đang mở, đồng thời sử dụng thông tin này với danh sách các trang web ngân hàng trực tuyến mục tiêu được xác định trước nhằm xác định xem có nên thực hiện bất kỳ hành động nào trên chúng hay không. Danh sách các ngân hàng mục tiêu được nén bằng gzip, mã hóa bằng AES-256 và được lưu trữ dưới dạng chuỗi base64. Vectơ khởi tạo AES (IV) được lưu trữ trong 16 byte đầu tiên của dữ liệu base64 đã giải mã và khóa lưu trữ trong 32 byte tiếp theo. Dữ liệu mã hóa thực tế bắt đầu từ offset 48.
Cơ chế mã hóa này giống với cơ chế được sử dụng bởi Coyote, một loại Trojan ngân hàng cũng được viết bằng .NET và được phát hiện vào đầu năm 2024.
Nếu tìm thấy bất kỳ ngân hàng nào trong số này, chương trình sẽ giải mã một tệp PE khác bằng cùng thuật toán được mô tả trong phần .NET loader ở mục trên và sẽ tải tệp đó dưới dạng một assembly, gọi điểm vào của tệp đó với tên của ngân hàng đang mở làm đối số. PE mới này được gọi là “Maverick.Agent” và chứa hầu hết thông tin các ngân hàng để kết nối với C2 và trích xuất dữ liệu từ đó.
Maverick agent
Agent là mã nhị phân sẽ thực hiện hầu hết nhiệm vụ độc hại. Trước tiên, nó kiểm tra xem máy tính có đang hoạt động ở Brazil hay không. Để làm được điều này, agent sẽ kiểm tra các ràng buộc sau:
- IsValidBrazilianTimezone(): Kiểm tra múi giờ hiện tại. Brazil có múi giờ từ UTC-5 đến UTC-2. Nếu múi giờ nằm trong phạm vi này, hàm sẽ trả về giá trị “true”.
- IsBrazilianLocale(): Kiểm tra xem ngôn ngữ. Ví dụ: “pt-BR”, “pt_br” hoặc bất kỳ chuỗi nào chứa “portuguese” và “brazil”. Trả về “true” nếu điều kiện được đáp ứng.
- IsBrazilianRegion(): Kiểm tra xem vùng được cấu hình của hệ thống có phải là Brazil hay không. Hàm này so sánh các mã vùng như “BR”, “BRA” hoặc kiểm tra xem tên vùng có chứa “brazil” không. Trả về “true” nếu vùng được đặt là Brazil.
- IsBrazilianDateFormat(): Kiểm tra định dạng ngày ngắn có tuân theo tiêu chuẩn Brazil không. Định dạng Brazil là dd/MM/yyyy. Hàm này kiểm tra xem mẫu có bắt đầu bằng “dd/” và chứa “/MM/” hay “dd/MM” không.
Hình 6. Hàm kiểm tra máy tính nạn nhân có đang hoạt động tại Brazil không
Ngay sau khi kiểm tra, agent kích hoạt hỗ trợ DPI phù hợp cho hệ điều hành và loại màn hình, đảm bảo hình ảnh sắc nét, vừa với tỷ lệ (thu phóng màn hình) và hoạt động tốt trên nhiều màn hình với độ phân giải khác nhau. Sau đó, agent kiểm tra xem có bất kỳ tệp nào đang chạy, được tạo trước đó trong “C:\Users\
Giao tiếp C2
Giao tiếp sử dụng thư viện WatsonTCP với các đường hầm SSL, nó sử dụng chứng chỉ X509 được mã hóa cục bộ để bảo vệ giao tiếp, một điểm tương đồng khác với phần mềm độc hại Coyote. Kết nối thực hiện với máy chủ casadecampoamazonas[.]com trên cổng 443. Chứng chỉ trích xuất dưới dạng mã hóa và mật khẩu để giải mã là Maverick2025!. Sau đó, máy khách sẽ kết nối với máy chủ.
Hình 7. Hành vi liên lạc với máy chủ C2
Để C2 hoạt động, cần phải gửi một mật khẩu cụ thể trong lần kết nối đầu tiên. Mật khẩu được kẻ tấn công sử dụng là “101593a51d9c40fc8ec162d67504e221”. Việc sử dụng mật khẩu này trong lần kết nối đầu tiên sẽ xác thực thành công agent với C2 và nó sẽ sẵn sàng nhận lệnh từ kẻ tấn công.
Kết luận
Theo phân tích của Kaspersky, phần mềm độc hại hiện được thiết kế chỉ nhắm mục tiêu vào người Brazil. Rõ ràng là mối đe dọa này rất tinh vi và phức tạp, toàn bộ chuỗi thực thi còn tương đối mới, nhưng payload cuối cùng có nhiều điểm trùng lặp và tương đồng với Trojan ngân hàng Coyote mà Kaspersky đã ghi nhận vào năm 2024.
Tuy nhiên, có một một số kỹ thuật không chỉ dành riêng cho Coyote và đã được quan sát thấy trong các Trojan ngân hàng ít được biết đến khác được viết bằng .NET. Cấu trúc của agent cũng khác với cách Coyote hoạt động (trước đây mã độc chưa từng sử dụng kiến trúc này). Rất có thể Maverick là một Trojan ngân hàng mới sử dụng mã nguồn được chia sẻ từ Coyote, điều này có thể cho thấy các nhà phát triển đã tái cấu trúc và biên dịch lại hoàn toàn phần lớn các thành phần của chúng. Maverick hoạt động giống như bất kỳ Trojan ngân hàng nào khác, nhưng khía cạnh đáng lo ngại là phương thức lây lan và tác động đáng kể của nó.