15-枚举RWX区域注入
一、前言
常见的远程线程注入是需要通过 VirtualAllocEx 在远程进程的虚拟地址空间中申请一块PAGE_EXECUTE_READWRITE的内存区域,然后使用 WriteProcessMemory 将shellcode写入远程的指定内存区域,最后通过 CreateRemoteThread 创建一指向shellcode的远程线程。
但是在我们的计算机上运行大量的进程,这些进程或多或少会有RWX的内存区域,我们可以在系统上暴力破解/枚举当前正在运行的目标进程,搜索它们分配的内存块并检查是否有任何受 RWX 保护的内存块,以便我们可以尝试写入/读取/执行它们。
枚举RWX区域注入 最大的优点是它不需要 VirtualAllocEx 这个敏感的WindowsAPI,在远程线程注入的执行链中缺少了关键一步,这将有助于规避AV/EDR的检测。
二、流程
创建一个系统快照,遍历系统上的所有进程
查询每个进程的内存信息
遍历每个进程中所有分配的内存块
检查是否有任何受RWX保护的内存块并且是私有的、已提交的
如果满足上述条件
打印内存块的地址
将 shellcode 写入该内存块
创建一个指向上述步骤中编写的 shellcode 的远程线程(如果有必要的话可以加上这一步)
用到关键API
CreateToolhelp32Snapshot:创建一个快照,获取当前系统中的所有进程。官方文档:CreateToolhelp32Snapshot 函数 (tlhelp32.h) - Win32 apps | Microsoft LearnProcess32First:获取第一个进程。官方文档:Process32First 函数 (tlhelp32.h) - Win32 apps | Microsoft LearnProcess32Next:获取下一个进程。官方文档:Process32Next 函数 (tlhelp32.h) - Win32 apps | Microsoft LearnOpenProcess:打开进程。官方文档:OpenProcess 函数 (processthreadsapi.h) - Win32 apps | Microsoft LearnVirtualQueryEx:查询进程的内存信息。官方文档:VirtualQueryEx 函数 (memoryapi.h) - Win32 apps | Microsoft Learn
⚠注意:
使用
枚举RWX区域注入可能会导致被注入进程异常甚至是崩溃,请谨慎使用。尽量选择注入到conhost.exe里面
三、代码实现



Last updated