长亭百川云 - 文章详情

关于yara各种检测cobaltstrike

鱼凫游民随笔

58

2024-07-13

--

0x00 前言

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

这个我也不知道为什么,按理说我没有过多针对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

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

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个例子:

这个是默认的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进制:

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

strrep                 "\x4D\x5A\x41\x52\x55\x48\x89\xE5\x48\x81\xEC\x20\x00\x00\x00\x48\x8D\x1D\xEA\xFF\xFF\xFF\x48\x89\xDF\x48\x81\xC3\xA4\x6E\x01\x00\xFF\xD3\x41\xB8\xF0\xB5\xA2\x56\x68\x04\x00\x00\x00\x5A\x48\x89\xF9\xFF\xD0" "\x4D\x5A\x48\x8D\x1D\xF8\xFF\xFF\xFF\x41\x52\x48\x83\xEC\x28\x48\x89\xDF\x48\x81\xC3\x52\xB7\x00\x00\x48\x81\xC3\x52\xB7\x00\x00\xFF\xD3\x48\xC7\xC2\x04\x00\x00\x00\x48\x89\xF9\xFF\xD0";
 
strrep "\x48\x89\x5C\x24\x08\x48\x89\x6C\x24\x10\x48\x89\x74\x24\x18\x57\x48\x83\xEC\x20\x4C\x8B\x51\x08\x41\x8B\xF0\x48\x8B\xEA\x48\x8B\xD9\x45\x8B\x0A\x45\x8B\x5A\x04\x4D\x8D\x52\x08\x45\x85\xC9" "\x48\x89\x6C\x24\x10\x48\x89\x5C\x24\x08\x48\x89\x74\x24\x18\x57\x48\x83\xEC\x20\x4C\x8B\x51\x08\x48\x89\xD5\x44\x89\xC6\x48\x89\xCB\x45\x8B\x5A\x04\x45\x8B\x0A\x4D\x8D\x52\x08\x45\x85\xC9";

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

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

这仅仅是过了一些规则的检测,但是依旧有一半的引擎被检测出,很多商业规则,比较难以测试,因此作为一个红队选手,编写一些自己的独自使用的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的形式自定义。

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

  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,可以直接使用。

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2