Phân tích phần mềm độc hại RisePro: Khám phá giao tiếp C2 trong phiên bản mới
TỔNG QUAN VỀ RISEPRO
RisePro lần đầu tiên được phát hiện bởi các công ty an ninh mạng Flashpoint và Sekoia. Nó được phân phối thông qua các trang web bẻ khóa (crack) giả mạo được vận hành bởi dịch vụ phân phối phần mềm độc hại PrivateLoader PPI (pay-per-install). Phần mềm độc hại này thiết kế để đánh cắp thông tin thẻ tín dụng, mật khẩu và ví tiền điện tử từ các thiết bị bị nhiễm.
RisePro có khả năng dựa trên phần mềm độc hại đánh cắp mật khẩu Vidar và nó sử dụng một hệ thống phụ thuộc DLL được nhúng. Phương thức hoạt động của RisePro bao gồm lấy dấu vân tay của hệ thống bị xâm nhập, ghi dữ liệu bị đánh cắp vào tệp văn bản, chụp ảnh màn hình, sau đó đóng gói và gửi dữ liệu này đến máy chủ của kẻ tấn công.
Dịch vụ PrivateLoader phân phối RisePro được biết đến với việc ngụy trang phần mềm độc hại dưới dạng các bản phần mềm bẻ khóa, các trình sinh khóa và sửa đổi các trò chơi. Nó được công ty an ninh Intel471 phát hiện lần đầu tiên vào tháng 02/2022. Trong khi đó, các nhà nghiên cứu của Sekoia cho rằng RisePro có chung các mã trùng lặp đáng kể với PrivateLoader, cho thấy mối liên hệ sâu sắc hơn giữa cả hai.
Phân tích của Anyrun tập trung vào những thay đổi gần đây trong mô hình lưu lượng mạng và giao tiếp C2 của RisePro trong phiên bản mới nhất, khác biệt đáng kể so với các phiên bản trước.
PHÂN TÍCH LƯU LƯỢNG TRUY CẬP PHIÊN BẢN MỚI CỦA RISEPRO
Có một sự thay đổi lớn về cách thức liên lạc của RisePro. Trong Hình 1 dưới đây là ảnh chụp màn hình gói tin mạng từ hệ thống sandbox phát hiện phần mềm độc hại trực tuyến của Anyrun.
Hình 1. So sánh nội dung gói tin được mã hóa (trái) và được giải mã (phải)
Khi kiểm tra các gói byte (cột bên phải), rõ ràng lưu lượng đã được mã hóa, khiến nó không thể giải mã được. Nhiệm vụ đầu tiên sau đó là giải mã nó. Các nhà nghiên cứu của Sekoia đã bẻ khóa mã hóa này, vì vậy để bắt đầu, Anyrun quyết định thử áp dụng thuật toán giải mã của họ. Điều đáng ngạc nhiên là nó đã giải mã thành công dữ liệu. Đồng nghĩa là mã hóa tương tự vẫn được sử dụng.
Thuật toán mã hóa là mã thay thế (Substitution Cipher) cơ bản - đây là phương pháp mà từng kí tự (hay từng nhóm kí tự) trong Plaintext được thay thế bằng một kí tự (hay một nhóm kí tự) khác tạo ra Ciphertext, theo sau là XOR với khóa 0x36. Bằng cách kiểm tra nó với các cổng khác nhau, các nhà nghiên cứu có thể tìm thấy nhiều khóa. Ví dụ: khóa cho cổng 50500 là 0x36 và đối với cổng 50505 là 0x79. Điều thú vị là các opcode (một phần của lệnh ngôn ngữ máy chỉ định thao tác sẽ được thực hiện) mang những ý nghĩa khác nhau tùy thuộc vào cổng.
Vì đã giải mã luồng TCP nên có thể bắt đầu hình dung cơ bản về cấu trúc của từng gói.
Hình 2. Mỗi gói tin có 3 khối theo một khuôn mẫu
Trong Hình 2, chúng ta thấy một số gói (gói đầu tiên là gói khởi tạo) với ba khối riêng biệt đáng chú ý, theo một khuôn mẫu rõ ràng.
Hình 3. Cấu trúc gói tin
Về cấu trúc gói tin, 4 byte đầu tiên được gắn nhãn là “magic”, luôn được lặp lại và xác định phần đầu của gói; 4 byte tiếp theo xác định độ dài của dữ liệu được đính kèm vào gói, được gắn nhãn là “payload_len”; Ngay sau đó là “packet_type”. Trong quá trình phân tích, các nhà nghiên cứu đã phát hiện ra các một số packet_types sau, đại diện cho nhiều loại opcode khác nhau.
Bảng 1. Một số packet_types
Rõ ràng đây là giao thức được máy khách xác nhận, vì hầu hết các tin nhắn đều có phản hồi “CONFIRM”. Từ Bảng 1, chúng ta có thể thấy rằng giao thức hỗ trợ các chức năng như tải cài đặt cấu hình, gửi tệp,… Kiểm tra các gói tin khác nhau cho thấy payload thường là chuỗi UTF-8 được mã hóa. Tuy nhiên, cần lưu ý rằng độ dài payload có thể bằng 0.
Hơn nữa, có hai loại gói riêng biệt khác với payload chuỗi thông thường: CLIENT_SEND_FILE và SERVER_SEND_FILE. Packet_type 0x271Fb ( CLIENT_SEND_FILE ) có cấu trúc payload này, được thể hiện qua Hình 4 và Hình 5 là packet_type 0x2715 (SERVER_SEND_FILE).
Hình 4. Packet_type 0x271F (CLIENT_SEND_FILE)
Hình 5. Packet_type 0x2715 (SERVER_SEND_FILE)
Từ hình ảnh trên có thể thấy rằng các gói này chứa các cấu trúc con thay cho các chuỗi để xử lý dữ liệu tệp.
THỨ TỰ GÓI TIN
Giao thức liên lạc với máy chủ C2 được chia thành ba giai đoạn chính:
- Khởi tạo: Đây là bước đầu tiên, trong đó máy khách thiết lập kết nối với máy chủ và khởi tạo phiên giao tiếp.
- Lấy thông tin cấu hình: Trong giai đoạn này, máy khách truy xuất chi tiết cấu hình từ máy chủ, có thể bao gồm các lệnh, tham số hoặc thông tin mục tiêu.
- Đánh cắp và tải hàm chức năng: Tại đây, máy khách thực hiện các hoạt động độc hại như đánh cắp dữ liệu.
Ngoài ra còn có giai đoạn 4 tùy chọn bao gồm việc khởi tạo HVNC (Hidden Virtual Network Computing), cho phép điều khiển từ xa mà không bị phát hiện.
Giai đoạn 1: Khởi tạo
Hình 6. Luồng khởi tạo mặc định để liên lạc với máy chủ C2
Luồng khởi tạo được thực hiện như sau:
1. Giao tiếp bắt đầu bằng gói SERVER_INIT sau khi thiết lập kết nối.
2. Máy khách có thể gửi gói CLIENT_INIT ngay sau khi kết nối, trước khi máy chủ gửi gói của nó. Nếu máy khách bắt đầu bằng CLIENT_INIT thì máy chủ sẽ phản hồi bằng SERVER_PING theo mặc định.
3. Gói SERVER_INIT bao gồm mã thông báo phiên, được sử dụng để nhận dạng duy nhất phiên.
4. Sau đó, máy chủ sẽ gửi địa chỉ IP public của nạn nhân cho máy khách.
5. Máy khách xác nhận địa chỉ IP bằng cách gửi lại xác nhận cùng với một chuỗi bổ sung trong phản hồi của nó.
Với các bước này, quá trình khởi tạo kết nối giữa máy khách và máy chủ đã hoàn tất.
Giai đoạn 2: Lấy thông tin cấu hình
Giai đoạn cấu hình bao gồm việc máy chủ gửi cấu hình theo một thứ tự cụ thể và máy khách gửi lại xác nhận kèm theo payload bổ sung.
Hình 7. Lấy thông tin cấu hình
Máy chủ gửi “mark_config”, “grab_config” và “loader_config” theo một trình tự cụ thể để thiết lập hành vi của phần mềm độc hại. Grab_config chỉ định phạm vi thu thập dữ liệu, đích đến của thông tin được thu thập và các chức năng mà phần mềm độc hại sẽ sử dụng. Ví dụ: nó cho phép phần mềm độc hại cấu hình máy chủ proxy trên máy tính của nạn nhân, khởi chạy HVNC và truyền dữ liệu tới Telegram (với tham số tg_ids chỉ định người nhận tin nhắn và tg_token là mã thông báo bot trong Telegram). Ngoài ra, phần mềm độc hại có khả năng chụp ảnh màn hình tại thời điểm thực thi (grab_screen) và đánh cắp dữ liệu từ các ứng dụng như Telegram và Discord.
Hình 8. Gói tin loader_config
Dưới đây là một số tham số đáng chú ý từ cấu hình trên:
- ld_geo: Cài đặt này có thể kích hoạt bộ lọc vị trí địa lý. Nếu được thiết lập, nó có thể kiểm tra mã quốc gia cụ thể, cho phép trình tải chỉ thực thi nếu có kết quả khớp.
- ld_marks: Đây là những điều kiện bổ sung xác định thời điểm nên kích hoạt trình tải.
- ld_name: Đây là mã định danh cho cấu hình cụ thể.
- ld_url: Điều này chỉ định nguồn URL mà payload sẽ được tải xuống.
Cấu trúc cấu hình này khác nhau ở các phiên bản mới và cũ của RisePro. Đáng chú ý là khi máy chủ được cập nhật, các phiên bản cũ hơn của phần mềm độc hại sẽ tiếp tục hoạt động. Tuy nhiên, chúng có thể bỏ qua một số giá trị cấu hình hoặc dữ liệu mới được giới thiệu trong các bản cập nhật.
Giai đoạn 3: Thực hiện đánh cắp và tải hàm chức năng
Ở giai đoạn này trong quy trình, máy chủ đưa ra lệnh chỉ định dữ liệu cần thu thập và để phản hồi, máy khách sẽ biên dịch và gửi lại kho lưu trữ .zip chứa tất cả dữ liệu bị đánh cắp.
Hình 9. Giao tiếp mạng để đánh cắp dữ liệu và tải hàm chức năng
Hình 10. Ví dụ về quy tắc lọc dữ liệu
Hình 10 là ví dụ về các quy tắc lọc dữ liệu.
- rule_collect_recursv: Điều này cho thấy phần mềm độc hại sẽ tìm kiếm đệ quy qua các thư mục, đi sâu vào các thư mục con để định vị tệp.
- rule_exceptions: Xác định các vị trí hoặc tệp cụ thể mà RisePro nên tránh.
- rule_files: Đây là mẫu hoặc tập hợp các phần mở rộng tệp mà RisePro nhắm tới để đánh cắp dữ liệu.
- rule_folder: Chỉ định đường dẫn từ các tệp, như được xác định bởi cấu hình biến môi trường sẽ được trích xuất.
- rule_name: Đây là mã định danh nội bộ cho các tập luật. Có thể có nhiều quy tắc như vậy.
- rule_size_kb: Điều này có thể đặt giới hạn kích thước tệp tối đa. Các tệp lớn hơn giá trị được chỉ định này sẽ không được thu thập.
Khi nhận được cấu hình, máy khách sẽ đánh cắp dữ liệu cụ thể và gửi lại dưới dạng kho lưu trữ zip.
Hình 11. Nội dung của kho lưu trữ chứa dữ liệu được lọc
Hình 12. Cấu trúc của các gói truyền dữ liệu
Cấu trúc của gói gửi dữ liệu bị đánh cắp bao gồm mã quốc gia, theo sau là dấu gạch dưới (_), sau đó là địa chỉ IP và cuối cùng là phần mở rộng .zip. Ví dụ: “DE_127.0.0.1.zip”. Giai đoạn này bao gồm các hành động phụ thuộc vào cấu hình đã chỉ định, như các chức năng của trình tải.
Nếu cấu hình trình tải được cung cấp, máy khách sẽ tải xuống một tệp và thực thi nó bằng các tác vụ đã lên lịch (schtask). Điều này cho thấy phần mềm độc hại có chức năng tải.
Thông tin chi tiết khác có trong gói “CLIENT_CONFIRM_LOADER_EXECUTION”. Sau khi thực thi, máy khách sẽ gửi xác nhận trở lại máy chủ, bao gồm giá trị của “ld_name”.
Giai đoạn 4: Giới thiệu tùy chọn HVNC
Phiên bản mới của RisePro cũng sở hữu khả năng điều khiển từ xa, nghĩa là giờ đây nó có thể hoạt động như một Trojan truy cập từ xa. Khả năng kích hoạt HVNC được bao gồm trong grab_config, như thể hiện trong Hình 13 dưới đây.
Hình 13. Việc sử dụng HVNC được đặt thành true trong grap_config
Nếu HVNC được bật, RisePro sẽ khởi tạo một phiên bản khác của chính nó, cụ thể là để tải xuống DLL và chạy máy chủ cho chức năng điều khiển từ xa.
Giai đoạn 4.1: Yêu cầu module HVNC
Để hiểu cách thiết lập kết nối HVNC, chúng ta xem xét quy trình diễn ra trong luồng TCP thứ hai. Điều này sẽ cung cấp thông tin chi tiết về các bước và thông tin liên lạc liên quan đến việc bắt đầu kết nối HVNC. Quá trình này có thể được mô tả như sau:
Giai đoạn 1: Máy khách gửi yêu cầu về tệp DLL, bao gồm một chuỗi chỉ định tên tệp.
Giai đoạn 2: Máy chủ xác nhận yêu cầu, gửi mã thông báo cho phiên và sau đó truyền tệp được yêu cầu.
Giai đoạn 4.2: Kết nối thứ ba
Trong lần kết nối thứ ba, quá trình liên lạc liên quan đến HVNC được đặc trưng bởi hai giai đoạn chính:
Giai đoạn 1: Truyền dữ liệu từ máy chủ. Ban đầu, máy chủ sẽ gửi dữ liệu cụ thể liên quan đến hoạt động của HVNC.
Giai đoạn 2: Sau đó, để duy trì kết nối, máy chủ sẽ gửi tin nhắn ping định kỳ đến máy khách.
LỌC DỮ LIỆU
Sau khi khám phá các kiểu giao tiếp mạng của RisePro, chúng ta có thể chuyển sang kiểm tra nội dung của các tệp do phần mềm độc hại gửi. Trước tiên, kiểm tra một tệp có tên information.txt.
Hình 14. Tệp information.txt
Tệp tin này chứa nhiều chi tiết khác nhau. Dưới đây là một số điểm nổi bật:
- Version: Chỉ định phiên bản của phần mềm độc hại.
- Date: Ngày phần mềm độc hại được kích hoạt.
- GUID: Có khả năng được sử dụng để định danh duy nhất máy tính.
- HWID: Mã định danh duy nhất cho phần cứng của hệ thống bị nhiễm.
- Path: Đường dẫn tệp từ nơi phần mềm độc hại được thực thi.
- Hardware: Chi tiết về card màn hình, bộ xử lý, RAM,…
- Processor: Tên và ID của các tiến trình hệ thống, có thể được sử dụng để kiểm tra xem có phần mềm anti-virus nào đang hoạt động hay không.
- Software: Liệt kê các phần mềm đã đăng ký
Ngoài ra, phần mềm độc hại sẽ gửi mật khẩu bị đánh cắp trong một tệp riêng biệt có tên là passs.txt. Đáng chú ý ngay lập tức là một liên kết đến nhóm hỗ trợ Telegram có liên quan đến hoạt động của phần mềm độc hại, có thể được cung cấp để được hỗ trợ hoặc hướng dẫn thêm. Tệp này cũng liệt kê các mật khẩu đã được trích xuất từ cơ sở dữ liệu của trình duyệt, ứng dụng email và phần mềm khác.
Kể từ ngày 22/11/2023, phiên bản hiện tại của RisePro được gắn nhãn là 1.0. Ngoài ra, kênh hỗ trợ Telegram của phần mềm độc hại này còn lưu ý rằng có hai phiên bản chính: một phiên bản viết bằng C# và một phiên bản khác viết bằng C++. Phiên bản C++ của RisePro thường được bảo vệ bằng VMProtect và được làm xáo trộn để tránh bị phát hiện và phân tích.
Hồng Đạt
(Tổng hợp)