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

commit a419dc2723c4f0425848c3861501e41ee504f063
parent d4d3a2e16860f1df0cb826122cba91264a89115c
Author: djnn <[email protected]>
Date: Tue, 3 Dec 2024 19:40:48 +0900

feat(osint): filtering unique assets from passive enum

Diffstat:
Mosint/run.go | 51+++++++++++++++++++++++++++++++++++++++++++++++++++

1 file changed, 51 insertions(+), 0 deletions(-)

diff --git a/osint/run.go b/osint/run.go
@@ -1,7 +1,12 @@
 package osint
 
 import (
+	"bytes"
 	"fmt"
+	"io/ioutil"
+	"net"
+	"slices"
+	"strings"
 )
 
 type OsintOpts struct {
@@ -106,6 +111,52 @@ func (opts OsintOpts) Run() {
 	opts.runSubfinder()
 	opts.runAssetfinder()
 	opts.runDnsx()
+
+	fmt.Printf("\n[OSINT %s] merging aggregated IP addresses together\n", opts.domain)
+
+	asfFilepath := fmt.Sprintf("%s/assetfinder_%s.txt", opts.scanPath, opts.domain)
+	dnsxFilepath := fmt.Sprintf("%s/dnsx_%s.json", opts.scanPath, opts.domain)
+	sbfOutfile := fmt.Sprintf("%s/subfinder_%s.txt", opts.scanPath, opts.domain)
+
+	domainsFiles := []string{asfFilepath, dnsxFilepath, sbfOutfile}
+	var domains []string
+	var domainBuffer bytes.Buffer
+	for _, file := range domainsFiles {
+		newDomains, err := ioutil.ReadFile(file)
+		if err != nil {
+			panic(err)
+		}
+
+		/* check if valid IP address / domain & if it's already in the list */
+		lines := strings.Split(strings.ReplaceAll(string(newDomains), "\r\n", "\n"), "\n")
+		for _, domain := range lines {
+
+			// already exists in list
+			if slices.Contains(domains, domain) {
+				continue
+			}
+
+			// is IP address ?
+			addr := net.ParseIP(domain)
+
+			// does it look like a domain name ? at least one .
+			// (hacky, but no need to make it better for now)
+			if addr != nil || strings.Contains(domain, ".") {
+				domains = append(domains, domain)
+				domainBuffer.Write([]byte(string(domain) + "\n"))
+			}
+		}
+	}
+
+	// now add all assets together, line by line
+	uniqueOutfile := fmt.Sprintf("%s/unique_%s.txt", opts.scanPath, opts.domain)
+	err := ioutil.WriteFile(uniqueOutfile, domainBuffer.Bytes(), 0644)
+	if err != nil {
+		panic(err)
+	}
+
+	fmt.Printf("[OSINT %s] Registered %v IP addresses and assets.\n", opts.domain, len(domains))
+
 	opts.runHttpx()
 	opts.runGowitness()