Как мога да изброя ВСИЧКИ DNS записи?

Има ли някакъв начин да изпиша ВСИЧКИ DNS записи за даден домейн?

Знам за такива неща като dig и nslookup, но те стигат само дотам. Например, ако имам A запис на поддомейн като

test A somedomain.co.uk

тогава, ако не го поискам изрично, напр.

dig any test.somedomain.co.uk

не мога да го видя.

Има ли някакъв начин (освен да прегледате записите, като отидете в DNS мениджъра) да видите какви точно са всички DNS записи?

Решение

Когато направите заявка за ANY, ще получите списък с всички записи на това ниво, но не и на по-ниско.

# try this
dig google.com any

Това може да върне A записи, TXT записи, NS записи, MX записи и т.н., ако името на домейна е точно "google.com". Въпреки това няма да върне подчинени записи (напр. www.google.com). По-точно, МОЖЕТЕ да получите тези записи, ако те съществуват. Сървърът за имена не е длъжен да връща тези записи, ако реши да не го прави (например, за да намали размера на отговора).

AXFR е прехвърляне на зона и вероятно е това, което искате. Обикновено обаче те са ограничени и не са достъпни, освен ако не контролирате зоната. Обикновено ще извършите прехвърляне на зона директно от авторитетния сървър (@ns1.google.com по-долу) и често от сървър за имена, който може да не е публикуван (скрит сървър за имена).

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

Ако имате контрол над зоната, можете да я настроите да получава прехвърляния, които са защитени с ключ TSIG. Това е споделена тайна, която клиентът може да изпрати на сървъра, за да оторизира прехвърлянето.

Коментари (6)

Поради липсата на възможност за прехвърляне на зони написах този малък 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

Сега използвам dg example.com, за да получа хубав, чист списък с DNS записи, или dg example.com x, за да включа куп други популярни поддомейни.

grep -vE "${wild_ips}" филтрира записите, които биха могли да бъдат резултат от запис в DNS със заместващ символ, като например * 10800 IN A 1.38.216.82. В противен случай записът с wildcard ще изглежда така, сякаш има записи за всеки $COMMON_SUBDOMAN.

Забележка: Това разчита на заявки ANY, които са блокирани от някои доставчици на DNS като CloudFlare.

Коментари (1)

Това, което искате, се нарича прехвърляне на зона. Можете да заявите прехвърляне на зона, като използвате dig -t axfr.

Една зона е домейн и всички домейни под него, които не са делегирани на друг сървър.

Имайте предвид, че прехвърлянето на зони не се поддържа винаги. Те не се използват при нормално търсене, а само при репликиране на DNS данни между сървъри; но има други протоколи, които могат да се използват за това (например rsync през ssh), може да има риск за сигурността от излагане на имена, а генерирането и изпращането на отговорите за прехвърляне на зони струва повече, отколкото при обичайните DNS търсения.

Коментари (0)