内存检测工具哪个好 鲁大师检测内存条好坏

背景2021年8月,BeaconEye项目发布,这是一款基于CobaltStrike记忆特性的威胁猎杀工具。BeaconEye出色的检测率和检测效率,让现有的大部分规避技术失效,在网络安全圈掀起了新一轮

本文最后更新时间:  2023-02-28 21:41:57

背景

2021年8月,BeaconEye项目发布,这是一款基于CobaltStrike记忆特性的威胁猎杀工具。BeaconEye出色的检测率和检测效率,让现有的大部分规避技术失效,在网络安全圈掀起了新一轮关于CS内存攻防的讨论。

为什么BeaconEye一针见血?

BeaconEye可以扫描正在运行的程序或Minidump中的程序,识别Beacon注入的进程,以上帝的视角窥视其内部行为。

选择信标配置。

获取执行命令的返回结果。

使用sleep_mask函数检测信标。

BeaconEye利用解密的配置特征值进行匹配,简单的几行规则秒杀无数隐藏手段。达到这种令人瞠目结舌的效果,非一日之功。在攻击技术和检测技术高度结合的今天,有两点非常突出:

1.信标配置被用作特征匹配对象。

2.把堆作为内存扫描的对象。

致命弱点-信标配置

信标配置存储信标运行时的配置信息,包括C2配置、通信参数、内存隐藏模式等重要信息。这些配置数据以典型的TLV格式组织,偏移量和内容相对固定,因此可以很容易地根据特征提取和分析这些敏感信息。

使用分析工具从信标二进制文件中提取配置信息

Becon执行进程的两个解密进程。

Beacon的默认加密存储在加载器中,并在执行期间释放到堆内存空中。无论加密方式如何,解密后的配置都会一直存在,即使开启了sleepmask功能,也只会保护代码段。无论采用什么加密或解密方式,Beacon Config最终都会暴露在堆内存中,这是Beacon Config的死门,也是BeaconEye扫描堆的原因。

雅拉规则成为BeaconEye的一部分

近日,Tom Bonner的研究在Twitter上披露,Beacon Config不仅包含域名/IP等关于Teamserver的信息,还包含每个攻击者的唯一身份水印信息。

嵌入水印信息的CobaltStrike服务器部分源代码

当Teamserver解析嵌入在二进制中的c2profile时,它会从c2profile中读取名为self的值,这个值记录了Teamserver文件的hash。对于大多数使用重新编译来破解和修改CobaltStrike的攻击者来说,这种泄露的文件哈希可能会暴露样本属性信息。研究人员已经有效地分析和聚类了一些野生样本中Beacon配置中包含的Teamserver哈希,并更准确地跟踪和分类了野生攻击的利用。

研究人员使用Beacon Config的水印信息进行属性聚类。

奇怪的把戏,盲目的信标眼

从BeaconEye的原理出发,躲避扫描的方法只有三种:

1.避免BeaconEye的内存扫描,使其无法扫描自身。

2.寻找内置yara规则的漏洞,绕过匹配

3.完全修改信标配置的数据结构。

第三种方法无疑是最治标不治本的方法,但也是攻击成本最高的方法。接下来要介绍的两种BeaconEye绕过方法就是前两种思路,可以用最小的代价绕过BeaconEye。

通过使用数据类型差异“修改1个字节”来绕过yara规则

TeamServer和Becon DLL的数据类型长度不一致,导致数据缺口的存在,可以填充为任意数据来绕过yara规则。这样就可以实现所谓的“修改1字节绕过BeaconEye”。

以32位信标为例:

在TeamServer的Java代码中,使用长度为4字节的Int类型来表示类型,而Beacon DLL中实际使用的只有前两个字节。所以下图红框区域的数据可以任意填充绕过信标眼而不影响信标功能。

使用堆遍历算法来避免内存扫描

BeaconEye检测到的信标配置数据存在于堆中,因此BeaconEye的有效性取决于对堆的扫描。老版本的BeaconEye存在堆块扫描不完全的问题,根源在于使用NtQueryVirtualMemory函数来枚举堆。这个函数得到的堆大小有一个天然的缺陷:只会计算属性一致的内存页,而实际上堆段中的内存属性是不同的,不一致的。因此,BeaconEye在获取堆信息时实际上只获取第一个堆段的内容。但这种问题不一定触发,而是有特定的触发条件。

通过调用SymInitialize函数或者反复调用HeapAlloc等。,可以手动使信标配置存在于BeaconEye无法扫描的堆段中。但该方法的发现者在披露绕过方法后向BeaconEye官方提交了正确的堆遍历方法,官方收到提交后就会生效。

华池石标探测技术的发展历程及对策

简单有效——可疑记忆属性和静态特征

寻找可疑内存属性的威胁是一种常见的想法。默认情况下,Beacon将在具有RWX(可读、可写、可执行)权限的memory 空中执行。这种敏感的内存属性会更容易找到Beacon存在的内存空。

在没有C2简档的RWX的存储区中存储的是完整的明文信标。

RWX存储区的明文信标

明文信标中DLL头、命名管道名字符串等静态特征明显,一些厂商利用这些静态特征在内存中识别扫描信标。

官方消防员-C2简介改变静态特征

然而,通过官方定制的配置文件可锻C2配置文件,攻击者可以进一步定制和隐藏Beacon的内存属性的静态特征:

自定义存储器属性rwx/rx

自定义或删除文件头。

自定义命名管道名称和替换字符串

C2概要凭借其强大灵活的特性,帮助Beacon成功避开了大部分内存属性和静态特征的检测,大大增强了Beacon的隐藏能力,增加了检测成本。

固定密钥异或?直接解密并提取信标配置

由于某种原因,在导出信标时,CobaltStrike只对其中包含的信标配置信息进行简单的XOR加密保护。更致命的是加密密钥是固定的。3.x版的CobaltStrike默认值为0x69,4.x版的CobaltStrike默认值为0x2e。用户不能通过C2配置文件等修改加密方法或密钥。

匹配的固定开始特征

结构相对固定的明文配置的特征,经过异或后仍然具有清晰的特征,可以通过简单的特征匹配捕获。

自己动手-神奇地更改信标配置密钥

信标配置的默认密钥可以通过手动补丁来修改。虽然复杂,但是只要同时修改服务器和Beacon二进制模板中的XOR密钥,就可以躲过使用默认XOR密钥的特征扫描的工具。

默认情况下,Beacon Config使用固定密钥加密的弱加密方法,为检测工具提取Beacon配置提供了机会,攻击者仍然可以通过魔法改变二进制的方式修改密钥。但只要加密方式不变,通过爆破异或提取加密配置依然不难。

总结

BeaconEye的侦查思路击中了钴击的要害。除非彻底改变数据结构,否则是没有办法一劳永逸绕过的。未来还会有更多像BeaconEye这样以C2框架中的固定数据结构为检测对象的工具出现,各种隐藏技术也会随之出现,这种拉锯战还会继续。

CS内存检测和对抗技术的发展,展现了双方在游戏中共同成长的路径。从记忆特征到信标配置,随着理解的深入,攻防位置越来越接近底部;从C2profile官方定制到动手变魔术,社区研究以实战为驱动,补充官方没有提供的对抗能力。

温馨提示:内容均由网友自行发布提供,仅用于学习交流,如有版权问题,请联系我们。