CobaltStrike逆向学习系列(11):自实现 Beacon 检测工具
这是[信安成长计划]的第 11 篇文章
关注微信公众号[信安成长计划]

0x00 目录
0x01 检测原理
0x02 检测方案
0x03 存在的问题
0x04 解决方案
0x05 示例代码
0x06 写在最后
年也过了,继续开始卷卷卷...
目前使用比较多的检测工具就是 BeaconEye,在之前的文章中也已经提到过它的检测原理与 Bypass 的方法《Bypass BeaconEye》《Bypass BeaconEye - Beacon 堆混淆》,BeaconEye 所依赖的就是 C2Profile 解析后的内存结构来检测的,根据之前逆向分析的成果,发现还有一种检测的方案而且也相对增加了绕过的难度
0x01 检测原理
BeaconEye 所依赖的是 C2Profile 解析后的固定内存结构,对于其解析的逻辑在之前也已经提到过了,这里也就不详细说了

对于 Beacon 的检测,针对 C2Profile 是一个比较稳妥的方案,这样会降低误报的概率,所以还是按照这个逻辑继续走才比较稳妥,所以检测逻辑就可以从检测 C2Profile 数据,改变为检测解析 C2Profile 的代码,或者获取 C2Profile 数据的函数
根据之前对 C2Profile 全流程的分析,这里就可以有四个检测方案——解析函数、GetShortValue、GetIntValue、GetPtrValue
0x02 检测方案
在检测的时候,可以直接将整个函数都作为特征,为了方便起见,也可以再缩小检测范围,这里以 GetShortValue 为例

经过观察可以发现,所有的获取函数在获取完值以后,都会再判断一下当前的类型是否正确,所以就可以把这一点拉出来作为检测的一个特征

再或者将寄存器取值作为特征也都是可行的,而且还能跟其他几个点进行配合,相互之间的组合方式也就有很多种了
0x03 存在的问题
以这些点来作为特征也存在一个问题,CS 自带的 Sleep_Mask 会在 Sleep 的时候将整块内存都进行混淆,我们之前也进行过分析它具体的实现原理,所以还需要在对之前的检测方案进行完善

根据之前的混淆逻辑可以很清楚的发现,CS 是将加解密函数拷贝到了 text 段的结尾位置,并且在处理完以后当前内存就一直存在了,不会去对其进行清理
0x04 解决方案
既然这样,那就直接按照前面所说的逻辑,直接将加解密函数作为特征来完成对 Beacon 的检测

如果计划缩小特征码,逻辑也与之前一致,从中间取出关键的几个步骤即可
0x05 示例代码
想了想代码还是交给你们自己写吧,将上面提到的几个方案的特征提取出来,在全内存中进行搜索即可
在网上搜 “内存搜索特征码” 也能找到很多可以来参考的例子
0x06 写在最后
其实整个的操作就是在进行特征码的搜索,这也就是被针对以后的问题了,倒是不是不能 Bypass,就是会比之前更麻烦一点,就是进行 inline Hook 关键的位置,然后将原始的内容抹零就好了。
CobaltStrike逆向学习系列(11):自实现 Beacon 检测工具的更多相关文章
- CobaltStrike逆向学习系列(2):Stageless Beacon 生成流程分析
这是[信安成长计划]的第 2 篇文章 关注微信公众号 [信安成长计划] 0x00 目录 0x01 Patch Beacon 0x02 Patch Loader 0x03 文件对比 0x04 流程图 C ...
- CobaltStrike逆向学习系列(3):Beacon C2Profile 解析
这是[信安成长计划]的第 3 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller 端分析 0x02 Beacon 端分析 0x03 展示图 在上一篇文章中完成了 S ...
- CobaltStrike逆向学习系列(8):Beacon 结果回传流程分析
这是[信安成长计划]的第 8 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 接收与处理 0x02 结果回传 Beacon 在接受完命令并执行后,会将数据加密回传给 T ...
- CobaltStrike逆向学习系列(6):Beacon sleep_mask 分析
这是[信安成长计划]的第 6 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 C2Profile 分析 0x02 set userwx "true" 0x03 s ...
- 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逆向学习系列(1):CS 登陆通信流程分析
这是[信安成长计划]的第 1 篇文章 关注微信公众号[信安成长计划][SecSource] 0x00 目录 0x01 密码校验 0x02 aggressor.authenticate 0x03 agg ...
- CobaltStrike逆向学习系列(12):RDI 任务发布流程分析
这是[信安成长计划]的第 12 篇文章 0x00 目录 0x01 任务构建 0x02 结果处理 0x03 功能 DLL 分析 之前的分析都是针对整个 CS 的框架来进行的,但是功能也是整个 C2 中相 ...
随机推荐
- postman设置token等关联参数
登陆时登录成功后服务器会返回一个token,这个token作为第二步骤的入参:第二个步骤请求成功后服务器会返回一个新token,然后这个token作为第三步骤的入参!如此一来的话,要用postman做 ...
- 【SpringCloud-Alibaba】环境搭建以及注意事项
一.开发环境 JDK 1.8 SpringBoot 2.1.7.RELEASE SpringCloud-Alibaba 2.1.2.RELEASE 数据库MySQL 5.8 如果需要修改版本请参照:S ...
- 学习JAVAWEB第一天
第一天:单元测试(junit)黑盒测试:不需要写代码,给输入值,看程序能否给出期望值白盒测试:需要写代码,关注程序的具体执行流程junit使用步骤:步骤1:定义一个测试类建议类名,被测试类名后面加一个 ...
- Linux 学习2
1.配置好阿里云yum源生成yum缓存下载nginx,并且启动nginx服务,使用浏览器访问,nginx页面 yum源的工作目录是? https://www.cnblogs.com/dlh-lmsh/ ...
- CaCl2 项目介绍。
一 是什么? 中国自然语言处理(NLP)研究项目. 二 主要功能? 从互联网获取的大量文本数据,结合自研力量进行分析.将数据重新格式化为大量条目,目录,并根据金融行业分类标准对这些条目进行了分类. 三 ...
- 字体替换 re.sub
dic={'hqo3r': '迎', 'hq6ic': '名', 'hq7yw': '头', 'hq1lk': '新', 'hqpe1': '肇'} content=''' 总体hqo3r则,错的注( ...
- 【C++】输入输出
缓冲 C++ 的输入输出均通过缓冲区来实现.缓冲区主要是为了解决速度不匹配的问题. cin 阻塞输入.当输入缓存中无字符时则等待用户输入. 输入缓冲 输入缓冲是一种行缓冲.在输入数据只要没有碰到换行符 ...
- js 每日一更(数组转换成前端更容易解析的树状结构)
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- JDBC 操作预编译语句中LIKE模糊匹配怎么用
问题描述 在使用JDBC 预编译执行语句时,遇到一个问题,那就是在含有LIKE的查询语句时,我到底怎么使用匹配符%._呢. 如: SELECT * FROM "+LQ_USERS+" ...
- StringUtils.isBlank(str)和StringUtils.isEmpty(str)的区别
1.StringUtils.isEmpty(CharSequence cs)实现源码 public static boolean isEmpty(CharSequence cs) { return c ...