细说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. 基本注入流程

  1. 打开远程进程句柄
  2. 在远程进程中分配内存
  3. 复制shellcode到远程进程
  4. 在远程进程中执行shellcode

2. 内存分配技术

Cobalt Strike提供两种内存分配方案:

  1. VirtualAllocEx-WriteProcessMemory模式

    • 经典注入方式
    • 支持跨架构注入(x86->x64等)
    • 配置:set allocator "VirtualAllocEx"
  2. 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. 特殊注入场景

  1. 自我注入:注入到自身进程,可使用更简单的方法
  2. 跨架构注入:x86<->x64需要特殊处理
  3. 临时进程注入:post-ex模块创建的进程可安全操作
  4. 参数传递:x64可通过SetThreadContext传递参数

3. 详细执行技术

  1. CreateThread

    • 仅用于自我注入
    • 可指定伪起始地址:"module!function+0x##"
    • 使用SetThreadContext修改线程上下文
  2. SetThreadContext

    • 适用于临时进程的主线程
    • 支持x86->x86, x64->x64和x64->x86
    • 线程起始地址反映原始执行入口点
  3. NtQueueApcThread-s

    • 用于暂停的进程
    • 将代码加入APC队列,唤醒时执行
    • 仅支持同架构注入
  4. NtQueueApcThread

    • 针对现有远程进程
    • 注入RWX存根到每个线程的APC队列
    • 存根检查是否已运行,防止重复执行
    • 触发CreateThread执行实际代码
  5. CreateRemoteThread

    • 经典远程线程注入
    • 从Vista起不支持跨会话边界
    • 触发Sysmon事件8
    • 支持伪起始地址变种
  6. RtlCreateUserThread

    • 支持跨会话边界
    • 支持所有架构组合(包括x86->x64)
    • 也触发Sysmon事件8
    • x86->x64需要转换模式并注入RWX存根

0x05 替代方案与建议

1. 进程注入替代方案

  1. runu命令

    • 无需注入即可迁移会话
    • 作为指定进程的子进程运行
  2. 自我注入

    • 针对当前Beacon进程执行
    • 避免远程注入风险
  3. 磁盘持久化

    • 某些场景下磁盘持久化更可靠
    • 例如将DLL放置到系统目录

2. 配置建议

  1. 在execute块中包含RtlCreateUserThread作为最后手段
  2. 尽可能让进程保持在x64模式
  3. 根据目标环境选择合适的注入技术
  4. 注意不同技术的OPSEC影响

3. 防御规避建议

  1. 使用transform块修改注入数据特征
  2. 避免RWX权限设置
  3. 考虑线程起始地址特征
  4. 混合使用不同技术规避检测

总结

Cobalt Strike提供了强大的进程注入能力,但需要根据具体场景选择合适的技术和配置。理解各种注入技术的原理、限制和防御规避特性,对于红队操作的成功至关重要。通过合理配置Malleable C2文件和选择适当的执行技术,可以在保持隐蔽性的同时实现有效的进程注入。

Cobalt Strike进程注入技术详解 0x01 前言 Cobalt Strike是一款广泛使用的红队测试工具,其3.14版本在进程注入方面进行了重要更新。本文将深入解析Cobalt Strike的进程注入机制,包括注入命令、配置选项和执行技术等关键细节。 0x02 注入功能 Cobalt Strike提供了多种进程注入方式: 1. 常用注入命令 inject命令 : 第一个参数是目标进程PID,第二个可选参数指定架构(默认x86) shinject命令 : 用于注入原始shellcode,需要提供bin格式的payload shspawn命令 : 启动新进程并注入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块: 关键配置项: 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文件和选择适当的执行技术,可以在保持隐蔽性的同时实现有效的进程注入。