-
-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathmain.go
207 lines (189 loc) · 4.96 KB
/
main.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
package main
import (
"bufio"
"flag"
"fmt"
"io/ioutil"
"net/http"
"os"
"regexp"
"strings"
"sync"
)
const (
s3path = "^(s3-|s3\\.)?(s3.*)\\.amazonaws\\.com"
s3url = "^s3://*"
s3vh = "(s3.*)\\.amazonaws\\.com$"
)
func banner() {
VERSION := "v1.0.1"
fmt.Printf(`
8""""8 eeee 8"""8 8"""" 88 8 8"""" 8"""8 8""""8 8""""
8 8 8 8 8 88 8 8 8 8 8 8
8eeeee 8 8eee8e 8eeee 88 e8 8eeee 8eee8e 8eeeee 8eeee
88 eee8 eeee 88 8 88 "8 8 88 88 8 88 88
e 88 88 88 8 88 8 8 88 88 8 e 88 88
8eee88 eee88 88 8 88eee 8ee8 88eee 88 8 8eee88 88eee
`)
fmt.Println("by @hahwul | "+VERSION)
fmt.Println("")
}
func main() {
// input options
iL := flag.String("iL", "", "input List")
// to options
tN := flag.Bool("tN", false, "to name")
tS := flag.Bool("tS", false, "to s3 url")
tP := flag.Bool("tP", false, "to path-style")
tV := flag.Bool("tV", false, "to virtual-hosted-style")
verify := flag.Bool("verify", false, "testing bucket(acl,takeover)")
// output options
oN := flag.String("oN", "", "Write output in Normal format (optional)")
oA := flag.String("oA", "", "Write output in Array format (optional)")
var s3Buckets []string
flag.Parse()
if flag.NFlag() == 0 {
banner()
flag.Usage()
return
}
// accept domains on stdin
if *iL == "" {
sc := bufio.NewScanner(os.Stdin)
for sc.Scan() {
target := strings.ToLower(sc.Text())
var s3 = identifys3(target)
if s3 != "" {
s3Buckets = append(s3Buckets, s3)
}
}
} else {
target, err := readLinesOrLiteral(*iL)
if err != nil {
fmt.Println(err)
}
for _, s := range target {
var s3 = identifys3(s)
if s3 != "" {
s3Buckets = append(s3Buckets, s3)
}
}
}
// Remove Deplicated value
s3Buckets = unique(s3Buckets)
// Printing
if *verify {
var wg sync.WaitGroup
for _, s := range s3Buckets {
wg.Add(1)
go func(s string) {
defer wg.Done()
var DefaultTransport http.RoundTripper = &http.Transport{}
var resp *http.Response
req, err := http.NewRequest("GET", "https://s3.amazonaws.com/"+s, nil)
if err != nil {
fmt.Printf("%s", err)
} else {
resp, err = DefaultTransport.RoundTrip(req)
if err != nil {
fmt.Printf("%s", err)
return
}
}
defer resp.Body.Close()
contents, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("%s", err)
}
if strings.Contains(string(contents), "<Code>NoSuchBucket</Code>") {
fmt.Println("[NoSuchBucket] " + s)
} else if strings.Contains(string(contents), "<Code>AccessDenied</Code>") {
fmt.Println("[PublicAccessDenied] " + s)
} else {
fmt.Println("[PublicAccessGranted] " + s)
}
}(s)
}
wg.Wait()
} else {
for _, s := range s3Buckets {
if *tN {
fmt.Println(s)
}
if *tS {
fmt.Println("s3://" + s)
}
if *tP {
fmt.Println("https://s3.amazonaws.com/" + s)
}
if *tV {
fmt.Println(s + ".s3.amazonaws.com")
}
}
}
_ = oN
_ = oA
}
func unique(intSlice []string) []string {
keys := make(map[string]bool)
list := []string{}
for _, entry := range intSlice {
if _, value := keys[entry]; !value {
keys[entry] = true
list = append(list, entry)
}
}
return list
}
func identifys3(t string) string {
// images.skypicker.com-dev.s3-website-eu => images.skypicker.com-dev1
target := strings.Replace(t, "http://", "", 1)
target = strings.Replace(target, "https://", "", 1)
target = strings.Replace(target, "s3://", "s3:////", 1)
target = strings.Replace(target, "//", "", 1)
path, _ := regexp.MatchString(s3path, target)
vh, _ := regexp.MatchString(s3vh, target)
url, _ := regexp.MatchString(s3url, target)
if path {
target = strings.Replace(target, "s3.amazonaws.com/", "", 1)
target = strings.Split(target, "/")[0]
} else if vh {
target = strings.Replace(target, ".s3.amazonaws.com", "", 1)
target = strings.Split(target, "/")[0]
} else if url {
target = strings.Replace(target, "s3://", "", 1)
target = strings.Split(target, "/")[0]
}
return target
}
// readLines reads all of the lines from a text file in to
// a slice of strings, returning the slice and any error
func readLines(filename string) ([]string, error) {
f, err := os.Open(filename)
if err != nil {
return []string{}, err
}
defer f.Close()
lines := make([]string, 0)
sc := bufio.NewScanner(f)
for sc.Scan() {
lines = append(lines, sc.Text())
}
return lines, sc.Err()
}
// readLinesOrLiteral tries to read lines from a file, returning
// the arg in a string slice if the file doesn't exist, unless
// the arg matches its default value
func readLinesOrLiteral(arg string) ([]string, error) {
if isFile(arg) {
return readLines(arg)
}
// if the argument isn't a file, but it is the default, don't
// treat it as a literal value
return []string{arg}, nil
}
// isFile returns true if its argument is a regular file
func isFile(path string) bool {
f, err := os.Stat(path)
return err == nil && f.Mode().IsRegular()
}