Comment puis-je lister TOUS les enregistrements DNS ?

Existe-t-il un moyen de lister TOUS les enregistrements DNS d'un domaine ?

Je connais des outils tels que dig et nslookup, mais ils ne vont pas plus loin. Par exemple, si l'enregistrement A d'un sous-domaine est le suivant

test A somedomain.co.uk

alors, à moins que je ne le demande spécifiquement, par exemple.

dig any test.somedomain.co.uk

Je ne peux pas le voir.

Existe-t-il un moyen (autre que de regarder les enregistrements en allant dans le gestionnaire de DNS) de voir exactement ce que sont tous les enregistrements DNS ?

Solution

Lorsque vous faites une requête pour ANY, vous obtenez une liste de tous les enregistrements à ce niveau, mais pas en dessous.

# try this
dig google.com any

Ceci peut retourner les enregistrements A, TXT, NS, MX, etc. si le nom de domaine est exactement "google.com&quot ;. Cependant, elle ne retournera pas les enregistrements enfants (par exemple, www.google.com). Plus précisément, vous POUVEZ obtenir ces enregistrements s'ils existent. Le serveur de noms n'est pas obligé de renvoyer ces enregistrements s'il choisit de ne pas le faire (par exemple, pour réduire la taille de la réponse).

Un AXFR est un transfert de zone et c'est probablement ce que vous voulez. Cependant, ces transferts sont généralement restreints et ne sont pas disponibles à moins que vous ne contrôliez la zone. Vous effectuerez généralement un transfert de zone directement à partir du serveur faisant autorité (le @ns1.google.com ci-dessous) et souvent à partir d'un serveur de noms qui n'est peut-être pas publié (un serveur de noms furtif).

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

Si vous avez le contrôle de la zone, vous pouvez la configurer pour obtenir des transferts qui sont protégés par une clé TSIG. Il s'agit d'un secret partagé que le client peut envoyer au serveur pour autoriser le transfert.

Commentaires (6)

En l'absence de la possibilité de faire des transferts de zone, j'ai écrit ce petit script bash, 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

Maintenant, j'utilise dg example.com pour obtenir une belle liste propre d'enregistrements DNS, ou dg example.com x pour inclure un tas d'autres sous-domaines populaires.

grep -vE "${wild_ips}" filtre les enregistrements qui pourraient être le résultat d'une entrée DNS joker telle que * 10800 IN A 1.38.216.82. Sinon, une entrée joker ferait croire qu'il existe des enregistrements pour chaque $COMMON_SUBDOMAN.

Remarque : Cette méthode repose sur les requêtes ANY, qui sont [bloquées par certains fournisseurs DNS tels que CloudFlare][1].

[1] : https://blog.cloudflare.com/deprecating-dns-any-meta-query-type/

Commentaires (1)

Ce que vous voulez est appelé un transfert de zone. Vous pouvez demander un transfert de zone en utilisant dig -t axfr.

Une zone est un domaine et tous les domaines qui lui sont inférieurs et qui ne sont pas délégués à un autre serveur.

Notez que les transferts de zone ne sont pas toujours pris en charge. Ils ne sont pas utilisés dans les recherches normales, mais seulement pour répliquer les données DNS entre les serveurs ; mais il y a d'autres protocoles qui peuvent être utilisés pour cela (comme rsync sur ssh), il peut y avoir un risque de sécurité en exposant les noms, et les réponses de transfert de zone coûtent plus cher à générer et à envoyer que les recherches DNS habituelles.

Commentaires (0)