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

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 }