-
Notifications
You must be signed in to change notification settings - Fork 22
/
ssh.go
95 lines (90 loc) · 2.51 KB
/
ssh.go
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
package Plugins
import (
"errors"
"fmt"
"fs/config"
"golang.org/x/crypto/ssh"
"io/ioutil"
"strings"
"time"
)
func sshBruteforce(info *config.HostInfo) (tmperr error) {
if config.NoBrute {
return
}
starTime := time.Now().Unix()
for _, user := range config.Userdict["ssh"] {
for _, passwd := range config.Passwords {
passwd = strings.Replace(passwd, "{user}", user, -1)
flag, err := attemptSSH(info, user, passwd)
if flag == true && err == nil {
return err
} else {
errlog := fmt.Sprintf("[-] ssh %v:%v %v %v %v", info.Host, info.Ports, user, passwd, err)
config.LogError(errlog)
tmperr = err
if config.CheckErrs(err) {
return err
}
if time.Now().Unix()-starTime > (int64(len(config.Userdict["ssh"])*len(config.Passwords)) * config.Timeout) {
return err
}
}
if config.SshKey != "" {
return err
}
}
}
return tmperr
}
func attemptSSH(info *config.HostInfo, user string, pass string) (flag bool, err error) {
flag = false
Host, Port, Username, Password := info.Host, info.Ports, user, pass
var Auth []ssh.AuthMethod
if config.SshKey != "" {
pemBytes, err := ioutil.ReadFile(config.SshKey)
if err != nil {
return false, errors.New("read key failed" + err.Error())
}
signer, err := ssh.ParsePrivateKey(pemBytes)
if err != nil {
return false, errors.New("parse key failed" + err.Error())
}
Auth = []ssh.AuthMethod{ssh.PublicKeys(signer)}
} else {
Auth = []ssh.AuthMethod{ssh.Password(Password)}
}
sshConfig := &ssh.ClientConfig{
User: Username,
Auth: Auth,
Timeout: 2 * time.Second,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
conn, err := ssh.Dial("tcp", fmt.Sprintf("%v:%v", Host, Port), sshConfig)
if err != nil {
//fmt.Printf("Connection failed! %v (Password: %s)\n", err, Password)
return
}
defer conn.Close()
session, err := conn.NewSession()
if err == nil {
defer session.Close()
flag = true
var result string
if config.Command != "" {
combo, _ := session.CombinedOutput(config.Command)
result = fmt.Sprintf("[+] SSH %v:%v:%v %v \n %v", Host, Port, Username, Password, string(combo))
if config.SshKey != "" {
result = fmt.Sprintf("[+] SSH %v:%v sshkey correct \n %v", Host, Port, string(combo))
}
config.LogSuccess(result)
} else {
result = fmt.Sprintf("[+] SSH %v:%v %v %v", Host, Port, Username, Password)
if config.SshKey != "" {
result = fmt.Sprintf("[+] SSH %v:%v sshkey correct", Host, Port)
}
config.LogSuccess(result)
}
}
return flag, err
}