前言

本人有10+台VPS,大多数仅仅是用来传输流量,并不经常登陆,但是一旦登陆就能看到提示上万条登陆失败记录,很烦。


为了更好的“利用”VPS资源,就搞了一下伪造SSH,抓取扫爆口令,获取属于自己的字典

简介&代码

使用github.com/gliderlabs/ssh简单造个轮子。

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
package main

import (
"flag"
"fmt"
"github.com/gliderlabs/ssh"
gossh "golang.org/x/crypto/ssh"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"time"
)

var (
port int
local string
)

func main() {
hostKeySigner, err := createOrLoadKeySigner()
if err != nil {
log.Fatal(err)
}
flag.StringVar(&local, "local", "0.0.0.0", "local listening port")
flag.IntVar(&port, "p", 22, "SSH Server Port")
flag.Parse()
s := &ssh.Server{
Addr: fmt.Sprintf("%v:%v", local, port),
Handler: SSHHandler,
PasswordHandler: passwordHandler,
}
s.AddHostKey(hostKeySigner)
log.Fatal(s.ListenAndServe())
}

func passwordHandler(ctx ssh.Context, password string) bool {
data := fmt.Sprintf("[%s]< %s:%s >from:%s\n", time.Now().Format("2006-01-02 15:04:05"), ctx.User(), password, ctx.RemoteAddr())
fmt.Print(data)
file, err := os.OpenFile("pw.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
if err != nil {
fmt.Println("文件打开失败", err)
}
defer file.Close()
file.Write([]byte(data))
return false
}
func SSHHandler(s ssh.Session) {
s.Write([]byte("log"))
s.Exit(1)

}

//创建key 来验证 host public
func createOrLoadKeySigner() (gossh.Signer, error) {
keyPath := filepath.Join(os.TempDir(), "fssh.rsa")
if _, err := os.Stat(keyPath); os.IsNotExist(err) {
os.MkdirAll(filepath.Dir(keyPath), os.ModePerm)
stderr, err := exec.Command("ssh-keygen", "-f", keyPath, "-t", "rsa", "-N", "").CombinedOutput()
output := string(stderr)
if err != nil {
return nil, fmt.Errorf("Fail to generate private key: %v - %s", err, output)
}
}
privateBytes, err := ioutil.ReadFile(keyPath)
if err != nil {
return nil, err
}
return gossh.ParsePrivateKey(privateBytes)
}

使用方法

更换sshd服务监听端口

1.修改配置文件

1
2
3
4
vim /etc/ssh/sshd_config
#修改Port 22 为 Port 222
或者
sed 's/Port 22/Port 222/' /etc/ssh/sshd_config

注意:此时222端口一定要添加到防火墙放行,否则可能失联。

2.重启sshd服务

1
systemctl restart sshd

3.断开连接,重新使用222端口 ssh 登陆vps

获取软件

上面代码编译 or github获取

启动软件

正常启动

sage of ./main:

-local string

​ local listening port (default “0.0.0.0”)

-p int

​ SSH Server Port (default 22)

chmod +x main && ./main就可以,获取到的密码保存到pw.txt

后台启动

1
2
3
4
5
chmod +x main

nohup ./main &
#或者
screen -S fakessh ./main

数据读取

获取字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@w39tPyBEu4 sshf]# awk  '{print $3}' pw.txt
root:ads
root:minecraftserver
kjayroe:kjayroe
root:minecraftserver
root:1qaz2wsx3edc
oracle:oracle
root:1qazZAQ!
[root@w39tPyBEu4 sshf]# awk '{print $3}' pw.txt | sed 's/:/ /'
root ads
root minecraftserver
kjayroe kjayroe
root minecraftserver
root 1qaz2wsx3edc
oracle oracle
root 1qazZAQ!
[root@w39tPyBEu4 sshf]# grep root pw.txt |awk '{print $3}' | sed 's/:/ /'
root ads
root minecraftserver
root minecraftserver
root 1qaz2wsx3edc
root 1qazZAQ

只获取密码

1
awk -F'[: ]' '{print $7}' pw.txt