dns/examples/fp/q.go

72 lines
1.7 KiB
Go
Raw Normal View History

2012-01-24 04:03:15 +11:00
package main
import (
"dns"
"flag"
"fmt"
"os"
"strconv"
)
func q(w dns.RequestWriter, m *dns.Msg) {
w.Send(m)
r, err := w.Receive()
if err != nil {
fmt.Printf("%s\n", err.Error())
}
w.Write(r)
}
func main() {
port := flag.Int("port", 53, "port number to use")
2012-01-29 00:06:44 +11:00
report := flag.Bool("report", false, "show fingerprint for (yet) unknown server")
2012-01-24 04:03:15 +11:00
flag.Usage = func() {
2012-01-28 23:31:01 +11:00
fmt.Fprintf(os.Stderr, "Usage: %s [OPTIONS...] [@server]\n", os.Args[0])
2012-01-24 04:03:15 +11:00
flag.PrintDefaults()
}
conf, _ := dns.ClientConfigFromFile("/etc/resolv.conf")
nameserver := "@" + conf.Servers[0]
flag.Parse()
for i := 0; i < flag.NArg(); i++ {
// If it starts with @ it is a nameserver
if flag.Arg(i)[0] == '@' {
nameserver = flag.Arg(i)
2012-01-28 22:05:25 +11:00
break
2012-01-24 04:03:15 +11:00
}
2012-01-28 22:26:07 +11:00
}
2012-01-24 04:03:15 +11:00
nameserver = string([]byte(nameserver)[1:]) // chop off @
nameserver += ":" + strconv.Itoa(*port)
2012-01-28 22:26:07 +11:00
c := dns.NewClient()
2012-01-28 23:31:01 +11:00
prints, _ := fingerPrintFromFile("data/q")
results := make([]*fingerprint, 0)
2012-01-30 05:15:26 +11:00
if *report {
fmt.Printf("# Fingerprint of <Nameserver> <version>\n# Supplied by <Name> on <Date>\n#\n")
}
2012-01-28 22:53:39 +11:00
for _, f := range prints {
f1 := probe(c, nameserver, f)
2012-01-28 23:31:01 +11:00
results = append(results, f1)
if *report {
2012-01-30 05:15:26 +11:00
fmt.Printf("#%s\n%s\n", f.String(), f1.String())
2012-01-28 23:31:01 +11:00
}
}
if *report {
return
2012-01-28 22:26:07 +11:00
}
2012-01-28 23:01:03 +11:00
2012-01-28 23:31:01 +11:00
// For now, just list them:
2012-01-30 05:15:26 +11:00
files := []string{"Atlas", "Bind8", "Bind9", "MaraDNS", "Microsoft", "Nsd3", "PowerDNS"}
fmt.Printf("%s\t%s\t%s\t\t\t\t\t\t\t\t%s\n", "Server type", "Diffs", "Fingerprint", "Recevied")
2012-01-28 23:31:01 +11:00
for _, file := range files {
2012-01-30 05:15:26 +11:00
diff := 0
2012-01-29 00:57:03 +11:00
prints, _ := fingerPrintFromFile("data/" + file)
2012-01-28 23:31:01 +11:00
for i, f := range prints {
d := f.compare(results[i])
2012-01-30 05:15:26 +11:00
diff += d
fmt.Printf("%s\t%d %s %s\n", file, d, f.String(), results[i].String())
2012-01-28 23:31:01 +11:00
}
2012-01-30 05:15:26 +11:00
fmt.Printf("\t\t=\nDifferences:\t%d\n\n", diff)
2012-01-28 23:31:01 +11:00
}
2012-01-24 04:03:15 +11:00
}