15-枚举RWX区域注入

一、前言

常见的远程线程注入是需要通过 VirtualAllocEx 在远程进程的虚拟地址空间中申请一块PAGE_EXECUTE_READWRITE的内存区域,然后使用 WriteProcessMemory 将shellcode写入远程的指定内存区域,最后通过 CreateRemoteThread 创建一指向shellcode的远程线程。

但是在我们的计算机上运行大量的进程,这些进程或多或少会有RWX的内存区域,我们可以在系统上暴力破解/枚举当前正在运行的目标进程,搜索它们分配的内存块并检查是否有任何受 RWX 保护的内存块,以便我们可以尝试写入/读取/执行它们。

枚举RWX区域注入 最大的优点是它不需要 VirtualAllocEx 这个敏感的WindowsAPI,在远程线程注入的执行链中缺少了关键一步,这将有助于规避AV/EDR的检测。

二、流程

  1. 创建一个系统快照,遍历系统上的所有进程

  2. 查询每个进程的内存信息

  3. 遍历每个进程中所有分配的内存块

  4. 检查是否有任何受RWX保护的内存块并且是私有的、已提交的

  5. 如果满足上述条件

    • 打印内存块的地址

    • 将 shellcode 写入该内存块

  6. 创建一个指向上述步骤中编写的 shellcode 的远程线程(如果有必要的话可以加上这一步)

用到关键API

  1. CreateToolhelp32Snapshot:创建一个快照,获取当前系统中的所有进程。官方文档:CreateToolhelp32Snapshot 函数 (tlhelp32.h) - Win32 apps | Microsoft Learnarrow-up-right

  2. Process32First:获取第一个进程。官方文档:Process32First 函数 (tlhelp32.h) - Win32 apps | Microsoft Learnarrow-up-right

  3. Process32Next:获取下一个进程。官方文档:Process32Next 函数 (tlhelp32.h) - Win32 apps | Microsoft Learnarrow-up-right

  4. VirtualQueryEx:查询进程的内存信息。官方文档:VirtualQueryEx 函数 (memoryapi.h) - Win32 apps | Microsoft Learnarrow-up-right

⚠注意:

  1. 使用 枚举RWX区域注入 可能会导致被注入进程异常甚至是崩溃,请谨慎使用。

  2. 尽量选择注入到conhost.exe里面

三、代码实现

Last updated