Skip to content

Instantly share code, notes, and snippets.

@abdallah
Created September 12, 2012 09:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abdallah/3705407 to your computer and use it in GitHub Desktop.
Save abdallah/3705407 to your computer and use it in GitHub Desktop.
Guess DNS Zone
import dns.zone
import dns.resolver
domain_name = 'rimuhosting.com' # --- CHANGE THIS
dns_server = 'ns1.rimuhosting.com'
def guess_zone(domain_name):
soa_answer = dns.resolver.query(domain_name, 'SOA')
soa_rr = soa_answer.rrset[0]
ns_answer = dns.resolver.query(domain_name, 'NS')
mx_answer = dns.resolver.query(domain_name, 'MX')
a_answer = dns.resolver.query(domain_name, 'A')
txt_answer = dns.resolver.query(domain_name, 'TXT')
zone_text = '$ORIGIN %s.\n' % domain_name
zone_text += '$TTL 1h\n'
zone_text += '%s. IN SOA %s %s (\n' % (domain_name, soa_rr.mname.to_text(), soa_rr.rname.to_text())
zone_text += ' %s ; serial number of this zone file\n' % soa_rr.serial
zone_text += ' %s ; slave refresh\n' % soa_rr.refresh
zone_text += ' %s ; slave retry time in case of a problem\n' % soa_rr.retry
zone_text += ' %s ; slave expiration time\n' % soa_rr.expire
zone_text += ' %s ; maximum caching time in case of failed lookups\n' % soa_rr.minimum
zone_text += ')\n'
zone_text += ns_answer.rrset.to_text() + '\n'
zone_text += mx_answer.rrset.to_text() + '\n'
zone_text += a_answer.rrset.to_text() + '\n'
zone_text += txt_answer.rrset.to_text() + '\n'
possible_cnames = ['@', 'www', 'www1', 'www2', 'ftp', 'webmail', 'mail', 'mail1', 'mail2' 'smtp', 'imap', 'pop', 'ns1', 'ns2', 'ns3', 'ns4']
for cn in possible_cnames:
try:
a_answer = dns.resolver.query('%s.%s.' % (cn, domain_name), 'A')
zone_text += a_answer.rrset.to_text() + '\n'
except:
pass
try:
cn_answer = dns.resolver.query('%s.%s.' % (cn, domain_name), 'CNAME')
zone_text += cn_answer.rrset.to_text() + '\n'
except:
pass
print zone_text
try:
zone = dns.zone.from_text(zone_text)
return zone
except Exception, e:
print e
return False
def axfr_zone(domain_name, dns_server):
try:
zone = dns.zone.from_xfr(dns.query.xfr(dns_server, domain_name))
return zone
except Exception, e:
print e
return False
zone = axfr_zone(domain_name, dns_server)
if not zone:
zone = guess_zone(domain_name)
zone.to_file('%s.db' % domain_name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment