diff --git a/examples/fp/data/Bind9 b/examples/fp/data/Bind9 new file mode 100644 index 00000000..7a4b3926 --- /dev/null +++ b/examples/fp/data/Bind9 @@ -0,0 +1,4 @@ +.,CH,TXT,QUERY,NOERROR,qr,aa,tc,RD,ra,ad,cd,z,0,0,0,0,DO,4097,NSID .,CH,TXT,QUERY,REFUSED,QR,aa,tc,RD,ra,ad,cd,z,1,0,0,1,DO,4096,NSID +auThoRs.bInD.,CH,TXT,QUERY,NOERROR,qr,aa,tc,rd,ra,ad,cd,z,0,0,0,0,do,0,nsid auThoRs.bInD.,CH,TXT,QUERY,NOERROR,QR,AA,tc,rd,ra,ad,cd,z,1,15,1,0,do,0,nsid +bind.,NONE,SOA,NOTIFY,NOERROR,qr,AA,tc,RD,ra,ad,cd,Z,0,0,0,0,do,0,nsid bind.,NONE,SOA,NOTIFY,REFUSED,QR,aa,tc,RD,ra,ad,cd,z,1,0,0,0,do,0,nsid + diff --git a/examples/fp/data/Nsd3 b/examples/fp/data/Nsd3 new file mode 100644 index 00000000..8ffb6c22 --- /dev/null +++ b/examples/fp/data/Nsd3 @@ -0,0 +1,4 @@ +# NSD3 fingerprint +.,CH,TXT,QUERY,NOERROR,qr,aa,tc,RD,ra,ad,cd,z,0,0,0,0,DO,4097,NSID .,CH,TXT,QUERY,NOERROR,QR,aa,tc,RD,ra,ad,cd,z,1,0,0,1,DO,4096,nsid +auThoRs.bInD.,CH,TXT,QUERY,NOERROR,qr,aa,tc,rd,ra,ad,cd,z,0,0,0,0,do,0,nsid auThoRs.bInD.,CH,TXT,QUERY,NOERROR,QR,aa,tc,rd,ra,ad,cd,z,1,0,0,0,do,0,nsid +bind.,NONE,SOA,NOTIFY,NOERROR,qr,AA,tc,RD,ra,ad,cd,Z,0,0,0,0,do,0,nsid .,CLASS0,TYPE0,NOTIFY,NXDOMAIN,QR,AA,tc,RD,ra,ad,cd,z,0,0,0,0,do,0,nsid diff --git a/examples/fp/fp.go b/examples/fp/fp.go index c10a02a4..a2e29582 100644 --- a/examples/fp/fp.go +++ b/examples/fp/fp.go @@ -2,7 +2,9 @@ package main import ( + "bufio" "dns" + "os" "strconv" "strings" ) @@ -132,6 +134,13 @@ func (f *fingerprint) StringNoSections() string { return strings.Join(s[2:13], ",") } +// Return a new fingerprint, set from string +func newFingerprint(s string) *fingerprint { + f := new(fingerprint) + f.setString(s) + return f +} + // SetString sets the strings str to the fingerprint *f. func (f *fingerprint) setString(str string) { for i, s := range strings.Split(str, ",") { @@ -349,6 +358,30 @@ func (f *fingerprint) compare(f1 *fingerprint) (diff int) { return } +// Read the finger prints from the file. Lines starting with +// # are comments. Each line should contain one fingerprint in string format. +func fingerPrintFromFile(f string) ([]*fingerprint, error) { + r, e := os.Open(f) + if e != nil { + return nil, e + } + b := bufio.NewReader(r) + l, p, e := b.ReadLine() + i := 1 + prints := make([]*fingerprint, 0) + for e == nil { + if p { + return nil, nil + } + if l[0] != '#' { + prints = append(prints, newFingerprint(string(l))) + } + l, p, e = b.ReadLine() + i++ + } + return prints, nil +} + func valueOfBool(b bool, w string) string { if b { return strings.ToUpper(w) diff --git a/examples/fp/q.go b/examples/fp/q.go index d29b59c4..cb2f2276 100644 --- a/examples/fp/q.go +++ b/examples/fp/q.go @@ -38,19 +38,9 @@ func main() { nameserver = string([]byte(nameserver)[1:]) // chop off @ nameserver += ":" + strconv.Itoa(*port) c := dns.NewClient() - fp := new(fingerprint) - for _, s := range fingerprints() { - fp.setString(s) - fp1 := probe(c, nameserver, fp) - println(s, "|", fp1.String()) - } -} - -// A list of all the evil finger prints -func fingerprints() []string { - return []string{ - ".,CH,TXT,QUERY,NOERROR,qr,aa,tc,RD,ra,ad,cd,z,0,0,0,0,DO,4097,NSID", // general - "auThoRs.bInD.,CH,TXT,QUERY,NOERROR,qr,aa,tc,rd,ra,ad,cd,z,0,0,0,0,do,0,nsid", // case - "bind.,NONE,SOA,NOTIFY,NOERROR,qr,AA,tc,RD,ra,ad,cd,Z,0,0,0,0,do,0,nsid", // notify + prints, _ := fingerPrintFromFile("data/q") + for _, f := range prints { + f1 := probe(c, nameserver, f) + println(f.String(), f1.String()) } }