Enumerate DNS records for the target domain.
(self, target: Target)
| 21 | """Enumerate DNS records for the target domain.""" |
| 22 | result = self.create_result(target) |
| 23 | |
| 24 | # Handle IP targets with reverse DNS lookup |
| 25 | if target.target_type == "ip": |
| 26 | return await self._reverse_lookup(target, result) |
| 27 | |
| 28 | if target.target_type not in ("domain", "url"): |
| 29 | result.errors.append(f"Invalid target type: {target.target_type}. Expected domain or IP.") |
| 30 | result.success = False |
| 31 | result.complete() |
| 32 | return result |
| 33 | |
| 34 | domain = self._extract_domain(target.value) |
| 35 | self.logger.info(f"Enumerating DNS records for {domain}") |
| 36 | |
| 37 | resolver = dns.asyncresolver.Resolver() |
| 38 | resolver.timeout = 5.0 |
| 39 | resolver.lifetime = 10.0 |
| 40 | |
| 41 | records_found = {} |
| 42 | |
| 43 | for record_type in self.RECORD_TYPES: |
| 44 | try: |
| 45 | answers = await resolver.resolve(domain, record_type) |
| 46 | records = [] |
| 47 | for rdata in answers: |
| 48 | records.append(str(rdata)) |
| 49 | if records: |
| 50 | records_found[record_type] = records |
| 51 | self.logger.debug(f"Found {len(records)} {record_type} records") |
| 52 | except dns.resolver.NXDOMAIN: |
| 53 | result.errors.append(f"Domain {domain} does not exist") |
| 54 | result.success = False |
| 55 | break |
| 56 | except dns.resolver.NoAnswer: |
| 57 | pass |
| 58 | except dns.resolver.NoNameservers: |
| 59 | result.errors.append(f"No nameservers available for {domain}") |
| 60 | break |
| 61 | except Exception as e: |
| 62 | self.logger.debug(f"Error querying {record_type}: {e}") |
| 63 | |
| 64 | if records_found: |
| 65 | result.raw_data["dns_records"] = records_found |
| 66 | |
| 67 | if "A" in records_found: |
| 68 | result.add_finding( |
| 69 | title="IPv4 Addresses Found", |
| 70 | description=f"Domain resolves to {len(records_found['A'])} IPv4 address(es)", |
| 71 | severity=Severity.INFO, |
| 72 | data={"addresses": records_found["A"]}, |
| 73 | ) |
| 74 | |
| 75 | if "MX" in records_found: |
| 76 | result.add_finding( |
| 77 | title="Mail Servers Found", |
| 78 | description=f"Found {len(records_found['MX'])} mail server(s)", |
| 79 | severity=Severity.INFO, |
| 80 | data={"servers": records_found["MX"]}, |