Projects STRLCPY reverse_ssh Commits 07dc74ba
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■
    internal/server/commands/init.go
    skipped 1 lines
    2 2   
    3 3  import (
    4 4   "github.com/NHAS/reverse_ssh/internal"
    5  - "github.com/NHAS/reverse_ssh/internal/server/multiplexer"
    6 5   "github.com/NHAS/reverse_ssh/internal/terminal"
    7 6   "github.com/NHAS/reverse_ssh/pkg/logger"
    8 7  )
    9 8   
    10  -//This is used for help, so we can generate the nice table
     9 +// This is used for help, so we can generate the nice table
    11 10  // I would prefer if we could do some sort of autoregistration process for these
    12 11  var allCommands = map[string]terminal.Command{
    13 12   "ls": &list{},
    skipped 22 lines
    36 35   "exec": &exec{},
    37 36   "who": &who{},
    38 37   "watch": &watch{},
    39  - "listen": Listen(multiplexer.ServerMultiplexer, log),
     38 + "listen": Listen(log),
    40 39   "webhook": &webhook{},
    41 40   "version": &version{},
    42 41   }
    skipped 4 lines
  • ■ ■ ■ ■ ■
    internal/server/commands/listen.go
    skipped 3 lines
    4 4   "errors"
    5 5   "fmt"
    6 6   "io"
     7 + "net"
     8 + "strconv"
    7 9   
     10 + "github.com/NHAS/reverse_ssh/internal"
     11 + "github.com/NHAS/reverse_ssh/internal/server/clients"
     12 + "github.com/NHAS/reverse_ssh/internal/server/multiplexer"
    8 13   "github.com/NHAS/reverse_ssh/internal/terminal"
    9 14   "github.com/NHAS/reverse_ssh/pkg/logger"
    10  - "github.com/NHAS/reverse_ssh/pkg/mux"
     15 + "golang.org/x/crypto/ssh"
    11 16  )
    12 17   
    13 18  type listen struct {
    14  - m *mux.Multiplexer
    15 19   log logger.Logger
    16 20  }
    17 21   
    18  -func client() {
    19  - 
    20  -}
    21  - 
    22  -func server() {
    23  - 
    24  -}
    25  - 
    26  -func (w *listen) Run(tty io.ReadWriter, line terminal.ParsedLine) error {
    27  - if line.IsSet("h") || len(line.Flags) < 1 {
    28  - fmt.Fprintf(tty, "%s", w.Help(false))
    29  - return nil
    30  - }
    31  - 
     22 +func server(tty io.ReadWriter, line terminal.ParsedLine) error {
    32 23   if line.IsSet("l") {
    33  - listeners := w.m.GetListeners()
     24 + listeners := multiplexer.ServerMultiplexer.GetListeners()
    34 25   
    35 26   if len(listeners) == 0 {
    36 27   fmt.Fprintln(tty, "No active listeners")
    skipped 9 lines
    46 37   on := line.IsSet("on")
    47 38   off := line.IsSet("off")
    48 39   
    49  - if on && off {
    50  - return errors.New("Cannot specify on and off at the same time")
     40 + if on {
     41 + addrs, err := line.GetArgsString("on")
     42 + if err != nil {
     43 + return err
     44 + }
     45 + 
     46 + for _, addr := range addrs {
     47 + err := multiplexer.ServerMultiplexer.StartListener("tcp", addr)
     48 + if err != nil {
     49 + return err
     50 + }
     51 + fmt.Fprintln(tty, "started listening on: ", addr)
     52 + }
    51 53   }
    52 54   
     55 + if off {
     56 + addrs, err := line.GetArgsString("off")
     57 + if err != nil {
     58 + return err
     59 + }
     60 + 
     61 + for _, addr := range addrs {
     62 + err := multiplexer.ServerMultiplexer.StopListener(addr)
     63 + if err != nil {
     64 + return err
     65 + }
     66 + fmt.Fprintln(tty, "stopped listening on: ", addr)
     67 + }
     68 + }
     69 + 
     70 + return nil
     71 +}
     72 + 
     73 +func client(tty io.ReadWriter, line terminal.ParsedLine) error {
     74 + 
     75 + specifier, err := line.GetArgString("c")
     76 + if err != nil {
     77 + specifier, err = line.GetArgString("client")
     78 + if err != nil {
     79 + return err
     80 + }
     81 + }
     82 + 
     83 + foundClients, err := clients.Search(specifier)
     84 + if err != nil {
     85 + return err
     86 + }
     87 + 
     88 + if len(foundClients) == 0 {
     89 + return fmt.Errorf("No clients matched '%s'", client)
     90 + }
     91 + 
     92 + on := line.IsSet("on")
     93 + off := line.IsSet("off")
     94 + 
    53 95   if on {
     96 + var fwRequests []internal.RemoteForwardRequest
     97 + 
    54 98   addrs, err := line.GetArgsString("on")
    55 99   if err != nil {
    56 100   return err
    57 101   }
    58 102   
    59 103   for _, addr := range addrs {
    60  - err := w.m.StartListener("tcp", addr)
     104 + ip, port, err := net.SplitHostPort(addr)
     105 + if err != nil {
     106 + return err
     107 + }
     108 + 
     109 + p, err := strconv.Atoi(port)
    61 110   if err != nil {
    62 111   return err
    63 112   }
    64  - fmt.Fprintln(tty, "started listening on: ", addr)
     113 + 
     114 + fwRequests = append(fwRequests, internal.RemoteForwardRequest{
     115 + BindPort: uint32(p),
     116 + BindAddr: ip,
     117 + })
     118 + 
     119 + }
     120 + 
     121 + for _, r := range fwRequests {
     122 + b := ssh.Marshal(&r)
     123 + for c, sc := range foundClients {
     124 + result, message, err := sc.SendRequest("tcpip-forward", true, b)
     125 + if !result {
     126 + fmt.Fprintln(tty, "failed to start port on: ", c, ": ", message)
     127 + continue
     128 + }
     129 + 
     130 + if err != nil {
     131 + fmt.Fprintln(tty, "error starting port on: ", c, ": ", err)
     132 + }
     133 + }
    65 134   }
    66 135   
    67  - return nil
    68 136   }
    69 137   
    70 138   if off {
     139 + var cancelFwRequests []internal.RemoteForwardRequest
     140 + 
    71 141   addrs, err := line.GetArgsString("off")
    72 142   if err != nil {
    73 143   return err
    74 144   }
    75 145   
    76 146   for _, addr := range addrs {
    77  - err := w.m.StopListener(addr)
     147 + ip, port, err := net.SplitHostPort(addr)
    78 148   if err != nil {
    79 149   return err
    80 150   }
    81  - fmt.Fprintln(tty, "stopped listening on: ", addr)
     151 + 
     152 + p, err := strconv.Atoi(port)
     153 + if err != nil {
     154 + return err
     155 + }
     156 + 
     157 + cancelFwRequests = append(cancelFwRequests, internal.RemoteForwardRequest{
     158 + BindPort: uint32(p),
     159 + BindAddr: ip,
     160 + })
     161 + 
    82 162   }
    83 163   
    84  - return nil
     164 + for _, r := range cancelFwRequests {
     165 + b := ssh.Marshal(&r)
     166 + for c, sc := range foundClients {
     167 + result, message, err := sc.SendRequest("cancel-tcpip-forward", true, b)
     168 + if !result {
     169 + fmt.Fprintln(tty, "failed to stop port on: ", c, ": ", message)
     170 + continue
     171 + }
     172 + 
     173 + if err != nil {
     174 + fmt.Fprintln(tty, "error stop port on: ", c, ": ", err)
     175 + }
     176 + }
     177 + }
    85 178   }
    86 179   
    87 180   return nil
    88 181  }
    89 182   
     183 +func (w *listen) Run(tty io.ReadWriter, line terminal.ParsedLine) error {
     184 + if line.IsSet("h") || len(line.Flags) < 1 {
     185 + fmt.Fprintf(tty, "%s", w.Help(false))
     186 + return nil
     187 + }
     188 + 
     189 + if line.IsSet("server") || line.IsSet("s") {
     190 + return server(tty, line)
     191 + } else if line.IsSet("client") || line.IsSet("c") {
     192 + return client(tty, line)
     193 + }
     194 + 
     195 + return errors.New("neither server or client were specified, please choose one")
     196 +}
     197 + 
    90 198  func (W *listen) Expect(line terminal.ParsedLine) []string {
    91 199   return nil
    92 200  }
    skipped 5 lines
    98 206   
    99 207   return terminal.MakeHelpText(
    100 208   "listen [OPTION] [PORT]",
    101  - "listen starts or stops listening ports",
     209 + "listen starts or stops listening control ports",
    102 210   "\t--client (-c)\tSpecify client/s to act on, e.g -c *, --client your.hostname.here",
    103 211   "\t--server (-s)\tSpecify to change the server listeners",
    104 212   "\t--on\tTurn on port, e.g --on :8080 127.0.0.1:4444",
    skipped 2 lines
    107 215   )
    108 216  }
    109 217   
    110  -func Listen(multiplexer *mux.Multiplexer, log logger.Logger) *listen {
     218 +func Listen(log logger.Logger) *listen {
    111 219   return &listen{
    112  - m: multiplexer,
    113 220   log: log,
    114 221   }
    115 222  }
    skipped 1 lines
Please wait...
Page is in error, reload to recover