CobaltStrike逆向学习系列(2):Stageless Beacon 生成流程分析
字数 2054 2025-08-07 08:22:12

CobaltStrike逆向学习系列(2):Stageless Beacon生成流程分析

0x00 概述

本文详细分析CobaltStrike中Stageless Beacon的生成流程,包括Beacon的Patch处理、Loader的Patch处理以及最终文件生成的关键步骤。Stageless Beacon与Stage Beacon的主要区别在于前者最终文件较大,不需要从网络中拉取后续阶段。

0x01 Patch Beacon流程

1.1 生成界面处理

  1. 点击生成时进入WindowsExecutableStageDialog.dialogAction方法
  2. 根据选择的输出类型决定生成文件后缀
  3. 弹出保存框后进入dialogResult方法处理Patch操作

1.2 关键参数获取

  1. 获取当前选择的Listener名称和对应Listener对象
  2. 获取当前选择的架构(x86/x64)

1.3 export方法处理

export方法是Patch Beacon的核心方法:

  1. 根据选择的payload决定调用哪个处理函数
  2. 根据架构选择对应的Beacon文件(核心功能DLL)
  3. 执行两个关键处理:
    • exportBeaconStage:处理C2Profile相关内容
    • pe.process:处理PE格式、ReflectiveLoad和引导头

1.4 C2Profile处理

exportBeaconStage方法中:

  1. 根据Beacon路径读取相应文件
  2. 解析C2Profile内容
  3. 将所有数据按特定格式处理(这是BeaconEye、CobaltStrikeScan等工具检测的关键)
  4. 处理完成后:
    • 将整体转为byte数组
    • 设置总大小为4096字节,不足部分用随机字符填充
    • 调用beacon_obfuscate进行混淆(逐字节异或)
  5. 将处理后的内容Patch到Beacon中

1.5 PE处理

PE处理分为两步:

  1. pre_process

    • 从C2Profile中取出与PE相关的项
    • 通过PEEditor进行基本处理
  2. post_process

    • 添加ReflectiveLoad和引导头

ReflectiveLoad处理细节

  1. 使用PEParser解析Beacon(注意:作者实现的解析类存在一些小BUG)

  2. 获取导出函数ReflectiveLoad的偏移

  3. 通过偏移Patch引导头:

    • 引导头利用PE头中的原始数据字节作为指令
    • 覆盖不重要的PE结构,在堆栈平衡前提下执行自定义功能
    • 通过偏移跳转执行ReflectiveLoad函数
  4. 调用getReflectiveLoaderFunction添加ReflectiveLoad函数:

    • CS使用自己实现的ReflectiveLoad,而非公开的RDI项目
    • 提供三份备用方案,区别在于内存分配函数不同:
      • HeapAlloc
      • VirtualAlloc
      • MapViewOfFile
  5. 将ReflectiveLoad和引导头放到对应位置

0x02 Patch Loader流程

CS在处理完Beacon后,会根据需要生成的类型选择对应Loader,将Beacon Patch到Loader中再保存文件。

2.1 Loader选择

  1. Stageless使用的Loader文件名中包含"big"
  2. Stage使用的Loader文件名不包含"big"

2.2 _patchArtifact处理

  1. 随机生成一个数值
  2. 对整个Beacon进行异或操作

2.3 Patch操作

  1. 找到Patch点(1024个"A"的位置)

  2. 构造Patch内容:

    • Patch+16的位置(4字节)
    • Beacon总长度(4字节)
    • 异或加密Key(4字节)
    • GetModuleHandleA地址(4字节)
    • GetProcAddress地址(4字节)
    • 异或后的Beacon
    • (第一个存储的位置指向GetProcAddress地址)
  3. 执行Patch并返回

2.4 文件写入

完成Patch操作后直接写入文件。

0x03 文件对比分析

3.1 beacon.x64.dll分析

  1. 通过直接搜索可以找到Patch点
  2. 从导出函数跟踪可看到一串90 CC占位

3.2 生成文件对比

对比生成的Beacon与artifact64big.exe文件差异。

0x04 关键知识点总结

  1. C2Profile处理:是检测工具的关键依据,理解其解析逻辑可绕过检测或增强检测
  2. PE处理:包括PE格式处理、引导头添加和ReflectiveLoad注入
  3. Loader Patch:将处理后的Beacon嵌入到Loader中
  4. 混淆技术:使用随机异或密钥对Beacon进行混淆
  5. 内存分配方案:提供三种不同的内存分配方式实现

0x05 后续研究方向

  1. C2Profile的详细解析逻辑
  2. PEParser类的BUG分析
  3. 引导头技术的深入探讨
  4. ReflectiveLoad的三种实现方式对比
  5. 检测与反检测的对抗技术
CobaltStrike逆向学习系列(2):Stageless Beacon生成流程分析 0x00 概述 本文详细分析CobaltStrike中Stageless Beacon的生成流程,包括Beacon的Patch处理、Loader的Patch处理以及最终文件生成的关键步骤。Stageless Beacon与Stage Beacon的主要区别在于前者最终文件较大,不需要从网络中拉取后续阶段。 0x01 Patch Beacon流程 1.1 生成界面处理 点击生成时进入 WindowsExecutableStageDialog.dialogAction 方法 根据选择的输出类型决定生成文件后缀 弹出保存框后进入 dialogResult 方法处理Patch操作 1.2 关键参数获取 获取当前选择的Listener名称和对应Listener对象 获取当前选择的架构(x86/x64) 1.3 export方法处理 export 方法是Patch Beacon的核心方法: 根据选择的payload决定调用哪个处理函数 根据架构选择对应的Beacon文件(核心功能DLL) 执行两个关键处理: exportBeaconStage :处理C2Profile相关内容 pe.process :处理PE格式、ReflectiveLoad和引导头 1.4 C2Profile处理 在 exportBeaconStage 方法中: 根据Beacon路径读取相应文件 解析C2Profile内容 将所有数据按特定格式处理(这是BeaconEye、CobaltStrikeScan等工具检测的关键) 处理完成后: 将整体转为byte数组 设置总大小为4096字节,不足部分用随机字符填充 调用 beacon_obfuscate 进行混淆(逐字节异或) 将处理后的内容Patch到Beacon中 1.5 PE处理 PE处理分为两步: pre_process : 从C2Profile中取出与PE相关的项 通过 PEEditor 进行基本处理 post_process : 添加ReflectiveLoad和引导头 ReflectiveLoad处理细节 使用 PEParser 解析Beacon(注意:作者实现的解析类存在一些小BUG) 获取导出函数 ReflectiveLoad 的偏移 通过偏移Patch引导头: 引导头利用PE头中的原始数据字节作为指令 覆盖不重要的PE结构,在堆栈平衡前提下执行自定义功能 通过偏移跳转执行 ReflectiveLoad 函数 调用 getReflectiveLoaderFunction 添加ReflectiveLoad函数: CS使用自己实现的ReflectiveLoad,而非公开的RDI项目 提供三份备用方案,区别在于内存分配函数不同: HeapAlloc VirtualAlloc MapViewOfFile 将ReflectiveLoad和引导头放到对应位置 0x02 Patch Loader流程 CS在处理完Beacon后,会根据需要生成的类型选择对应Loader,将Beacon Patch到Loader中再保存文件。 2.1 Loader选择 Stageless使用的Loader文件名中包含"big" Stage使用的Loader文件名不包含"big" 2.2 _ patchArtifact处理 随机生成一个数值 对整个Beacon进行异或操作 2.3 Patch操作 找到Patch点(1024个"A"的位置) 构造Patch内容: Patch+16的位置(4字节) Beacon总长度(4字节) 异或加密Key(4字节) GetModuleHandleA地址(4字节) GetProcAddress地址(4字节) 异或后的Beacon (第一个存储的位置指向GetProcAddress地址) 执行Patch并返回 2.4 文件写入 完成Patch操作后直接写入文件。 0x03 文件对比分析 3.1 beacon.x64.dll分析 通过直接搜索可以找到Patch点 从导出函数跟踪可看到一串 90 CC 占位 3.2 生成文件对比 对比生成的Beacon与 artifact64big.exe 文件差异。 0x04 关键知识点总结 C2Profile处理 :是检测工具的关键依据,理解其解析逻辑可绕过检测或增强检测 PE处理 :包括PE格式处理、引导头添加和ReflectiveLoad注入 Loader Patch :将处理后的Beacon嵌入到Loader中 混淆技术 :使用随机异或密钥对Beacon进行混淆 内存分配方案 :提供三种不同的内存分配方式实现 0x05 后续研究方向 C2Profile的详细解析逻辑 PEParser类的BUG分析 引导头技术的深入探讨 ReflectiveLoad的三种实现方式对比 检测与反检测的对抗技术