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查杀率:

微步沙箱:

还是有些高。

改进

  1. 在程序执行过程休眠几次
  2. 把shellcode六次base64之后存入目录下的1.ico文件中,使用时读取、解码即可。
  3. 在shellcode载入内存前会压入一段其他字符串达到混淆的效果。
  4. 载入真正的shellcode时分段载入。
  5. 为了防止杀软上传云端执行使用,可以添加参数来唤醒,这里是 -b udp

具体代码如下:

1.ico

可以成功上线

如果想隐藏黑窗口的话可以调用win32的windowsapi,但是免杀效果不太好,所以这里去除黑框可以编写bat实现。使用bat调用exe的同时隐藏dos黑框:

1.bat

成功上线

vt上传看看:

已经基本达到了预期免杀效果,国内的安全管家、360、火绒等均可以完美绕过。