首页
社区
课程
招聘
[原创]魔改CobaltStrike:免杀就像便秘一样
2021-3-19 21:14 16457

[原创]魔改CobaltStrike:免杀就像便秘一样

2021-3-19 21:14
16457

一、概述

最近快开展护网行动,陆续有老哥问是否有免杀的马子。遂本篇文章简要介绍CobaltStrike的免杀方式。若有什么错误之处,请大伙指出,谢谢。下面主要分三部分来展开。

 

环境配置如下:
受害端:192.168.202.143、192.168.202.1
控制端:192.168.202.1
Teamserver: 192.168.202.1

二、Stager执行返回Beacon时的网络特征及规避网络测绘

当CobaltStrike的stager在受害端运行时,会请求TeamServer端拉取Beacon进行在内存中反射注入运行,有关stager端的详细分析可以看之前我所写的文章,https://bbs.pediy.com/thread-264470.htm 。
先运行stage,打开wireshark抓包:


可见受害端访问teamserver http://192.168.202.1/7v9v,返回206k的数据包,结合之前上文的CS的stager分析文章可以得出响应得数据就是经过异或后的Beacon数据。

 

先来具体看看stager是如何生成相关URI的:调用MSFURI(),传入参数4:

跟入,可见传入的参数4表示所生成的URI为”/”再假上4个字符串组成的,最后传入checksum8()后并判断结果是否为92:

字符串由var1传入pick()方法来随机生成:

跟入checksum8()方法,该方法就是计算传入的URI字符(不包括/)的asc值的总和,再把和与256进行求余:

所以,URI的规则就是四个字符串的asc码之和,再把和值与256求余,若求余后的值等于92则生成该URI值。

 

现在来观察TeamServer是如何响应stage并返回Beacon的:
现跟入NanoHTTPD对应的线程中先接受请求头的数据:

再将请求头的数据、请求方式和URI传入_serve()方法,在该方法中先对useragent进行判断:

紧接着把URI传入checksum8()函数进行规则判断:

 

在isStager()中调用checksum8()函数对传入的URI进行判断,checksum8()上述已介绍过:

拼接相应的响应头和响应数据:

最后调用sendResponse()发送数据:

在该方法中每次发送2048个字节数据:

 

直接使用浏览器访问该URI,能返回相应的Beacon:

 

所以目前有网络测绘技术对这种特征根据相应的算法拼接URI在公网上进行扫描,所以我们需要对其修改,需要修改的点主要有两个:
1、当控制端Aggressor生成stage时,调用MSFURI()生成请求URI这个函数后,再把生成的URI写入stage;
2、WebServer中的响应请求头的函数,当调用isStager()时会验证传入的URI,所以可以修改isStage()该函数来个改变对URI的校验;
修改的方法有很多是比较灵活的,可以直接写定某个URI,也可以换一种生成的规则,只要能避免网络测绘就可以了。

三、千人千面的Shellcode

CobaltStrike所生成的shellcode其实是一个使用wininet库及其对应函数的加载器,其作用就是用来下载对应的stage,并在内存中反射注入。所以我们完全可以把对应shellcode转为c代码,然后进行一系列混淆等操作来实现免杀,这里混淆或加密就比较多发挥的空间了。
我直接把C代码所生成的shellcode写入,都没有任何加任何垃圾代码或者混淆和加密编码等操作就已经免杀了:


 

执行上线:

 

代码功能就是一个连接Teamserver端并下载stage,并跳转执行,这里截取部分代码:

 

另外我再用另一个库winhttp实现了该功能:


均能正常上线的,这两份转shellcode为C的代码,然后再把c代码转换为shellcode,其间我们能在c代码中能加入垃圾代码等混淆操作,这样生成的shellcode更具迷惑性,可以说是千人千面,这样能一劳永逸的解决shellcode被杀的问题,上传到之前CS源码的地址,混淆可以自行加上去:https://github.com/mai1zhi2/CobaltstrikeSource

四、Beacon的内存查杀特征

虽然上述的stager已能免杀绝大部分的杀软,但是卡巴对内存反射注入加载的beacon查杀比较厉害,DOS头的花指令对卡巴作用不大:
这里DOS头的前面是一串不定长的花指令,这串花指令应该是用来干扰360/火绒内存查杀的,我们也可以nop掉,:

花指令的后面就是异或解密dll的操作了,具体异或解密算法可以看我之前发的CS分析的帖子:

 

这里有妹纸分享无阶段生成的beacon.exe特征的帖子,https://xz.aliyun.com/t/9224?page=1,里面总结了beacon端被查杀的几个特征:
1、读取了默认的default. profile内容,可以看看之前我发的帖子后门生成beacon部分里有提及,所以不要使用默认的default. profile,需要加载自己profile。
2、导出反射注入的函数名字,默认生成是ReflectiveLoader,这个也是需要在profile替换的。
3、就是查杀IAT表,可以在profile配置 set obfuscate "true"

 

但有点比较遗憾的是,我复现该方法时,卡巴和火绒的静态和实时监控都过不了,可能是我操作步骤问题抑或是加了其他壳,同样我在CS4.1解密出的dll也是报毒的:


但360是能过掉的:

五、总结

如果能从规避网络测绘->shellcode混淆->beacon去特征(成功的话)这几步做下来,应该是能规避市面上一些杀软,其实在没有源码的情况下能做的动作还是比较有限和麻烦的,去特征码、加资源、伪造签名、搞IAT表、搞入口点等,小弟功力尚浅,希望老哥能发表高见,请老哥指导,谢谢大家观看。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-3-19 21:37 被快乐鸡哥编辑 ,原因:
收藏
点赞4
打赏
分享
最新回复 (7)
雪    币: 5486
活跃值: (2593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chinasmu 2021-3-19 21:33
2
0
厉害
雪    币: 6
活跃值: (980)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lookzo 2021-3-23 08:41
3
0
good job
雪    币: 437
活跃值: (524)
能力值: ( LV3,RANK:27 )
在线值:
发帖
回帖
粉丝
GhostValley 2021-3-23 09:34
4
1
然并卵、最初的loader、被干的概率很大。(eg: Win10 WD);这么多操作在规避静态查杀上有用,执行起来就是另外一回事了,但能当个小马跑个1次。持久化感觉不现实。CobaltStrike不就是换了个壳的msf么,所谓的免杀都是shellcode做了个静态免杀,或者换个loader、也是在规避静态;这种方式个人感觉已经不足够满足红队了,对拥有 行为查杀/云查杀,主动防御/EDR这种属性的,这个做法不知起了多大的作用。攻击持久性很弱,虽说改容易,可暴漏C2总不成。【也许自己说的不对,希望能有大佬批评指正,同时希望能有更多看法】
雪    币: 5274
活跃值: (1832)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wanttobeno 2021-3-24 09:54
5
0
感谢分享!
雪    币: 24
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
digshell233 2021-3-30 08:02
6
0
感谢分享!
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_smjnmjcb 2023-2-22 14:14
8
0
鸡哥,加花指令的是什么软件啊!!!!求解
游客
登录 | 注册 方可回帖
返回