yellow~ opinionated web scanning pipeline for pentesters in a hurry |
| git clone https://github.com/djnnvx/yellow.git |
| log | files | refs | archive | README | LICENSE |
assetfinder.go (1699B)
1 package osint 2 3 import ( 4 "fmt" 5 "os" 6 "sync" 7 "time" 8 9 "evil.djnn.sh/djnn/yellow/core" 10 // old fork that dissociates main from runner 11 // (repo was deleted but module still exists, and the tool has not 12 // been updated in 4 years so...) 13 assetfinder "github.com/spiral-sec/assetfinder/scanner" 14 ) 15 16 type fetchFn func(string) ([]string, error) 17 18 type Assetfinder struct{} 19 20 func (*Assetfinder) Name() string { return "assetfinder" } 21 22 func (*Assetfinder) Run(ctx *core.Context) error { 23 fmt.Println("[+] Running Assetfinder on ", ctx.Domain) 24 if ctx.DryRun { 25 return nil 26 } 27 28 outfile := fmt.Sprintf("%s/assetfinder.txt", ctx.ScanPath) 29 functions := []fetchFn{ 30 assetfinder.CertSpotter, 31 assetfinder.HackerTarget, 32 assetfinder.ThreatCrowd, 33 assetfinder.CrtSh, 34 assetfinder.Facebook, 35 assetfinder.VirusTotal, 36 assetfinder.FindSubDomains, 37 assetfinder.Urlscan, 38 assetfinder.BufferOverrun, 39 } 40 41 var wg sync.WaitGroup 42 rl := assetfinder.NewRateLimiter(time.Second) 43 out := make(chan string) 44 45 for _, f := range functions { 46 wg.Add(1) 47 fn := f 48 49 go func() { 50 defer wg.Done() 51 52 rl.Block(fmt.Sprintf("%#v", fn)) 53 names, err := fn(ctx.Domain) 54 55 if err != nil { 56 return 57 } 58 59 for _, n := range names { 60 n = assetfinder.CleanDomain(n) 61 out <- n 62 } 63 }() 64 } 65 66 go func() { 67 wg.Wait() 68 close(out) 69 }() 70 71 printed := make(map[string]bool) 72 file, err := os.OpenFile(outfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 73 if err != nil { 74 return nil 75 } 76 defer file.Close() 77 78 for n := range out { 79 if _, ok := printed[n]; ok { 80 continue 81 } 82 printed[n] = true 83 fmt.Println(n) 84 file.WriteString(n + "\n") 85 } 86 87 fmt.Printf("[OSINT %s] Assetfinder done.\n\n", ctx.Domain) 88 return nil 89 }