Gibt es eine Möglichkeit, ALLE DNS-Einträge für eine Domäne aufzulisten?
Ich weiß über solche Dinge wie dig und nslookup, aber sie gehen nur so weit. Zum Beispiel, wenn ich einen A-Eintrag für eine Subdomain habe als
test A somedomain.co.uk
Wenn ich nicht ausdrücklich danach frage, z. B..
dig any test.somedomain.co.uk
Ich kann es nicht sehen.
Gibt es eine Möglichkeit (abgesehen von der Anzeige der Einträge im DNS-Manager), um genau zu sehen, was die DNS-Einträge sind?
Wenn Sie nach ANY abfragen, erhalten Sie eine Liste aller Datensätze auf dieser Ebene, aber nicht darunter.
# try this
dig google.com any
Dies kann A-Einträge, TXT-Einträge, NS-Einträge, MX-Einträge usw. zurückgeben, wenn der Domänenname genau "google.com" lautet. Es werden jedoch keine Child-Records zurückgegeben (z. B. www.google.com). Genauer gesagt, Sie KÖNNEN diese Einträge erhalten, wenn sie existieren. Der Nameserver muss diese Datensätze nicht zurückgeben, wenn er sich dagegen entscheidet (z. B. um den Umfang der Antwort zu verringern).
Ein AXFR ist ein Zonentransfer und ist wahrscheinlich das, was Sie wollen. Diese sind jedoch in der Regel eingeschränkt und nicht verfügbar, es sei denn, Sie kontrollieren die Zone. In der Regel führen Sie einen Zonentransfer direkt vom autoritativen Server (dem unten stehenden @ns1.google.com) und oft von einem Nameserver durch, der möglicherweise nicht veröffentlicht ist (ein Stealth-Nameserver).
# This will return "Transfer failed"
dig @ns1.google.com google.com axfr
Wenn Sie die Kontrolle über die Zone haben, können Sie sie so einrichten, dass sie Übertragungen erhält, die mit einem TSIG-Schlüssel geschützt sind. Dies ist ein gemeinsames Geheimnis, das der Client an den Server senden kann, um die Übertragung zu autorisieren.
In Ermangelung der Möglichkeit, Zonentransfers durchzuführen, schrieb ich dieses kleine Bash-Skript, 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
Jetzt verwende ich dg example.com
, um eine schöne, saubere Liste von DNS-Einträgen zu erhalten, oder dg example.com x
, um eine Reihe von anderen beliebten Subdomains einzuschließen.
Mit grep -vE "${wild_ips}"
werden Einträge herausgefiltert, die das Ergebnis eines Wildcard-DNS-Eintrags wie * 10800 IN A 1.38.216.82
sein könnten. Andernfalls würde ein Platzhaltereintrag den Anschein erwecken, als gäbe es Einträge für jeden $COMMON_SUBDOMAN
.
Hinweis: Dies beruht auf ANY
-Abfragen, die von einigen DNS-Anbietern wie CloudFlare blockiert werden.
Was Sie wollen, nennt man Zonentransfer. Sie können einen Zonentransfer mit "dig -t axfr" anfordern.
Eine Zone ist eine Domain und alle darunter liegenden Domains, die nicht an einen anderen Server delegiert sind.
Beachten Sie, dass Zonentransfers nicht immer unterstützt werden. Sie werden nicht für normale Suchvorgänge verwendet, sondern nur für die Replikation von DNS-Daten zwischen Servern, aber dafür gibt es andere Protokolle (z.B. rsync über ssh), es kann ein Sicherheitsrisiko durch die Offenlegung von Namen bestehen, und Zonentransfer-Antworten kosten mehr als normale DNS-Suchvorgänge.