Статья DNS пентест: от разведки и zone transfer до cache poisoning, rebinding и туннелирования

Матричный принтер на чёрном столе печатает зелёным шрифтом вывод DNS zone transfer с именами хостов и IP-адресами. Янтарный свет сверху, глубокая тень, атмосфера ночной разведки.


На внутреннем пентесте банковской сети мы запустили dig axfr @ns2.target.bank target.bank - и получили полный дамп зоны с 340+ записями. Четыре минуты работы. Вторичный NS оказался legacy-BIND с дефолтной конфигурацией: AXFR разрешён для любого IP. В дампе - имена вроде dc01-prod, jenkins-build, vault-backup. Субдомены дали карту инфраструктуры, паттерны именования хостов - подсказки для брутфорса учёток. Дальнейший lateral movement и выход на domain admin - три дня. Пропорция показательная.

DNS - точка входа, которую многие считают «тривиальной». А потом удивляются, когда именно через неё раскручивается весь engagement.

Дальше - конкретные техники DNS-разведки, cache poisoning, DNS rebinding и туннелирования с командами, ограничениями каждого метода и привязкой к MITRE ATT&CK.

Как работает DNS-протокол и где он ломается​

Прежде чем ломать протокол, надо понимать его на уровне пакетов. Когда ты набираешь dig @8.8.8.8 example.com, разворачивается цепочка:

Stub resolver - DNS-клиент на твоей машине - формирует UDP-пакет и отправляет его рекурсивному резолверу (здесь - 8.8.8.8). Резолвер лезет в кэш. Если записи нет - запускает цепочку запросов: к корневому серверу, затем к серверу зоны .com, затем к авторитативному серверу домена example.com. Авторитативный сервер отвечает конкретной записью (A, MX, TXT). Резолвер кэширует ответ на время, определённое полем TTL (Time To Live) - число в секундах, после которого запись считается устаревшей.

Каждый DNS-пакет несёт Transaction ID - 16-битное число, связывающее запрос с ответом. Если атакующий угадает Transaction ID и отправит поддельный ответ быстрее настоящего сервера - резолвер примет фальшивые данные. На этом строится cache poisoning.

Ключевые типы DNS-записей для пентестера:

ТипСодержимоеЗачем атакующему
A / AAAAIPv4 / IPv6 адресКарта инфраструктуры
MXПочтовый серверВектор фишинга, определение почтовой платформы
NSАвторитативные серверыЦели для zone transfer
TXTПроизвольный текст (SPF, DKIM, верификации)Утечка конфигурации
AXFRПолная копия зоныДамп всех записей домена
CNAMEАлиас на другой доменDangling CNAME - вектор subdomain takeover
SRVСервисные записи (Kerberos, LDAP)Обнаружение AD-контроллеров

Корень проблемы: UDP на порту 53 без шифрования и без аутентификации ответов. Из этого растут почти все DNS-атаки.

DNS-разведка: пассивная и активная​

DNS-разведка - первый этап любого пентеста. По MITRE ATT&CK это техники Gather Victim Network Information: DNS (T1590.002, Reconnaissance) и Search Open Technical Databases: DNS/Passive DNS (T1596.001, Reconnaissance).

Пассивная DNS-разведка​

Пассивная разведка не генерирует трафик к целевой инфраструктуре - работаешь с публичными источниками.

Certificate Transparency Logs - через crt.sh находятся субдомены, для которых выпускались SSL-сертификаты. Запрос curl -s "https://crt.sh/?q=%.target.com&output=json" | jq -r '.[].name_value' | sort -u возвращает уникальные имена. Passive DNS базы - SecurityTrails, VirusTotal хранят историю DNS-резолвов. Субдомен, который больше не резолвится, но когда-то указывал на IP - потенциальный dangling record и вектор subdomain takeover. WHOIS - whois target.com покажет NS-серверы, иногда IP-диапазоны в поле inetnum, контактные email.

Инструмент subfinder (ProjectDiscovery, активно поддерживается, 10k+ звёзд на GitHub) автоматизирует сбор из десятков пассивных источников: subfinder -d target.com -silent. По данным WhoisXML API, Amass и Subfinder - отраслевой стандарт для subdomain enumeration в пентесте.

Ограничение: пассивная разведка показывает только то, что было публично. Внутренние субдомены, split-horizon DNS и свежие записи не попадут в результаты. Это начало, не финиш.

DNS zone transfer атака и subdomain enumeration​

Zone transfer (AXFR) - первое, что проверяется на engagement. Если авторитативный NS разрешает AXFR с произвольных IP, атакующий получает полный дамп зоны - полный DNS enumeration одной командой:
Код:
dig axfr @ns1.target.com target.com
Если трансфер запрещён - ответ Transfer failed. Проверять стоит каждый NS-сервер отдельно: конфигурация может различаться между первичным и вторичным. На практике вторичные NS чаще оказываются misconfigured - по документам всё закрыто, а вторичный NS просто забыли.

Subdomain brute-force - перебор поддоменов по словарю. dnsenum --dnsserver <DNS_IP> --enum -p 0 -s 0 -o subdomains.txt -f /path/to/wordlist target.com выполняет zone transfer, затем словарный перебор. dnsrecon -d target.com -a -n <DNS_IP> добавляет reverse lookup и cache snooping.

Decision tree: когда какой инструмент использовать

УсловиеДействиеИнструмент
Начало engagement, нужна максимальная тишинаПассивный сбор из CT logs, Passive DNSsubfinder, amass -passive
Есть IP авторитативного NSПопробовать zone transferdig axfr, dnsrecon
Zone transfer закрыт, нужны субдоменыСловарный переборdnsenum, dnsx
Внутренний пентест, ищем AD-контроллерыSRV-записи для Kerberos/LDAPdig -t SRV _ldap._tcp.dc._msdcs.domain.com
Bug bounty, широкий скоупКомбинация пассива и актива с дедупликациейamass + subfinder + dnsx

Разведка AD через DNS: SRV-записи выдают контроллеры домена, серверы Kerberos и LDAP - dig -t SRV _kerberos._tcp.corp.target.com @<DNS_IP>. Эти записи нужны самому AD, удалить их нельзя. На внутреннем пентесте это первый шаг к пониманию структуры домена.

Контекст применимости: на внешнем пентесте открытый AXFR ожидаем разве что на legacy-инфраструктуре или второстепенных доменах. На внутреннем - шансы выше, особенно в сетях с DNS-серверами разных поколений.

DNS cache poisoning и DNS spoofing​

DNS cache poisoning - атака, при которой поддельная запись внедряется в кэш рекурсивного резолвера. Все клиенты, обращающиеся к этому резолверу, получают подменённый IP-адрес. По MITRE ATT&CK ближайшая техника - Adversary-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay (T1557.001) в контексте name resolution poisoning.

Атака Камински: механика и ограничения​

В 2008 году Дэн Камински показал, что рандомизация Transaction ID сама по себе недостаточна. Механика такая:

Атакующий отправляет резолверу запрос на несуществующий субдомен - random123.target.com. Резолвер обращается к авторитативному серверу. Пока идёт ожидание ответа, атакующий засыпает резолвер поддельными ответами, перебирая Transaction ID. Ключевой трюк: в поддельном ответе атакующий не просто подменяет A-запись, а добавляет Additional Section, заявляя, что NS для всего домена target.com теперь находится по IP атакующего. Если Transaction ID совпал - резолвер кэширует подмену, и все последующие запросы к target.com идут через DNS spoofing.

Пространство перебора: Transaction ID - 16 бит, 65 536 возможных значений. При скорости тысяч пакетов в секунду вероятность попадания ненулевая. Source port randomization (RFC 5452) добавляет ещё 16 бит, увеличивая пространство до ~1 миллиарда комбинаций.

Ограничения в современных средах:
  • DNSSEC - цифровая подпись записей. Поддельный ответ не пройдёт валидацию. Но DNSSEC до сих пор внедрён далеко не везде.
  • Source port randomization - стандарт с 2008 года. Проверка: dig +short porttest.dns-oarc.net TXT @<resolver> покажет, насколько предсказуемы source-порты целевого резолвера.
  • DNS over HTTPS (DoH) / DNS over TLS (DoT) - шифрование транспорта закрывает MITM между клиентом и резолвером, но не защищает участок «резолвер - авторитативный сервер». DoH bypass - отдельная головная боль для blue team: если пользователь включил DoH в браузере, корпоративный DNS-прокси его не видит.
Практический вердикт: cache poisoning по Камински на внешнем пентесте нереализуем против современных резолверов. На внутреннем, где стоит legacy-dnsmasq или BIND без DNSSEC - вектор жив. Контекст: legacy-инфраструктура, внутренний пентест.

DNS rebinding атака

DNS rebinding эксплуатирует не кэш резолвера, а same-origin policy в браузере. Это отдельный вектор DNS-атаки, который пентестеры часто упускают - а зря.

Атакующий владеет доменом evil.com со своим авторитативным DNS-сервером. Жертва заходит на evil.com - браузер резолвит домен, получает IP атакующего, загружает JavaScript. DNS-сервер настроен на TTL в 1-2 секунды. Через несколько секунд JavaScript делает новый запрос к evil.com. На этот раз DNS отвечает уже внутренним IP жертвы - например, 192.168.1.1 (роутер) или 169.254.169.254 (AWS metadata endpoint). Браузер считает, что origin не изменился - домен тот же. JavaScript получает доступ к ресурсам внутренней сети.

Где это стреляет: DNS rebinding атака работает против внутренних веб-интерфейсов (роутеры, принтеры, IoT), облачных метаданных (SSRF через браузер), localhost-сервисов разработчиков - Jupyter, Docker API, Redis без аутентификации. По сути, это мост между внешним и внутренним пентестом: атакующий снаружи получает доступ к сервисам за NAT через браузер жертвы.

Ограничения: Chrome с версии 94+ реализует Private Network Access (PNA) - блокировку обращений публичных сайтов к приватным IP. Firefox внедряет аналогичную защиту. На практике PNA не покрывает все edge-кейсы, а не все внутренние сервисы проверяют соответствующие заголовки.

DNS-туннелирование: C2 и exfiltration через порт 53​

DNS-туннелирование - кодирование произвольных данных внутри DNS-запросов и ответов. По MITRE ATT&CK: Application Layer Protocol: DNS (T1071.004, Command and Control) и Protocol Tunneling (T1572, Command and Control).
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Что видит защита при DNS-атаках - и где слепые зоны​

По данным CyberDefenders, ключевые индикаторы DNS-туннелирования:
  • Длина поддоменов - легитимные запросы короткие и читаемые. Туннельные содержат base32/base64-строки, приближающиеся к лимиту 255 символов. Порог для алерта: поддомены длиннее 50 символов.
  • Shannon entropy - высокая энтропия (выше 4.0) указывает на закодированные данные. Для понимания: у слова login энтропия низкая, у dGhpcy1pcw== - высокая.
  • Объём запросов - один хост, генерирующий тысячи запросов к одному obscure-домену, - явная аномалия.
  • Редкие типы записей - всплеск TXT и NULL-запросов от одного источника.
  • Возраст домена - домены младше 30 дней без веб-контента.
Infoblox сообщает, что их ML-модель на базе CNN-автоэнкодера и Random Forest, обученная на миллионах легитимных доменов, достигает 99.9% precision и 99.5% recall при детекции DNS-туннелей. Модель анализирует reconstruction loss (насколько запрос отличается от «нормального» DNS-паттерна) и word segmentation ratio (содержит ли поддомен реальные слова или случайные символы).

Красивые числа. Но вот реальность.

Слепые зоны стандартного стека:

Stateful firewall видит факт DNS-запроса на порт 53, но не анализирует содержимое. Стандартный IDS/NGFW проверяет репутацию домена и базовые сигнатуры. DNS-туннель через легитимный облачный домен с короткими запросами и низкой частотой обходит эти правила. Если в организации нет dedicated DNS security-решения или DNS-прокси с глубоким анализом - DNS-туннель невидим.

Рекомендация для обеих сторон: blue team должен форсировать весь DNS через корпоративный резолвер (блокировать прямые обращения на 53/UDP к внешним DNS), включить логирование запросов и мониторить аномалии. Пентестеру стоит проверять: если прямой DNS к внешнему серверу заблокирован - iodine не заработает. В таком случае надо использовать внутренний резолвер как транзит, что iodine поддерживает по умолчанию.

Восемь техник MITRE ATT&CK, которые мы разобрали (T1590.002, T1596.001, T1071.004, T1572, T1557.001, T1568.001, T1583.002, T1048.003), покрывают DNS-вектор от разведки до эксфильтрации. Но в реальных проектах я вижу устойчивый паттерн: команды тратят 80% усилий на web-exploitation и AD-атаки, а DNS-разведку считают тривиальной. Ошибка. Zone transfer, который «не должен работать», работает на каждом пятом внутреннем пентесте, с которым я сталкивался за последние два года. DNS-туннель спасает engagement, когда всё остальное заблокировано. DNS rebinding атака даёт доступ к внутренним сервисам вообще без присутствия в сети - через браузер жертвы. Каждый из этих векторов по отдельности выглядит «нишевым», но вместе они складываются в целый слой атаки, который многие защитные команды просто не мониторят.

Мой совет: на следующем engagement начните не с nmap, а с полного DNS-аудита скоупа - количество находок удивит. Если хочешь повторить DNS-разведку и попробовать туннелирование в контролируемой инфре - на HackerLab.pro есть задачи, где DNS-вектор нужно раскручивать от первого запроса до получения данных.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab