Stealer nodejs capcut
I. Tổng quan
Mẫu được lấy và submit lên VirusTotal - File - d6aee63ffe429ddb9340090bff2127efad340240954364f1c996a8da6b711374. Sau khi đưa mẫu vào DIE, ta biết được mẫu được biên dịch bằng C/C++, 64bit. Với thông tin này, ta có thể load mẫu vào trong IDA Pro 64 để xem xét các hành vi khác. Ở đây điều đặc biệt hơn là mẫu có tải trọng ~60MB, khá lớn so với một malware thông thường. Tại thời điểm ban đầu mình cho rằng có thể mẫu được chèn trash byte, null byte hay điều gì đó tương tự nhằm bypass các trình sandbox phát hiện mã độc.
Sau khi load mẫu và chờ một thời gian, bước đầu tiên mình chọn thực hiện là xem xét các strings xuất hiện trong file. Bước đầu từ thông tin từ VirusTotal, mình cố gắng tìm kiếm các thông tin liên quan đến Registry hay các cơ chế persistance trên máy nhưng có vẻ không có quá nhiều thông tin quan trọng. Ngoài ra mẫu còn thực hiện nhiều hành vi liên quan đến file như đọc, ghi và các hành động khác nhưng chưa có bằng chứng rõ ràng nào về hành vi của mã độc. Sau nhiều lần xem xét, mình quay lại và phát hiện sự xuất hiện của các thư viện, hay đúng hơn là các chức năng liên quan đến pkg-packer, một trình packer được sử dụng trong các bundle liên quan đến js.
II. Unpack malware
Với thông tin có được như trên, lúc này mình đã chuyển hướng sang tìm kiếm các công cụ để unpack cũng như phân tách mẫu trên. Trong quá trình tìm kiếm thì có 2 công cụ được đề cập đến là pkg-unpacker và ghidra_nodejs. Lúc này khi sử dụng remnux như thông thường để cài đặt và sử dụng pkg-unpacker thì xảy ra lỗi nhiều lần. Cảm ơn @bananNat đã cho mình lời khuyên thử chạy trên hệ điều hành Kali và tuyệt vời là chạy thành công. Bên dưới là command để thực hiện cài đặt và unpack mã độc.
1
2
3
4
git clone https://github.com/LockBlock-dev/pkg-unpacker.git
cd pkg-unpacker
npm install
node unpack.js -i ../d6aee63ffe429ddb9340090bff2127efad340240954364f1c996a8da6b711374 -o ./unpacked
Sau khi chạy chuỗi lệnh trên mình tạo được một thư mục gồm các file .*js như bên dưới. Trong đó phần lớn là node_modules, các modules, lib mặc định, file duy nhất đáng nghi là app.js.
III. Deobfuscation Malware
Mở file qua SublimeText thì mình nhận ra rằng nó đã bị obfuscation bằng obfuscation thông dụng được dùng khi viết js. Việc viết script mình đã thử bằng tay để decode nhưng có vẻ nó khá tốn thời gian mặc dù việc hiểu cơ chế obfuscation của nó không hề khó. Thay vào đó mình load nội dung của đoạn code vào các trình deobfuscation online như Obfuscator.io Deobfuscator hay JavaScript Deobfuscator. Kết quả của 2 công cụ này khá tương đồng.
Bên dưới là kết quả khi deobfuscation đoạn mã:
IV. Decrypt các thông tin bị mã hóa
Trong đoạn mã của mã độc có một hàm decipher De() dùng để mã hóa cứng các chuỗi được hacker đưa vào. Các chuỗi này bao gồm đường dẫn đến nơi lưu trữ của các browser được dùng phổ biến như Chrome, Opera, Brave, Edge, các đường dẫn đến việc gọi bot telegram phục vụ cho mục đích làm C2 (lưu trữ thông tin đánh cắp), hay các server của hacker dựng lên để truyền lệnh hay thực hiện các hành vi độc hại khác. Đoạn mã này đơn giản chỉ thực hiện chuyển đổi hex và xor với key đã được cung cấp trước, ở đây key hacker cung cấp là haha123444
.
Ngoài ra thì hacker còn sử dụng bbbse (js-base64) trong việc giải mã để kết nối với các server đã được dựng sẵn.
Các thông tin bị đánh cắp được kẻ tấn công gửi thông qua bot với chức năng sendMessage
, senDocument
đến địa chỉ telegram được dựng sẵn. Đây không phải là kỹ thuật mới khi nhiều năm qua các hacker đã tận dụng telegram với tính năng tích hợp bot như là cách để exfiltrate dữ liệu bị đánh cắp.
Kết luận
IOCs
Domains https://avatarcloud[.]top https://cloudimages[.]net https://editorimage[.]info https://getavatar[.]top https://hahaimage[.]info https://hahaimage[.]top https://hahaimage[.]xyz https://heheimage[.]info https://heheimage[.]top https://heheimage[.]xyz https://heyavatar[.]info https://heyavatar[.]top https://heyimage[.]info https://nametoimage[.]com https://toimageai[.]top
Hash
d6aee63ffe429ddb9340090bff2127efad340240954364f1c996a8da6b711374
Những thông tin hacker đánh cắp
1
2
3
4
5
{"name":"Chrome","productName":"Google Chrome","pa":"\\AppData\\Local\\Google\\Chrome\\User Data","local":"\\AppData\\Local\\Google\\Chrome\\User Data\\Local State","cookie":"\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cookies","login":"\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data"}
{"name":"Opera","productName":"Opera Browser","pa":"\\AppData\\Roaming\\Opera Software\\Opera GX Stable","local":"\\AppData\\Roaming\\Opera Software\\Opera GX Stable\\Local State","cookie":"\\AppData\\Roaming\\Opera Software\\Opera GX Stable\\Cookies","login":"\\AppData\\Roaming\\Opera Software\\Opera GX Stable\\Login Data"}
{"name":"Opera","productName":"Opera Browser","pa":"\\AppData\\Roaming\\Opera Software\\Opera Stable","local":"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Local State","cookie":"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Cookies","login":"\\AppData\\Roaming\\Opera Software\\Opera Stable\\Login Data"}
{"name":"Edge","productName":"Microsoft Edge","pa":"\\AppData\\Local\\Microsoft\\Edge\\User Data","local":"\\AppData\\Local\\Microsoft\\Edge\\User Data\\Local State","cookie":"\\AppData\\Local\\Microsoft\\Edge\\User Data\\Default\\Cookies","login":"\\AppData\\Local\\Microsoft\\Edge\\User Data\\Default\\Login Data"}
{"name":"Brave","productName":"Brave Browser","pa":"\\AppData\\Local\\BraveSoftware\\Brave-Browser\\User Data","local":"\\AppData\\Local\\BraveSoftware\\Brave-Browser\\User Data\\Local State","cookie":"\\AppData\\Local\\BraveSoftware\\Brave-Browser\\User Data\\Default\\Cookies","login":"\\AppData\\Local\\BraveSoftware\\Brave-Browser\\User Data\\Default\\Login Data"}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
type DuLieu {
ten: String
uid: String
fa: String
cookie: String
password: String
token: String
ngayLay: DateTime
cookieGg: String
email: String
fanpage: [Fanpage]
businesses: [Businesses]
taiKhoanAds: [TaiKhoanAds]
birthday: String
location: String
step: String
cookieOutlook: String
usergmail: String
passgmail: String
useroutlook: String
passoutlook: String
ip: String
nguongHienTaiCaoNhat: String
hanhDong: String
trinhDuyet: String
ngayReset: DateTime
getnew: String
_id: String
createdAt: DateTime
updatedAt: DateTime
maquocgia: String
trangthaionline: Boolean
maMay: String
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type TaiKhoanAds {
trangThai: String
ngayTao: String
ngayLapHoaDon: String
adminAn: Int
loaiTaiKhoan: String
muiGio: String
theThanhToan: String
currency: String
id: String
gioiHanChiTieu: String
nguongHienTai: String
tongChiTieu: String
soDu: String
ten: String
ngayHetHan: String
trangThaiThe: String
radioToUsd: Float
}
1
2
3
4
5
6
7
type Fanpage {
accessToken: String
id: String
name: String
verification_status: String
fan_count: String
}
1
2
3
4
5
6
7
8
9
10
type Businesses {
ten: String
gioiHan: Int
ngayTao: String
role: String
trangThai: String
nguoi: Int
linkBm: String
id: String
}
Threat Intelligence
https://x.com/josh_penny/status/1679092742666825731
Undefined #stealer disguised as @capcutapp installer distributed via @trello 🏴☠️ No VT detection