Перейти к содержимому

TShark анализ pcap: автоматизация детекта Kerberoasting, AS-REP Roasting и LDAP-разведки в CI-пайплайне

TShark анализ pcap: автоматизация детекта Kerberoasting, AS-REP Roasting и LDAP-разведки в CI-пайплайне
Время чтения: 14 мин.

В 2024 году ransomware-группа положила Ascension — одну из крупнейших сетей клиник в США. По данным Zscaler, точкой входа стали слабости Kerberos с RC4-шифрованием в Active Directory. Инцидент дошёл до сенатора Рона Уайдена, который написал в FTC с требованием привлечь Microsoft за поддержку устаревшего RC4. Между первым аномальным запросом сервисного тикета и полным захватом домена прошли часы — но в pcap-дампе (файле с записью сетевого трафика) атака была видна с первого пакета. Автоматического разбора, который поднял бы тревогу, не было.

Здесь — конкретная задача: один bash-скрипт, который принимает pcap на вход, прогоняет через цепочку TShark-фильтров и выдаёт вердикт — есть ли в трафике следы Kerberoasting, AS-REP Roasting или LDAP-разведки. Скрипт встраивается в CI/CD-пайплайн (конвейер автоматической сборки и тестирования) и работает без GUI на любом сервере с установленным TShark.

Бизнес-логика атак: от LDAP-разведки до компрометации домена Active Directory

Прежде чем писать фильтры, разберём, зачем атакующему эти три техники. Все они сидят на раннем этапе kill chain — между получением первого доступа в корпоративную сеть (initial access) и латеральным движением (lateral movement). Конечная цель — учётные данные, которые откроют путь к Domain Admin.

LDAP-перечисление — этап разведки. Атакующий подключается к контроллеру домена (DC — сервер, управляющий Active Directory) по протоколу LDAP и запрашивает список учётных записей с определёнными свойствами: привязанные Service Principal Names (SPN — идентификаторы, связывающие сервис типа SQL Server или IIS с учётной записью AD) или установленный флаг DONT_REQUIRE_PREAUTH. По классификации MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1558 — её идентификаторы) этот шаг относится к тактике Discovery.

Kerberoasting следует за разведкой. Обнаружив учётные записи с SPN, атакующий запрашивает у KDC (Key Distribution Center — компонент AD, выдающий тикеты аутентификации) сервисный тикет TGS-REP для каждого SPN. Тикет зашифрован хешем пароля сервисной учётной записи. Если DC возвращает тикет с шифрованием RC4-HMAC (etype 23 — устаревший алгоритм, который ломается на GPU за часы), атакующий забирает его и перебирает пароль офлайн. В MITRE ATT&CK это техника T1558.003, тактика Credential Access.

AS-REP Roasting (T1558.004, тактика Credential Access) бьёт по учётным записям с отключённой Kerberos pre-authentication — предварительной аутентификацией, при которой клиент доказывает знание пароля до получения тикета. Если pre-auth отключена, KDC возвращает AS-REP (Authentication Service Response) с данными, зашифрованными паролем пользователя, вообще без проверки. По данным Netwrix, типичные жертвы — legacy-учётки сервисов и совместимости, со статичными паролями и широким доступом.

Финансовый импакт конкретен: скомпрометированная сервисная учётка с правами на бэкапы или scheduled tasks открывает атакующему путь к данным, инфраструктуре деплоя и ransomware-развёртыванию — как в случае с Ascension. Все три техники оставляют чёткие следы в сетевом трафике. И их можно ловить автоматически через анализ pcap.

Требования к окружению

Перед написанием фильтров — чеклист готовности стенда.

  • ОС: Linux (Ubuntu 22.04+, Debian 12+, Kali Linux). macOS поддерживается, но CI-раннеры обычно крутятся на Ubuntu
  • TShark: версия 3.6+ (входит в пакет tshark или wireshark-common). Проверка: tshark --version
  • bash: 4.0+ (стандарт на современных Linux)
  • RAM: для pcap до 500 МБ хватит 2 ГБ. Для файлов 1 ГБ+ нужно 4+ ГБ
  • pcap-дампы: из продакшена (снятые с SPAN-порта или сетевого TAP на сегменте AD) или сгенерированные в лаборатории утилитами Rubeus / Impacket (GetUserSPNs.py). Тестовые дампы с Kerberos-трафиком доступны на wiki.wireshark.org/SampleCaptures
  • Для CI: GitHub Actions или GitLab CI раннер с правами sudo (для установки tshark)

Установка на Ubuntu: sudo apt-get install -y tshark. При установке система спрашивает, разрешать ли захват трафика непривилегированным пользователям — для CI-контекста ответ «Да».

TShark фильтры для детекта Kerberoasting в pcap

Kerberoasting оставляет характерный сетевой след: запросы TGS-REQ (Ticket Granting Service Request, тип сообщения Kerberos 12) и ответы TGS-REP (тип 13), где шифрование — RC4-HMAC (etype 23). В современных AD-средах нормой стал AES256 (etype 18), поэтому RC4 в TGS-обмене — красный флаг.

Как выглядит Kerberoasting в трафике

В нормальной инфраструктуре (Windows Server 2016+, функциональный уровень домена 2012 R2+, актуальные патчи) TGS-ответы используют AES256-CTS-HMAC-SHA1-96. Появление RC4-HMAC в TGS-REP означает одно из двух: либо в домене живёт legacy-система, требующая RC4, либо кто-то намеренно запрашивает слабое шифрование для офлайн-перебора.

Фильтр для TGS-REQ с запросом RC4 ловит момент, когда клиент просит устаревшее шифрование: tshark -r evidence.pcap -Y 'kerberos.msg_type == 12 && kerberos.etype == 23'. Здесь -r указывает файл pcap, а -Y задаёт display filter (фильтр отображения — работает после разбора пакета, в отличие от capture filter, который отбрасывает пакеты при записи). Поле kerberos.msg_type == 12 отбирает TGS-запросы, kerberos.etype == 23 — только те, где запрошен RC4.

Для структурированного вывода добавьте -T fields с нужными полями: tshark -r evidence.pcap -Y 'kerberos.msg_type == 13 && kerberos.etype == 23' -T fields -e frame.number -e ip.src -e ip.dst -e kerberos.CNameString. Это покажет номер кадра, IP источника и назначения, имя клиента. Если из одного IP за секунды приходят десятки TGS-REQ с RC4 к разным SPN — перед вами Kerberoasting.

Ложные срабатывания и предусловия

[Применимо: внутренний мониторинг, AD-среды с функциональным уровнем домена 2008 R2+]

Ложные срабатывания возникают в средах с legacy-системами, легитимно требующими RC4 — старые SQL Server, Java-приложения на устаревших JDK, некоторые NAS-устройства. Если такие системы есть, дополните фильтр исключением их IP: && !(ip.src == 10.0.2.50).

Работает если: Kerberos-трафик идёт по TCP/UDP 88 в открытом виде (стандарт внутри корпоративной сети). Не работает если: между точкой захвата и DC стоит VPN-туннель или IPsec — TShark не разберёт содержимое зашифрованных пакетов.

AS-REP Roasting: обнаружение в сетевом дампе через TShark

AS-REP Roasting (T1558.004) эксплуатирует учётные записи с отключённой pre-authentication. Нормальный поток выглядит так: клиент отправляет AS-REQ (тип 10) с зашифрованной меткой времени PA-ENC-TIMESTAMP, KDC проверяет — и только потом возвращает AS-REP (тип 11) с TGT (Ticket Granting Ticket — тикет, дающий право запрашивать другие тикеты). Если pre-auth отключена, KDC отдаёт AS-REP без проверки — любой участник сети получает данные, зашифрованные паролем жертвы.

Как описывает XPN InfoSec Blog, в Wireshark-захвате разница видна сразу: для защищённой учётки — AS-REQ, ответ ERR_PREAUTH_REQUIRED, второй AS-REQ с PA-ENC-TIMESTAMP, AS-REP. Для учётки без pre-auth — первый же AS-REQ и мгновенно AS-REP с зашифрованным TGT. Этот зашифрованный блоб атакующий передаёт в Hashcat (режим 18200) или John the Ripper для перебора.

Фильтры TShark для AS-REP Roasting

Ключевой индикатор — AS-REP (msg_type 11) с шифрованием RC4-HMAC (etype 23): tshark -r evidence.pcap -Y 'kerberos.msg_type == 11 && kerberos.etype == 23' -T fields -e frame.number -e ip.dst -e kerberos.CNameString. Здесь ip.dst — адрес получателя AS-REP (адрес атакующего), а kerberos.CNameString покажет имя учётной записи, для которой выдан ответ.

Для углублённого анализа полезно также ловить сами AS-REQ: tshark -r evidence.pcap -Y 'kerberos.msg_type == 10' -T fields -e ip.src -e kerberos.CNameString. Если из одного IP летят AS-REQ к десяткам разных CName — это паттерн перебора, характерный для Rubeus (asreproast) или Impacket (GetNPUsers.py). По данным Atomic Red Team (публичный набор тестов для техник MITRE ATT&CK), стандартные тесты для T1558.004 включают Rubeus и PowerView — оба генерируют именно такой Kerberos-трафик.

XPN InfoSec Blog также описывает использование TShark на offensive-стороне: команда tshark -r capture.pcap -T pdml > output.pdml конвертирует pcap в PDML-формат (XML-представление пакетов), после чего скрипт krbpa2john.py из JTR Jumbo извлекает AS-REP хеши для офлайн-перебора. Тот же TShark-вывод, который blue team берёт для детекта, red team берёт для эксплуатации. Знание обеих сторон — то, что отличает специалиста от оператора.

Как отличить от легитимного трафика

Единичный AS-REP с RC4 сам по себе — не приговор. Windows по умолчанию сначала отправляет AS-REQ без pre-auth, получает ERR_PREAUTH_REQUIRED и повторяет запрос — это поведение описано в RFC 4120 (Kerberos V5), §3.1.3. Подозрительным становится объёмный паттерн: десятки AS-REQ к разным CName из одного IP за секунды. У легитимного клиента нет причин перебирать имена учётных записей.

LDAP-перечисление: обнаружение разведки AD в сетевом трафике

Перед запуском Kerberoasting или AS-REP Roasting атакующий проводит разведку: ищет учётные записи с SPN или с отключённой pre-authentication. Стандартный метод — LDAP-запросы к контроллеру домена.

Индикаторы в LDAP-запросах

Два типа LDAP search requests однозначно указывают на подготовку к атаке.

Поиск SPN-учёток (преамбула Kerberoasting). Атакующий запрашивает объекты с атрибутом servicePrincipalName. Фильтр: tshark -r evidence.pcap -Y 'ldap.filter contains "servicePrincipalName"' -T fields -e frame.number -e ip.src -e ldap.filter. Если фильтр вернул строки — кто-то целенаправленно ищет сервисные учётки.

Поиск учёток без pre-auth (преамбула AS-REP Roasting). Как описывает XPN InfoSec Blog, атакующий использует LDAP-фильтр с битовой маской: (userAccountControl:1.2.840.113556.1.4.803:=4194304). Значение 4194304 — десятичное представление флага DONT_REQUIRE_PREAUTH (0x400000). Фильтр TShark: tshark -r evidence.pcap -Y 'ldap.filter contains "userAccountControl"' -T fields -e frame.number -e ip.src -e ldap.filter. Появление подстроки 4194304 или 1.2.840.113556.1.4.803 в выводе — практически гарантированный индикатор разведки. Ни одно штатное бизнес-приложение не ищет учётные записи по этому критерию.

Общий объём LDAP search-запросов с одного IP тоже информативен. Команда tshark -r evidence.pcap -Y 'ldap' -T fields -e ip.src | sort | uniq -c | sort -rn покажет, какой адрес сгенерировал больше всего LDAP-запросов. Всплеск от одного источника на фоне стабильного baseline — повод копнуть глубже.

[Применимо: внутренний мониторинг. Не работает, если LDAP-трафик идёт через LDAPS (порт 636/TCP с TLS) — TShark не разберёт содержимое запросов без ключей шифрования.]

Какой фильтр включать: decision tree

Выбор набора фильтров зависит от инфраструктуры:

  • Современная среда без legacy (Server 2016+, AES-only): etype 23 в любом Kerberos-обмене — однозначная аномалия, whitelist не нужен. Включайте все три фильтра
  • Среда с legacy-системами (старые SQL, JDK 6, NAS): все три фильтра + whitelist IP-адресов систем, легитимно использующих RC4
  • В pcap нет LDAP-трафика (захват только на порту 88): фильтры Kerberoasting и AS-REP Roasting без LDAP-перечисления

Один скрипт — автоматизация разбора pcap для SOC

Фильтры собраны — объединяем в один скрипт. Логика простая: TShark прогоняет pcap трижды (по разу на каждый тип атаки) и подсчитывает подозрительные пакеты. Если хотя бы один счётчик ненулевой — скрипт завершается с кодом 1, и CI-пайплайн помечает джоб как failed.

#!/bin/bash
PCAP="${1:?Использование: $0 <файл.pcap>}"
KERB=$(tshark -r "$PCAP" -Y 'kerberos.msg_type==13 && kerberos.etype==23' 2>/dev/null | wc -l)
ASREP=$(tshark -r "$PCAP" -Y 'kerberos.msg_type==11 && kerberos.etype==23' 2>/dev/null | wc -l)
LDAP_E=$(tshark -r "$PCAP" -Y 'ldap.filter contains "servicePrincipalName" || ldap.filter contains "userAccountControl"' 2>/dev/null | wc -l)
printf '{"kerberoasting":%d,"asrep_roasting":%d,"ldap_enum":%d}\n' "$KERB" "$ASREP" "$LDAP_E"
if [ "$KERB" -gt 0 ] || [ "$ASREP" -gt 0 ] || [ "$LDAP_E" -gt 0 ]; then exit 1; fi
exit 0

Построчно. Первая строка принимает аргумент — путь к pcap; если не передан, скрипт выведет подсказку и остановится. Переменные KERB, ASREP и LDAP_E хранят количество строк вывода TShark — по сути, количество пакетов, прошедших фильтр. Перенаправление 2>/dev/null глушит stderr-сообщения TShark о загрузке диссекторов. printf формирует JSON с тремя полями. Последние две строки — проверка: если любой счётчик больше нуля, exit code 1.

Ожидаемый вывод при чистом трафике: {"kerberoasting":0,"asrep_roasting":0,"ldap_enum":0} и код возврата 0. При обнаружении атаки — ненулевые значения и код 1, джоб падает, CI отправляет нотификацию.

На практике скрипт обрастает деталями за неделю: добавляются метки времени первого и последнего подозрительного пакета (-e frame.time), список уникальных SPN, IP-адреса источников. JSON превращается в артефакт инцидента — его можно отправить в Slack через curl или положить в артефакты пайплайна для разбора.

Автоматизация в CI/CD: сетевой мониторинг в пайплайне SOC

Скрипт готов — встраиваем в пайплайн. Ниже конфиг для GitHub Actions: устанавливает TShark, забирает pcap-файлы из репозитория (папка tests/) и прогоняет скрипт. Если скрипт вернёт exit code 1, джоб провалится и придёт уведомление.

name: AD pcap analysis
on: [push, workflow_dispatch]
jobs:
  detect:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: |
          echo 'wireshark-common wireshark-common/install-setuid boolean false' | sudo debconf-set-selections
          sudo apt-get update
          sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tshark
      - run: chmod +x detect_ad_attacks.sh
      - run: |
          for f in tests/*.pcap; do
            echo "--- Scanning $f ---" && ./detect_ad_attacks.sh "$f"
          done

Для GitLab CI логика та же: image: ubuntu:22.04, стадия test, скрипт apt-get install -y tshark && ./detect_ad_attacks.sh tests/evidence.pcap. Артефакты сохраняются через artifacts: paths:.

Сценарии применения

SOC / Blue Team. Периодический анализ pcap-дампов с SPAN-порта или Zeek-сенсора на сегменте AD. Дампы складываются в git-репозиторий или подтягиваются из S3/MinIO, скрипт запускается по расписанию (on: schedule: cron: '0 */4 * * *'). Срабатывание — алерт в Slack.

Detection Engineering. Когда команда пишет новые детект-правила, pcap с тестовым трафиком атаки работает как unit-тест. Добавили дамп с Kerberoasting-трафиком, сгенерированным через Impacket GetUserSPNs.py в лаборатории, — скрипт должен вернуть ненулевой счётчик. Не вернул — правило не работает, коммит не проходит.

Ограничения TShark-подхода и когда он не работает

Автоматизация анализа pcap через TShark — инструмент, не серебряная пуля. Вот конкретные ситуации, когда подход деградирует.

Сценарий TShark-детект Альтернатива
Kerberos по TCP/UDP 88 (открытый) Работает
Kerberos через IPsec/VPN Не видит содержимое SIEM с данными от DC (Event ID 4769)
LDAP порт 389 (открытый) Работает
LDAPS порт 636 (TLS) Не расшифровывает без ключей LDAP-аудит на DC (Event ID 1644)
Корреляция N запросов за T секунд Не поддерживает Zeek + SIEM-правило
Legacy-среда с легитимным RC4 Высокий FP без whitelist IP-whitelist в скрипте

Отсутствие корреляции — главное ограничение. TShark обрабатывает каждый пакет изолированно: он не скажет «10 TGS-REQ с RC4 за 5 секунд от одного IP». Для такого уровня детекта нужен SIEM — Elastic Security 8.x+ или Microsoft Sentinel — или Zeek, который строит connection-level логи и агрегирует сессии.

Детекция через EDR/Identity Protection. Microsoft Defender for Identity детектит Kerberoasting и AS-REP Roasting на уровне контроллера домена, анализируя Event ID 4769 (Ticket Encryption Type = 0x17 для RC4) и Event ID 4768. CrowdStrike Falcon Identity Protection покрывает аналогичные сценарии на identity-уровне. TShark-подход дополняет эти решения сетевой видимостью, которую они не дают, но не заменяет — особенно в средах без сетевого TAP.

Альтернативные инструменты. Для потокового мониторинга лучше подходят Zeek (бывший Bro) — он строит kerberos.log с полями request_type, cipher, client — и Suricata с правилами ET OPEN/ET PRO для Kerberoasting. Оба масштабируются на гигабиты трафика. TShark-скрипт из этой статьи — для точечного анализа дампов и CI-валидации, не для inline-мониторинга.

По классификации MITRE D3FEND (knowledge graph защитных техник), ключевые контрмеры против T1558.004 включают D3-CH (Credential Hardening — усиление паролей сервисных учёток и включение pre-auth), D3-DUC (Decoy User Credential — создание honeypot-учёток для раннего детекта; Zscaler описывает схему: decoy-учётка без pre-auth, с 30-символьным паролем, любой TGS-REQ к которой — автоматический индикатор атаки) и D3-CR (Credential Revocation — немедленная ротация при подозрении).

Среди SOC-инженеров укоренилось убеждение: для детекта атак на Kerberos достаточно мониторинга Windows Event Log. Event ID 4769 с Ticket Encryption Type 0x17 — и тема закрыта. Но я наблюдал ситуации, когда атакующий после компрометации DC первым делом чистил или отключал журналы Security — и весь детект на Event ID исчезал. Pcap с сетевого TAP — слой, который атакующий не контролирует: TGS-REP с etype 23 невозможно подделать или стереть постфактум, если дамп уже записан.

Неудобная правда: большинство команд этот слой игнорируют. Проще поставить галочку «SIEM мониторит 4769» и считать тему закрытой. Автоматизация pcap-анализа в CI меняет логику: дамп попадает в пайплайн, скрипт отрабатывает за секунды, JSON уходит в Slack. Не нужен аналитик, вручную открывающий Wireshark. Нужен инженер, который один раз напишет фильтр — и забудет до момента, когда пайплайн упадёт.

Это ремесло, и оно начинается с понимания того, что именно летит по проводу и почему. Если хочешь не разбирать чужие pcap по статьям, а системно освоить базу SOC-аналитика — IB Basics на codeby.school покрывает фундамент, от которого строятся такие пайплайны.

Эту тему и смежные навыки разбирают на практике в курсе «Аналитик SOC» Codeby Academy.