РАЗБОР Статья

Атака на цепочку поставок через заброшенный домен

Сергей Попов
Сергей Попов Red Team · 6,7 тыс. сообщений
Подписаться
434
[ обложка статьи ]
Режим чтения
Разорванный чёрный конверт на тёмной антистатической поверхности, восковая печать расколота пополам: одна часть со штампом просроченного регистратора домена, другая — с ценником в двенадцать доллар...


На внешнем пентесте финансовой организации я нашёл в DNS CNAME-запись, ведущую на домен виджета обратной связи от стороннего SaaS-вендора. Домен истёк два месяца назад и был доступен для регистрации за $12. После согласования с заказчиком расширения scope (захват домена третьей стороны выходит за стандартные ROE - нужно отдельное разрешение) я зарегистрировал домен, поднял HTTP-сервер, настроил DNS. Через 48 часов на мой лог посыпались запросы: браузеры сотрудников, внутренние порталы, автоматизированные системы. Несколько тысяч уникальных хостов. EDR молчал, алертов в SIEM не было - трафик шёл по CNAME-пути, который существовал три года и ни у кого не вызывал подозрений. По MITRE ATT&CK это Compromise Infrastructure: Domains (T1584.001, Resource Development). Стоимость атаки - чашка кофе.

Бизнес-логика атаки: зачем злоумышленнику заброшенный домен​

Атака на цепочку поставок через заброшенные домены работает на одном принципе: доверие наследуется, даже когда объект доверия исчез. Организация подключает сторонний виджет, CDN или аналитику через внешний домен - тот попадает в белые списки CSP-политик, CORS-правил, firewall-исключений. Домен вендора истекает, а все доверительные отношения остаются на месте. Атакующий регистрирует домен и наследует накопленное доверие. Подробнее - в нашем материале про asset management пентест.

Монетизация зависит от типа перехваченного ресурса:

Тип ресурсаВектор монетизацииМасштаб
JavaScript-библиотека (CDN)Инъекция стилера, майнера, редиректPolyfill.io - 100 000+ сайтов
Поддомен для SaaS-интеграцииФишинг от имени бренда, спамSubdoMailing - 8 000+ поддоменов
Домен пакетного менеджераПодмена пакета, RCE через обновлениеMavenGate, django-log-tracker
Email-сервис (MX-записи)Перехват переписки, BEC-атакиЗахват MX истёкшего домена

Стоимость входа: регистрация домена - $8-15, VPS - $5/месяц. Один заброшенный домен CDN-виджета может дать initial access к десяткам тысяч эндпоинтов одновременно. По данным IBM X-Force Threat Intelligence Index 2025, среднее время между публикацией CVE и устранением в организации - 29 месяцев. Для истёкших доменов и dangling DNS нет ни CVE, ни патча, ни сканера. Эти записи могут жить годами, и никто не почешется.

В терминологии MITRE ATT&CK цепочка выглядит так:
  • Reconnaissance: WHOIS (T1596.002) + DNS (T1590.002) - поиск истекающих доменов и dangling-записей
  • Resource Development: Acquire Infrastructure: Domains (T1583.001) - покупка домена
  • Initial Access: Supply Chain Compromise (T1195) - подмена ресурса. Для кейсов внедрения вредоносного кода в пакет/зависимость (Polyfill.io, django-log-tracker) применимы T1195.001/T1195.002; для generic domain takeover через dangling DNS корректнее рассматривать захват домена как этап Resource Development (T1584.001/T1583.001), а Initial Access происходит через доверенный канал загрузки ресурса
Предусловия для эксплуатации:

ПредусловиеОписание
Домен вендора истёкДоступен для регистрации через WHOIS или аукцион
DNS-записи клиента не очищеныCNAME/A/MX указывают на несуществующий ресурс
Мониторинг DNS отсутствуетОрганизация не отслеживает статус third-party доменов
Доверительные отношения активныCSP, CORS, firewall-правила не обновлены

Recon: поиск заброшенных доменов в supply chain​

1794213562853.webp

WHOIS-разведка и мониторинг истечения доменов​

Первый этап - собрать все внешние домены, от которых зависит целевая инфраструктура. На пентесте я начинаю с пассивного сбора: парсинг JavaScript-файлов на сайте цели через Developer Tools (вкладка Network, фильтр по сторонним доменам), анализ CSP-заголовков (Content-Security-Policy), проверка DNS-записей SPF/DKIM/DMARC. Каждый домен третьей стороны - потенциальная точка захвата.

Массовая проверка WHOIS для списка обнаруженных доменов:
Bash:
# Проверка дат истечения третьесторонних доменов
while read domain; do
  expiry=$(whois "$domain" 2>/dev/null | grep -i "expir" | head -1)
  echo "$domain | $expiry"
done < third_party_domains.txt | sort -t'|' -k2
Для масштабной автоматизации подходят SecurityTrails API и WhoisXML API - они хранят историческую WHOIS-информацию и позволяют отслеживать смену регистранта. Если домен сменил владельца с корпоративного на частный аккаунт или перешёл в статус pendingDelete - красный флаг.

Инструмент dnstwist полезен для обнаружения domain squatting - атаки на инфраструктуру через похожие доменные имена. Но для нашего сценария важнее мониторинг точных доменов вендоров, уже прописанных в инфраструктуре цели, а не поиск тайпосквоттинга.

Поиск dangling DNS-записей​

Dangling DNS record - DNS-запись (CNAME, A, MX), указывающая на ресурс, который больше не контролируется владельцем записи. По данным исследования BitSight TRACE, заброшенные домены продолжают получать трафик спустя месяцы и годы после прекращения использования. В одном из наблюдаемых случаев сотни истёкших доменов календарных сервисов получали запросы синхронизации с миллионов устройств. Представьте масштаб: миллионы устройств стучатся на домен, который можно купить за десятку.

Связка amass + ручная верификация через dig для поиска dangling-записей:
Bash:
# Перечисление поддоменов цели
amass enum -passive -d target.com -o subdomains.txt
# Проверка CNAME на dangling
while read sub; do
  cname=$(dig +short CNAME "$sub" 2>/dev/null)
  if [ -n "$cname" ]; then
    resolved=$(dig +short A "$cname" 2>/dev/null)
    [ -z "$resolved" ] && echo "DANGLING: $sub -> $cname"
  fi
done < subdomains.txt
Если CNAME указывает на домен, который не резолвится - потенциальный subdomain takeover. Если CNAME ведёт на домен с истёкшей регистрацией - это эксплуатация истёкших доменов с готовым вектором initial access.

Отдельно стоит проверять облачные сервисы. По данным BitSight, исследователи безопасности демонстрировали subdomain takeover на платформах Shopify и GitHub Pages: удалённые hosted-сайты оставляли за собой CNAME-записи, позволяя атакующим захватить незарегистрированный ресурс и раздавать вредоносный контент с доверенных корпоративных поддоменов. По сути - вы раздаёте малварь с домена условного bank.com, и браузер даже не моргнёт.

Цепочка атаки: от покупки домена до перехвата трафика​

1794213643681.webp

Пошаговый разбор - обобщённый сценарий из нескольких проектов.

Шаг 1: Сбор third-party зависимостей. Анализ всех внешних ресурсов, загружаемых сайтом цели. Developer Tools, Network Tab, фильтр по сторонним доменам. Дополнительно: curl -s https://target.com | grep -oP 'src="https?://[^"]*"' для извлечения всех внешних скриптов и стилей.

Шаг 2: Проверка WHOIS и DNS. Для каждого стороннего домена - проверка статуса регистрации. Домен в статусе redemptionPeriod, pendingDelete или с истёкшим Expiry Date - кандидат для захвата заброшенного домена.

Шаг 3: Регистрация. Стандартная регистрация через любого регистратора. Стоимость: $8-15 для .com/.io. Некоторые домены доступны только через аукционы (GoDaddy Auctions, NameJet) - цена редко превышает $50.

Шаг 4: Настройка инфраструктуры. DNS-сервер с теми же типами записей (A, MX), которые использовал оригинальный вендор. На VPS - HTTP/HTTPS-сервер с логированием всех входящих запросов. Let's Encrypt выпустит сертификат бесплатно, потому что домен теперь наш (если на домене не осталась CAA-запись, ограничивающая выпуск другим CA, и домен не попал в blocklist CA/Browser Forum).

Шаг 5: Перехват трафика. В первые часы после настройки DNS начинают приходить запросы от систем, которые до сих пор ссылаются на захваченный домен. Лог-файл покажет масштаб: User-Agent, Referer, IP-адреса, типы запросов. Десятки, сотни или тысячи систем, зависящих от одного ресурса - и все они теперь ваши.

Шаг 6 (PoC для клиента). Для отчёта достаточно вернуть кастомный JavaScript с alert('PoC: domain takeover by [pentester]') или отдать JSON с контролируемым payload. В реальной атаке здесь был бы стилер, криптомайнер или редирект.

И вот что интересно: на шагах 3-6 не эксплуатируется ни одна уязвимость в традиционном понимании. Нет CVE, нет exploit-кода, нет обхода защиты. Только организационный пробел - никто не отслеживает домены третьих сторон.

Кейсы захвата заброшенных доменов в supply chain​

Polyfill.io (июнь 2024). Сервис для совместимости JavaScript с устаревшими браузерами. Домен и GitHub-аккаунт проданы CDN-провайдеру Funnull, после чего cdn.polyfill.io начал раздавать вредоносный код. По данным Kaspersky, через фейковый домен, имитирующий Google Analytics (www[.]googie-anaiytics[.]com), пользователей перенаправляли на сайт ставок. На момент инцидента Polyfill.io использовали более 100 000 сайтов. Скрипт сервиса до сих пор торчит на десятках тысяч сайтов - типичная supply chain атака через домен, где компрометация одной точки распространения затронула всю downstream-цепочку.

SubdoMailing (2024). По данным Guardio Labs (описано BitSight), атакующие захватили более 8 000 поддоменов известных брендов - MSN, McAfee, The Economist, Cornell University, CBS, Marvel, eBay. Механизм: supply chain атака через поддомен - организации привязывали поддомены к внешним сервисам, при деактивации сервисов dangling DNS-записи оставались. Атакующие зарегистрировали ресурсы, на которые указывали записи, и использовали доверие к брендам для массовой рассылки фишинга. 8 000 поддоменов - это не единичный инцидент, это индустрия.

django-log-tracker (февраль 2024). Заброшенный пакет на PyPI - последнее легитимное обновление в 2022 году. По данным Kaspersky, злоумышленники получили контроль над аккаунтом разработчика и загрузили обновление с инфостилером Nova Sentinel. Вредонос тянул пароли из браузеров, ключи от криптокошельков, сессионные токены. Классический захват аккаунта вендора в хозяйстве пакетных менеджеров.

MavenGate. Согласно исследованию Maven-Hijack (arxiv), атака MavenGate эксплуатировала предположения о владении пространствами имён (groupId) в Maven. Атакующие перерегистрировали истёкшие домены, связанные с groupId, публикуя вредоносные версии ранее доверенных Java-библиотек.

Для контекста масштаба: CVE-2024-3094 (XZ Utils) получил CVSS 10.0 (CRITICAL) с вектором CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H и классификацией CWE-506 (Embedded Malicious Code). EPSS 0.9090 (Top 1%) - вероятно, из-за множества публичных PoC-чекеров и широкого обсуждения в сообществе, а не из-за продолжающейся активной эксплуатации уже устранённого бэкдора. Операция длилась два с половиной года - пользователь под ником Jia Tan получил контроль над проектом, модифицированная liblzma попала в тестовые версии GNU/Linux-дистрибутивов. Принцип тот же: компрометация цепочки поставок через DNS, код или аккаунт - результат одинаков.

Subdomain takeover: эксплуатация dangling CNAME​

1794213697751.webp

Subdomain takeover - частный случай захвата заброшенного домена, только на уровне поддоменов. Механизм:
  1. Организация создаёт CNAME: status.company.com -> company.statuspage.io
  2. Statuspage-аккаунт отключают, но CNAME остаётся
  3. Атакующий создаёт аккаунт на Statuspage и привязывает company.statuspage.io
  4. status.company.com теперь отдаёт контент атакующего
Для domain hijacking в этом сценарии не нужна покупка домена - достаточно зарегистрировать аккаунт на SaaS-платформе. Бесплатно.

Наиболее уязвимые паттерны (по данным публичных исследований, упомянутых BitSight):

ПлатформаПаттерн CNAMEПризнак dangling
GitHub Pages*.github.io404 при обращении
Shopify*.myshopify.comShopify default page
Azure*.azurewebsites.netNXDOMAIN
AWS S3*.s3.amazonaws.comNoSuchBucket
Heroku*.herokuapp.comNo such app

Для автоматизации обнаружения - subjack и проект can-i-take-over-xyz на GitHub с актуальным списком fingerprints для каждой платформы.

Что проверять и как защититься от захвата домена вендора​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Заброшенные домены - один из тех векторов, который не вписывается в привычную модель управления уязвимостями. Нет CVE, нет CVSS, нет патча. Сканер периметра не поймает dangling CNAME. SIEM не алертнёт на загрузку скрипта с домена, который три года был в белом списке. На практике, на каждом втором внешнем пентесте находится хотя бы одна dangling DNS-запись, указывающая на ресурс, который никто не контролирует.

Большинство команд безопасности фокусируются на том, что они контролируют: свои серверы, приложения, код. Но атака на цепочку поставок через заброшенные домены бьёт по зонам вне контроля. Домен вендора, который закрылся. CDN-ссылка, которую забыли убрать при миграции. Поддомен, созданный маркетологом для промо-страницы два года назад. Всё это - артефакты, которые превращаются в точки initial access за $10 и 15 минут работы.

В ближайший год мы увидим рост целевых атак через перерегистрацию доменов пакетных менеджеров и CDN-провайдеров. Polyfill.io был демонстрацией масштаба - 100 000+ сайтов через один домен. Атакующим не нужен zero-day, когда достаточно подождать, пока домен вендора уйдёт на аукцион. Проверьте свой периметр скриптом из раздела про dangling CNAME - если хоть одна запись ведёт в пустоту, у вас та же проблема, что я нашёл на том пентесте. Только без пентестера на вашей стороне. Если хочешь отработать эту цепочку руками - на HackerLab.pro (ХакерЛаб) есть web-задачи, где DNS-разведку и subdomain takeover нужно пройти от recon до полного захвата.
Сергей Попов
Автор материалаСергей Попов
OSINT, Веб-безопасность
Полезно · 1

Комментарии

0