1. 背景介绍
现在很多内网环境中都安了各种各样的杀软,在做内网渗透时难免会四处碰壁。想到Go是一门较新的语言,免杀效果应该比较好,再加上现在网上主流的免杀都是c、c++、python一类的,涉及go的免杀较少,所以就想来做一个Go语言的免杀。
2. 基本原理
在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。可在寄存器eip溢出后,放入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
我们在做免杀时需要想办法将shellcode成功加载进电脑内存中并执行而绕过杀软的检测。
3. 实验环境
Golang go1.16.6 windows/amd64
vscode 1.49
SublimeText
windows10
metasploit v6.0.53-dev-
shellcode加载
先上代码:
具体的代码原理都在代码注释中注明。
这里的shellcode是使用msf生成的:
再用SublimeText,ctrl+h替换掉引号,把\x改成0x即可。
msf上线操作如下:
成功上线
隐藏黑框可以在编译时使用命令:
免杀效果
火绒:
金山毒霸:
迈克菲:
windowsdefender
360
查杀率较高,这里尝试一下分离免杀,将shellcode写入到文件中和加载器分离开,在加载器启动执行时再将shellcode从文件当中读取进来。
为了存储和读取时格式统一,这里将所有的shellcode统一以字符串的形式存储在1.txt中(即去除掉所有0x和,和空格回车),同样可以使用SublimeText,ctrl+h来进行替换,此处不再赘述。
在程序从1.txt中读取shellcode后,可以使用hex.DecodeString来将字符串转换为字节数组的形式存储。
test1.go
1.txt
修改之后的vt查杀率:
微步沙箱:
还是有些高。
改进
- 在程序执行过程休眠几次
- 把shellcode六次base64之后存入目录下的1.ico文件中,使用时读取、解码即可。
- 在shellcode载入内存前会压入一段其他字符串达到混淆的效果。
- 载入真正的shellcode时分段载入。
- 为了防止杀软上传云端执行使用,可以添加参数来唤醒,这里是 -b udp
具体代码如下:
1.ico
可以成功上线
如果想隐藏黑窗口的话可以调用win32的windowsapi,但是免杀效果不太好,所以这里去除黑框可以编写bat实现。使用bat调用exe的同时隐藏dos黑框:
1.bat
成功上线
vt上传看看:
已经基本达到了预期免杀效果,国内的安全管家、360、火绒等均可以完美绕过。