CobaltStrike逆向学习系列(1):控制端登陆流程分析
字数 2567 2025-08-29 08:30:36

CobaltStrike逆向学习系列(1):控制端登陆流程分析 - 教学文档

1. 名词定义

  • Controller: CobaltStrike的客户端界面,用于操作和控制
  • TeamServer: CobaltStrike的服务端,负责与Beacon通信
  • Beacon: 植入目标系统的payload,执行命令并回传结果

2. 整体流程概述

Controller连接TeamServer的完整流程分为以下几个阶段:

  1. 密码校验阶段
  2. aggressor.authenticate认证
  3. aggressor.metadata元数据交换
  4. 数据同步阶段
  5. 常态化通信

3. 密码校验详细流程

3.1 TeamServer准备阶段

  1. TeamServer启动后创建SecureServerSocket对象
  2. 循环调用acceptAndAuthenticate方法等待Controller连接
  3. 验证成功后调用clientAuthenticated方法
  4. 创建线程执行ManageUser处理Controller信息

3.2 Controller连接阶段

  1. 点击Connect按钮触发dialogAction方法
  2. 创建SecureSocket对象
  3. 调用authenticate方法进行验证

3.3 握手与验证过程

  1. TeamServer进入SecureServerSocket.this.authenticate方法
    • var4.readInt()处阻塞等待Controller发送数据
  2. Controller构造数据包:
    • 先写入标志位48879(int)
    • 写入密码长度(byte)
    • 写入密码
    • 65填充剩余空间
    • 总长度不超过261字节(256+5)
  3. TeamServer验证:
    • 检查标志位是否正确
    • 读取密码
    • 读取填充字符
    • 对比密码
    • 验证成功则写回标志位51966
  4. Controller验证返回的标志位

4. aggressor.authenticate流程

4.1 TeamServer处理

  1. 创建Socket连接
  2. 创建ManageUser对象处理Controller信息

4.2 Controller处理

  1. 创建TeamQueue处理与TeamServer通信
    • 构造函数中创建两个线程:
      • TeamReader: 读取TeamServer数据
      • TeamWriter: 向TeamServer发送数据
  2. 调用call方法发送aggressor.authenticate
    • 传递user、pass、版本号组成的对象
  3. call方法关键操作:
    • 使用addRequest将构造好的Request对象存入LinkedList
    • TeamWriter线程从LinkedList中取数据发送

4.3 请求处理流程

  1. TeamServer的ManageUser循环等待请求
  2. 进入process方法处理请求
    • 根据任务类型执行对应操作
    • 验证版本和密码
  3. 验证成功返回SUCCESS
  4. 启动BroadcastWriter线程

4.4 响应处理

  1. Controller的TeamReader接收响应
    • 接收的是Reply对象(与Request结构相似)
  2. 使用之前存储的callback值调用对应类的result方法
  3. 判断返回值为SUCCESS后发送aggressor.metadata

5. aggressor.metadata流程

  1. Controller调用call发送aggressor.metadata
    • 参数为当前时间戳
  2. TeamServer的ManageUser处理请求
    • 执行一系列Map操作
    • 返回信息给Controller
  3. Controller处理响应
    • 进入Connect处理aggressor.metadata
    • 调用AggressorClient.setup方法初始化界面
    • 发送aggressor.ready表示完成

6. 数据同步流程

6.1 TeamServer处理

  1. register方法中:
    • 将user与对应的manageUser存入Map
    • 调用playback处理同步
  2. playback方法:
    • 计算this.transcriptsthis.replayme总大小
    • 调用send方法发送数据
  3. send方法:
    • 通过用户名从Map获取对应的ManageUser
    • 打包信息为ReplyRequest发送

6.2 Controller处理

  1. TeamReader接收消息
    • callback为0时进入else分支
    • 调用DataManager.result方法处理
  2. 判断senttotal是否相等
    • 确认同步是否完成
  3. 遍历并调用对应的result方法

6.3 数据发送细节

  1. TeamServer遍历this.transcriptsthis.replayme
    • 修改当前message信息
    • 先发送playback.status
    • 再发送Key、Value数据
    • 递增sent计数器
  2. Controller处理:
    • 判断为Data类型进入对应分支
    • ChangeLog类型内容存入Map
  3. 提供当前用户信息给Controller

7. 常态化通信

  1. TeamServer处理:
    • 接收Controller的aggressor.ping
    • BroadcastWriter回写Beacons信息
  2. 进入稳定通信状态

8. 流程图

Controller连接流程:
1. 密码校验
   Controller -> [48879标志+密码+填充] -> TeamServer
   TeamServer -> [51966标志] -> Controller
2. aggressor.authenticate
   Controller -> [认证请求] -> TeamServer
   TeamServer -> [SUCCESS] -> Controller
3. aggressor.metadata
   Controller -> [元数据请求] -> TeamServer
   TeamServer -> [元数据响应] -> Controller
   Controller -> [aggressor.ready] -> TeamServer
4. 数据同步
   TeamServer -> [同步数据] -> Controller
5. 常态化通信
   Controller <-> [ping/数据交换] <-> TeamServer

9. 关键数据结构

  • Request: 请求数据结构
  • Reply: 响应数据结构
  • TeamQueue: 通信队列
    • TeamReader: 读取线程
    • TeamWriter: 写入线程
  • ManageUser: TeamServer端用户管理
    • BroadcastWriter: 广播写入线程

10. 参考实现要点

  1. 密码校验使用固定标志位(48879/51966)
  2. 通信使用自定义协议封装
  3. 多线程处理请求和响应
  4. 回调机制处理异步通信
  5. 数据同步采用增量方式

11. 安全注意事项

  1. 密码传输未加密(仅简单填充)
  2. 固定标志位可能被识别
  3. 通信协议可被逆向分析
  4. 缺乏强加密机制
CobaltStrike逆向学习系列(1):控制端登陆流程分析 - 教学文档 1. 名词定义 Controller : CobaltStrike的客户端界面,用于操作和控制 TeamServer : CobaltStrike的服务端,负责与Beacon通信 Beacon : 植入目标系统的payload,执行命令并回传结果 2. 整体流程概述 Controller连接TeamServer的完整流程分为以下几个阶段: 密码校验阶段 aggressor.authenticate认证 aggressor.metadata元数据交换 数据同步阶段 常态化通信 3. 密码校验详细流程 3.1 TeamServer准备阶段 TeamServer启动后创建 SecureServerSocket 对象 循环调用 acceptAndAuthenticate 方法等待Controller连接 验证成功后调用 clientAuthenticated 方法 创建线程执行 ManageUser 处理Controller信息 3.2 Controller连接阶段 点击Connect按钮触发 dialogAction 方法 创建 SecureSocket 对象 调用 authenticate 方法进行验证 3.3 握手与验证过程 TeamServer进入 SecureServerSocket.this.authenticate 方法 在 var4.readInt() 处阻塞等待Controller发送数据 Controller构造数据包: 先写入标志位 48879 (int) 写入密码长度(byte) 写入密码 用 65 填充剩余空间 总长度不超过261字节(256+5) TeamServer验证: 检查标志位是否正确 读取密码 读取填充字符 对比密码 验证成功则写回标志位 51966 Controller验证返回的标志位 4. aggressor.authenticate流程 4.1 TeamServer处理 创建Socket连接 创建 ManageUser 对象处理Controller信息 4.2 Controller处理 创建 TeamQueue 处理与TeamServer通信 构造函数中创建两个线程: TeamReader : 读取TeamServer数据 TeamWriter : 向TeamServer发送数据 调用 call 方法发送 aggressor.authenticate 传递user、pass、版本号组成的对象 call 方法关键操作: 使用 addRequest 将构造好的 Request 对象存入 LinkedList TeamWriter 线程从 LinkedList 中取数据发送 4.3 请求处理流程 TeamServer的 ManageUser 循环等待请求 进入 process 方法处理请求 根据任务类型执行对应操作 验证版本和密码 验证成功返回 SUCCESS 启动 BroadcastWriter 线程 4.4 响应处理 Controller的 TeamReader 接收响应 接收的是 Reply 对象(与 Request 结构相似) 使用之前存储的 callback 值调用对应类的 result 方法 判断返回值为 SUCCESS 后发送 aggressor.metadata 5. aggressor.metadata流程 Controller调用 call 发送 aggressor.metadata 参数为当前时间戳 TeamServer的 ManageUser 处理请求 执行一系列Map操作 返回信息给Controller Controller处理响应 进入 Connect 处理 aggressor.metadata 调用 AggressorClient.setup 方法初始化界面 发送 aggressor.ready 表示完成 6. 数据同步流程 6.1 TeamServer处理 在 register 方法中: 将user与对应的 manageUser 存入Map 调用 playback 处理同步 playback 方法: 计算 this.transcripts 与 this.replayme 总大小 调用 send 方法发送数据 send 方法: 通过用户名从Map获取对应的 ManageUser 打包信息为 Reply 或 Request 发送 6.2 Controller处理 TeamReader 接收消息 callback 为0时进入else分支 调用 DataManager.result 方法处理 判断 sent 与 total 是否相等 确认同步是否完成 遍历并调用对应的 result 方法 6.3 数据发送细节 TeamServer遍历 this.transcripts 和 this.replayme 修改当前message信息 先发送 playback.status 包 再发送Key、Value数据 递增 sent 计数器 Controller处理: 判断为Data类型进入对应分支 非 ChangeLog 类型内容存入Map 提供当前用户信息给Controller 7. 常态化通信 TeamServer处理: 接收Controller的 aggressor.ping BroadcastWriter 回写Beacons信息 进入稳定通信状态 8. 流程图 9. 关键数据结构 Request : 请求数据结构 Reply : 响应数据结构 TeamQueue : 通信队列 TeamReader: 读取线程 TeamWriter: 写入线程 ManageUser : TeamServer端用户管理 BroadcastWriter: 广播写入线程 10. 参考实现要点 密码校验使用固定标志位(48879/51966) 通信使用自定义协议封装 多线程处理请求和响应 回调机制处理异步通信 数据同步采用增量方式 11. 安全注意事项 密码传输未加密(仅简单填充) 固定标志位可能被识别 通信协议可被逆向分析 缺乏强加密机制