From 90e2e053d25feabd2dcf384dfc262a8bcdbe3ab8 Mon Sep 17 00:00:00 2001 From: Cody Hiar Date: Sat, 5 Mar 2022 12:53:15 -0700 Subject: Initial Commit --- termshare/internal/client.go_ | 86 +++++++++++++++++++++++++++++++++++++ termshare/internal/daemon/daemon.go | 56 ++++++++++++++++++++++++ termshare/internal/forwarder.go_ | 37 ++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 termshare/internal/client.go_ create mode 100644 termshare/internal/daemon/daemon.go create mode 100644 termshare/internal/forwarder.go_ (limited to 'termshare/internal') diff --git a/termshare/internal/client.go_ b/termshare/internal/client.go_ new file mode 100644 index 0000000..1845a15 --- /dev/null +++ b/termshare/internal/client.go_ @@ -0,0 +1,86 @@ +package main + +import ( + "fmt" + "golang.org/x/crypto/ssh" + "log" + "os" + // Uncomment to store output in variable + //"bytes" +) + +func main() { + + username := "root" + password := "" + hostname := "127.0.0.1" + port := "2222" + + // SSH client config + config := &ssh.ClientConfig{ + User: username, + Auth: []ssh.AuthMethod{ + ssh.Password(password), + }, + // Non-production only + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + } + + // Connect to host + client, err := ssh.Dial("tcp", hostname+":"+port, config) + if err != nil { + log.Fatal(err) + } + defer client.Close() + + // Create sesssion + sess, err := client.NewSession() + if err != nil { + log.Fatal("Failed to create session: ", err) + } + defer sess.Close() + + // StdinPipe for commands + stdin, err := sess.StdinPipe() + if err != nil { + log.Fatal(err) + } + + // Uncomment to store output in variable + //var b bytes.Buffer + //sess.Stdout = &b + //sess.Stderr = &b + + // Enable system stdout + // Comment these if you uncomment to store in variable + sess.Stdout = os.Stdout + sess.Stderr = os.Stderr + + // Start remote shell + err = sess.Shell() + if err != nil { + log.Fatal(err) + } + + // send the commands + commands := []string{ + "whoami", + "exit", + } + for _, cmd := range commands { + _, err = fmt.Fprintf(stdin, "%s\n", cmd) + if err != nil { + log.Fatal(err) + } + } + + // Wait for sess to finish + err = sess.Wait() + if err != nil { + log.Fatal(err) + } + + // Uncomment to store in variable + //fmt.Println(b.String()) + +} diff --git a/termshare/internal/daemon/daemon.go b/termshare/internal/daemon/daemon.go new file mode 100644 index 0000000..465cdff --- /dev/null +++ b/termshare/internal/daemon/daemon.go @@ -0,0 +1,56 @@ +package daemon + +import ( + "fmt" + "bufio" + "io" + "log" + "os" + "os/exec" + "syscall" + "strconv" + "unsafe" + + "github.com/gliderlabs/ssh" + "github.com/creack/pty" +) + +func setWinsize(f *os.File, w, h int) { + syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), uintptr(syscall.TIOCSWINSZ), + uintptr(unsafe.Pointer(&struct{ h, w, x, y uint16 }{uint16(h), uint16(w), 0, 0}))) +} + +func RunDaemon(port string) { + ssh.Handle(func(s ssh.Session) { + cmd := exec.Command("bash") + ptyReq, winCh, isPty := s.Pty() + if isPty { + cmd.Env = append(cmd.Env, fmt.Sprintf("TERM=%s", ptyReq.Term)) + f, err := pty.Start(cmd) + if err != nil { + panic(err) + } + go func() { + for win := range winCh { + setWinsize(f, win.Width, win.Height) + } + }() + go func() { + io.Copy(f, s) // stdin + }() + io.Copy(s, f) // stdout + cmd.Wait() + } else { + io.WriteString(s, "No PTY requested.\n") + reader := bufio.NewReader(s) + for { + input, _, _ := reader.ReadRune() + io.WriteString(os.Stdout, strconv.QuoteRune(input)) + } + s.Exit(1) + } + }) + + log.Println("starting ssh server on port " + port + " ...") + log.Fatal(ssh.ListenAndServe(":" + port, nil)) +} diff --git a/termshare/internal/forwarder.go_ b/termshare/internal/forwarder.go_ new file mode 100644 index 0000000..2ce866f --- /dev/null +++ b/termshare/internal/forwarder.go_ @@ -0,0 +1,37 @@ +package main + +import ( + "io" + "log" + + "github.com/gliderlabs/ssh" +) + +func main() { + + log.Println("starting ssh server on port 2222...") + + forwardHandler := &ssh.ForwardedTCPHandler{} + + server := ssh.Server{ + LocalPortForwardingCallback: ssh.LocalPortForwardingCallback(func(ctx ssh.Context, dhost string, dport uint32) bool { + log.Println("Accepted forward", dhost, dport) + return true + }), + Addr: ":2222", + Handler: ssh.Handler(func(s ssh.Session) { + io.WriteString(s, "Remote forwarding available...\n") + select {} + }), + ReversePortForwardingCallback: ssh.ReversePortForwardingCallback(func(ctx ssh.Context, host string, port uint32) bool { + log.Println("attempt to bind", host, port, "granted") + return true + }), + RequestHandlers: map[string]ssh.RequestHandler{ + "tcpip-forward": forwardHandler.HandleSSHRequest, + "cancel-tcpip-forward": forwardHandler.HandleSSHRequest, + }, + } + + log.Fatal(server.ListenAndServe()) +} -- cgit v1.2.3