From 9806c8f4a43a05675cd0e85b66d4d99b21a3f75e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sat, 20 Aug 2022 00:03:37 +0200 Subject: [PATCH] add script to do recursive AXFR DNS requests --- python/recursive-axfr/recursive-axfr.py | 52 +++++++++++++++++++++++++ python/recursive-axfr/requirements.txt | 1 + 2 files changed, 53 insertions(+) create mode 100644 python/recursive-axfr/recursive-axfr.py create mode 100644 python/recursive-axfr/requirements.txt diff --git a/python/recursive-axfr/recursive-axfr.py b/python/recursive-axfr/recursive-axfr.py new file mode 100644 index 0000000..9dc9118 --- /dev/null +++ b/python/recursive-axfr/recursive-axfr.py @@ -0,0 +1,52 @@ +import dns.resolver +import dns.zone +import dns.query +import dns.rdatatype +import dns.reversename +import dns.name + +import sys + +ZONES = ['0l.de', 'steffenvogel.de', 'dn42.org', 'vogel.cc', 'noteblok.net', 'chaos.family', '0l.dn42'] + +master_name = 'ipa-0.edgy.vms.0l.de' +master_answer = dns.resolver.resolve(master_name, 'A') + +NS = master_answer[0].address + +def get_names(zone, rdtypes=['A', 'AAAA', 'CNAME', 'NS']): + names = set() + + zone = dns.name.from_text(zone) + + try: + x = dns.query.xfr(NS, zone) + z = dns.zone.from_xfr(x) + + for rdtype in rdtypes: + rdtype = dns.rdatatype.from_text(rdtype) + + for name, ttl, rdata in z.iterate_rdatas(rdtype): + fqdn = name.derelativize(zone).to_text(True) + + if rdtype == dns.rdatatype.NS and len(name) > 0: + names |= get_names(fqdn) + elif not name.is_wild(): + names.add(fqdn) + + except dns.xfr.TransferError as e: + print(f'{e}: {zone}', file=sys.stderr) + + return names + +def main(): + + names = set() + for zone in ZONES: + names |= get_names(zone) + + print('\n'.join(sorted(names))) + + +if __name__ == '__main__': + main() diff --git a/python/recursive-axfr/requirements.txt b/python/recursive-axfr/requirements.txt new file mode 100644 index 0000000..2f73596 --- /dev/null +++ b/python/recursive-axfr/requirements.txt @@ -0,0 +1 @@ +dnspython