Skip to content

Instantly share code, notes, and snippets.

@maurorappa
Last active July 21, 2020 14:05
Show Gist options
  • Save maurorappa/10b9d4e75c2debe6d6173865fb6e2d3c to your computer and use it in GitHub Desktop.
Save maurorappa/10b9d4e75c2debe6d6173865fb6e2d3c to your computer and use it in GitHub Desktop.
A DNS Scraper in Go
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