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

admin 2022年4月23日02:34:11CobaltStrike逆向学习系列(11)-自实现 Beacon 检测工具已关闭评论103 views字数 1057阅读3分31秒阅读模式

目前使用比较多的检测工具就是 BeaconEye,在之前的文章中也已经提到过它的检测原理与 Bypass 的方法《Bypass BeaconEye》《Bypass BeaconEye - Beacon 堆混淆》,BeaconEye 所依赖的就是 C2Profile 解析后的内存结构来检测的,根据之前逆向分析的成果,发现还有一种检测的方案而且也相对增加了绕过的难度

0x01 检测原理

BeaconEye 所依赖的是 C2Profile 解析后的固定内存结构,对于其解析的逻辑在之前也已经提到过了,这里也就不详细说了

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

对于 Beacon 的检测,针对 C2Profile 是一个比较稳妥的方案,这样会降低误报的概率,所以还是按照这个逻辑继续走才比较稳妥,所以检测逻辑就可以从检测 C2Profile 数据,改变为检测解析 C2Profile 的代码,或者获取 C2Profile 数据的函数

根据之前对 C2Profile 全流程的分析,这里就可以有四个检测方案——解析函数、GetShortValue、GetIntValue、GetPtrValue

0x02 检测方案

在检测的时候,可以直接将整个函数都作为特征,为了方便起见,也可以再缩小检测范围,这里以 GetShortValue 为例

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

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

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

再或者将寄存器取值作为特征也都是可行的,而且还能跟其他几个点进行配合,相互之间的组合方式也就有很多种了

0x03 存在的问题

以这些点来作为特征也存在一个问题,CS 自带的 Sleep_Mask 会在 Sleep 的时候将整块内存都进行混淆,我们之前也进行过分析它具体的实现原理,所以还需要在对之前的检测方案进行完善

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

根据之前的混淆逻辑可以很清楚的发现,CS 是将加解密函数拷贝到了 text 段的结尾位置,并且在处理完以后当前内存就一直存在了,不会去对其进行清理

0x04 解决方案

既然这样,那就直接按照前面所说的逻辑,直接将加解密函数作为特征来完成对 Beacon 的检测

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

如果计划缩小特征码,逻辑也与之前一致,从中间取出关键的几个步骤即可

0x05 示例代码

想了想代码还是交给你们自己写吧,将上面提到的几个方案的特征提取出来,在全内存中进行搜索即可

在网上搜 “内存搜索特征码” 也能找到很多可以来参考的例子

0x06 写在最后

其实整个的操作就是在进行特征码的搜索,这也就是被针对以后的问题了,倒是不是不能 Bypass,就是会比之前更麻烦一点,就是进行 inline Hook 关键的位置,然后将原始的内容抹零就好了。

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月23日02:34:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CobaltStrike逆向学习系列(11)-自实现 Beacon 检测工具https://cn-sec.com/archives/916928.html