Hoe kan ik ALLE DNS-records oplijsten?

Is er een manier waarop ik ALLE DNS-records voor een domein kan oplijsten?

Ik weet van dingen als dig en nslookup maar die gaan maar tot zover. Bijvoorbeeld, als ik'heb een subdomein A record als

test A somedomain.co.uk

dan tenzij ik er specifiek om vraag, bijv.

dig any test.somedomain.co.uk

kan ik het niet zien.

Is er een manier (anders dan naar de records te kijken door naar de DNS manager te gaan) om precies te zien wat alle DNS records zijn?

Oplossing

Wanneer je zoekt op ANY krijg je een lijst van alle records op dat niveau maar niet eronder.

# try this
dig google.com any

Dit kan A records, TXT records, NS records, MX records, enz. opleveren als de domeinnaam exact "google.com" is. Het zal echter geen kindrecords teruggeven (bv. www.google.com). Meer precies, u KAN deze records krijgen als ze bestaan. De naamserver hoeft deze records niet terug te sturen als hij dat liever niet doet (bijvoorbeeld om de grootte van het antwoord te beperken).

Een AXFR is een zone transfer en is waarschijnlijk wat u wilt. Deze zijn echter meestal beperkt en niet beschikbaar tenzij u de zone controleert. U voert een zonetransfer meestal rechtstreeks uit vanaf de gezaghebbende server (de @ns1.google.com hieronder) en vaak vanaf een naamserver die mogelijk niet wordt gepubliceerd (een stealth-naamserver).

# This will return "Transfer failed"
dig @ns1.google.com google.com axfr

Als je controle hebt over de zone, kun je deze instellen om transfers te krijgen die beschermd zijn met een TSIG sleutel. Dit is een gedeeld geheim dat de client naar de server kan sturen om de overdracht te autoriseren.

Commentaren (6)

Bij gebrek aan de mogelijkheid om zone-overdrachten te doen, schreef ik dit kleine bash script, dg:

#!/bin/bash
COMMON_SUBDOMAINS=(www mail smtp pop imap blog en ftp ssh login)
if [[ "$2" == "x" ]]; then
    dig +nocmd "$1" +noall +answer "${3:-any}"
    wild_ips="$(dig +short "*.$1" "${3:-any}" | tr '\n' '|')"
    wild_ips="${wild_ips%|}"
    for sub in "${COMMON_SUBDOMAINS[@]}"; do
        dig +nocmd "$sub.$1" +noall +answer "${3:-any}"
    done | grep -vE "${wild_ips}"
    dig +nocmd "*.$1" +noall +answer "${3:-any}"
else
    dig +nocmd "$1" +noall +answer "${2:-any}"
fi

Nu gebruik ik dg example.com om een mooie, schone lijst van DNS records te krijgen, of dg example.com x om een heleboel andere populaire subdomeinen op te nemen.

grep -vE "${wild_ips}" filtert de records die het resultaat kunnen zijn van een wildcard DNS entry zoals * 10800 IN A 1.38.216.82. Anders zou een wildcard entry het laten lijken alsof er records zijn voor elke $COMMON_SUBDOMAN.

Opmerking: Dit is gebaseerd op ANY queries, die geblokkeerd worden door sommige DNS providers zoals CloudFlare.

Commentaren (1)

Wat u wilt, heet een zone transfer. U kunt een zone overdracht aanvragen met dig -t axfr.

Een zone is een domein en alle domeinen eronder die niet gedelegeerd zijn naar een andere server.

Merk op dat zone overdrachten niet altijd worden ondersteund. Ze'worden niet gebruikt in normale lookup, alleen in het repliceren van DNS gegevens tussen servers; maar er zijn andere protocollen die daarvoor gebruikt kunnen worden (zoals rsync over ssh), er kan een veiligheidsrisico zijn van het blootstellen van namen, en zone transfer antwoorden kosten meer om te genereren en te verzenden dan gewone DNS lookups.

Commentaren (0)