Artifact是CS用来做免杀的Kit,可以让生成的PE文件自带免杀特效,相比生成shellcode由外部loader加载更方便。本质上可以理解为将自定义的外部loader集成进CS的接口。

  • ArtifactKit并未开源,而且博客之前就被盯上封掉过。。。仅仅记录一下大致流程,具体实现可见参考链接,按照思路自行组装

修改模板

dist-template为例,将patch.c中用于填充定位的1024个A替换为其它字符串,同时替换artifact.cnaindexOf的相应字符串。

ArtifactKit原本采用4个随机数充当异或密钥,可以考虑实现高级加密算法,也可以只是方便的扩充$key数组的位数。相应地修改artifact.cnawriteb函数,以及patch.c中的异或取余位数、patch.h中结构体的key数组下标。

如果用mingw交叉编译,只需要去build.sh文件底部加上相应路径(注释掉官方本身自带的几个加快编译速度)。如果用VS编译,stage要在patch.h中加上#define DATA_SIZE 1024#define DATA_SIZE 271360(big),patch.cset_key_pointers函数的形式参数改为char * buffer

集成Syscall

在定义功能函数的patch.c中引入SysWhispers2SysWhispers2_x86作为64位与32位Syscall函数实现,并将VirtualAllocVirtualProtectCreateThread分别改写为NtAllocateVirtualMemoryNtProtectVirtualMemoryNtCreateThreadEx

  • VS编译时,64位项目patch.cspawn函数的形式参数改为__int64 length

这样就已经可以过掉不少常见杀软了:

集成Detours

与WBG大佬介绍的思路一样,hook相关系统函数,去除sleep期间beacon内存的EXECUTE权限,利用VEH处理sleep后执行时的Access Violation错误,只在执行期间短暂恢复权限。

可以进一步完善profile支持的HeapAllocMapViewOfFile内存申请方式、将被hook函数改为Syscall、适配stage类型调用。这个过程坑相当多,等有生之年完全吃透了再详细记录。(感谢NoOne大哥的全程指导)

最终绕过卡巴斯基终端安全:

参考链接

Implementing Syscalls In The Cobaltstrike Artifact Kit

记一次cs bypass卡巴斯基内存查杀

cs bypass卡巴斯基内存查杀 2