CobaltStrike逆向学习系列(7):Controller 任务发布流程分析
字数 1272 2025-08-07 08:22:23
CobaltStrike逆向学习系列(7): Controller任务发布流程分析
0x00 概述
本文详细分析CobaltStrike中从Controller发布任务到Beacon执行的完整流程,以shell whoami命令为例,解析任务在CobaltStrike组件间的传递和处理机制。
0x01 Controller到TeamServer的任务发布流程
1.1 命令输入与初步处理
- 命令输入:在Console中输入命令(如
shell whoami)并回车 - BeaconConsole处理:
- 专门处理shell命令
- 使用
popString方法解析命令,返回要执行的命令(如whoami)
1.2 任务构造与处理
-
TaskBeacon处理:
- 处理执行逻辑
- 构造任务数据,格式化信息供Beacon解析执行
-
日志记录:
- 先打印执行日志
- 日志通过
TeamQueue传递给TeamServer - TeamServer在
ManageUser中接收日志 - 处理后添加广播将信息发送出去
- 通过
BroadcastWriter写回Controller
1.3 任务发送到TeamServer
-
Controller发送任务:
- 将构造好的任务发送给TeamServer
-
TeamServer接收处理:
- 从参数中提取
BeaconId和任务数据 - 进入
BeaconData处理逻辑 - 关键代码位于else分支中的
add操作 - 注意:CS设置了一个暗桩 - 运行30分钟后执行命令会直接发布退出任务
- 从参数中提取
-
任务存储:
- 将任务添加到任务List
- 记录对应的
BeaconId
0x02 TeamServer到Beacon的任务传递
2.1 Beacon请求任务
-
心跳机制:
- Beacon通过心跳包请求任务
- 从任务队列中取出数据
-
任务处理:
- 循环添加任务,并将已添加的任务移除
- 如果任务大于指定大小则跳出循环
- 返回任务队列
-
数据构造:
- 取出其他相关内容
- 构造返回数据
- 打印日志,输出发送的命令长度
2.2 数据加密
-
密钥获取:
- 根据
BeaconId获取对应的AESKey和HmacSHA256Key
- 根据
-
数据准备:
- 写入系统时间/1000
- 写入任务长度
- 写入任务数据
- 进行数据补齐(添加'A'字符,补足16的整数倍)
-
加密过程:
- 进行AES加密
- 对数据进行Hmac计算
- 将AES加密后的任务数据与Hmac的前16位拼接
-
返回数据:
- 将加密后的数据返回给Beacon
0x03 流程图解
Controller -> TeamServer -> Beacon 任务流程:
1. Controller端:
[命令输入] -> [BeaconConsole处理] -> [TaskBeacon构造任务] -> [日志记录] -> [发送任务到TeamServer]
2. TeamServer端:
[接收任务] -> [BeaconData处理] -> [存储任务到队列] -> [等待Beacon请求]
3. Beacon端:
[心跳请求] -> [TeamServer返回任务] -> [数据加密] -> [返回加密任务]
4. 加密细节:
[获取AESKey/HmacKey] -> [数据补齐] -> [AES加密] -> [Hmac计算] -> [拼接返回]
关键点总结
- 任务生命周期:Controller -> TeamServer -> Beacon
- 加密机制:使用AES和HmacSHA256双重加密
- 心跳机制:Beacon通过心跳主动拉取任务
- 暗桩设计:30分钟后可能触发退出任务
- 数据格式:包含时间戳、长度、任务数据和校验信息
- 日志记录:全程伴随日志记录和广播机制
理解这一流程对于分析CobaltStrike通信协议、检测其流量以及开发相关防御措施具有重要意义。