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

dnsx.go (2105B)

      1 package osint
      2 
      3 import (
      4 	"bytes"
      5 	"encoding/json"
      6 	"fmt"
      7 	"net"
      8 	"os"
      9 
     10 	"evil.djnn.sh/djnn/yellow/core"
     11 	"github.com/projectdiscovery/dnsx/libs/dnsx"
     12 )
     13 
     14 type Dnsx struct{}
     15 
     16 func (*Dnsx) Name() string { return "dnsx" }
     17 
     18 func (*Dnsx) Run(ctx *core.Context) error {
     19 	fmt.Println("[+] Running dnsx on ", ctx.Domain)
     20 	if ctx.DryRun {
     21 		return nil
     22 	}
     23 
     24 	outfile := fmt.Sprintf("%s/dnsx.json", ctx.ScanPath)
     25 	domain := ctx.Domain
     26 
     27 	dnsClient, err := dnsx.New(dnsx.DefaultOptions)
     28 	if err != nil {
     29 		fmt.Printf("err: %v\n", err)
     30 		return nil
     31 	}
     32 
     33 	result, err := dnsClient.Lookup(domain)
     34 	if err != nil {
     35 		fmt.Printf("err: %v\n", err)
     36 		return nil
     37 	}
     38 	for idx, msg := range result {
     39 		fmt.Printf("%d: %s\n", idx+1, msg)
     40 	}
     41 
     42 	rawResp, err := dnsClient.QueryOne(domain)
     43 	if err != nil {
     44 		fmt.Printf("err: %v\n", err)
     45 		return nil
     46 	}
     47 
     48 	jsonStr, err := rawResp.JSON()
     49 	if err != nil {
     50 		fmt.Printf("err: %v\n", err)
     51 		return nil
     52 	}
     53 
     54 	// Try to unmarshal the DNSX JSON response into a map so we can add TXT records.
     55 	var obj map[string]any
     56 	if err := json.Unmarshal([]byte(jsonStr), &obj); err != nil {
     57 		// If unmarshalling fails, preserve the original JSON under "raw".
     58 		fmt.Printf("warning: failed to unmarshal DNSX JSON: %v\n", err)
     59 		obj = map[string]any{"raw": jsonStr}
     60 	}
     61 
     62 	txts, txtErr := net.LookupTXT(domain)
     63 	if txtErr != nil {
     64 		fmt.Printf("warning: failed to lookup TXT records for %s: %v\n", domain, txtErr)
     65 		txts = []string{}
     66 	}
     67 	obj["TXTs"] = txts
     68 
     69 	modifiedJSON, err := json.Marshal(obj)
     70 	if err != nil {
     71 		fmt.Printf("err: %v\n", err)
     72 		return nil
     73 	}
     74 
     75 	var prettyJSON bytes.Buffer
     76 	if indentErr := json.Indent(&prettyJSON, modifiedJSON, "", "\t"); indentErr != nil {
     77 		fmt.Printf("err: %v\n", indentErr)
     78 		return nil
     79 	}
     80 
     81 	fo, err := os.Create(outfile)
     82 	if err != nil {
     83 		fmt.Printf("[!] Dnsx: failed to create %s: %v\n", outfile, err)
     84 		return nil
     85 	}
     86 	defer fo.Close()
     87 
     88 	if _, err := fo.Write(prettyJSON.Bytes()); err != nil {
     89 		fmt.Printf("[!] Dnsx: failed to write %s: %v\n", outfile, err)
     90 		return nil
     91 	}
     92 
     93 	fmt.Printf("[OSINT %s] Dnsx results are stored in %s\n", domain, outfile)
     94 	return nil
     95 }