Инженер по безопасности Адам Райс (Adam Rice), специализирующийся на создании CTF-задач, регулярно использует DNS TXT-записи для доставки полезных нагрузок в своих сценариях. Идея проста: TXT-записи - это произвольные текстовые поля без какой-либо валидации содержимого. Если через них можно доставить шеллкод, то почему не целую программу?
DNS — протокол без встроенного контроля содержимого. Именно это свойство делает его удобным транспортом не только для резолвинга имён, но и для произвольных данных. Инженер по безопасности Адам Райс наглядно показал это, реализовав запуск DOOM целиком через TXT-записи одной DNS-зоны.
Как это реализовано
Архитектура проекта состоит из двух частей: серверной (подготовка и загрузка данных в DNS) и клиентской (скачивание и запуск).
Серверная часть
1. За основу взят managed-doom - порт оригинального движка DOOM на чистый C#. Выбор не случаен: .NET-сборки (managed assemblies) можно загрузить в память через Assembly.Load() из массива байт, без записи файлов на диск (удобный метод для "стелс"-вирусов, кстати).
2. Форк движка (doom-over-dns) потребовал серьёзных модификаций:
• Убрана работа с файловой системой - загрузка WAD-файла переведена на MemoryStream.
• Заменена нативная оконная библиотека GLFW на прямые Win32 API-вызовы через P/Invoke.
• Полностью удалён звук (для экономии места в DNS-записях).
• Компиляция переведена с Native AOT на framework-dependent .NET 8 - иначе рефлексия невозможна.
3. С компрессией WAD-файл сжимается с 4 МБ до 1.7 МБ, бандл DLL - с 4.4 МБ до 1.2 МБ. Итого ~3 МБ данных, закодированных в base64, распределённых по 1 966 TXT-записям в одной DNS-зоне (в целом не рекордное количество и DNS-хостинги такое позволяют).
4. Загрузка записей выполняется через CloudFlare API (скрипт Publish-DoomOverDNS.ps1). Процесс занимает около 15 минут. Используется зона CloudFlare Pro (до 3 400 записей).
Клиентская часть
PowerShell-скрипт Start-DoomOverDNS.ps1 - около 250 строк кода:
1. Читает метаданные из специальной DNS-записи stripe-meta, чтобы узнать количество чанков и контрольную хеш-сумму.
2. Последовательно резолвит ~2 000 TXT-записей через стандартный Resolve-DnsName.
3. Декодирует base64, собирает данные в памяти, проверяет целостность по хешу.
4. Загружает .NET-сборки через рефлексию (Assembly.Load()) и запускает игру.
Весь процесс занимает 10–20 секунд. На диск не записывается ни одного файла.
Параметры проекта
Параметр | Значение |
WAD-файл (сжатый) | 1.7 МБ (из 4 МБ) |
DLL-бандл (сжатый) | 1.2 МБ (из 4.4 МБ) |
Кол-во TXT-записей | ~1 966 |
Время загрузки с DNS | 10–20 секунд |
Файлов на диске | 0 |
Стоимость зоны | $20/мес (CloudFlare Pro) |
DNS как транспорт - давно не шутка
Проект Райса - отличная инженерная демонстрация, но сама идея использования DNS не по назначению имеет богатую и далеко не безобидную историю.
DNS-туннелирование
Инструменты Iodine и dnscat2 существуют уже много лет. Iodine позволяет туннелировать полноценный IPv4-трафик через DNS-запросы - создаётся виртуальный сетевой интерфейс, и удалённые машины работают как будто в одной сети. Dnscat2 ориентирован на создание зашифрованных C2-каналов (Command & Control) через DNS, поддерживая типы записей A, AAAA, CNAME, MX, TXT.
Оба инструмента активно используются как в red team-операциях, так и реальными атакующими. DNS-трафик формально корректен, не нарушает сетевые политики и свободно проходит через большинство межсетевых экранов.
Реальные атаки
• SUNBURST (SolarWinds, 2020) - один из крупнейших инцидентов в истории кибербезопасности. Бэкдор использовал DNS-запросы для C2-связи: идентификаторы жертв кодировались в поддоменах.
• OilRig (APT34) - иранская APT-группировка с 2016 года использует кастомные инструменты DNS-туннелирования (Helminth, ISMAgent, BONDUPDATER) как основной метод C2-коммуникации.
• Cobalt Strike DNS Beacon - утёкшие версии легитимного инструмента стали стандартом у реальных атакующих. DNS Beacon полностью управляет заражённой системой через DNS-запросы к порту 53.
Доставка малвари через TXT-записи
В июле 2025 года исследователи DomainTools задокументировали малварь Joker Screenmate - код был разбит на фрагменты и спрятан в DNS TXT-записях нескольких поддоменов. Каждый фрагмент по отдельности выглядел безобидно, но при последовательном запросе и сборке превращался в рабочий payload. Рядом с «шуточным» кодом обнаружился PowerShell-стейджер, способный загрузить и выполнить произвольную нагрузку.
Принцип идентичен тому, что использует Райс для загрузки DOOM. Разница в том, что рабочий пример с открытым кодом теперь общедоступен.
ICMP-туннели и другие «творческие» протоколы
DNS - не единственный протокол, который эксплуатируют подобным образом.
ICMP-туннелирование - данные инкапсулируются в ICMP Echo Request/Reply (обычный ping). RFC 792 не ограничивает содержимое поля data в ICMP-пакетах, поэтому туда можно вложить произвольную полезную нагрузку:
• icmptunnel - туннелирует весь IP-трафик через ICMP echo/reply, создавая виртуальный интерфейс. Используется для обхода captive-порталов и файрволов.
• ptunnel - туннелирует TCP-соединения через ICMP, обеспечивая ~50 Kbps пропускной способности.
• icmpsh - реверс-шелл, полностью работающий по ICMP.
pingfs - файловая система, хранящая данные исключительно «в интернете» в виде ICMP Echo-пакетов, постоянно летающих между хостами. По сути - delay line memory образца XXI века. Данные существуют только пока пинги ходят туда-обратно.
Сравнение техник скрытых каналов
Техника | Пропускная способность | Детектирование | Применение |
DNS-туннелирование через домены | Средняя (десятки Kbps) | Требует DPI и поведенческого анализа на уровне DNS-резолвера. Классические межсетевые экраны без инспекции DNS-трафика не детектируют. Но это возможно в Ideco NGFW и SkyDNS. | C2, эксфильтрация, доставка payload |
ICMP-туннелирование | ~50 Kbps (ptunnel) | Аномальные размеры пакетов | C2, обход captive-порталов |
TXT record delivery в DNS | До ~3 МБ за 20 сек | Массовые TXT-запросы | Доставка малвари, DOOM |
Почему это важно для ИБ
Проект DOOM over DNS наглядно демонстрирует то, о чём специалисты по безопасности (и мы) говорим: DNS - часто слепая зона корпоративных сетей. Более 91% вредоносного ПО использует DNS на тех или иных этапах атаки, при этом почти 60% организаций не осуществляют мониторинг DNS-трафика на регулярной основе.
Всё, что показал Райс - base64-кодирование данных в TXT-записях, побайтовая сборка в памяти, запуск через рефлексию без записи на диск - является точным описанием техники, которую уже используют реальные атакующие.
С точки зрения защиты здесь сходятся несколько факторов:
• Формальная корректность. Каждый DNS-запрос к TXT-записи - абсолютно легитимен с точки зрения протокола. Классические файрволы его пропустят.
• Отсутствие артефактов на диске. Ни одного файла не создаётся - антивирусные сканеры, работающие с файловой системой, бесполезны.
• Массовость запросов. Пачка из 2 000 TXT-запросов за 10–20 секунд - это аномалия, которую можно и нужно детектировать.
• Обход сегментации. Даже устройства без прямого доступа в интернет умеют резолвить DNS через внутренние серверы, с которых трафик уходит наружу.
Именно для закрытия этой «слепой зоны» существуют решения уровня DNS Security: анализ энтропии доменных имён, эвристики по частоте и объёму запросов, ML-модели для детектирования аномального поведения. Как подробно разобрано в нашем обзоре, фильтрация DNS-трафика - это первый рубеж, который блокирует угрозу ещё до установления TCP/TLS-соединения.
Выводы
Проект DOOM over DNS - красивая инженерная работа, наглядно показывающая возможности протокола, которому почти 45 лет. Но для индустрии безопасности это одновременно и напоминание: каждая «весёлая демонстрация» - это proof of concept для атакующих.
Технически между доставкой DOOM и доставкой вредоносной нагрузки нет архитектурной разницы: base64-кодирование данных в TXT-записях, побайтовая сборка в памяти, исполнение без записи на диск. NGFW без инспекции DNS-трафика не имеет точки видимости в этот канал и, следовательно, не может зафиксировать ни факт передачи данных, ни аномалию в паттерне запросов. |
