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()
|