-
UID:17777
-
- 注册时间2007-05-02
- 最后登录2025-05-02
- 在线时间18634小时
-
- 发帖786294
- 搜Ta的帖子
- 精华0
- 飞翔币209891
- 威望215717
- 飞扬币2613068
- 信誉值8
-
访问TA的空间加好友用道具
- 发帖
- 786294
- 飞翔币
- 209891
- 威望
- 215717
- 飞扬币
- 2613068
- 信誉值
- 8
|
[font=-apple-system, BlinkMacSystemFont, "]一、概述最近快开展护网行动,陆续有老哥问是否有免杀的马子。遂本篇文章简要介绍CobaltStrike的免杀方式。若有什么错误之处,请大伙指出,谢谢。下面主要分三部分来展开。[font=-apple-system, BlinkMacSystemFont, "]环境配置如下:[font=-apple-system, BlinkMacSystemFont, "]受害端:192.168.202.143、192.168.202.1[font=-apple-system, BlinkMacSystemFont, "]控制端:192.168.202.1[font=-apple-system, BlinkMacSystemFont, "]Teamserver: 192.168.202.1[font=-apple-system, BlinkMacSystemFont, "] 二、Stager执行返回Beacon时的网络特征及规避网络测绘当CobaltStrike的stager在受害端运行时,会请求TeamServer端拉取Beacon进行在内存中反射注入运行,有关stager端的详细分析可以看之前我所写的文章,https://www.52pojie.cn/thread-1334525-1-1.html 。先运行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()发送数据:[font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "]在该方法中每次发送2048个字节数据:[font=-apple-system, BlinkMacSystemFont, "] 直接使用浏览器访问该URI,能返回相应的Beacon: [font=-apple-system, BlinkMacSystemFont, "]所以目前有网络测绘技术对这种特征根据相应的算法拼接URI在公网上进行扫描,所以我们需要对其修改,需要修改的点主要有两个:[font=-apple-system, BlinkMacSystemFont, "]1、当控制端Aggressor生成stage时,调用MSFURI()生成请求URI这个函数后,再把生成的URI写入stage;[font=-apple-system, BlinkMacSystemFont, "]2、WebServer中的响应请求头的函数,当调用isStager()时会验证传入的URI,所以可以修改isStage()该函数来个改变对URI的校验;[font=-apple-system, BlinkMacSystemFont, "]修改的方法有很多是比较灵活的,可以直接写定某个URI,也可以换一种生成的规则,只要能避免网络测绘就可以了[font=-apple-system, BlinkMacSystemFont, "]。三、千人千面的ShellcodeCobaltStrike所生成的shellcode其实是一个使用wininet库及其对应函数的加载器,其作用就是用来下载对应的stage,并在内存中反射注入。所以我们完全可以把对应shellcode转为c代码,然后进行一系列混淆等操作来实现免杀,这里混淆或加密就比较多发挥的空间了。我直接把C代码所生成的shellcode写入,都没有任何加任何垃圾代码或者混淆和加密编码等操作就已经免杀了:  执行上线: 代码功能就是一个连接Teamserver端并下载stage,并跳转执行,这里截取部分代码: 另外我再用另一个库winhttp实现了该功能: 均能正常上线的,这两份转shellcode为C的代码然后通过shellcode框架再把c代码转换为shellcode,其间我们能在c代码中能加入垃圾代码等混淆操作,这样生成的shellcode更具迷惑性,可以说是千人千面,这样能一劳永逸的解决shellcode被杀的问题,上传到之前CS源码的地址,混淆可以自行加上去:https://github.com/mai1zhi2/CobaltstrikeSource四、Beacon的内存查杀特征[font=-apple-system, BlinkMacSystemFont, "]虽然上述的stager已能免杀绝大部分的杀软,但是卡巴对内存反射注入加载的beacon查杀比较厉害,DOS头的花指令对卡巴作用不大:这里DOS头的前面是一串不定长的花指令,这串花指令应该是用来干扰360/火绒内存查杀的,我们也可以nop掉,:[font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "]花指令的后面就是异或解密dll的操作了,具体异或解密算法可以看我之前发的CS分析的帖子: 这里有妹纸分享无阶段生成的beacon.exe特征的帖子,https://xz.aliyun.com/t/9224?page=1,里面总结了beacon端被查杀的几个特征:[size=10.5000pt]1、 读取了默认的[font=-apple-system, BlinkMacSystemFont, "]default. profile内容,可以看看之前我发的帖子后门生成[font=-apple-system, BlinkMacSystemFont, "]beacon部分里有提及,所以不要使用默认的default. profile,需要加载自己[font=-apple-system, BlinkMacSystemFont, "]profile。[size=10.5000pt]2、 导出反射注入的函数名字,默认生成是[font=-apple-system, BlinkMacSystemFont, "]ReflectiveLoader,这个也是需要在[font=-apple-system, BlinkMacSystemFont, "]profile替换的。[size=10.5000pt][font=-apple-system, BlinkMacSystemFont, "][size=10.5000pt]3、 就是查杀[font=-apple-system, BlinkMacSystemFont, "]IAT表,可以在profile配置 set obfuscate "true" 但有点比较遗憾的是,我复现该方法时,卡巴和火绒的静态和实时监控都过不了,可能是我操作步骤问题抑或是加了其他壳,同样我在[font=-apple-system, BlinkMacSystemFont, "]CS4.1解密出的dll也是报毒的:[font=-apple-system, BlinkMacSystemFont, "] [font=-apple-system, BlinkMacSystemFont, "] 但360是能过掉的:
|