前言
近日,360的团队将cobaltstrike stage uri的特征公开了,这着实令我有些感叹,做了我们想做但不敢做的事情。关于对抗方面,我目前看到的都是从stage uri着手,今天将从另一个角度给大家分享一下如何bypass beacon config scan。
beacon检测原理
stager uri的验证规则如下:
只要传入的uri经过checksum8计算,符合条件的话,就下载对应的stage。
而且这一点,在官方文档里其实早有提示:
而这个stage是经过了一系列异或加密的:
想要分析config需要对其进行解密,这里参考一个老外的脚本:
https://sysopfb.github.io/malware,/cobaltstrike/2020/03/24/beacon-in-azure.html
import sys,struct
解密后的程序使用另一个老外的脚本可以解析出马子的配置文件:
https://github.com/Sentinel-One/CobaltStrikeParser
在代码里我们可以发现,cs 3.x版本的配置信息是通过异或0x69解密出的,4.x版本的配置信息是通过异或0x2e解密出的。
winhex手动异或一下:
至此,可以发现,从3.x到4.x,cs自解密的算法没变,自解密后再解密配置文件的算法就只是改了个密钥,而且是固定的(3.x 0x69,4.x 0x2e)。
燥起来
目前,大家用的cs应该都是4.x了吧,所以配置文件的异或密钥为0x2e,如果我们修改了这个密钥,脚本就不能直接获取到配置信息了。
这里以cs4.1为例,给大家讲解一下,如何修改这个密钥。
首先在/beacon/BeaconPayload.class里,我们可以看到对应的异或算法,将反编译出的代码copy出来,拷贝到BeaconPayload.java,修改0x2E为0x3E
编译:javac -encoding UTF-8 -classpath cobaltstrike.jar BeaconPayload.java
报错:
在161行str1前面加个String:
重新编译就好了:
当然,光改这么一个java文件是不行的,接下来的,才是本文的重点。
我们知道,cs在生成shellcode的时候,是要依赖一些模板dll的,而要想实现效果,我们就需要对dll进行反编译并修改,但这些dll是经过加密了的,所以我们还得解密一下。
关于解密,我们可以参考一个脚本:
https://github.com/ca3tie1/CrackSleeve/blob/master/CrackSleeve.java
这里我们改点代码,加密的时候用cs里的密钥就好了:
而密钥在破解版cs4.1在/common/Authorization.class中直接给出了,所以可以直接拿来用:
然后编译:javac -encoding UTF-8 -classpath cobaltstrike.jar CrackSleeve.java
接着decode dll:java -classpath cobaltstrike.jar;./ CrackSleeve decode
发现报错,不要紧,脚本是提取的cs4.0的代码,所以4.1报错也是很正常的。
对比一下代码,发现4.0处理资源的时候,Setup方法中是paramArrayOfByte(认证相关的知识请看文章《Cobaltstrike 4破解之 我自己给我自己颁发license》https://mp.weixin.qq.com/s/Pneu8R0zoG0ONyFXF9VLpg)
而4.1中是CommonUtils.readResource("resources/cobaltstrike.auth")
于是稍微改下脚本:
重新编译后解密文件:
不是我说,兄弟,有了ida,还要什么女朋友???
用ida打开beacon.dll:
搜索0x2E,找到xor的地方:
然后修改字节:
把2E改成3E:
最后别忘了应用:
除了beacon.dll,还有以下dll(代码看得不仔细,如有漏掉,请务必告知~):
beacon.x64.dll
dnsb.dll
dnsb.x64.dll
pivot.dll
pivot.x64.dll
extc2.dll
extc2.x64.dll
由于修改方式都一样,这里就不一一演示了 TaT
dll修改完成,我们还需要加密回去:
java -classpath cobaltstrike.jar;./ CrackSleeve encode
java文件和dll都改好了,现在将修改后的文件放进cs里,其中dll放进/sleeve里:
BeaconPayload.class放进/beacon目录里:
启动cs,确定常用的http和https监听器都能用:
然后使用grab_beacon_config来检测,在web log里,可以看到,脚本请求了stage的uri,但是没有分析出beacon的配置文件:
此刻,我们通过修改cs代码和dll的方式,bypass了beacon config的检测。
改完的文件我传到GitHub了,有兴趣的小伙伴可以自行下载(如有顾虑,可以自己修改):
https://github.com/qigpig/bypass-beacon-config-scan/
以上如有未修改到的地方,请及时与我反馈,共同进步!
最后,关注公众号,后期我们会分享更多有意思的内容,包括cobaltstrike其他方面的一些修改。
最后的最后,不是我说,兄弟,若有女朋友,还要什么ida???
参考链接
[1] https://www.anquanke.com/post/id/157782
[2] https://sysopfb.github.io/malware,/cobaltstrike/2020/03/24/beacon-in-azure.html
[3] https://github.com/Sentinel-One/CobaltStrikeParser
[4] https://mp.weixin.qq.com/s/Pneu8R0zoG0ONyFXF9VLpg
[5] https://github.com/ca3tie1/CrackSleeve/blob/master/CrackSleeve.java