Last active
July 21, 2020 14:05
-
-
Save maurorappa/10b9d4e75c2debe6d6173865fb6e2d3c to your computer and use it in GitHub Desktop.
A DNS Scraper in Go
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
//simple usage go run dns_scraper.go -h=0.uk.pool.ntp.org -s=3 | |
import ( | |
"flag" | |
"fmt" | |
"github.com/bogdanovich/dns_resolver" | |
"io/ioutil" | |
"math/rand" | |
"net" | |
"net/http" | |
"os" | |
"strings" | |
"time" | |
) | |
var ( | |
url = "https://public-dns.info/nameservers.txt" | |
all_public_servers []string | |
discovered_entries []string | |
) | |
func fetchdns() []string { | |
resp, err := http.Get(url) | |
if err != nil { | |
fmt.Println("Error fecthing the dns list!") | |
os.Exit(2) | |
} | |
defer resp.Body.Close() | |
body, err := ioutil.ReadAll(resp.Body) | |
dns_list := strings.Split(string(body), "\n") | |
return dns_list | |
} | |
func getdns(dns_list []string) string { | |
rand.Seed(time.Now().UnixNano()) | |
random_server_ip := dns_list[rand.Intn(len(dns_list))] | |
random_server_name, _ := net.LookupAddr(random_server_ip) | |
fmt.Printf("Using dns %s - %s\n", random_server_ip, random_server_name) | |
return random_server_ip | |
} | |
func readdnsfile() []string { | |
data, err := ioutil.ReadFile("./dns.list") | |
if err != nil { | |
fmt.Println("cannot read dns.list in the current directory") | |
os.Exit(3) | |
} | |
dns_list := strings.Split(string(data), "\n") | |
return dns_list | |
} | |
func main() { | |
hostname := flag.String("h", "www.google.com", "hostname to resolve") | |
servers := flag.Int("s", 3, "how many random servers query") | |
fetch := flag.Bool("f", true, "fetch open DNS list from public-dns.info, if false read the file dns.list (one IP per line) on the same directory") | |
flag.Parse() | |
if *fetch { | |
all_public_servers = fetchdns() | |
} else { | |
all_public_servers = readdnsfile() | |
} | |
for i := 0; i <= *servers; i++ { | |
choosendns := getdns(all_public_servers) | |
resolver := dns_resolver.New([]string{choosendns}) | |
// In case of i/o timeout | |
resolver.RetryTimes = 5 | |
ip, err := resolver.LookupHost(*hostname) | |
if err != nil { | |
fmt.Println(err.Error()) | |
i-- | |
} | |
fmt.Println(ip) | |
for _, val := range ip { | |
fmt.Printf("found: %s\n", val) | |
discovered_entries = append(discovered_entries, val.String()) | |
} | |
} | |
fmt.Printf("\nAll entries for %s:\n %#v\n", *hostname, discovered_entries) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment