This repository was archived by the owner on Sep 10, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathssh_probe.go
More file actions
124 lines (105 loc) · 2.4 KB
/
Copy pathssh_probe.go
File metadata and controls
124 lines (105 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// SSH Tester
//
// The SSH tester connects to a remote host and ensures that a response
// is received that looks like an SSH-server banner.
//
// This test is invoked via input like so:
//
// host.example.com must run ssh [with port 22]
//
package protocols
import (
"bufio"
"errors"
"fmt"
"net"
"strconv"
"strings"
"github.com/skx/overseer/test"
)
// SSHTest is our object.
type SSHTest struct {
}
// Arguments returns the names of arguments which this protocol-test
// understands, along with corresponding regular-expressions to validate
// their values.
func (s *SSHTest) Arguments() map[string]string {
known := map[string]string{
"port": "^[0-9]+$",
}
return known
}
// Example returns sample usage-instructions for self-documentation purposes.
func (s *SSHTest) Example() string {
str := `
SSH Tester
----------
The ssh tester connects to a remote host and ensures that a response
is received that looks like an ssh-server banner.
This test is invoked via input like so:
host.example.com must run ssh
`
return str
}
// RunTest is the part of our API which is invoked to actually execute a
// test against the given target.
//
// In this case we make a TCP connection, defaulting to port 22, and
// look for a response which appears to be an SSH-server.
func (s *SSHTest) RunTest(tst test.Test, target string, opts test.Options) error {
var err error
//
// The default port to connect to.
//
port := 22
//
// If the user specified a different port update to use it.
//
if tst.Arguments["port"] != "" {
port, err = strconv.Atoi(tst.Arguments["port"])
if err != nil {
return err
}
}
//
// Set an explicit timeout
//
d := net.Dialer{Timeout: opts.Timeout}
//
// Default to connecting to an IPv4-address
//
address := fmt.Sprintf("%s:%d", target, port)
//
// If we find a ":" we know it is an IPv6 address though
//
if strings.Contains(target, ":") {
address = fmt.Sprintf("[%s]:%d", target, port)
}
//
// Make the TCP connection.
//
conn, err := d.Dial("tcp", address)
if err != nil {
return err
}
//
// Read the banner.
//
banner, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
return err
}
conn.Close()
if !strings.Contains(banner, "SSH-") {
return errors.New("banner doesn't look like an SSH server")
}
return nil
}
//
// Register our protocol-tester.
//
func init() {
Register("ssh", func() ProtocolTest {
return &SSHTest{}
})
}