Phân tích Lu0Bot: Phần mềm độc hại trên nền tảng Node.js (Phần 1)

07:35 | 03/11/2023

Hiện nay, ngày càng có nhiều nhà phát triển phần mềm độc hại sử dụng kết hợp đa ngôn ngữ lập trình để vượt qua các hệ thống bảo mật phát hiện nâng cao. Trong đó, phần mềm độc hại Node.js Lu0Bot là minh chứng nổi bật cho xu hướng này. Bằng cách nhắm mục tiêu vào môi trường runtime - thường được sử dụng trong các ứng dụng web hiện đại và sử dụng tính năng che giấu nhiều lớp, Lu0Bot là mối đe dọa nghiêm trọng đối với các tổ chức và cá nhân. Trong phần I của bài viết sẽ khám phá kiến trúc của phần mềm độc hại này.

TỔNG QUAN VỀ LU0BOT

Lu0bot ban đầu xuất hiện vào tháng 2/2021 dưới dạng payload giai đoạn hai trong các cuộc tấn công GCleaner. Hiện tại thì nó hoạt động như một bot, chờ lệnh từ máy chủ điều khiển và kiểm soát (C2) và gửi thông tin hệ thống cơ bản được mã hóa trở lại máy chủ đó. 

Thông thường, loại phần mềm độc hại này sử dụng kỹ thuật che giấu nhiều lớp bằng JavaScript. Nó kết hợp các đặc điểm của các phần mềm độc hại truyền thống với công nghệ web khiến Lu0Bot trở thành một thách thức đặc biệt trong việc phát hiện và phân tích.

PHÂN TÍCH TĨNH

Những phát hiện chính từ quá trình kiểm tra phân tích mẫu Lu0Bot gần đây được một nhóm các nhà nghiên cứu trên AnyRun đã tiết lộ việc sử dụng trình đóng gói SFX, đây là một kho lưu trữ tự giải nén chứa các tệp được khám phá riêng lẻ. Tệp BAT được nhúng, cùng với tệp EXE chứa nhiều tệp bao gồm trình thông dịch Node, là một phần của gói này. Ngoài ra, nó còn bao gồm một số tệp “.dat”, mỗi tệp đóng vai trò cụ thể.

Tệp BAT

Hình 1. Nội dung của tập tin BAT

Dòng đầu tiên chứa một nhận xét (comment), nhưng ý nghĩa của nó vẫn chưa rõ ràng. Tiếp theo, nhiều tệp được gói thành một tệp EXE, cụ thể là trình thông dịch Node có tên là  “fjlpexyjauf.exe”.

Sau đó, trình thông dịch nhận được một tệp và một tham số (%1% trong Hình 1) có thể dùng làm khóa mã hóa cho tệp.

Tệp eqnyiodbs.dat

Tệp này được chia thành các khối byte khác nhau. Các khối này sau đó được kết hợp để tạo thành trình thông dịch Node.

Hình 2. Nội dung của tập tin eqnyiodbs.dat

Tệp tin lknidtnqmg.dat

Tệp này chứa byte được mã hóa trong Base64. Nó có thể được giải mã bằng cách sử dụng số được cung cấp làm đầu vào.

Hình 3. Nội dung của tệp lknidtnqmg.dat

Tệp tin gyvdcniwvlu.dat

Đây là trình điều khiển được thiết kế để cho phép các chương trình 32 bit trên hệ thống x64 chuyển đổi mã quét khóa thành ký tự Unicode, có thể sẽ kích hoạt chức năng keylogging.

PHÂN TÍCH ĐỘNG

Phân tích tĩnh chỉ ra tệp EXE và lknidtnqmg.dat là đáng chú ý. Bước tiếp theo là kiểm tra hành vi động và cố gắng giải mã các byte hoặc tìm chúng được giải mã trong bộ nhớ tiến trình. Các nhà nghiên cứu sử dụng sandbox phân tích phần mềm độc hại ANY.RUN để thực hiện phân tích động.

Hình 4. Cây tiến trình

Hình 4 thể hiện cây tiến trình trong quá trình thực hiện mẫu. Phân tích cho thấy rằng, khi thực thi, tiến trình chính đã khởi động tệp BAT để khởi chạy tệp EXE. Mã này chấp nhận đầu vào JS được mã hóa và thu thập dữ liệu hệ thống bằng WMIC, bao gồm thông tin về vị trí thực thi tiến trình, phù hợp với kỹ thuật T1047 MITER.

Hình 5. Thư mục Startup

Các nhà nghiên cứu phát hiện ra rằng trình thông dịch đã được sao chép vào thư mục Startup. Kết nối với tên miền vẫn tiếp tục sau khi hệ thống khởi động lại, cho phép bot tiếp tục hoạt động. Ngoài ra, phần mềm độc hại còn thể hiện một cách tiếp cận độc đáo để kết nối tên miền bằng cách tập hợp nhiều phần khác nhau thành một thực thể duy nhất trong mã JS.

Hình 6. Request DNS

PHÂN TÍCH KỸ THUẬT BẰNG TRÌNH DỊCH NGƯỢC VÀ GỠ LỖI

Để truy cập mã JS chính, các nhà nghiên cứu đã giải nén kho lưu trữ SFX; Chạy lệnh để thu thập tệp Node.js; Chạy fjlpexyjauf.exe trong x32dbg, nhập dữ liệu đến vào dòng lệnh command line; Thực thi mã JS; Định vị mã trong bộ nhớ và lưu trích xuất.

Phân tích mã JS

Mã JavaScript khá phức tạp đã được làm các nhà nghiên cứu làm rõ bằng cách loại bỏ các byte không cần thiết và sử dụng trình giải mã JavaScript. Sau khi chuyển đổi, kết quả như Hình 7.

Hình 7. Kết quả chuyển đổi mã

Mã bắt đầu bằng một mảng chứa các chuỗi được mã hóa. Ngay sau đó, các phần tử cụ thể được chuyển đến cuối mảng. Tiếp theo, có một hàm đã được triển khai để giải mã các chuỗi bằng cách sử dụng dạng thay thế BASE64 (T1132.002), tiếp theo là mã hóa/giải mã URL và cuối cùng là RC4.

Hàm này được gọi với hai biến: biến đầu tiên là một phần tử trong mảng và biến thứ hai là khóa RC4. Để đơn giản hóa nhiệm vụ phân tích cú pháp mã này, các nhà nghiên cứu đã viết một tập lệnh nhỏ tự động giải mã những dòng này, tiết lộ rằng các phần của tên miền đã được mã hóa cứng vào mẫu.

Hình 8. Trước quá trình giải mã

Hình 9. Sau khi giải mã

Sau đó, phần mã chịu trách nhiệm tập hợp tên miền đã được phát hiện.

Hình 10. Xây dựng tên miền

Gỡ lỗi mã JavaScript

Để gỡ lỗi, các nhà nghiên cứu đã sử dụng Node.js với tham số kiểm tra “-brk”, đặt điểm breakpoint trên từ khóa “var” và quan sát đầu ra do mỗi dòng tạo ra. Hàm đầu tiên là “ginf”, xử lý việc thu thập thông tin. Nó xuất ra một mảng có 15 phần tử, tất cả đều là thông tin chi tiết về hệ thống.

Hình 11. Một mảng chứa đầu ra của hàm ginf

Hàm thứ hai “hwco” đã sử dụng mảng 15 phần tử từ hàm ginf làm đầu vào, tạo đầu ra bao gồm phần cuối của miền cho đến dấu chấm. Phân tích sâu hơn cho thấy rằng kết quả đầu ra này là một bản băm của dữ liệu hệ thống được thu thập.

Hình 12. Đầu ra chuỗi từ hàm hwco

Tiếp theo, các phần tử như cổng (port), số (number) và phân đoạn tên miền (domain segment) theo dấu chấm được trích xuất từ ​​mảng “acc” và gán cho các biến.

Hình 13. Trích xuất các phần tử từ mảng acc

Một số ngẫu nhiên đã được thêm vào phân đoạn tên miền sau dấu chấm. Dòng tiếp theo sẽ chọn một tên miền thay thế nếu đáp ứng được một số điều kiện nhất định.

Hình 14. Chọn tên miền 

Sau một số thao tác khác, tên miền đã được tập hợp hoàn chỉnh và tất cả các phần tử cần thiết đã được đóng gói vào một đối tượng JSON.

Sau khi thực thi, phần mềm độc hại liên tục cố gắng xác định địa chỉ để truyền dữ liệu. Khi lưu lượng truy cập đến máy chủ thành công, quá trình trao đổi dữ liệu sẽ diễn ra, liên quan đến việc máy chủ C2 gửi mã JS.

Phát hiện Lu0Bot

Là một phần trong nỗ lực của mình, các nhà nghiên cứu đã cố gắng khám phá vô số thông tin tình báo và IOC, cũng như viết ra các quy tắc (rule) YARA, Sigma và Suricata.  Tất cả các phát hiện đã được tích hợp vào ANY.RUN, cho phép dịch vụ nhanh chóng xác định bất kỳ mẫu Lu0Bot nào và tiết lộ các tên miền C2 sau khi giải mã chuỗi.

Hình 15. Ví dụ về quy tắc Sigma

KẾT LUẬN

Lu0bot là một phần mềm độc hại bất thường kết hợp Node.js và mã JS thực thi. Nó sở hữu cấu trúc tên miền duy nhất và sử dụng các phương thức mã hóa tùy chỉnh cho chuỗi. Mặc dù hiện tại phần mềm độc hại này có mức độ hoạt động thấp nhưng Lu0bot vẫn có thể gây ra rủi ro đáng kể nếu chiến dịch của nó mở rộng quy mô và máy chủ C2 bắt đầu phản hồi tích cực.