从RWX权限内存遍历到Dirty Vanity
字数 1613 2025-08-29 08:30:05
从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中调用RtlCloneUserProcessfork自身 - 执行指定的StartRoutine
实际应用注意事项
-
MessageBox限制:不能直接使用MessageBox的shellcode,因为:
- USER32!MessageBoxW在fork进程中会失败(访问违规)
- USER32.gpsi内存没有正确映射到fork进程
- gSharedInfo(来自user32!gSharedInfo)虽然被显式映射到每个进程,但带有ViewUnmap属性,影响继承行为
-
推荐shellcode:可以使用作者提供的专用shellcode(参考GitHub仓库)
参考资源
技术优势
- 绕过传统EDR/AV对远程内存操作的检测
- 不需要使用常见的注入API
- 执行环境更接近合法进程行为
- 可用于高级渗透测试和红队操作
防御建议
- 监控异常fork操作
- 检查进程创建链的异常
- 加强对RtlCloneUserProcess等底层API的监控
- 实施行为分析检测异常内存操作模式