这是[信安成长计划]的第 3 篇文章

关注微信公众号[信安成长计划]

0x00 目录

0x01 Controller 端分析

0x02 Beacon 端分析

0x03 展示图

在上一篇文章中完成了 Stageless Beacon 生成的分析,接下来就是对 Beacon 的分析了,在分析上线之前先将 C2Profile 的解析理清楚,因为 Beacon 中大量的内容都是由 C2Profile 决定的。

而且,目前 C2Profile 也是被作为检测 CobaltStrike 的一种手段,只有在理解了它的实现原理,才能真正明白检测原理和绕过方法。

0x01 Controller 端分析

直接跟到 beacon/BeaconPayload.java,看 exportBeaconStage 方法

对于前面值的获取暂时不管,直接看重点,是如何添加的,因为最后是直接把 settings 转 byte 数组,然后混淆后 Patch 的,所以就重点看一下 settings 都干了什么事

看一眼 settings 的设置,可以很明显的发现四个方法 addShort、addInt、addString、addData

但是可以发现 addString 根本上调用的就是 addData,所以重点就是 addShort、addInt、addData 三个方法

再回头看一下前面在调用时候的情况,后面的参数是需要添加进去的内容、长度,但在第一个参数位置还有一些不明白含义的数字,这个序号是在 Beacon 端解析 C2Profile 的时候需要用到的,在后面来进行解释。

在分析这三个关键方法的时候,还有三个 final 类型的值需要注意一下,到这里也就可以猜个八九不离十了,C2Profile 一定是用某个字节的值来表示数据类型,然后将对应的数据存储在后面

所以来整体看一下这三个方法,首先将序号添加进来;接着 addShort 添加了 1,addInt 添加了 2,addData 添加了 3,这刚好就是上面所定义的几个值;然后 addShort 添加了 2,addInt 添加了 4,addData 添加了 长度值,所以推测,这个位置应该是后面数据的长度;最后他们都将数据添加在了后面

所以整体的结构应该是

0x02 Beacon 端分析

在理 C2Profile 的时候,顺便把解析前的一些内容一起分析一下,在之前分析 Beacon 生成的时候,已经分析过了,实际执行的 Beacon 是由一个 Loader 加载执行的,所以在实际运行的时候,运行的是 Loader,我们在 CreateThread 下断,然后在线程函数中下断也就跟到了熟悉的 PE 头,这里也就是之前说的引导头

首先,它通过计算偏移的方式调用了 ReflectiveLoad

跟进去后,可以发现 ReflectiveLoad 最后调用 DLLMain 的时候传递的 fdwReason 为 1,同时在 return 的时候,也将 DLLMain 的地址 return 回来了

继续往下跟,可以发现它再次调用了 DLLMain,并且传递的 fdwReason 为 4

接下来就该分析真正核心的 beacon.dll 在 DLLMain 中干了什么事,经过分析发现,当 fdwReason 为 1 时,实际执行的是解析 C2Profile 的操作,当 fdwReason 为 4 时,才是真正的功能执行,很明显,这里我们更关心的是解析 C2Profile 的操作

跟进分析,先申请了一片 0x800 的内存用于存储,接着有一个很明显的操作,将一片内存异或,这些都与之前分析生成时候的逻辑一致

AAAABBBBCCCCDDDD 的内存特征

4096 的内存大小

0x2E 的异或操作

接着设置了一个结构体,将 C2Profile 的地址存两份,将其大小也存两份,这个结构体在后面解析的时候会用到

之后就是循环解析,并在最后的时候将这片区域抹零

首先在最开始的时候取了 Short 类型,并且这个函数也是结束解析的关键,首先判断一下结构当中的 Size,如果小于 2,直接 return 0,也就是说所有的都解析完了,这个 0 也就刚好在外层结束了整个解析的流程

转换字节序,取两个字节,这个值也就是之前所说的 index,然后将位置偏移加二,总大小减二,返回 index

然后按照刚才的逻辑可以取出 type 和 size

接着将 index*16,并将 type 存储到对应的位置,到这里 index 的作用也就明确了,是用来指定存储的偏移位置的,这样做就相当于内存对齐一样,在查找的时候是非常方便的

接着便是根据 type 类型来决定执行操作了

获取 Short 与 Int 的都是一样的,就不细说了,重点说一下 Ptr 类型的

先根据 size 申请了一片内存空间,并将地址存储在了对应的位置上,然后去解析

如果剩余大小小于 Ptr 要取的大小,说明有问题,直接 return;然后与之前一样,将所存储的这个结构体的位置偏移后移,将大小进行对应的减小,最后将数据的地址 return 回来

最后使用内存拷贝的方式将数据拷到所申请的内存当中

所以最终在 Beacon 中所使用的样子是这样的

0x03 展示图

所以 Controller Patch 到 Beacon 中的 C2Profile 与 Beacon 在运行时所使用的 C2Profile 长的并不是一样的

Controller

Beacon

CobaltStrike逆向学习系列(3):Beacon C2Profile 解析的更多相关文章

  1. CobaltStrike逆向学习系列(5):Bypass BeaconEye

    这是[信安成长计划]的第 5 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 BeaconEye 检测原理 0x02 Bypass 1 0x03 Bypass 2 0x04 效果图 ...

  2. CobaltStrike逆向学习系列(11):自实现 Beacon 检测工具

    这是[信安成长计划]的第 11 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 检测原理 0x02 检测方案 0x03 存在的问题 0x04 解决方案 0x05 示例代码 0x06 ...

  3. CobaltStrike逆向学习系列(2):Stageless Beacon 生成流程分析

    这是[信安成长计划]的第 2 篇文章 关注微信公众号 [信安成长计划] 0x00 目录 0x01 Patch Beacon 0x02 Patch Loader 0x03 文件对比 0x04 流程图 C ...

  4. CobaltStrike逆向学习系列(4):Beacon 上线协议分析

    这是[信安成长计划]的第 4 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 发送 0x02 TeamServer 处理 0x03 流程图 0x04 参考文章 在上一篇 ...

  5. CobaltStrike逆向学习系列(7):Controller 任务发布流程分析

    这是[信安成长计划]的第 7 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller->TeamServer 0x02 TeamServer->Beacon ...

  6. CobaltStrike逆向学习系列(6):Beacon sleep_mask 分析

    这是[信安成长计划]的第 6 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 C2Profile 分析 0x02 set userwx "true" 0x03 s ...

  7. CobaltStrike逆向学习系列(8):Beacon 结果回传流程分析

    这是[信安成长计划]的第 8 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 接收与处理 0x02 结果回传 Beacon 在接受完命令并执行后,会将数据加密回传给 T ...

  8. CobaltStrike逆向学习系列(15):CS功能分析-BOF

    这是[信安成长计划]的第 15 篇文章 0x00 目录 0x01 BOF功能分析 0x02 BOF功能执行 0x03 写在最后 其实在看过 RDI 与 DotNet 功能执行之后,BOF 的执行基本就 ...

  9. CobaltStrike逆向学习系列(10):TeamServer 启动流程分析

    这是[信安成长计划]的第 10 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 基本校验与解析 0x02 初始化 0x03 启动 Listeners 在之前的分析中,都是针对 Cob ...

随机推荐

  1. linux 安装mysql 可能遇到的小问题

    问题一. ./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No ...

  2. JavaScript 中BOM的常用操作

    JavaScript BOM操作 1.获取浏览器窗口尺寸 var width=window,innerWidth //获取可视窗口宽度 var height=window.innerHeight // ...

  3. C++ 基本类型的大小

    C++的基本类型: char bool (unsigned) short (int) (unsigned) int (unsigned) long (int) (unsigned) long long ...

  4. 流言粉碎机:JAVA使用 try catch 会严重影响性能

    目录 一.JVM 异常处理逻辑 二.关于JVM的编译优化 1. 分层编译 2. 即时编译器 1. 解释模式 2. 编译模式 3. 提前编译器:jaotc 三.关于测试的约束 执行用时统计 编译器优化的 ...

  5. java接口概述及特点

    1 package face_09; 2 3 4 5 6 abstract class AbsDemo{ 7 abstract void show1(); 8 abstract void show2( ...

  6. 【转载】Systemd 入门教程:实战篇

    作者: 阮一峰 日期: 2016年3月 8日 上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务. 一.开机启动 对于那些支持 Systemd 的软件,安装的时候, ...

  7. while...break 实例

    // 输出1-100内前5个可以被3整除的数 public class Demo { public static void main(String[] args) { int num = 0; for ...

  8. Pycharm 使用备忘

    1.打开方法定义 快捷方式:[ctrl+左键]或者[Ctrl+B] 如果点击之后,打开不是[.py]文件,而是[.pyi]文件,可以把下面红框的参数删掉. 2.设置文件开头默认注释 # *_* cod ...

  9. TypeScript入门文档

    typescript入门文档链接d地址:https://ts.xcatliu.com/basics/type-of-function.html 博主个人站点:www.devloper.top

  10. mybatis 配置文件 简单介绍

    配置文件? 一. properties属性:可以引入外部的属性文件,可以自定义属性信息,供后续的节点使用: 注意!外部文件 定义在SRC目录下 否则找不到资源.二. settings设置:全局的配置信 ...