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

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

0x00 目录

0x01 BeaconEye 检测原理

0x02 Bypass 1

0x03 Bypass 2

0x04 效果图

在之前的三篇文章《Stageless Beacon 生成流程分析》《Beacon C2Profile 解析》《Beacon 上线协议分析》中,已经穿插着将 C2Profile 的全部内容介绍完了,也把 Bypass 所需要的一些内容也都穿插着提到过了,接下来就该说如何对其进行 Bypass

0x01 BeaconEye 检测原理

BeaconEye 是通过 yara 规则来对 Beacon 进行检测的,规则所匹配的就是 C2Profile,在 Beacon 解析完以后,每一项都是占 16 个字节,前 8 个字节是 type,后 8 个字节是 data

为了明确对比一下,先看一下 Java 端的操作,关键需要对比的就是这五条

yara 规则的第一条全为零,是因为 Beacon 在解析的时候直接偏移了 index 个位置

接下来也就都对得上了,类型依次是 short、short、int、int、short,对应过去就是 1、1、2、2、1,后面的值也就都是一样对应了

所以只要能够打破这个规则结构也就可以完成 Bypass 的工作了

0x02 Bypass 1

如果单纯做打破结构的话,将中间的值进行替换就可以了,整个十六个字节,实际需要使用的也就是第一位和后面的数据,中间的一片零都是没有意义的,所以在申请这片内存的时候,直接将其设置成其他值就可以了

直接去改字节兴许还有点困难,再或者就是使用寄存器的赋值操作,将其他寄存器的值,替换到 edx 当中

再者就是 inline Hook,这样所有的问题也都很容易解决了

0x03 Bypass 2

这个方案会比较复杂,但是做完这个以后,之后要做其他的操作就会比较方便了,不管是进行特征修改,还是后续继续做 Beacon 的二次开发也都是非常方便的。

这个方案就是 HOOK,而且需要对两边都需要进行修改才可以,工作量也是比较大的。

整个 C2Profile 的流程是这样的,先在 Controller 按照指定格式组成数组,将其 Patch 到 beacon.dll 当中,再将 beacon.dll Patch 到 Loader 当中,Beacon 在执行的时候再将其解析成后续需要使用的格式。

为了能更方便处理 beacon.dll,最好的方式是重写 Loader,这样对于修改特征等也都会很方便。

接下来需要讨论的就是如何修改,关键函数就是解析 C2Profile 和取值两块,总共四个函数

对于解析是很容易处理的,之前提到过了,当 fdwReason 传入 1 的时候,所执行的是解析 C2Profile 的操作,直接将这个函数 HOOK 掉就好了

对于取值的话,也都是单个独立的函数,所以整体操作的逻辑都是一致的

对于 HOOK 的库自行选择一个自己感觉舒服的就好,重要的还是地址的偏移,下面是 X64 的偏移量

ULONG_PTR ulParseProfile = ImageBase + 0x18694;
ULONG_PTR ulGetShortValue = ImageBase + 0x18664;
ULONG_PTR ulGetIntValue = ImageBase + 0x185DC;
ULONG_PTR ulGetPtrValue = ImageBase + 0x18630;

后续的代码重写也就非常简单了,申请内存赋值、取 Short、取 Int、取Ptr,这些都按照个人的设计思路来写就可以了

可以很简单的把数据进行罗列,这样在取值的时候会比较麻烦,毕竟不好定位,当然也可以用定长的方式来做

也可以做的很复杂,在中间插入大量的垃圾字符,用一种只有自己才明白的格式来写

有一点需要注意,在 X86 上写三个取值函数的时候,并不能直接去取值,beacon.dll 并不是堆栈传参的,而是通过 edx 来传参的,因为 X86 是支持内嵌汇编的,所以在修改上也是很容易的

__asm mov index, edx

0x04 效果图

CobaltStrike逆向学习系列(5):Bypass BeaconEye的更多相关文章

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

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

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

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

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

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

  4. CobaltStrike逆向学习系列(14):CS功能分析-DotNet

    这是[信安成长计划]的第 14 篇文章 0x00 目录 0x01 DotNet功能分析 0x02 DotNet功能执行 0x03 写在最后 在上两篇文章中,讲述了 CS 中的一种功能执行方式 RDI, ...

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

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

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

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

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

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

  8. CobaltStrike逆向学习系列(3):Beacon C2Profile 解析

    这是[信安成长计划]的第 3 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller 端分析 0x02 Beacon 端分析 0x03 展示图 在上一篇文章中完成了 S ...

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

    这是[信安成长计划]的第 1 篇文章 关注微信公众号[信安成长计划][SecSource] 0x00 目录 0x01 密码校验 0x02 aggressor.authenticate 0x03 agg ...

随机推荐

  1. 备忘录——基于rdlc报表实现打印产品标签

    目录 0. 背景说明 1. 条形码生成 2. 获取产品的小程序码 3. 报表设计器设计标签模版 3.1 为WinForm控件工具箱添加ReportViewer控件 3.2 为VS2019安装RDLC报 ...

  2. 《剑指offer》面试题61. 扑克牌中的顺子

    问题描述 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大.小王为 0 ,可以看成任意数字.A 不能视为 14. 示例 ...

  3. Golang单元测试框架整理

    目录 一.单元测试是什么 二.单元测试的意义 三.Golang单元测试框架 3.1 Golang内置testing包 3.1.1 简单的测试 3.1.2 Benchmark 基准测试 3.1.3 运行 ...

  4. 【初体验】valgrind分析程序性能

    wget https://fossies.org/linux/misc/valgrind-3.15.0.tar.bz2 tar -jxvf valgrind-3.15.0.tar.bz2 cd val ...

  5. MySQL查询处理——逻辑查询处理和物理查询处理

    对于查询处理,可将其分为逻辑查询处理和物理查询处理.逻辑查询处理表示执行查询应该产生什么样的结果,而物理查询代表MySQL数据库是如何得到结果的. 逻辑查询处理 MySQL真正的执行顺序如下: (8) ...

  6. 记一次redis 基于spring实现类对同一个KEY序列化内容不同导致一次事故

    我们的场景是这样的 我们对一个key:比如list.point.card:1 @Resourceprivate RedisTemplate<String, Long> redisTempl ...

  7. golang中的原子操作atomic包

    1. 概念 原子操作 atomic 包 加锁操作涉及到内核态的上下文切换,比较耗时,代价高, 针对基本数据类型我们还可以使用原子操作来保证并发的安全, 因为原子操作是go语言提供的方法,我们在用户态就 ...

  8. 浅谈C#可变参数params

    前言 前几天在群里看到群友写了一个基础框架,其中设计到关于同一个词语可以添加多个近义词的一个场景.当时群友的设计是类似字典的设计,直接添加k-v的操作,本人看到后思考了一下觉得使用c#中的params ...

  9. Redis集群安装详细步骤

    环境: Centos7    redis3.0 三台虚拟机主机名分别为 master   node1  node2 如果单机的时候设置过密码最好把密码去掉,避免位置的错误. 拍个快照方便恢复. 1.创 ...

  10. UDP数据包最大传输长度

    概念以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.这个1500字节被称为链路层的MTU(最大传输单元). 但这并不是指链路层的长度被限制在1500字 ...