yellow~ opinionated web scanning pipeline for pentesters in a hurry |
| git clone https://github.com/djnnvx/yellow.git |
| log | files | refs | archive | README | LICENSE |
sitemap.go (2257B)
1 package scan 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/url" 7 "strings" 8 9 "evil.djnn.sh/djnn/yellow/core" 10 "evil.djnn.sh/djnn/yellow/helpers" 11 ) 12 13 var GlobalHeaders = []string{"Server", "X-XSS-Protection", "Access-Control-Allow-Credentials", "Content-Security-Policy", "X-Powered-By", "Strict-Transport-Security"} 14 15 type Sitemap struct{} 16 17 func (*Sitemap) Name() string { return "sitemap" } 18 19 func (*Sitemap) Run(ctx *core.Context) error { 20 fmt.Println("[+] Running Sitemap on", ctx.Domain) 21 if ctx.DryRun { 22 return nil 23 } 24 25 domain := strings.TrimSuffix(ctx.Domain, "/") 26 27 client := helper.GetHttpClient(true) 28 29 for _, u := range getUrls(domain) { 30 req, err := http.NewRequest("GET", fmt.Sprint(u, "/sitemap.xml"), nil) 31 if err != nil { 32 fmt.Printf("%v", err) 33 continue 34 } 35 req.Header.Add("User-Agent", helper.GetUserAgent()) 36 37 resp, err := client.Do(req) 38 if err != nil { 39 fmt.Printf("%v", err) 40 continue 41 } 42 43 if resp.StatusCode != http.StatusNotFound { 44 for headerName, headerValue := range resp.Header { 45 if contains(GlobalHeaders, headerName) { 46 fmt.Printf("Found Header: %s | %s \n", headerName, headerValue) 47 } 48 } 49 50 outfile := fmt.Sprintf("%s/sitemap.xml", ctx.ScanPath) 51 if n, err := core.SaveStream(outfile, resp.Body); err != nil { 52 fmt.Printf("[!] sitemap: could not write %s: %v\n", outfile, err) 53 } else { 54 fmt.Printf("[SCAN %s] sitemap: %d bytes in %s\n", domain, n, outfile) 55 } 56 } else { 57 fmt.Println("----- Sorry, got 404 status code for sitemap.xml -----") 58 } 59 resp.Body.Close() 60 } 61 62 fmt.Printf("[SCAN %s] Sitemap scan for %s completed\n\n", domain, domain) 63 return nil 64 } 65 66 func contains(slice []string, item string) bool { 67 set := make(map[string]struct{}, len(slice)) 68 for _, s := range slice { 69 set[s] = struct{}{} 70 } 71 72 _, ok := set[item] 73 return ok 74 } 75 76 func getUrls(target string) (c []*url.URL) { 77 if strings.HasPrefix(target, "http") { 78 u, err := url.Parse(target) 79 if err == nil { 80 c = append(c, u) 81 } 82 83 return 84 } 85 86 if !strings.HasPrefix(target, "http://") { 87 u, err := url.Parse("http://" + target) 88 if err == nil { 89 c = append(c, u) 90 } 91 } 92 93 if !strings.HasPrefix(target, "https://") { 94 u, err := url.Parse("https://" + target) 95 if err == nil { 96 c = append(c, u) 97 } 98 } 99 100 return 101 }