yellow.git


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 }