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 生成界面处理
- 点击生成时进入
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项目
- 提供三份备用方案,区别在于内存分配函数不同:
HeapAllocVirtualAllocMapViewOfFile
-
将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的三种实现方式对比
- 检测与反检测的对抗技术