细说Cobalt Strike进程注入
字数 1875 2025-08-26 22:11:45
Cobalt Strike进程注入技术详解
0x01 前言
Cobalt Strike是一款广泛使用的红队测试工具,其3.14版本在进程注入方面进行了重要更新。本文将深入解析Cobalt Strike的进程注入机制,包括注入命令、配置选项和执行技术等关键细节。
0x02 注入功能
Cobalt Strike提供了多种进程注入方式:
1. 常用注入命令
-
inject命令:
inject <PID> [x86|x64]第一个参数是目标进程PID,第二个可选参数指定架构(默认x86)
-
shinject命令:
shinject <PID> [x86|x64] </path/to/shellcode.bin>用于注入原始shellcode,需要提供bin格式的payload
-
shspawn命令:
shspawn [x86|x64] </path/to/shellcode.bin>启动新进程并注入shellcode,比前两种更稳定
2. 注入流程特点
- post-exploitation模块会创建临时进程注入DLL
- 通过命名管道确认注入结果
- 可安全操作临时进程的主线程
0x03 注入流程与配置
1. 基本注入流程
- 打开远程进程句柄
- 在远程进程中分配内存
- 复制shellcode到远程进程
- 在远程进程中执行shellcode
2. 内存分配技术
Cobalt Strike提供两种内存分配方案:
-
VirtualAllocEx-WriteProcessMemory模式
- 经典注入方式
- 支持跨架构注入(x86->x64等)
- 配置:
set allocator "VirtualAllocEx"
-
NtMapViewOfSection模式
- 使用文件映射技术
- 仅支持同架构注入(x86->x86或x64->x64)
- 配置:
set allocator "NtMapViewOfSection"
3. 数据转换配置
Malleable C2配置中的process-inject块:
process-inject {
set allocator "NtMapViewOfSection"; // 内存分配技术
set min_alloc "16384"; // 最小分配大小
set userwx "false"; // 内存最终权限
// 数据转换
transform-x86 {
prepend "\x90"; // x86架构前添加NOP
}
transform-x64 {
prepend "\x90"; // x64架构前添加NOP
}
// 执行技术
execute {
CreateThread "ntdll!RtlUserThreadStart";
CreateThread;
NtQueueApcThread-s;
CreateRemoteThread;
RtlCreateUserThread;
}
}
关键配置项:
min_alloc:最小内存分配大小startrwx/userwx:内存权限控制transform-x86/transform-x64:架构特定数据转换
0x04 代码执行技术
1. 执行技术选择策略
- 按顺序尝试execute块中的方法
- 第一个成功的方法将被使用
- 必须涵盖各种极端情况
2. 特殊注入场景
- 自我注入:注入到自身进程,可使用更简单的方法
- 跨架构注入:x86<->x64需要特殊处理
- 临时进程注入:post-ex模块创建的进程可安全操作
- 参数传递:x64可通过SetThreadContext传递参数
3. 详细执行技术
-
CreateThread
- 仅用于自我注入
- 可指定伪起始地址:
"module!function+0x##" - 使用SetThreadContext修改线程上下文
-
SetThreadContext
- 适用于临时进程的主线程
- 支持x86->x86, x64->x64和x64->x86
- 线程起始地址反映原始执行入口点
-
NtQueueApcThread-s
- 用于暂停的进程
- 将代码加入APC队列,唤醒时执行
- 仅支持同架构注入
-
NtQueueApcThread
- 针对现有远程进程
- 注入RWX存根到每个线程的APC队列
- 存根检查是否已运行,防止重复执行
- 触发CreateThread执行实际代码
-
CreateRemoteThread
- 经典远程线程注入
- 从Vista起不支持跨会话边界
- 触发Sysmon事件8
- 支持伪起始地址变种
-
RtlCreateUserThread
- 支持跨会话边界
- 支持所有架构组合(包括x86->x64)
- 也触发Sysmon事件8
- x86->x64需要转换模式并注入RWX存根
0x05 替代方案与建议
1. 进程注入替代方案
-
runu命令:
- 无需注入即可迁移会话
- 作为指定进程的子进程运行
-
自我注入:
- 针对当前Beacon进程执行
- 避免远程注入风险
-
磁盘持久化:
- 某些场景下磁盘持久化更可靠
- 例如将DLL放置到系统目录
2. 配置建议
- 在execute块中包含RtlCreateUserThread作为最后手段
- 尽可能让进程保持在x64模式
- 根据目标环境选择合适的注入技术
- 注意不同技术的OPSEC影响
3. 防御规避建议
- 使用transform块修改注入数据特征
- 避免RWX权限设置
- 考虑线程起始地址特征
- 混合使用不同技术规避检测
总结
Cobalt Strike提供了强大的进程注入能力,但需要根据具体场景选择合适的技术和配置。理解各种注入技术的原理、限制和防御规避特性,对于红队操作的成功至关重要。通过合理配置Malleable C2文件和选择适当的执行技术,可以在保持隐蔽性的同时实现有效的进程注入。