Mã độc có rất nhiều kỹ thuật ẩn giấu, bypass logging các giải pháp bảo mật. Ở blog trước đã giới thiệu về kỹ thuật Command Line Spoofing, phần này sẽ đề cập thêm một số kỹ thuật khác, cách để phát hiện và một số khuyến nghị bảo mật. Một số kỹ thuật, giải pháp mà mình tìm hiểu:

  • Che giấu lệnh tham số (command line spoofed)
  • Tiêm mã thực thi vào tiến trình qua biến môi trường (Environment Variables)
  • Vô hiệu các nguồn thông tin của các phần mềm bảo vệ, theo dõi
  • Khuyến nghị thiết lập log, giải pháp bảo mật cần thiết để theo dõi kỹ thuật

Tiêm mã thực thi vào tiến trình qua biến môi trường (Environment Variables)

Phân tích kỹ thuật

Nhìn chung các kỹ thuật tiêm mã thực thi vào tiến trình khác (process injection) đều trải qua 3 bước chính và việc phát hiện cũng dựa vào các dấu hiệu mà 3 bước này để lại:

  • Tạo vùng nhớ
  • Ghi dữ liều cần thiết
  • Khởi tạo luồng thực thi trên tiến trình mới

Bài này sẽ giới thiệu một kỹ thuật để bỏ qua bước 1 và 2, qua đó giảm khả năng payload bị phát hiện khi thực hiện process injection.

Trong mỗi tiến trình đều có một vùng nhớ chứa Environment Variables (biến môi trường) và các giá trị của chúng, ở dạng chuỗi với độ dài tối đa là 32767 kí tự (tương ứng 32767 byte khi ở dạng ansi char và 32767*2 byte khi ở dạng wide char). Mỗi một vùng biến môi trường sẽ bao gồm tên biến và giá trị của biến, có dạng:

    Var1=Value1\0
    Var2=Value2\0
    Var3=Value3\0 
    ...
    VarN=ValueN\0\0

Mặc định, mỗi khi tiến trình được khởi tạo, các biến môi trường sẽ được gán là giá trị môi trường hiện tại của tiến trình đang khởi tạo nó. Thông qua API CreateProcess, tiến trình khởi tạo có thể thêm, sửa, xóa các biến môi trường tùy ý.

Lợi dụng điều này, kẻ tấn công có thể chỉnh sửa danh sách biến môi trường hiện tại, thêm vào một biến mới, có giá trị là chuỗi tham số đặc biệt hay chuỗi dữ liệu thô, thậm chí cả chuỗi shellcode để truyền dữ liệu này vào tiến trình mới mà không cần dùng các api rất hay bị theo dõi bởi các giải pháp bảo mật như WriteProcessMemory. Tiến trình mới sau đó sẽ có thể truy xuất các dữ liệu này thông qua việc đọc giá trị của biến môi trường.

Một số hướng ứng dụng kỹ thuật này để tránh bị các giải pháp bảo mật nghi ngờ khi cần truyền dữ liệu sang một tiến trình mới:

  • Truyền chuỗi lệnh mã hóa cho các trình script như powershell sau đó thực hiện đọc dữ liệu từ biến môi trường, giải mã và thực thi: có thể giấu tham số nghi ngờ [1]

  • Tiêm mã thực thi (process injection) vào tiến trình mới để thực thi: các kỹ thuật tiêm mã thường có 3 bước bao gồm tìm hoặc tạo vùng nhớ có thể chứa mã thực thi, ghi mã thực thi vào vùng nhớ, tạo hoặc chỉnh sửa thread để thực thi đoạn mã. Sử dụng biến môi trường để đưa mã thực thi vào tiến trình mới là một phương pháp mới áp dụng vào bước 1 và 2 do đó có thể tránh được việc đoạn mã thực thi bị quét trước khi thực thi và giảm các hành vi nghi ngờ. [2]

  • Tiêm thư viện dll vào tiến trình mới: Giống như cách 2, có thể tránh được quá trình tạo và ghi vào vùng nhớ chứa đường dẫn tới dll để nạp. [3]

Làm thế nào để phát hiện?

Tương ứng với các kỹ thuật đã nêu ở trên, có những cách để phát hiện sau:

  • Đối với cách tấn công đầu tiên, giải pháp là cần theo dõi các hành vi của powershell thông qua các bản ghi log để xác định chính xác cành hành vi mà các tiến trình này thực thi (owershell transcript, event id: “200, 400, 500, 501, 800, 4104,…”). Với các script không để lại log thực thi như wscript và script, module AMSI có thể sẽ phát hiện được các hành vi nguy hiểm trước khi nó được thực thi.

  • Với cách tấn công thứ hai, việc phát hiện sẽ trở nên khó khăn hơn. Quá trình đưa mã thực thi vào bên trong tiến trình mới không dùng phương pháp truyền thống (WriteProcessMemory) sẽ có thể không bị nghi ngờ. Tuy nhiên việc thực thi đoạn mã vẫn cần dùng cách như CreateRemoteThread có thể bị phát hiện bằng sysmon (event id 8).

  • Trong trường hợp tấn công sử dụng tiêm dll vào tiến trình, có thể phát hiện bằng event id 7 của sysmon.

QueueUserAPC có thể bypass được event id 8 của sysmon nên phả sử dụng usermode api hook để phát hiện sớm hoặc theo dõi bằng thông tin từ các Provider của ETW (một vài provider của ETW là private, chỉ một số partner của MS được truy cập dữ liệu từ provider này trên các phiên bản windows của khách hàng, ví dụ Microsoft-Windows-Threat-Intelligence provider).

 

Vô hiệu các nguồn thông tin của các phần mềm bảo vệ, theo dõi

Các cơ chế thu thập nguồn thông tin:

  • Usermode api hook: unhook, direct syscall
  • Kernel callback: remove kernel callback (SYSTEM account)
  • ETW provider: stop, delete provider (SYSTEM account)

Làm thế nào để phát hiện?

  • ETW provider theo dõi ở kernel mode nên có thể phát hiện các hành vi mà ko cần hook hoặc các hành vi bypass hook bằng direct system call.
  • Theo dõi các tiến trình nghi ngờ thực thi với quyền cao (SYSTEM), các dấu vết của kỹ thuật leo thang
  • Theo dõi việc load driver mới có thể là driver chứa lỗ hổng hoặc rootkit
  • Cập nhật bản vá thường xuyên các sản phẩm đang chạy, theo dõi danh sách các driver chứa lỗ hổng có thể bị khai thác

Khuyến nghị thiết lập log, giải pháp bảo mật cần thiết để theo dõi kỹ thuật

Một số khuyến nghị giúp theo dõi và phát hiện các kỹ thuật trên:

  • Cài đặt EDR, EPP, sysmon
  • Thiết lập log powershell, wmi
  • Thiết lập log audit nâng cao cho process, file, registry,..
  • Sử dụng giải pháp có thông tin từ ETW hoặc các công cụ Kellect, SilkETW, Sealighter để lấy thông tin từ ETW.
  • Quản trị log tập trung để hạn chế việc bị clear log (SIEM, Event Log Forwarder,…)

Tham khảo

By,

Blue_Team

34 lượt xem