CobaltStrike逆向学习系列(1):CS 登陆通信流程分析
字数 2440 2025-08-07 08:22:09

CobaltStrike逆向学习系列(1): CS 登陆通信流程分析

0x00 概述

本文详细分析CobaltStrike(CS)中Controller与TeamServer之间的登录通信流程。CS系统可分为三个主要组件:

  • Controller: 操作者使用的客户端
  • TeamServer: 命令控制服务器
  • Beacon: 植入目标系统的代理程序

0x01 密码校验流程

TeamServer端准备

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

Controller端连接

  1. 点击Connect按钮触发dialogAction方法
  2. 创建SecureSocket对象并调用authenticate方法
  3. TeamServer在SecureServerSocket.this.authenticate方法中阻塞等待(var4.readInt())

认证数据包构造

Controller构造认证数据包:

  1. 写入标志位48879(int)
  2. 写入密码长度(byte)
  3. 写入密码
  4. 65填充剩余空间
    • 密码长度+填充长度≤256
    • 总长度=256+5=261字节

验证过程

  1. TeamServer验证标志位
  2. 读取密码和填充字符
  3. 密码正确则写回标志位51966
  4. Controller验证返回的标志位

0x02 aggressor.authenticate流程

TeamServer端

  1. 创建Socket和ManageUser处理Controller请求
  2. ManageUser循环等待Controller请求

Controller端

  1. 创建TeamQueue处理与TeamServer通信
  2. TeamQueue构造函数创建两个线程:
    • TeamReader: 读取TeamServer数据
    • TeamWriter: 向TeamServer发送数据
  3. 调用call发送aggressor.authenticate请求,包含:
    • 用户名
    • 密码
    • 版本号
  4. addRequest将构造的Request对象存入LinkedList
  5. TeamWriter线程从LinkedList取数据发送

请求处理

  1. TeamServer的ManageUser接收请求
  2. 进入process方法处理请求
  3. 验证版本和密码
  4. 验证成功返回SUCCESS
  5. 启动BroadcastWriter线程

响应处理

  1. Controller的TeamReader接收响应(Reply对象)
  2. 通过callback值调用对应类的result方法
  3. 验证返回值为SUCCESS后发送aggressor.metadata

0x03 aggressor.metadata流程

  1. Controller发送aggressor.metadata请求,附带时间戳
  2. TeamServer的ManageUser处理请求:
    • 创建多个Map
    • 返回信息给Controller
  3. Controller处理响应:
    • 进入AggressorClientsetup方法
    • 初始化界面相关内容
    • 发送aggressor.ready表示完成
  4. TeamServer准备数据同步

0x04 数据同步流程

TeamServer端

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

Controller端

  1. TeamReader接收消息
  2. callback为0时:
    • 调用DataManagerresult方法
    • 检查senttotal是否相等
    • 遍历调用对应result方法
  3. 处理Data类型消息:
    • ChangeLog类型存入Map

后续同步

  1. TeamServer遍历this.transcriptsthis.replayme
  2. 发送流程:
    • 先发送playback.status
    • 发送Key-Value数据
    • 递增sent计数器
  3. 同步用户信息给Controller
  4. 调用broadcast同步eventlog

0x05 常态化通信

  1. Controller定期发送aggressor.ping
  2. TeamServer的BroadcastWriter回传Beacon信息

0x06 流程图

[此处应插入通信流程图,包含以下关键节点:

  1. 密码校验
  2. aggressor.authenticate
  3. aggressor.metadata
  4. 数据同步
  5. 常态化通信]

关键点总结

  1. 认证协议:使用固定标志位(48879/51966)和填充机制(65)
  2. 通信模型
    • Controller使用双线程模型(TeamReader/TeamWriter)
    • TeamServer使用ManageUser处理请求
  3. 数据同步:通过playback机制同步历史数据
  4. 状态维护:使用sent/total计数器确保同步完整性
  5. 错误处理:严格的版本和密码校验机制

参考实现建议

  1. 实现CS协议分析工具时,可重点关注:
    • 认证数据包构造
    • aggressor.* 系列命令
    • playback同步机制
  2. 协议逆向关键点:
    • SecureSocket/SecureServerSocket类
    • ManageUser.process方法
    • TeamQueue的通信模型
CobaltStrike逆向学习系列(1): CS 登陆通信流程分析 0x00 概述 本文详细分析CobaltStrike(CS)中Controller与TeamServer之间的登录通信流程。CS系统可分为三个主要组件: Controller : 操作者使用的客户端 TeamServer : 命令控制服务器 Beacon : 植入目标系统的代理程序 0x01 密码校验流程 TeamServer端准备 TeamServer启动后创建 SecureServerSocket 对象 循环调用 acceptAndAuthenticate 方法等待Controller连接 验证成功后调用 clientAuthenticated 方法,创建线程执行 ManageUser 处理Controller通信 Controller端连接 点击Connect按钮触发 dialogAction 方法 创建 SecureSocket 对象并调用 authenticate 方法 TeamServer在 SecureServerSocket.this.authenticate 方法中阻塞等待( var4.readInt() ) 认证数据包构造 Controller构造认证数据包: 写入标志位 48879 (int) 写入密码长度(byte) 写入密码 用 65 填充剩余空间 密码长度+填充长度≤256 总长度=256+5=261字节 验证过程 TeamServer验证标志位 读取密码和填充字符 密码正确则写回标志位 51966 Controller验证返回的标志位 0x02 aggressor.authenticate流程 TeamServer端 创建Socket和 ManageUser 处理Controller请求 ManageUser 循环等待Controller请求 Controller端 创建 TeamQueue 处理与TeamServer通信 TeamQueue 构造函数创建两个线程: TeamReader : 读取TeamServer数据 TeamWriter : 向TeamServer发送数据 调用 call 发送 aggressor.authenticate 请求,包含: 用户名 密码 版本号 addRequest 将构造的 Request 对象存入 LinkedList TeamWriter 线程从 LinkedList 取数据发送 请求处理 TeamServer的 ManageUser 接收请求 进入 process 方法处理请求 验证版本和密码 验证成功返回 SUCCESS 启动 BroadcastWriter 线程 响应处理 Controller的 TeamReader 接收响应( Reply 对象) 通过 callback 值调用对应类的 result 方法 验证返回值为 SUCCESS 后发送 aggressor.metadata 0x03 aggressor.metadata流程 Controller发送 aggressor.metadata 请求,附带时间戳 TeamServer的 ManageUser 处理请求: 创建多个Map 返回信息给Controller Controller处理响应: 进入 AggressorClient 的 setup 方法 初始化界面相关内容 发送 aggressor.ready 表示完成 TeamServer准备数据同步 0x04 数据同步流程 TeamServer端 register 方法: 将用户与对应 manageUser 存入Map 调用 playback 处理同步 playback 方法: 计算 this.transcripts 和 this.replayme 总大小 开始发送数据 send 方法: 通过用户名获取对应 ManageUser 打包数据为 Reply 或 Request 发送 Controller端 TeamReader 接收消息 当 callback 为0时: 调用 DataManager 的 result 方法 检查 sent 与 total 是否相等 遍历调用对应 result 方法 处理 Data 类型消息: 非 ChangeLog 类型存入Map 后续同步 TeamServer遍历 this.transcripts 和 this.replayme 发送流程: 先发送 playback.status 发送Key-Value数据 递增 sent 计数器 同步用户信息给Controller 调用 broadcast 同步 eventlog 0x05 常态化通信 Controller定期发送 aggressor.ping TeamServer的 BroadcastWriter 回传Beacon信息 0x06 流程图 [ 此处应插入通信流程图,包含以下关键节点: 密码校验 aggressor.authenticate aggressor.metadata 数据同步 常态化通信 ] 关键点总结 认证协议 :使用固定标志位(48879/51966)和填充机制(65) 通信模型 : Controller使用双线程模型(TeamReader/TeamWriter) TeamServer使用ManageUser处理请求 数据同步 :通过playback机制同步历史数据 状态维护 :使用sent/total计数器确保同步完整性 错误处理 :严格的版本和密码校验机制 参考实现建议 实现CS协议分析工具时,可重点关注: 认证数据包构造 aggressor.* 系列命令 playback同步机制 协议逆向关键点: SecureSocket/SecureServerSocket类 ManageUser.process方法 TeamQueue的通信模型