Анализ сетевого трафика (pcap)

Если диск говорит «что осталось на машине», то трафик говорит «что и куда уходило по сети» — и часто это единственный свидетель эксфильтрации данных.

pcap (packet capture) — файл с сохранёнными сетевыми пакетами «как они летели по проводу». Из него реконструируют сессии, восстанавливают переданные файлы и выявляют каналы управления (C2) и утечки.

Этот урок — про криминалистику сети: как из захваченного трафика извлечь картину инцидента. Работаем в режиме защитника и расследователя: анализируем трафик своей сети или лабораторного стенда. Перехват чужого трафика без полномочий нарушает тайну связи (ст. 138 УК РФ), поэтому всё ниже — про захват на своём периметре и разбор учебных дампов.

Зачем это знать защитнику

Многие следы атаки не остаются на диске вовсе: «бесфайловый» вредонос живёт в памяти, а данные утекают в зашифрованном потоке, не касаясь локального хранилища. Сеть видит то, что скрыто от хоста: к какому внешнему серверу ходила машина, как часто, сколько данных отдала. Реконструкция трафика отвечает на ключевые вопросы инцидента — «была ли эксфильтрация», «есть ли управляющий канал», «какие ещё хосты заражены». Без сетевой телеметрии расследование однобоко: вы видите взлом, но не его масштаб и не вывод данных.

Захват трафика

Пакеты захватывают там, где они проходят: на хосте, на зеркалирующем порту коммутатора (SPAN/TAP), на шлюзе. Базовая иллюстрация захвата в лаборатории:

# Захват в файл на лабораторном интерфейсе (метод, не таргет)
tcpdump -i eth0 -w capture.pcap
# Ограничить срез интересующим хостом стенда
tcpdump -i eth0 host 10.0.0.5 -w host.pcap

Главный принцип форензики применим и здесь: захват нужно настроить до инцидента (постоянный сенсор на периметре) — задним числом «переснять» вчерашний трафик нельзя. И сразу зафиксировать целостность дампа: хеш файла + журнал «кто, где, когда снял», иначе доказательство оспорят.

Реконструкция сессий

Сырые пакеты неудобно читать поштучно: TCP-поток разбит на сегменты, перемешан повторами и подтверждениями. Инструменты (Wireshark, tshark, Zeek, NetworkMiner) собирают сессии обратно: склеивают сегменты в непрерывный диалог, выделяют, кто инициатор, какие протоколы внутри, какие файлы передавались. В Wireshark это «Follow TCP/HTTP Stream» — он показывает запрос и ответ целиком, как переписку. Несколько базовых фильтров отображения для сортировки трафика:

http.request                # все HTTP-запросы
dns                         # DNS-запросы и ответы
ip.addr == 10.0.0.5         # весь трафик подозрительного хоста
tcp.flags.syn == 1 && tcp.flags.ack == 0   # попытки установить соединение

Из реконструированного HTTP- или FTP-потока часто удаётся извлечь переданный файл (carving по содержимому ответа). Незашифрованные протоколы выдают многое; с TLS содержимое скрыто, но метаданные (адрес, объём, SNI-имя в рукопожатии) остаются — и их достаточно для выводов.

Выявление эксфильтрации и C2

Признаки эксфильтрации

Эксфильтрация — вывод данных наружу. В трафике она проявляется как заметный исходящий объём к внешнему адресу, который обычно ничего не получает; передача в нерабочее время; необычный протокол для таких данных. Классический трюк — DNS-туннелирование: данные кодируются в длинных поддоменах (a8f3...x9.tunnel.example) и «утекают» через, казалось бы, безобидные DNS-запросы. Признак — аномально длинные, высокоэнтропийные доменные имена и шквал запросов к одному домену.

Признаки C2 (beaconing)

C2 (command-and-control) — канал, по которому заражённая машина получает команды. Его выдаёт beaconing: регулярные, однообразные обращения к одному адресу через равные промежутки (например, каждые 60 секунд) — заражённый хост «звонит домой» за инструкциями. Человеческий трафик нерегулярен и разнообразен, а маячок ритмичен. Простой Python-эвристик: если соединения к одному адресу идут с почти постоянным интервалом и низким разбросом — это подозрительно на beaconing.

import statistics

# Времена соединений (сек) к одному внешнему адресу, извлечённые из pcap
timestamps = [0, 60, 121, 180, 239, 301, 360]

intervals = [b - a for a, b in zip(timestamps, timestamps[1:])]
mean = statistics.mean(intervals)
spread = statistics.pstdev(intervals)        # разброс интервалов

print(f"Интервалы: {intervals}")
print(f"Средний интервал: {mean:.1f} c, разброс: {spread:.2f} c")
print("Подозрение на beaconing" if spread < 5 else "Похоже на обычный трафик")

Вывод:

Интервалы: [60, 61, 59, 59, 62, 59]
Средний интервал: 60.0 c, разброс: 1.15 c
Подозрение на beaconing

Малый разброс при постоянном интервале — сильный признак автоматического маячка. На практике эвристику дополняют: одинаковый размер пакетов, обращения по таймеру даже когда пользователь неактивен, обращение к свежезарегистрированному домену.

Как это работает под капотом

Захват опирается на режим, в котором сетевая карта отдаёт ОС копии проходящих кадров (через libpcap/WinPcap); каждый пакет сохраняется с временной меткой и заголовками канального, сетевого и транспортного уровней. Реконструкция сессии — это обратная сборка: анализатор сопоставляет пакеты по «пятёрке» (адреса и порты источника/назначения + протокол), упорядочивает TCP-сегменты по номерам последовательности, отбрасывает дубликаты и склеивает полезную нагрузку в непрерывный поток. Поверх этого протокольные парсеры распознают HTTP, DNS, TLS и достают поля (URL, домены, имена сертификатов). Выявление аномалий — уже статистика над метаданными потоков: распределение объёмов, периодичность, энтропия доменных имён. Важное ограничение: шифрование (TLS) прячет содержимое, поэтому современная сетевая форензика всё больше опирается на метаданные и поведение потоков, а не на чтение полезной нагрузки.

Как защититься

1. Постоянный захват/сенсор на периметре. Зеркалируйте трафик на IDS/сенсор (Suricata, Zeek) с ротацией дампов. Тогда при инциденте есть что разбирать, а не пустота.

2. Фиксируйте целостность дампов. Хеш pcap-файла и журнал сбора (где, когда, кем снят) превращают захват в доказательство, которое выдержит проверку.

3. Алерты на beaconing и DNS-аномалии. Правила на регулярные обращения к одному адресу, на длинные/высокоэнтропийные домены и всплески исходящего объёма ловят C2 и эксфильтрацию раньше, чем утечёт всё.

4. Снижайте слепые зоны TLS. Логируйте метаданные (SNI, объёмы, репутацию адресов); там, где политика и закон позволяют, применяйте контролируемую инспекцию на корпоративном шлюзе. Не пытайтесь «расшифровать» чужой трафик вне своих систем.

5. Анализируйте только разрешённый трафик. Свой периметр, лабораторные дампы, инциденты в своей организации. Перехват чужой связи без полномочий — ст. 138 УК РФ.

Итоги

  • pcap сохраняет пакеты «как с провода»; из них реконструируют сессии и нередко извлекают переданные файлы.
  • Сеть видит то, чего нет на диске: эксфильтрацию и C2-каналы — поэтому сетевая телеметрия незаменима для оценки масштаба инцидента.
  • Beaconing (регулярные однообразные обращения к одному адресу) и DNS-туннелирование (длинные высокоэнтропийные домены) — ключевые индикаторы.
  • Шифрование прячет содержимое, но метаданные потоков (адрес, объём, периодичность, SNI) остаются и достаточны для выводов.
  • Захват настраивают заранее, фиксируют целостность дампа и анализируют только разрешённый трафик (ст. 138 УК РФ о тайне связи).
Проверьте себя
1. Какой паттерн в трафике сильнее всего указывает на C2-канал (beaconing)?
AРегулярные однообразные обращения к одному внешнему адресу через почти равные промежутки с малым разбросом интервалов
BРазнообразные обращения к множеству популярных сайтов в рабочее время
CЕдиничный крупный входящий файл с сервера обновлений
DСлучайные всплески трафика без какой-либо периодичности
2. Почему современная сетевая криминалистика всё больше опирается на метаданные потоков, а не на чтение полезной нагрузки?
AПотому что TLS-шифрование скрывает содержимое, но адрес, объём, периодичность и SNI остаются видимыми
BПотому что полезная нагрузка никогда не содержит полезной информации
CПотому что метаданные позволяют расшифровать любой TLS-трафик
DПотому что чтение нагрузки запрещено в любой лаборатории