Detect C2 через DNS-over-HTTPS: какие алерты настроить SOC-аналитику

Varonis Threat Labs взяли открытый инструмент GoDoH, подняли C2-канал через DNS-over-HTTPS — и убедились: вредоносный домен, завёрнутый в HTTPS-запрос к Cloudflare или Google DNS, полностью невидим для стандартных DNS-логов и большинства IDS. В перехваченном трафике конечный адресат — не C2-сервер атакующего, а dns.google.com. По данным hunt.io, 70% ransomware-атак в 2023 году опирались на C2-инфраструктуру, а DoH делает обнаружение этой инфраструктуры задачей другого уровня. Множество образцов вредоносного ПО уже используют DNS-over-HTTPS для C2-коммуникаций и эксфильтрации данных. Разберу конкретные точки детекта, покажу Sigma-правило и SIEM-запрос — чтобы дежурный SOC-аналитик мог настроить алерты в свою смену.
Зачем атакующие прячут C2 в DoH-трафике
C2 (Command and Control) — канал связи между вредоносом на заражённом хосте и сервером атакующего. Через него передаются команды: загрузи модуль, выгрузи файлы, перемещайся по сети к ценным активам. В классификации MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1071 — её идентификаторы) использование протоколов прикладного уровня для C2 описано в технике T1071 — Application Layer Protocol, тактика Command and Control.
Классический C2 через DNS работает просто: вредонос кодирует данные в поддоменах — скажем, exfil-base64.evil.com — и отправляет DNS-запрос через штатный резолвер организации. SOC видит эти запросы в логах и ловит аномалии: длинные поддомены с высокой энтропией, необычные типы записей (TXT, ANY). Это классический dns tunneling, для него давно написаны рабочие правила.
DoH (DNS-over-HTTPS) — протокол, передающий DNS-запросы внутри зашифрованного HTTPS-соединения (RFC 8484, принят в 2018 году). Для SOC-аналитика это переворачивает картину:
- DNS-запрос уходит не к корпоративному резолверу, а к публичному DoH-провайдеру по порту 443
- Содержимое зашифровано TLS — IDS не видит, какой домен запрашивается
- В сетевых логах фигурирует только IP Cloudflare или Google — адрес, который никто не заблокирует по умолчанию
- DNS-логи корпоративного резолвера остаются чистыми: запрос к нему просто не приходит
Публичный DoH-провайдер работает как бесплатный прокси для вредоносного трафика. Varonis формулируют точно: «бесплатный domain fronting для вредоносной активности через DNS».
Зачем это атакующему: скрытый C2-канал позволяет месяцами удерживать связь с заражённым хостом. Через него загружают дополнительные модули, выгружают украденные данные (exfiltration), координируют lateral movement — перемещение от хоста к хосту в направлении ценных активов. По CrowdStrike Global Threat Report 2025, среднее время lateral movement после первичного доступа — 62 минуты (рекорд — 51 секунда). Пока C2-канал жив, атакующий действует свободно. По Mandiant M-Trends 2025, медианное время нахождения злоумышленника в сети до обнаружения — 11 дней. Если C2 зашифрован, этот срок может быть значительно больше.
Как устроен C2-канал через DNS-over-HTTPS
Разберём механику на примере. Атакующий контролирует домен c2.evil.example и использует инструмент вроде GoDoH (открытый proof-of-concept, протестированный Varonis Threat Labs в лабе).
Вредонос формирует DNS-запрос к encoded-cmd.c2.evil.example. Вместо отправки через корпоративный DNS-резолвер запрос оборачивается в HTTPS и уходит на публичный DoH-эндпоинт — скажем, https://dns.google/dns-query?name=encoded-cmd.c2.evil.example&type=TXT. Google DNS разрешает запрос и возвращает TXT-запись от авторитативного DNS-сервера атакующего — всё внутри зашифрованного HTTPS.
Что видит SOC-аналитик в логах: HTTPS-соединение с dns.google (IP 8.8.8.8) на порту 443. Домена c2.evil.example в логах нет — он спрятан внутри зашифрованного payload. Varonis зафиксировали этот эффект при тестировании GoDoH: FQDN (полное доменное имя) C2-сервера оказывался либо в GET-параметрах URL (зашифрованных TLS), либо в теле HTTP POST-запроса.
Вариации, которые дополнительно усложняют обнаружение c2 через dns:
- HTTP POST вместо GET — домен C2 в теле запроса, вообще не виден даже при дешифровке URL
- Собственный DoH-сервер атакующего вместо публичного — трафик идёт на неизвестный IP по стандартному порту 443, неотличимый от обычного HTTPS
- Domain fronting через CDN — техника, описанная исследователями RedTeam.pl: SNI (Server Name Indication — расширение TLS, где клиент указывает имя сервера открытым текстом при установке соединения) показывает домен CDN-провайдера, а реальный запрос уходит на DoH-сервер атакующего
Каждая из этих вариаций требует своего подхода к детекту.
Слепые зоны: почему мониторинг DNS запросов SOC не ловит DoH C2
Типичный SOC-мониторинг DNS опирается на три источника данных. Каждый из них «слеп» к DoH-каналам.
| Источник | Что видит обычно | Почему не ловит DoH |
|---|---|---|
| Логи DNS-резолвера организации | Все DNS-запросы от хостов сети | DoH-запрос к резолверу не приходит — он идёт напрямую к публичному провайдеру |
| IDS/IPS (Suricata, Snort) | DNS по UDP/53 в открытом виде | HTTPS по порту 443 зашифрован TLS — содержимое DNS-запроса недоступно |
| Прокси-логи | HTTP(S)-запросы через корпоративный прокси | Вредонос может обходить прокси, устанавливая прямое соединение |
Рекомендации NIST CSF v2.0 (подкатегория DE.AE-01) требуют установленного baseline сетевых операций и ожидаемых потоков данных для пользователей и систем. Без понимания, какие процессы на каких хостах легитимно используют DoH, обнаружение аномалий невозможно.
Отдельная засада: начиная с Windows 11 и Windows Server 2022, DoH настраивается на уровне ОС — не только в браузере. Запрет DoH через браузерные GPO (Group Policy Object — механизм централизованного управления настройками Windows в домене) и рекомендации DISA STIG для Chrome, Edge и Firefox — шаг нужный, но недостаточный. Любой бинарник на хосте может самостоятельно открыть HTTPS-соединение к 1.1.1.1, минуя все браузерные ограничения. Varonis прямо пишут: «организации должны понимать, что отключение DoH через GPO в корпоративных браузерах — это не финальное решение».
Обнаружение C2 через зашифрованный DNS: три метода detection engineering
TLS SNI и IP-фильтрация: базовый doh c2 детект
До массового внедрения ECH (Encrypted Client Hello) значение SNI в TLS-соединениях передаётся открытым текстом и доступно в сетевых логах. Это самая простая точка обнаружения: если хост устанавливает TLS-соединение с SNI dns.google или cloudflare-dns.com — он использует DoH.
Публичные DoH-эндпоинты для мониторинга:
| Провайдер | Домен | IP-адреса |
|---|---|---|
| dns.google | 8.8.8.8, 8.8.4.4 | |
| Cloudflare | cloudflare-dns.com | 1.1.1.1, 1.0.0.1 |
| Quad9 | dns.quad9.net | 9.9.9.9, 149.112.112.112 |
| Mozilla/Cloudflare | mozilla.cloudflare-dns.com | 1.1.1.1 |
| OpenDNS | doh.opendns.com | 208.67.222.222 |
Ключевой вопрос — кто именно инициирует соединение. Chrome или Firefox с DoH в настройках — нарушение политики, но не инцидент. А вот powershell.exe, rundll32.exe или неизвестный бинарник, стучащий на 1.1.1.1 по порту 443, — красный флаг, требующий эскалации.
Ограничение метода: если атакующий поднял собственный DoH-сервер, его IP не окажется ни в каком публичном списке. Для таких сценариев нужны следующие два метода.
JA3-фингерпринтинг DoH-сессий
JA3 — метод фингерпринтинга TLS-клиентов по параметрам сообщения ClientHello: версия TLS, наборы шифров (cipher suites), расширения протокола. JA3S — аналогичный фингерпринт серверного ответа (ServerHello). Каждое приложение — Chrome, Firefox, GoDoH, кастомный C2-агент на Python — генерирует свой JA3-хэш.
Зачем это для detection engineering doh трафика: TLS-соединение к 1.1.1.1 с JA3-хэшем, не совпадающим ни с одним из корпоративных браузеров — аномалия. GoDoH или скрипт на Python дадут JA3, отличный от браузерного.
Предусловие: Zeek (ранее Bro) развёрнут на span-порту или TAP с модулем JA3 — установка через zkg install ja3. Zeek вычисляет JA3/JA3S для каждого TLS-соединения и записывает в ssl.log. Suricata поддерживает JA3 начиная с версии 4.1.
Порядок действий:
- Собери baseline легитимных JA3-хэшей — запусти Chrome, Edge, Firefox на тестовом хосте с включённым DoH и запиши их хэши из Zeek
ssl.log. Это твой «белый список» - Настрой фильтр в SIEM: TLS-соединения к IP из таблицы DoH-провайдеров, где JA3 не совпадает с baseline
- Каждое несовпадение — алерт на расследование
Ограничение: продвинутый вредонос может имитировать JA3-параметры браузера, подставляя нужные cipher suites и extensions. Это требует дополнительной разработки со стороны атакующего и встречается реже, чем стандартные C2-клиенты. Но знать об этом стоит — чтобы не полагаться на один метод.
DNS beaconing detection: ловим скрытые каналы c2 по поведению
C2-маяки (beacons) «стучат» на сервер с определённой периодичностью — каждые 30 секунд, минуту, 5 минут. Даже при полном шифровании ритм соединений виден в метаданных. Этот метод работает против любого зашифрованного канала, включая кастомные DoH-серверы, где фильтрация по IP/домену бесполезна.
На что смотреть:
- Периодичность — регулярные соединения к одному IP с постоянным интервалом. Jitter (отклонение от среднего) ниже 20% указывает на автоматику, а не на живого человека
- Соотношение download/upload — метрика D3-PHDURA (Per Host Download-Upload Ratio Analysis, классификация MITRE D3FEND) выявляет аномальный обмен данными: C2-маяки обычно передают маленькие пакеты (команды), а exfiltration — большие
- Длительность сессий — DoH C2 может поддерживать длинные HTTPS-сессии с минимальным объёмом payload, что нетипично для веб-браузинга
- Время активности — соединения к DoH-провайдерам от рабочих станций в 3 часа ночи заслуживают проверки
Полезен и паттерн D3-RPA (Relay Pattern Analysis по D3FEND) — анализ паттернов ретрансляции в исходящем интернет-трафике, который помогает выявить хосты, работающие как relay-точки для C2.
Сводная таблица методов обнаружения:
| Метод | Что нужно | Что ловит | Что пропускает |
|---|---|---|---|
| SNI/IP-фильтрация | Firewall или Zeek ssl.log | DoH к публичным провайдерам | Кастомные DoH-серверы; ECH |
| JA3-фингерпринтинг | Zeek ssl.log или Suricata 4.1+ | Нестандартные TLS-клиенты | Агенты, копирующие JA3 браузера |
| Beaconing-анализ | SIEM + conn.log (time/bytes) | Любой C2, включая кастомный DoH | Низкочастотные маяки (раз в час и реже) |
Оптимальная стратегия — комбинация всех трёх. Первый ловит большинство случаев (публичные провайдеры). Второй выявляет нестандартных клиентов. Третий работает как страховка против продвинутых сценариев с собственными DoH-серверами.
Настройка алертов на dns tunneling через DoH: Sigma и SIEM-запросы для SOC-аналитика
В репозитории SigmaHQ по тегу attack.t1071 (Application Layer Protocol) доступно 79 правил детекции. Специализированного правила именно для doh malware c2 среди них пока нет. Ниже — правило, которое можно адаптировать под конкретную инфраструктуру.
Предусловие: нужны логи сетевых соединений с endpoint-агента — Sysmon Event ID 3 (Network Connection) или EDR-телеметрия, содержащая процесс-инициатор и IP назначения. Без информации о процессе правило даёт только IP-фильтрацию без контекста.
title: DoH Non-Browser Process (T1071)
logsource:
category: network_connection
product: windows
detection:
doh: {DestinationIp: ['8.8.8.8','1.1.1.1','9.9.9.9'], DestinationPort: 443}
ok: {Image|endswith: ['\chrome.exe','\firefox.exe','\msedge.exe']}
condition: doh and not ok
level: high
Что делает правило: срабатывает, когда любой процесс кроме Chrome, Firefox и Edge устанавливает HTTPS-соединение к IP публичных DoH-провайдеров. Уровень high — легитимных причин для такого поведения почти нет.
При срабатывании алерт покажет хост-источник, процесс-инициатор (Image), IP назначения. Если в Image окажется powershell.exe, python.exe, curl.exe или неизвестный бинарник — эскалируй.
Конвертация: утилита sigma-cli (pip install sigma-cli) переводит YAML в запросы для Splunk SPL, Elastic KQL, Microsoft Sentinel и других SIEM.
Эквивалентный запрос для Splunk, если Sysmon-логи поступают в индекс:
index=sysmon EventCode=3
dest_ip IN ("8.8.8.8","8.8.4.4","1.1.1.1","1.0.0.1","9.9.9.9")
dest_port=443
NOT (Image="*\\chrome.exe" OR Image="*\\firefox.exe"
OR Image="*\\msedge.exe")
| stats count by src_ip Image dest_ip
| sort - count
В выводе — таблица с колонками src_ip, Image, dest_ip и count. Браузеры отфильтрованы, всё что осталось — подозрительно. Нулевой результат — норма; любая строка заслуживает разбора.
Практика: настраиваем обнаружение doh c2 за три шага
Шаг 1. Собрать watchlist DoH-эндпоинтов и whitelist процессов.
Возьми таблицу DoH-провайдеров из этой статьи и создай в SIEM lookup-таблицу или watchlist с их IP-адресами и доменами. Параллельно составь whitelist процессов, которым разрешено обращаться к DoH — обычно это Chrome, Edge и Firefox. Если в инфраструктуре есть приложения, легитимно использующие DoH (некоторые VPN-клиенты, агенты мониторинга), добавь их в исключения, чтобы снизить число ложных срабатываний.
Как проверить: lookup содержит минимум 10 IP-адресов и 5 доменов. Whitelist — не более 5–7 записей. Если whitelist растёт за 10, стоит разобраться, почему столько приложений используют DoH — возможно, часть из них стоит заблокировать.
Шаг 2. Развернуть Sigma-правило в SIEM.
Конвертируй Sigma-правило через sigma-cli в формат твоего SIEM. Загрузи результат как correlation rule или scheduled search. Установи schedule — раз в 5–15 минут в зависимости от нагрузки.
Предусловие: Sysmon должен быть развёрнут на endpoint с включённым EventCode 3 (Network Connection). Без Sysmon правило не получит данных о процессах. Если Sysmon не развёрнут — используй логи файрвола или EDR-телеметрию, но потеряешь информацию о процессе-инициаторе.
Как проверить: запусти запрос вручную за последние 24 часа. Если в организации есть хосты с Windows 11 и включённым системным DoH — увидишь срабатывания от svchost.exe. Это ожидаемый false positive: добавь svchost.exe в whitelist, если DoH на уровне ОС разрешён корпоративной политикой.
Шаг 3. Протестировать детект на живом трафике.
Чтобы убедиться в работоспособности правила, сгенерируй тестовый DoH-запрос не из браузера. Предусловие: доступ к командной строке на хосте с Sysmon. Выполни из терминала:
curl -s -H "accept: application/dns-json" \
"https://dns.google/resolve?name=example.com&type=A"
В ответе — JSON с IP-адресом example.com. В SIEM через 5–15 минут (зависит от schedule) появится алерт: curl.exe обратился к 8.8.8.8:443. Если алерт есть — детект работает. Если нет — проверь, поступают ли Sysmon Event ID 3 в SIEM. Частая причина: EventCode 3 отключён в конфигурации Sysmon из-за объёма логов. Тогда включи его хотя бы с фильтром по dst_port 443.
После подтверждения добавь suppression для curl.exe на тестовом хосте, чтобы тестовые запросы не засоряли production-алерты.
Большинство рекомендаций по DoH в корпоративной среде сводятся к «заблокируй в браузерах через GPO и добавь IP DoH-резолверов в deny list на файрволе». Формально верно, на практике закрывает процентов восемьдесят. Проблема в остальных двадцати: любой бинарник может открыть HTTPS-соединение к произвольному IP на порту 443 и передать DNS-запрос внутри — никакой GPO этого не остановит. А если атакующий поднял собственный DoH-сервер, IP-фильтрация тоже бесполезна.
Настоящий навык SOC-аналитика — не знание конкретного списка DoH-провайдеров (он меняется), а умение строить детект по поведению: периодичность соединений, аномальное соотношение upload/download, нестандартные JA3-хэши, активность за рамками рабочего графика. Этот навык переносится на любой зашифрованный C2-канал — не только DoH. Наработать его по отдельным гайдам тяжело: нужна системная тренировка на реальных логах с разбором ложных срабатываний и выстраиванием приоритетов. Если SOC-мониторинг — направление, в которое вы переходите, и хочется пройти базу системно — на IB Basics показывают не теорию, а как джуны реально решают задачи в blue team.
Эту тему и смежные навыки разбирают на практике в курсе «Аналитик SOC» Codeby Academy.
