In-Memory Execution: Mã độc né tránh phát hiện tinh vi trong bộ nhớ

Các kỹ thuật thực thi mã độc trong bộ nhớ (in-memory execution) đang ngày càng trở nên phổ biến trong giới tấn công mạng, cho phép các tác nhân đe dọa (threat actors) triển khai các payload độc hại mà không ghi bất kỳ tệp nào xuống đĩa. Điều này giúp chúng né tránh các cơ chế phát hiện truyền thống dựa trên chữ ký tệp hay phân tích hành vi trên đĩa cứng. Các phương pháp tải mã độc này thường sử dụng các script PowerShell để thực hiện các bước phức tạp như giải mã, cấp phát bộ nhớ động, và thực thi shellcode hoặc các assembly .NET trực tiếp trong bộ nhớ.

Phân tích chi tiết kỹ thuật các chiến dịch APT/Malware

1. PowerShell Shellcode Loader (Liên quan đến Cobalt Strike)

Một trong những kỹ thuật phổ biến được các tác nhân đe dọa sử dụng là PowerShell shellcode loader. Loại loader này được thiết kế như một script PowerShell hoàn chỉnh, tập trung vào việc thực thi mã độc hoàn toàn trong bộ nhớ.

  • Đặc điểm của Loader:
    • Loader là một script PowerShell được thiết kế đặc biệt để tải và thực thi shellcode.
    • Nó sử dụng Set-StrictMode -Version Latest để đảm bảo môi trường thực thi nghiêm ngặt, giúp mã chạy sạch hơn và tránh các lỗi không mong muốn.
    • Định nghĩa hai hàm quan trọng:
      • func_get_proc_address: Hàm này sử dụng kỹ thuật Reflection của .NET để động lấy địa chỉ của các hàm Windows API (như VirtualAlloc) từ các DLL. Thay vì gọi trực tiếp API, nó tìm kiếm và gọi hàm dựa trên tên, tăng cường khả năng né tránh.
      • func_get_delegate_type: Hàm này cho phép tạo các delegate một cách linh hoạt, cần thiết để gọi các hàm trong bộ nhớ đã được cấp phát.
    • Quy trình thực thi chính trên các hệ thống x64 diễn ra như sau:
      • Mã độc giải mã một mảng byte được mã hóa Base64.
      • Sau đó, nó tiếp tục giải mã dữ liệu bằng phép toán XOR.
      • Sử dụng hàm VirtualAlloc của Windows API để cấp phát một vùng bộ nhớ có khả năng thực thi (executable memory). Đây là bước cực kỳ quan trọng vì nó cho phép shellcode chạy mà không cần ghi xuống đĩa.
      • Cuối cùng, shellcode đã giải mã được sao chép vào vùng bộ nhớ đã cấp phát và được thực thi thông qua một delegate. Toàn bộ quá trình này diễn ra hoàn toàn trong bộ nhớ, giúp mã độc tránh bị các phần mềm bảo mật truyền thống phát hiện dựa trên chữ ký tệp hoặc hành vi ghi đĩa.
  • Phát hiện & Săn tìm (Detection & Hunting):
    • Một phương pháp hiệu quả để phát hiện các loader tương tự là tìm kiếm tên hàm "func_get_delegate_type" trong các tệp .ps (PowerShell script). Việc này đã dẫn đến việc phát hiện nhiều script đáng ngờ liên quan đến cơ sở hạ tầng Cobalt Strike đang hoạt động, được lưu trữ trên các máy chủ ở Trung Quốc và Nga.
  • Cơ sở hạ tầng (Infrastructure):
    • Nhiều thư mục mở (open directories) lưu trữ các script độc hại này đã được tìm thấy công khai trên các máy chủ Trung Quốc, cung cấp bằng chứng rõ ràng về việc các loader này đang được sử dụng rộng rãi.

2. Malware Chihuahua Stealer

Chihuahua Stealer là một loại malware đánh cắp thông tin (infostealer) được phát triển dựa trên .NET framework, sử dụng các kỹ thuật tinh vi để duy trì sự bền bỉ và thực thi trong bộ nhớ.

  • Chiến thuật, Kỹ thuật và Quy trình (TTPs):
    • Để duy trì sự bền bỉ trên hệ thống bị lây nhiễm, Chihuahua Stealer sử dụng các tác vụ theo lịch (scheduled tasks/jobs) thông qua các cmdlet PowerShell như Get-ScheduledJobSet-ScheduledJob. Điều này giúp mã độc tự khởi chạy lại sau khi hệ thống khởi động hoặc theo một chu kỳ nhất định.
    • Mã độc tải các assembly .NET từ các URL được lưu trữ trên các dịch vụ đám mây công khai, bao gồm:
    • flowers.hold-me-finger[.]xyz/api/arhbr49b
    • Và các URL được lưu trữ trên OneDrive, thường chứa các payload đã được mã hóa Base64.
  • Các bước thực thi trong bộ nhớ:

    Chihuahua Stealer thực hiện các bước sau để tải và thực thi payload hoàn toàn trong bộ nhớ:

    Invoke-RestMethod                   # Lấy payload đã được mã hóa từ URL
    [System.Convert]::FromBase64String()  # Giải mã chuỗi Base64 thành mảng byte
    [System.Reflection.Assembly]::Load(...) # Tải mảng byte đã giải mã thành một .NET assembly trực tiếp vào bộ nhớ. Đây là kỹ thuật "reflective loading".
    # Kỹ thuật Reflection sau đó được sử dụng để gọi phương thức Main của lớp Program trong assembly đã tải.
    

    Sau khi hoàn tất quá trình thực thi, mã độc sẽ xóa nội dung console và xóa nội dung clipboard, sau đó thoát khỏi PowerShell. Phương pháp này hoàn toàn tránh việc ghi bất kỳ tệp nào xuống đĩa, giúp nó né tránh các giải pháp chống virus truyền thống dựa trên chữ ký tệp.

3. Trojan truy cập từ xa / Đánh cắp thông tin ARECHCLIENT2

ARECHCLIENT2 là một Trojan truy cập từ xa (Remote Access Trojan – RAT) và đánh cắp thông tin (Infostealer) nguy hiểm, sử dụng các kỹ thuật tinh vi để né tránh phát hiện và thực thi payload.

  • Kỹ thuật thực thi:

    ARECHCLIENT2 sử dụng kỹ thuật hooking trên các API của Windows để né tránh các biện pháp bảo mật, đặc biệt là AMSI (Antimalware Scan Interface):

    Hooks LoadLibraryExW chờ tải amsi.dll,
    sau đó hooks AmsiScanBuffer0 API,
    bypassing AMSI protections.
    

    Bằng cách này, mã độc có thể thực thi các lệnh PowerShell hoặc các payload khác mà không bị AMSI quét và chặn.

    Mã độc còn có khả năng phân tích các tiêu đề PE (Portable Executable) để định vị section .tls (Thread Local Storage). Cụ thể:

    40 byte đầu tiên = XOR key,
    Các byte còn lại = mẫu ARECHCLIENT2 đã mã hóa,
    được giải mã trong bộ nhớ.
    

    Kỹ thuật này cho phép mã độc giấu payload chính đã mã hóa trong một phần ít được kiểm tra của tệp PE và giải mã nó khi cần thiết, hoàn toàn trong bộ nhớ.

    ARECHCLIENT2 tải .NET CLR (Common Language Runtime) một cách động thông qua Windows API:

    CLRCreateInstance()
    

    Và tải assembly malware một cách phản xạ (reflectively) mà không chạm vào đĩa, tương tự như Chihuahua Stealer, nhưng với mục đích và khả năng phức tạp hơn.

  • Mục tiêu / Khả năng của ARECHCLIENT2:

    ARECHCLIENT2 được thiết kế với nhiều khả năng độc hại:

    • Đánh cắp thông tin đăng nhập và tài chính: Mã độc nhắm mục tiêu vào ví tiền điện tử, mật khẩu trình duyệt, cookie, dữ liệu tự động điền; thông tin đăng nhập FTP/VPN/Telegram/Discord/Steam.
    • Thu thập thông tin hệ thống (System Profiling): Nó thu thập thông tin phiên bản hệ điều hành, thông tin phần cứng, địa chỉ IP, tên máy; dữ liệu vị trí địa lý (thành phố/quốc gia/múi giờ).
    • Thực thi lệnh (Command Execution): Có khả năng thực thi các lệnh nhận được từ máy chủ C2 (Command and Control), cho phép kẻ tấn công kiểm soát từ xa các máy chủ bị lây nhiễm.

Các kỹ thuật MITRE ATT&CK được tham chiếu hoặc ngụ ý

Các chiến dịch và kỹ thuật được mô tả ở trên liên quan đến nhiều kỹ thuật được định nghĩa trong khung MITRE ATT&CK, phản ánh các phương pháp mà các tác nhân đe dọa sử dụng để đạt được mục tiêu của mình:

  • T1059.001 – Command-Line Interface: PowerShell: Việc sử dụng các script PowerShell để tải, giải mã và thực thi mã độc là một ví dụ điển hình của kỹ thuật này. PowerShell cung cấp môi trường mạnh mẽ cho việc thao tác hệ thống và thực hiện các hoạt động độc hại.
  • T1106 – Native API: Việc sử dụng các hàm Windows API như VirtualAlloc, LoadLibraryExW, AmsiScanBuffer0, và CLRCreateInstance() để thực hiện các thao tác cấp phát bộ nhớ, tải DLL, hoặc né tránh bảo mật là một minh chứng rõ ràng.
  • T1218 – Signed Binary Proxy Execution: Mặc dù không được đề cập trực tiếp, việc sử dụng các công cụ hệ thống hợp pháp hoặc các binary đã ký để thực thi mã độc (ví dụ, PowerShell là một binary đã ký) có thể ngụ ý cho kỹ thuật này, nơi các kẻ tấn công lạm dụng các công cụ hợp pháp để ẩn mình.
  • T1053 – Scheduled Task/Job: Việc sử dụng Set-ScheduledJob bởi Chihuahua Stealer để duy trì sự bền bỉ là một ví dụ trực tiếp của kỹ thuật này.
  • T1027 – Obfuscated Files or Information: Mã hóa Base64, giải mã XOR, và giấu payload trong section .tls là các kỹ thuật che giấu thông tin được sử dụng để tránh bị phát hiện.
  • T1047 – Windows Management Instrumentation: Mặc dù không được đề cập trực tiếp, WMI thường được sử dụng cùng với PowerShell cho các mục đích quản trị và thực thi từ xa, có thể là một phần trong chuỗi tấn công dài hơn.

IOCs (Indicators of Compromise) được trích xuất từ phân tích

Dưới đây là danh sách các IOCs quan trọng được trích xuất từ các chiến dịch và malware đã phân tích, rất hữu ích cho việc săn lùng mối đe dọa và tăng cường phòng thủ:

URLs / Domains

  • flowers.hold-me-finger[.]xyz/api/arhbr49b (Vị trí tải xuống assembly .NET ban đầu được sử dụng bởi Chihuahua Stealer)
  • OneDrive-hosted URL (Được sử dụng cho payload Chihuahua Stealer giai đoạn hai đã được mã hóa Base64)
  • Chinese server open directory (Lưu trữ script PowerShell loader y1.ps1 liên kết với Cobalt Strike)
  • Russian provider hostnames (Cung cấp các PowerShell loader tương tự liên quan đến cơ sở hạ tầng Cobalt Strike)

Tên tệp (File Names)

  • y1.ps1 (Script PowerShell loader độc hại được phát hiện công khai)
  • ARECHCLIENT2 (Tên của trojan truy cập từ xa được tải phản xạ trong bộ nhớ)
  • Chihuahua Stealer (Tên của payload infostealer cuối cùng được thực thi qua reflection)
  • f90g30g82 (Tên tác vụ theo lịch được sử dụng bởi cơ chế bền bỉ của Chihuahua Stealer)

Hàm / Lệnh (Functions / Commands)

  • func_get_proc_address (Hàm lấy địa chỉ Windows API một cách động bằng Reflection)
  • func_get_delegate_type (Hàm tạo delegate một cách động để thực thi mã trong bộ nhớ)
  • Get-ScheduledJob
  • Set-ScheduledJob
  • New-JobTrigger
  • Invoke-RestMethod
  • [System.Convert]::FromBase64String()
  • [System.Reflection.Assembly]::Load(...)
  • CLRCreateInstance() (Cuộc gọi WinAPI tải CLR runtime trước khi tải phản xạ)
  • Các API bị hooking:
    • LoadLibraryExW
    • AmsiScanBuffer0
  • XOR decryption keys extracted from TLS section
  • VirtualAlloc

Bảng so sánh tóm tắt các Artifact chính qua các chiến dịch

Khía cạnhCobalt Strike LoaderChihuahua StealerARECHCLIENT2 RAT
Cơ chế phân phốiPS Script Shellcode LoaderPS Downloader + Scheduled JobReflective Loading sau AMSI Bypass
Loại PayloadShellcode đã mã hóaAssembly .NET đã mã hóaAssembly .NET đã mã hóa
Sự bền bỉScheduled Job mỗi phút
Sử dụng get_proc_address?
Sử dụng get_delegate_type?