CobaltStrike逆向学习系列(1):CS 登陆通信流程分析
这是[信安成长计划]的第 1 篇文章
关注微信公众号[信安成长计划][SecSource]
0x00 目录
0x01 密码校验
0x02 aggressor.authenticate
0x03 aggressor.metadata
0x04 数据同步
0x05 流程图
0x06 参考文章
先统一一下后续文章所提到的一些名词,以确保大家都在聊同一个东西,文中将 CobaltStrike 分为 Controller、TeamServer、Beacon 三端,本文所描述的是 TeamServer 启动之后,从 Controller 登陆 TeamServer 的流程分析。
由于水平有限,对于数据同步并没有理解的足够清楚,望各位斧正。
0x01 密码校验
启动 TeamServer 后,会创建 SecureServerSocket 对象并且循环调用 acceptAndAuthenticate 方法等待 Controller 连接
在接收到信息并验证成功以后,才会去调用 clientAuthenticated 方法来线程执行 ManageUser 以处理与 Controller 的信息
当 Controller 在点击 Connect 按钮时,会调用 Connect 中的 dialogAction 方法,会先创建 SecureSocket 对象,并调用 authenticate 方法进行验证
在创建 SecureSocket 对象时,会与 TeamServer 进行握手等操作,TeamServer 会进入 SecureServerSocket.this.authenticate 方法进行验证,此时会一直在 var4.readInt() 阻塞,直到 Controller 将信息发完
接着来看 Controller 的处理,在 authenticate 中,进行了数据包的构造,先写入一个标志 48879(int),接着是密码的长度(byte),然后是密码,之后用 65 来进行填充
密码长度加填充长度,不超过 256,再加上标识位和密码长度,256+5=261
接着在 flush 之后,TeamServer 就开始验证了,判断标志位是否正确,读取密码,读填充字符
对比密码,如果正确,写回标志位 51966
在 Controller 这边同样也会进行验证
密码校验到此也就结束了
0x02 aggressor.authenticate
接着,TeamServer 创建 Socket,并创建 ManageUser 来处理 Controller 发送的信息
Controller 创建 TeamQueue 来进行后续操作,TeamQueue 是用来处理与 TeamServer 的通讯的
在 TeamQueue 的构造函数中,创建了两个线程分别来跑 TeamQueue 的内部类 TeamReader 和 TeamWriter,用来与 TeamServer 进行通信
接着,当前线程调用 call 向 TeamServer 发送 aggressor.authenticate,并将 user、pass、版本号组成对象传递过去
在调用 call 中,最关键的就是 addRequest,它将构造好的 Request 对象存放到 LinkedList 当中
因为此时专门有一个线程 TeamWriter 一直在从 LinkedList 中取值发送,所以在添加完之后,这个信息就会被发送到 TeamServer 中
在 TeamServer 中,是由 ManageUser 一直循环等待 Controller 发送到请求的,在上面发送完成后,TeamServer 也就接收到请求了
进入 process 来处理请求,通过对比任务类型,来决定实际执行的内容
接着对 版本、密码进行校验
全部验证成功后,返回 SUCESS
接着会起一个线程,ManageUser 的内部类 BroadcastWriter
此时 Controller 由 TeamReader 接收到信息
这里接受的是 Reply,发送的时候是 Request,这两个类基本是一样的,可能是用来区分数据包的
在请求的时候填入的 callback,也是在这个时候使用的,在之前 call 的时候,将一个 callback 值与这个对象做 Map,在这个时候取出来用于去调用对应类中的 result 方法
在判断返回值是 SUCCESS 之后,接着又发送了 aggressor.metadata
0x03 aggressor.metadata
调用 call 与之前一样,此时传入的参数是当前的时间戳
TeamServer 中的 ManageUser 接到消息后,继续走 process 处理
做了一堆 Map,然后将信息传回给 Controller
Controller 的 TeamReader 接收到回传信息
到 Connect 处理 aggressor.metadata
在进入 AggressorClient 以后,调用 setup 方法,处理与界面相关内容,最后向 TeamServer 发送了 aggressor.ready 表示完成
TeamServer 在 ManageUser 中接到数据以后,process 进行处理,接下来的任务就是处理数据同步
0x04 数据同步
在 register 中,会先将 user 与对应的 manageUser 存储到 Map 当中,接着调用 playback 来处理同步的工作
在 playback 会计算 this.transcripts 与 this.replayme 的总大小,然后进行发送
send 的时候,就用到了前面所创建的 Map,通过名字取出相应的 ManageUser
之后也就是发送的常用流程,将信息打包成 Reply 或 Request 然后发送
Controller 会在 TeamReader 中接到消息,因为 callback 是 0,所以会走走 else 当中处理,调用 DataManager 的 result 方法来进行处理
用于判断 sent 与 total 是否相等,来明确是否已经完成
接着遍历并调用对应的 result 方法
继续回到 TeamServer ,接下来当前线程会来遍历 this.transcripts 和 this.replayme,并将信息 send 到 Controller,由于这里 this.transcripts 为空,就直接看 this.replayme
先把其中所对应的值都取出来,修改了当前的 message 信息以后,先将 playback.status 包发回,然后再将取出来的 Key、Value 发回,最后将 send 加一,用于 Controller 中对比 send 与 total 值
当回信息时,Controller 判断是 Data,所以进入了另外的分支,由于不是 ChangeLog 类型的内容,存储到 Map 后就直接结束了
之后再调用 将当前用户信息提供给 Controller
在 TeamServer 继续执行调用的时候,也是调用的 broadcast 来同步 eventlog
之后也就进入到了常态化的,接 Controller 的 aggressor.ping,和 BroadcastWriter 回写 Beacons 信息
0x05 流程图
0x06 参考文章
快乐鸡哥:https://bbs.pediy.com/thread-267208.htm
WBGlIl:https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/untitled-2
CobaltStrike逆向学习系列(1):CS 登陆通信流程分析的更多相关文章
- CobaltStrike逆向学习系列(10):TeamServer 启动流程分析
这是[信安成长计划]的第 10 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 基本校验与解析 0x02 初始化 0x03 启动 Listeners 在之前的分析中,都是针对 Cob ...
- CobaltStrike逆向学习系列(4):Beacon 上线协议分析
这是[信安成长计划]的第 4 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 发送 0x02 TeamServer 处理 0x03 流程图 0x04 参考文章 在上一篇 ...
- CobaltStrike逆向学习系列(15):CS功能分析-BOF
这是[信安成长计划]的第 15 篇文章 0x00 目录 0x01 BOF功能分析 0x02 BOF功能执行 0x03 写在最后 其实在看过 RDI 与 DotNet 功能执行之后,BOF 的执行基本就 ...
- CobaltStrike逆向学习系列(14):CS功能分析-DotNet
这是[信安成长计划]的第 14 篇文章 0x00 目录 0x01 DotNet功能分析 0x02 DotNet功能执行 0x03 写在最后 在上两篇文章中,讲述了 CS 中的一种功能执行方式 RDI, ...
- CobaltStrike逆向学习系列(11):自实现 Beacon 检测工具
这是[信安成长计划]的第 11 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 检测原理 0x02 检测方案 0x03 存在的问题 0x04 解决方案 0x05 示例代码 0x06 ...
- CobaltStrike逆向学习系列(2):Stageless Beacon 生成流程分析
这是[信安成长计划]的第 2 篇文章 关注微信公众号 [信安成长计划] 0x00 目录 0x01 Patch Beacon 0x02 Patch Loader 0x03 文件对比 0x04 流程图 C ...
- CobaltStrike逆向学习系列(12):RDI 任务发布流程分析
这是[信安成长计划]的第 12 篇文章 0x00 目录 0x01 任务构建 0x02 结果处理 0x03 功能 DLL 分析 之前的分析都是针对整个 CS 的框架来进行的,但是功能也是整个 C2 中相 ...
- CobaltStrike逆向学习系列(8):Beacon 结果回传流程分析
这是[信安成长计划]的第 8 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 接收与处理 0x02 结果回传 Beacon 在接受完命令并执行后,会将数据加密回传给 T ...
- CobaltStrike逆向学习系列(7):Controller 任务发布流程分析
这是[信安成长计划]的第 7 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller->TeamServer 0x02 TeamServer->Beacon ...
随机推荐
- 【Java】java基础
文章目录 Java基础 1 注释.标识符.关键字 1.1 注释 1.2 关键字 1.3 标识符 1.4 数据类型 1.4.1 基本类型 1.4.2 引用类型 1.4.3 整数类型拓展 1.4.4 浮点 ...
- 【C++】类-派生和继承
类-派生和继承 目录 类-派生和继承 1.基本概念 2. 语法 3. 继承方式 4. 类型转换 5. 派生类的构造.析构函数 构造函数 复制构造函数 析构函数 1.基本概念 继承:保持已有类的特性而构 ...
- Qt之锁
mythread.h: #ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include<QMutex> cl ...
- Java中四种访问权限总结
一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...
- MySQL技术内幕(一)
MySQL技术内幕 2. InnoDB存储引擎 2.1 InnoDB存储引擎概述 特点:行锁设计.支持MVCC.支持外键.提供一致性非锁定读 2.2 InnoDB体系架构 2.2.1 后台线程 Inn ...
- 学习Java第11天
今天所做的工作: 敲代码,按照教材进度,我已经"学完了",用引号引起来. 明天工作安排: 敲代码 所遇到的困难及解决方法: 虽然是"学完了",但真正写起来还是有 ...
- Kubernetes:Pod总结(二)
Blog:博客园 个人 承接上文. 在实际的生产使用场景中,直接用 Pod 是不合适的,因为必然会产生单点故障.因此,我们需要有一种方法来方便地创建.管理同一个服务的多个实例 Pod.Kubernet ...
- Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources failed.
说明 今天发现这个错误,然后整体检查了一下代码,没有发现任何错误,最后没法只有来一步一步排查. 解决 确定pom文件是否有问题 如上图,有红色波浪线,代表错误,请检查并解决,还有版本是否冲突,最好把不 ...
- Jvm和CPU保证特定情况下不乱序
简介 CPU为了提高指令执行效率,会在一条指令执行过程中(比去内存读数据(慢100倍)),去同时执行另一条指令,前提是,两条指令没有依赖关系. CPU保证不乱序 MESI--CPU缓存一致性协议(In ...
- android怎么做表格显示数据
实现思路:最底层(父级)背景为黑色,最上层(子级)背景为白色,然后父子组件之间存在一丝间隔即可显示出类似边框的线. 本次主要利用Android中的TableRow等实现,其他类比也可以实现效果. &l ...