Các Phương thức tấn công Process nâng cao
Last updated
Last updated
Process injection là một kỹ thuật phổ biến để vượt qua các biện pháp phòng thủ, thường được sử dụng trong malware và các chiến thuật tấn công không tệp tin. Kỹ thuật này cho phép chạy mã tùy ý trong không gian địa chỉ của một tiến trình khác. Tiêm mã vào tiến trình giúp tăng khả năng ẩn mình, một số kỹ thuật còn giúp đạt được persistence.
Mô tả: Malware ghi đường dẫn của DLL độc hại vào không gian địa chỉ ảo của một tiến trình khác và đảm bảo tiến trình từ xa tải DLL này bằng cách tạo một remote thread trong tiến trình đích.
Kịch bản tấn công:
Tìm kiếm mục tiêu để inject: Sử dụng bộ ba API gồm CreateToolhelp32Snapshot (liệt kê trạng thái heap hoặc mô-đun của một process cụ thể hoặc tất cả các process và trả về một ảnh chụp nhanh (snapshot)), Process32First (lấy thông tin về proces đầu tiên trong snapshot), Process32Next(sử dụng trong vòng lặp để lặp qua tất cả).
Sau khi tìm thấy process mục tiêu thì lấy mã điều khiển (handle) của process mục tiêu bằng cách gọi OpenProcess
POC: Rebhip worm
Malware gọi VirtualAllocEx để có một không gian để ghi đường dẫn đến DLL của nó.
Gọi WriteProcessMemory để ghi đường dẫn vào bộ nhớ đã được cấp phát
Gọi các API như CreateRemoteThread, NtCreateThreadEx hoặc RtlCreateUserThread (mục đích là truyền địa chỉ của LoadLibrary cho một trong các API này để một tiến trình từ xa phải thực thi DLL)
Nhược điểm: CreateRemoteThread bị theo dõi và gắn cờ bởi nhiều sản phẩm bảo mật + Yêu cầu DLL độc hại trên đĩa có thể phát hiện được
Thay vì truyền địa chỉ của LoadLibrary, malware có thể sao chép mã độc của nó vào một process đang mở và khiến nó thực thi (thông qua một shellcode nhỏ, hoặc bằng cách gọi CreateRemoteThread).
Một ưu điểm của PE injection so với kỹ thuật LoadLibrary là phần mềm độc hại không cần phải thả một DLL độc hại trên đĩa. Malware cũng cấp phát bộ nhớ trong một host process (vd: VirtualAllocEx) nhưng thay vì viết một DLL path, nó sẽ viết mã độc của nó trực tiếp bằng cách gọi WriteProcessMemory
Trở ngại là khi tiêm PE của nó vào một process khác, nó sẽ có một địa chỉ base mới không dự đoán được. Malware cần tìm địa chỉ bảng chuyển vị của nó trong host process và giải quyết các địa chỉ tuyệt đối của ảnh đã sao chép bằng cách lặp qua toàn bộ các mô tả chuyển vị của nó.
Kịch bản tấn công:
Tạo process mới ở trạng thái tạm dừng: Sử dụng CreateProcess với cờ CREATE_SUSPENDED
Hủy ánh xạ bộ nhớ của process mục tiêu: Sử dụng ZwUnmapViewOfSection hoặc NtUnmapViewOfSection
Cấp phát bộ nhớ mới trong process mục tiêu: Sử dụng VirtualAllocEx
Ghi mã độc vào bộ nhớ đã cấp phát: Sử dụng WriteProcessMemory
Điều chỉnh địa chỉ bắt đầu của process: Sử dụng SetThreadContext
Cuối cùng, tiếp tục luồng bị tạm dừng bằng cách gọi ResumeThread
Phát hiện: kiểm tra các module của file thực thi
Kỹ thuật này nhắm đến một luồng đang chạy trong một process, thay đổi luồng thực thi của nó để chạy mã độc, tránh việc tạo ra process hoặc luồng mới, giảm thiểu khả năng bị phát hiện
Kịch bản tấn công:
Chọn process và luồng mục tiêu: Malware sử dụng CreateToolhelp32Snapshot, Thread32First để tìm process và luồng tấn công, sau đó lấy quyền điều khiển bằng OpenThread
Tạm dừng luồng mục tiêu: Gọi SuspendThread
Cấp phát bộ nhớ và inject mã độc: Sử dụng VirtualAllocEx và WriteProcessMemory
Thay đổi luồng thực thi: Sửa đổi thanh ghi EIP (chứa địa chỉ của lệnh tiếp theo) của luồng mục tiêu bằng cách gọi SetThreadContext để trỏ tới mã độc hại đã được tiêm
Tiếp tục luồng: Gọi ResumeThread
Hooking là một kỹ thuật được dùng để chặn các cuộc gọi hàm. Malware có thể tận dụng chức năng hook để tải DLL độc hại của chúng khi một sự kiện được kích hoạt trong một luồng cụ thể. Điều này thường được thực hiện bằng cách gọi SetWindowsHookEx để cài đặt một quy trình hook vào chuỗi hook. Hàm SetWindowsHookEx nhận 4 đối số:
Loại sự kiện: WH_KEYBOARD(đầu vào từ bàn phím), WH_MOUSE(đầu vào từ chuột), CBT,...
Con trỏ tới hàm mà malware muốn gọi khi thực thi sự kiện
Mô-đun chứa hàm(thường sẽ thấy các cuộc gọi đến LoadLibrary và GetProcAddress trước khi gọi SetWindowsHookEx)
Luồng mà thủ tục hook liên kết (bằng 0 thì tất cả các luồng sẽ thực hiện hành động khi sự kiện được kích hoạt)
Tuy nhiên, Malware thường nhắm mục tiêu vào một luồng để giảm tiếng ồn, do đó cũng có thể thấy các cuộc gọi CreateToolhelp32Snapshot và Thread32Next trước SetWindowsHookEx để tìm và nhắm mục tiêu một luồng duy nhất. Sau khi DLL được tiêm, malware sẽ thực thi mã độc của nó thay cho process mà threadld của nó đã được chuyển đến hàm SetWindowsHookEx. Dưới đây là triển khai của Locky Ransomware
Appinit_DLL, AppCertDlls, và IFEO (Image File Execution Options) đều là các khóa registry mà malware sử dụng để injection và persistence, được đặt tại các vị trí sau:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls HKLM\Software\Microsoft\Windows NT\currentversion\image file execution options
AppInit_DLLs
Malware có thể chèn vị trí thư viện độc hại vào khóa registry Appinit_Dlls để yêu cầu một process tải thư viện của chúng. Mỗi thư viện trong khóa này đều được tải vào mỗi process tải User32.dll. User32.dll là một thư viện rất phổ biến được sử dụng để lưu trữ các thành phần đồ họa như hộp thoại. Do đó, khi malware sửa đổi khóa con này, phần lớn các process sẽ tải thư viện độc hại.
Hình sau minh họa trojan Ginwui mở khóa registry Appinit_Dlls bằng cách gọi RegCreateKeyEx và sửa đổi các giá trị của nó bằng cách gọi RegSetValueEx
AppCertDlls
Tương tự AppInit_DLLs trừ việc DLL trong khóa registry này được tải vào mọi process gọi các hàm API Win32 là CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW, CreateProcessWithTokenW và WinExec
Image File Execution Options (IFEO)
Image File Execution Options (IFEO) thường được dùng cho mục đích gỡ lỗi, nhưng cũng có thể bị malware lợi dụng để tự đưa chúng vào các chương trình khác. Malware sẽ sửa đổi khóa registry IFEO, đặt “Debugger Value” thành đường dẫn của chính nó, do đó mỗi khi chương trình mục tiêu được chạy, malware cũng sẽ được thực thi.
POC: Diztakun trojian điều chỉnh IFEO registry key
Malware có thể lợi dụng APC (Asynchronous Procedure Calls) để buộc một luồng khác thực thi mã tùy chỉnh của chúng bằng cách gắn nó vào hàng đợi APC của luồng mục tiêu. Mỗi luồng có một hàng đợi các APC đang chờ thực thi, khi luồng mục tiêu chuyển sang trạng thái có thể thay đổi (alterable state). Một luồng chuyển sang trạng thái cảnh báo nếu nó gọi các hàm SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx hoặc WaitForSingleObjectEx. Malware thường tìm kiếm bất kỳ luồng nào ở trạng thái có thể thay đổi, sau đó gọi OpenThread và QueueUserAPC để xếp hàng đợi APC vào một luồng. QueueUserAPC nhận ba đối số:
1) handle cho luồng mục tiêu;
2) một con trỏ đến hàm mà malware muốn chạy;
3) tham số được truyền cho con trỏ hàm.
Hình sau đây là malware Amanahe gọi OpenThread để lấy một handle của một luồng khác, sau đó gọi QueueUserAPC với LoadLibraryA làm con trỏ hàm để tiêm DLL độc hại của nó vào một luồng khác.
AtomBombing lần đầu được giới thiệu bởi EnSilo research và sau được sử dụng trong Dridex V4, cũng dựa vào APC injection nhưng dùng bảng atom để ghi vào bộ nhớ của một process khác
Ewmi là một kỹ thuật tiêm mã độc dựa trên việc đưa mã độc vào vào vùng nhớ mở rộng (EWM) của Explorer tray window, được sử dụng trong mã độc Gapz và PowerLoader. Khi đăng ký một Window class, ứng dụng có thể chỉ định một số byte bộ nhớ bổ sung gọi là EWM. Để vượt qua giới hạn trong EWM, malware sẽ ghi mã vào một phần được chia sẻ của explorer.exe và sử dụng SetWindowLong và SendNotifyMessage để làm cho con trỏ hàm trỏ đến shellcode, rồi thực thi nó. Có thể tạo phần chia sẻ và ánh xạ nó vào cả chính nó và một process khác hoặc mở rộng một phần chia sẻ đã tồn tại. Cách thứ nhất có chi phí cấp phát không gian heap và gọi NTMapViewOfSection ngoài một số lệnh gọi API khác, vì vậy cách thứ hai được sử dụng thường xuyên hơn. Sau khi malware ghi shellcode của nó vào phần được chia sẻ, nó sử dụng GetWindowLong và SetWindowLong để truy cập và sửa đổi EWM của “Shell_TrayWnd”. GetWindowLong và SetWindowLong dùng để truy xuất và thay đổi giá trị 32 bit tại offset đã chỉ định vào EWM. Bằng cách này, malware có thể dễ dàng thay đổi offset của một con trỏ hàm trong lớp cửa sổ và trỏ nó đến shellcode được ghi vào vùng chia sẻ. Để kích hoạt mã độc hại được tiêm, malware thực hiện gọi SendNotifyMessage, Shell_TrayWnd nhận và vận chuyển quyền điều khiển đến địa chỉ được trỏ đến bởi giá trị trước đó đặt bởi SetWindowLong
Dưới đây là hình ảnh của PowerLoader
Microsoft cung cấp Shims cho các developer để đảm bảo tính tương thích ngược của ứng dụng(áp dụng bản vá cho chương trình của họ mà không cần viết lại mã, từ đó có thể hướng dẫn HĐH xử lý ứng dụng của họ). Shim về cơ bản là một cách để hook vào API và nhắm mục tiêu các tệp thực thi. Malware lợi dụng điều này cho persistence và tiêm mã độc. Windows chạy Shim Engine khi nó tải một tệp nhị phân để kiểm tra các CSDL shim nhằm áp dụng các bản sửa lỗi thích hợp. Có nhiều bản sửa lỗi có thể được áp dụng, nhưng những bản sửa lỗi được malware yêu thích thương liên quan đến bảo mật (ví dụ: DisableNX, DisableSEH, InjectDLL, v.v.). Để cài đặt csdl shim, malware có thể triển khai nhiều cách tiếp cận khác nhau. Vd: Thực thi sdbinst.exe và trỏ nó đến tệp sdb độc hại.
SDB được sử dụng bởi Search Protect cho mục đích inject
IAT hooking và inline hooking thường được gọi là rootkit của người dùng.
IAT hooking: Malware thay đổi IAT(Import Address Table) của một chương trình. Khi chương trình gọi một API nằm trong DLL, hàm đã bị thay thế sẽ được thực thi thay vì hàm gốc
inline hooking: Malware sửa đổi trực tiếp hàm API.
POC: FinFisher thực hiện IAT hooking bằng cách thay đổi nơi CreateWindowEx chỉ vào
KẾT LUẬN
Shellcode Injection
Forcing A DLL To Be Loaded
DLL Injection
x
PE Injection
x
Process Hollowing
x
Thread Execution Hijacking
x
Hook Injection
x
Registry Modification
x
APC Injection
x
Shell Tray Window Injection
x
Shim Injection
x
IAT and Inline Hooking
x
x
Thay vì injection code vào một chương trình máy chủ (ví dụ: DLL injection), malware có thể thực hiện một kỹ thuật được gọi là process hollowing (làm rỗng tiến trình). Process hollowing xảy ra khi malware hủy ánh xạ (làm rỗng) mã hợp lệ khỏi bộ nhớ của process mục tiêu và ghi đè không gian bộ nhớ đó (ví dụ: svchost.exe) bằng tệp thực thi độc hại.