CobaltStrike逆向学习系列(2):Stageless Beacon 生成流程分析
这是[信安成长计划]的第 2 篇文章
关注微信公众号 [信安成长计划]

0x00 目录
0x01 Patch Beacon
0x02 Patch Loader
0x03 文件对比
0x04 流程图
CobaltStrike 的 Beacon 生成分为两种,Stage Beacon 和 Stageless Beacon,这次主要来说明的是无阶段的 Stageless Beacon,最终文件比较大,不用从网络中来拉取。
本文的分析流程使用的 payload 是 windows/beacon_http/reverse_http
0x01 Patch Beacon
下面是 Stageless Beacon 的生成界面

首先在点击生成时,会进入 WindowsExecutableStageDialog.dialogAction 来进行处理,根据界面中所选择的输出类型,决定生成什么后缀的文件,然后弹出保存框

在选择完成后,会进入 dialogResult 方法,来处理 Patch 操作
首先会获取当前所选择的 Listener 的名字,并根据名字获取到 Listener,同时也获取当前所选择的架构

接着会走到 Patch Beacon 的最关键的方法 export

在 export 中,会先根据所选择的 payload 来决定调用哪个处理函数

首先会根据架构来选择所需要使用的 Beacon 文件,这个就是最核心的功能 DLL

接下来会执行两个关键的处理 exportBeaconStage 和 pe.process,在 exportBeaconStage 中处理了 C2Profile 相关内容,在 pe.process 中对 PE 格式、 ReflectiveLoad、引导头等进行了处理
在 exportBeaconStage 中,首先根据 Beacon 路径读取出相应的文件

之后就是对 C2Profile 的解析操作

在解析完后,会把所有的数据都以一定的格式来进行处理,具体的处理逻辑放在后面的文章来说明,这也是 BeaconEye、CobaltStrikeScan 等工具检测的根本依据,在明白了解析逻辑之后,也就很容易可以绕过这几款检测工具了;当然,在明白解析逻辑之后,还可以做到更加稳妥的检测方式,增加绕过难度,对抗就是这样产生的。

直接跳到处理完成之后

先将整体转成 byte 数组,设置总大小为 4096 个字节,在将其转换完成之后,不足的字节用随机字符填充

接着调用 beacon_obfuscate 对整块内容进行混淆,逐字节异或了

这样就完成了对 C2Profile 的全部操作,然后将其 Patch 到 Beacon 当中并返回

接着就是对 PE 所进行的处理了,主要也分了两步

在 pre_process 中主要是从 C2Profile 中取出与 PE 相关的项,然后通过 PEEditor 进行基本处理

在 post_process 中会添加 ReflectiveLoad 和引导头

在 BeaconRDLL 中,先使用 PEParser 对 Beacon 进行解析,作者所写的这个解析类有一些小 BUG,在增加一些新操作的时候会出问题,这点也放在后面的文章中去叙述。

接着会获取导出函数 ReflectiveLoad 的偏移

然后通过这个来 Patch 引导头

这里所谓的引导头就是利用 PE 头中的原始数据字节当作指令来使用,通过覆盖不重要的 PE 结构,在堆栈平衡的前提下,执行我们自己的功能,这也是可以单独拿来当作一篇文章来讲述的内容。
这里所做的事情,主要就是通过偏移跳转执行 ReflectiveLoad 函数

接着会调用 getReflectiveLoaderFunction 函数来添加 ReflectiveLoad 函数

其中的解析和修复重定位等操作暂且不表,重点来说一下 getLoaderFile,CS 中所提到的 ReflectiveLoad 都是作者自己来实现的,并不是直接用公开的 RDI 项目,虽然逻辑上都是一致的,而且这里是有三份备用方案的,根据名字也可以看出,它们的不同点在于分配内存时所使用的函数 HeapAlloc、VirtualAlloc、MapViewOfFile

之后就直接将 ReflectiveLoad 和引导头放到对应的位置上

这样对 Beacon 的所有关键处理也就完成了
0x02 Patch Loader
CS 并不是在处理完 Beacon 之后直接保存文件的,而是将处理完的 Beacon,根据你实际需要生成的类型,选择对应的 Loader,将 Beacon Patch 到 Loader 当中,再进行文件保存的
下面就是根据选择的文件类型,选择对应的 Loader 了,可以看到每一个的名字里面都有 big,这就是为 Stageless 提供的 Loader,为 Stage 提供的 Loader 名字都是没有 big 的

重点是调用 _patchArtifact

在处理完最基本的信息后,会随机一个数值,再对整个 Beacon 进行异或操作

接下来就是 Patch 操作了,先找到 Patch 点,一串有 1024 个 A 的位置
接着构造 Patch 的内容,先存储 Patch+16 的位置(4 个字节),接着是 Beacon 的总长度(4 个字节),接着是异或的加密 Key(4 个字节),GetModuleHandleA(4 个字节),GetProcAddress(4 个字节),异或后的 Beacon
所以第一个存储的位置,应该是指向了 GetProcAddress 的地址

最后就是 Patch 并返回

接着就直接写文件,完成 Patch 操作
0x03 文件对比
经过上面的分析可以看出来,在处理 Beacon 时最重要的是 C2Profile、ReflectiveLoad,在处理 Loader 的时候最重要的就是把 Beacon Patch 进来
首先看一下 beacon.x64.dll,通过直接搜索可以找到其对应的 Patch 点

从导出函数跟过来可以很明显的看到这里的一串 90 CC 占位

接着就是对比生成的 Beacon 与 artifact64big.exe

0x04 流程图

CobaltStrike逆向学习系列(2):Stageless Beacon 生成流程分析的更多相关文章
- CobaltStrike逆向学习系列(4):Beacon 上线协议分析
这是[信安成长计划]的第 4 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 发送 0x02 TeamServer 处理 0x03 流程图 0x04 参考文章 在上一篇 ...
- CobaltStrike逆向学习系列(10):TeamServer 启动流程分析
这是[信安成长计划]的第 10 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 基本校验与解析 0x02 初始化 0x03 启动 Listeners 在之前的分析中,都是针对 Cob ...
- CobaltStrike逆向学习系列(3):Beacon C2Profile 解析
这是[信安成长计划]的第 3 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller 端分析 0x02 Beacon 端分析 0x03 展示图 在上一篇文章中完成了 S ...
- CobaltStrike逆向学习系列(6):Beacon sleep_mask 分析
这是[信安成长计划]的第 6 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 C2Profile 分析 0x02 set userwx "true" 0x03 s ...
- CobaltStrike逆向学习系列(8):Beacon 结果回传流程分析
这是[信安成长计划]的第 8 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 接收与处理 0x02 结果回传 Beacon 在接受完命令并执行后,会将数据加密回传给 T ...
- CobaltStrike逆向学习系列(5):Bypass BeaconEye
这是[信安成长计划]的第 5 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 BeaconEye 检测原理 0x02 Bypass 1 0x03 Bypass 2 0x04 效果图 ...
- CobaltStrike逆向学习系列(1):CS 登陆通信流程分析
这是[信安成长计划]的第 1 篇文章 关注微信公众号[信安成长计划][SecSource] 0x00 目录 0x01 密码校验 0x02 aggressor.authenticate 0x03 agg ...
- CobaltStrike逆向学习系列(11):自实现 Beacon 检测工具
这是[信安成长计划]的第 11 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 检测原理 0x02 检测方案 0x03 存在的问题 0x04 解决方案 0x05 示例代码 0x06 ...
- CobaltStrike逆向学习系列(15):CS功能分析-BOF
这是[信安成长计划]的第 15 篇文章 0x00 目录 0x01 BOF功能分析 0x02 BOF功能执行 0x03 写在最后 其实在看过 RDI 与 DotNet 功能执行之后,BOF 的执行基本就 ...
随机推荐
- 微服务架构 | 3.4 HashiCorp Consul 注册中心
目录 前言 1. Consul 基础知识 1.1 Consul 是什么 1.2 Consul 的特点 2. 安装并运行 Consul 服务器 2.1 下载 Consul 2.2 运行 Consul 服 ...
- 【记录一个问题】thanos receiver在tsdb切换期间,导致remote write接口失败增加
如图:配置了thanos receiver落盘的时间周期为10分钟,结果导致在切换tsdb期间,remote write接口的失败率增高. 目前看来,解决办法就是上游增加重试.
- MySQL的innoDB存储引擎的运作方式,数据结构等
先上InnoDB架构图: 自上而下依次为内存区结构,后台线程,操作系统,磁盘存储,日志文件等. 其中内存由缓冲池,额外缓冲池,日志缓冲池组成.其中缓冲池中结构如下: 在磁盘存储文件中,MyISAM存储 ...
- NTT 快速数论变换
NTT 先学习FFT 由于FFT是使用复数运算,精度并不好,而且也无法取模,所以有了NTT(快速数论变换). 建议先完全理解FFT后再学习NTT. 原根 NTT使用与单位根性质相似的原根来代替单位根. ...
- Django db使用MySQL连接池
Django db使用MySQL连接池 Sep 25 2016 Django db模块本身不支持MySQL连接池,只有一个配置CONN_MAX_AGE连接最大存活时间,如果WSGI服务器使用了线程池技 ...
- ARP链路追踪
arp协议在TCP/IP模型中属于IP层(网络层),在OSI模型中属于链路层.arp协议即地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议.它可以解决同一个局域网内主机或路由器的IP地址 ...
- [HZOI] 山海经 题解
0.题目大意 给出一个序列,每次查询一个区间的最大子段和的端点和值.序列长度 \(n \le 10^{5}\) . 1.思路 显然应该使用线段树.题目要求每次求一个区间的最大子段和,那么在线段树节点中 ...
- 用socket写一个简单的服务器
import socketsk=socket.socket()sk.bind(("127.0.0.1",7001))sk.listen()def login(url): with ...
- 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.6
公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...
- AT2689 [ARC080D] Prime Flip
简要题解如下: 区间修改问题,使用差分转化为单点问题. 问题变成,一开始有 \(2n\) 个点为 \(1\),每次操作可以选择 \(r - l\) 为奇质数的两个点 \(l, r\) 使其 ^ \(1 ...