从RWX权限内存遍历到Dirty Vanity
字数 1613 2025-08-29 08:30:05

从RWX权限内存遍历到Dirty Vanity技术详解

遍历RWX内存技术

基本原理

  1. 使用NtQuerySystemInformation系统调用遍历系统中的所有进程
  2. 通过NtQueryVirtualMemory查询每个进程的内存属性
  3. 寻找具有RWX(读-写-执行)权限的内存区域
  4. 将shellcode写入找到的RWX内存区域
  5. 创建远程线程执行注入的shellcode

技术特点

  • 这种方法会覆盖目标进程原有内存内容,可能导致目标进程崩溃
  • 成功率取决于找到合适的RWX内存区域
  • 对于.NET程序,可以利用特定句柄BaseNamedObjectsCor_Private_IPCBlock_v4_[pid]来辅助查找

Dirty Vanity技术详解

基本概念

Dirty Vanity是一种创新的代码注入技术,利用Windows的fork&exec机制进行进程创建和代码执行。

与传统注入技术的区别

传统注入技术 Dirty Vanity
需要远程申请内存 不需要远程申请内存
需要远程写内存 不需要远程写内存
创建远程线程执行 在fork的进程中执行
操作发生在目标进程 操作发生在fork的进程

核心技术实现

fork机制

Windows通过ntdll.dll中的RtlCloneUserProcess实现fork操作:

  • 创建一个新的子进程
  • 新进程是父进程的完全副本(除了PID不同)
  • 复制内存、文件描述符、代码等数据

fork分为两种类型:

  1. self fork - fork自身进程
  2. remote fork - fork远程进程

NtCreateUserProcess

关键参数说明:

  • 前两个参数:返回的进程和线程句柄
  • 第三四个参数:访问掩码(PROCESS_ALL_ACCESS等)
  • 第五六个参数:对象属性
  • 第七八个参数:属性标志(如挂起状态)
  • ProcessParameters:指向RTL_USER_PROCESS_PARAMETERS结构
  • CreateInfo:指向PS_CREATE_INFO结构
  • AttributeList:属性列表

NtCreateProcessEx

  • 用于实现remote fork
  • PssCaptureSnapshot底层调用了此函数

RtlCreateProcessReflection

实现remote fork的关键步骤:

  1. 在当前进程和目标进程间创建共享内存
  2. 创建线程执行RtlpProcessReflectionStartup
  3. RtlpProcessReflectionStartup中调用RtlCloneUserProcess fork自身
  4. 执行指定的StartRoutine

实际应用注意事项

  1. MessageBox限制:不能直接使用MessageBox的shellcode,因为:

    • USER32!MessageBoxW在fork进程中会失败(访问违规)
    • USER32.gpsi内存没有正确映射到fork进程
    • gSharedInfo(来自user32!gSharedInfo)虽然被显式映射到每个进程,但带有ViewUnmap属性,影响继承行为
  2. 推荐shellcode:可以使用作者提供的专用shellcode(参考GitHub仓库)

参考资源

  1. DeepInstinct官方博客
  2. 技术视频讲解
  3. GitHub实现代码

技术优势

  • 绕过传统EDR/AV对远程内存操作的检测
  • 不需要使用常见的注入API
  • 执行环境更接近合法进程行为
  • 可用于高级渗透测试和红队操作

防御建议

  • 监控异常fork操作
  • 检查进程创建链的异常
  • 加强对RtlCloneUserProcess等底层API的监控
  • 实施行为分析检测异常内存操作模式
从RWX权限内存遍历到Dirty Vanity技术详解 遍历RWX内存技术 基本原理 使用 NtQuerySystemInformation 系统调用遍历系统中的所有进程 通过 NtQueryVirtualMemory 查询每个进程的内存属性 寻找具有RWX(读-写-执行)权限的内存区域 将shellcode写入找到的RWX内存区域 创建远程线程执行注入的shellcode 技术特点 这种方法会覆盖目标进程原有内存内容,可能导致目标进程崩溃 成功率取决于找到合适的RWX内存区域 对于.NET程序,可以利用特定句柄 BaseNamedObjectsCor_Private_IPCBlock_v4_[pid] 来辅助查找 Dirty Vanity技术详解 基本概念 Dirty Vanity是一种创新的代码注入技术,利用Windows的fork&exec机制进行进程创建和代码执行。 与传统注入技术的区别 | 传统注入技术 | Dirty Vanity | |------------|-------------| | 需要远程申请内存 | 不需要远程申请内存 | | 需要远程写内存 | 不需要远程写内存 | | 创建远程线程执行 | 在fork的进程中执行 | | 操作发生在目标进程 | 操作发生在fork的进程 | 核心技术实现 fork机制 Windows通过 ntdll.dll 中的 RtlCloneUserProcess 实现fork操作: 创建一个新的子进程 新进程是父进程的完全副本(除了PID不同) 复制内存、文件描述符、代码等数据 fork分为两种类型: self fork - fork自身进程 remote fork - fork远程进程 NtCreateUserProcess 关键参数说明: 前两个参数:返回的进程和线程句柄 第三四个参数:访问掩码(PROCESS_ ALL_ ACCESS等) 第五六个参数:对象属性 第七八个参数:属性标志(如挂起状态) ProcessParameters:指向RTL_ USER_ PROCESS_ PARAMETERS结构 CreateInfo:指向PS_ CREATE_ INFO结构 AttributeList:属性列表 NtCreateProcessEx 用于实现remote fork PssCaptureSnapshot底层调用了此函数 RtlCreateProcessReflection 实现remote fork的关键步骤: 在当前进程和目标进程间创建共享内存 创建线程执行 RtlpProcessReflectionStartup 在 RtlpProcessReflectionStartup 中调用 RtlCloneUserProcess fork自身 执行指定的StartRoutine 实际应用注意事项 MessageBox限制 :不能直接使用MessageBox的shellcode,因为: USER32 !MessageBoxW在fork进程中会失败(访问违规) USER32.gpsi内存没有正确映射到fork进程 gSharedInfo(来自user32 !gSharedInfo)虽然被显式映射到每个进程,但带有ViewUnmap属性,影响继承行为 推荐shellcode :可以使用作者提供的专用shellcode(参考GitHub仓库) 参考资源 DeepInstinct官方博客 技术视频讲解 GitHub实现代码 技术优势 绕过传统EDR/AV对远程内存操作的检测 不需要使用常见的注入API 执行环境更接近合法进程行为 可用于高级渗透测试和红队操作 防御建议 监控异常fork操作 检查进程创建链的异常 加强对RtlCloneUserProcess等底层API的监控 实施行为分析检测异常内存操作模式