Апокриф 08

Тихий след: уклонение от IDS и анти-форензика

Тихий след: уклонение от IDS и анти-форензика

Система обнаружения вторжений — это ещё один участник сети, который видит не всё и не всегда одинаково. Она собирает пакеты, собирает из них сессии, применяет правила и пишет журнал. Каждый из этих шагов — точка расхождения: то, что видит IDS, может отличаться от того, что видит получатель.

Уклонение строится именно на расхождении. Если IDS собирает фрагменты иначе, чем операционная система, правило можно обойти, отправив пакеты, которые система соберёт одним способом, а сенсор — другим. Если IDS декодирует только один слой кодирования, полезная нагрузка проходит во втором. Если IDS смотрит на сигнатуры, медленная активность под них не попадает.

Тема 22 основной программы разбирала мониторинг, тема 18 — IDS/IPS как класс. Здесь эти системы рассматриваются как противник, у которого есть слепые зоны. Границы: конкретные атаки — темы 02–07; здесь только то, как они выглядят и как их спрятать.

Тень базового курса: наблюдатель, который не равен получателю

В основной программе IDS выглядел как датчик: поставили на зеркало порта, он видит трафик и предупреждает. На практике сенсор видит копию, а не оригинал: пакеты могут теряться при перегрузке, фрагменты приходить в другом порядке, а сегменты TCP — перекрываться.

Классическая работа Птачека и Ньюшема 1998 года описала три класса расхождений: вставка (сенсор видит данные, которых не видит получатель), уклонение (получатель видит данные, которых не видит сенсор) и отказ в обслуживании сенсора 2. С тех пор протоколы изменились, но принцип остался.

Как устроены IDS/IPS

Сигнатуры, аномалии и гибриды

Сигнатурный детектор ищет известные шаблоны: строку в HTTP-запросе, последовательность байтов в полезной нагрузке, аномалию в заголовке. Он точен на известном и слеп на новом. Аномальный детектор строит модель нормального трафика и ищет отклонения; он ловит новое, но даёт много ложных срабатываний.

Классификация и требования к IDS/IPS описаны в NIST SP 800-94 3. Snort и Suricata — сигнатурные с движком правил и разбором протоколов; Zeek — событийная система, которая пишет журналы и позволяет писать скрипты на языке, близком к доменному 45. На практике их ставят вместе: Suricata для алертов, Zeek для контекста.

Inline, tap и fail-open

IPS стоит в разрыве и может отбрасывать пакеты; IDS смотрит копию и только предупреждает. Inline-режим даёт возможность блокировки, но создаёт единую точку отказа: при перегрузке или сбое трафик либо встаёт, либо проходит без проверки (fail-open), либо блокируется (fail-closed).

suricata -i eth1 -c /etc/suricata/suricata.yaml          # IDS: копия пакетов
suricata -r capture.pcap -c /etc/suricata/suricata.yaml -l /tmp/log   # offline
suricata -q 0 -c /etc/suricata/suricata.yaml             # IPS через NFQUEUE

-i не ставит сенсор в разрыв: Suricata получает копию через AF_PACKET и может только предупреждать. Для настоящего inline трафик заводится в очередь netfilter (queue num 0), а Suricata читает её через -q 0 и возвращает вердикт: accept, drop или reject. Без правила queue процесс -q 0 просто ждёт пакетов. Для лабораторной удобнее offline-разбор: результат воспроизводим.

Уклонение на уровне сети и транспорта

Фрагментация и перекрытие сегментов

Если IDS не собирает фрагменты до применения правил, правило видит только первый фрагмент. Крошечный первый фрагмент содержит часть TCP-заголовка, и сигнатура, которая ищет порт или строку, не срабатывает 1.

С TCP-сегментами та же логика: перекрывающиеся сегменты с разными данными по одному смещению. Получатель выбирает одну версию, сенсор — другую. Если IDS принимает «первый выигрывает», а стек — «последний выигрывает», полезная нагрузка проходит мимо правила.

Перекрывающиеся фрагменты и разные результаты сборки в BSD и Windows
IDS и хост по-разному разрешают перекрытие, поэтому правило видит не тот пакет
# фрагментация при отправке
nmap -f --data-length 24 -p 80 192.0.2.20

TTL, контрольные суммы, опции

Некоторые сенсоры отбрасывают пакеты с неверной контрольной суммой, а некоторые стеки принимают. Некоторые проверяют TTL и отбрасывают «невозможные» значения. Расхождение в любом из этих решений — канал.

Опции IP и TCP тоже разбираются по-разному: один сенсор пропускает пакет с опцией, другой считает его подозрительным. Само наличие необычной опции — признак, поэтому уклонение часто выглядит как «сделать пакет максимально обычным», а не максимально странным.

Уклонение на уровне приложения

Кодирование и нормализация

Сигнатура ищет строку union select. Если запрос закодирован в URL, base64 или UTF-16, сигнатура не сработает, а приложение декодирует и выполнит. Защита — нормализация до применения правил: Suricata умеет декодировать url, base64, utf16 и применять правила к результату.

alert http any any -> any any (msg:"SQLi union select"; \
  http.uri; content:"union"; nocase; content:"select"; nocase; distance:0; \
  classtype:web-application-attack; sid:1000100; rev:1;)

Правило без нормализации ловит только открытый текст. С http.uri движок сам декодирует URL, но не base64 в параметре.

Медленность и распределённость

Сигнатура срабатывает на событие, а не на его отсутствие. Скан, растянутый на сутки, не превышает порог «много за минуту». Логин-перебор с одной попыткой в час не выглядит как атака. Уклонение через темп — самое дешёвое и самое трудное для обнаружения.

Шифрование как универсальный обход

TLS скрывает содержимое. Остаются метаданные: адреса, порты, размеры, тайминг, SNI и отпечаток клиента. Поэтому уклонение в шифрованном канале — это управление профилем: ровный поток, обычные размеры, легитимный отпечаток.

Анализ трафика и профили

Размеры, тайминг, JA3 и beaconing

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

tshark -r c2.pcap -Y "tcp.flags.syn==1 && tcp.flags.ack==0" \
  -T fields -e frame.time_epoch -e ip.dst | head -20

Методика разбора захвата и восстановления временных рядов разобрана у Сэндерса 6. По этим меткам времени видно интервалы. Среднее и стандартное отклонение интервалов — простейший детектор.

Стеганография в DNS, ICMP и HTTP

DNS-туннель прячет данные в именах, ICMP — в полезной нагрузке эха, HTTP — в заголовках и cookies. Обнаружение строится на статистике: длина, энтропия, доля уникальных значений, соотношение запросов и ответов.

Анти-форензика

Журналы, время и целостность

После инцидента остаются журналы: syslog, NetFlow, Zeek, pcap. Анти-форензика пытается их исказить: удалить записи, изменить метки времени, подменить pcap. Каждое действие оставляет след: пропуск в нумерации, несоответствие времени, несовпадение контрольных сумм.

journalctl --since "2026-10-19 10:00" --until "2026-10-19 11:00"
sha256sum capture.pcap

Хеш фиксирует целостность файла; цепочка доказательств требует, чтобы хеш был снят до анализа и хранился отдельно.

Что выдаёт правку

Правка журнала выдаёт себя не содержимым, а контекстом: запись, которая противоречит соседним; время, которое не сходится с NTP; процесс, который не оставил других следов. Поэтому анти-форензика — это не «удалить лог», а «сделать так, чтобы не осталось противоречий», и это почти всегда сложнее, чем кажется.

Инженерия обнаружения

Правила Suricata и скрипты Zeek

Приёмы уклонения классифицированы в матрице ATT&CK 7; хорошее правило описывает не атаку, а инвариант: «HTTP-запрос не должен содержать одновременно union и select в URI», «DNS-запрос не должен иметь метку длиннее 50 символов». Инвариант устойчив к вариантам.

alert dns any any -> any any (msg:"DNS long label"; \
  dns.query; pcre:"/^[^.]{50,}\./"; \
  threshold: type limit, track by_src, count 1, seconds 60; \
  classtype:bad-unknown; sid:1000200; rev:1;)

Базовые линии

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

cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p | \
  sort | uniq -c | sort -rn | head -20

Числа: порог, окно и цена ошибки

Пороговое правило задаётся двумя числами: сколько событий и за какое окно. Правило «30 SYN за 60 секунд» срабатывает на скане со скоростью 0,5 пакета в секунду и выше; чтобы его обойти, нужно опуститься ниже — и тогда полный перебор 65 536 портов занимает больше суток.

Отсюда компромисс: короткое окно ловит быстрые сканы и пропускает медленные, длинное — наоборот, но требует больше памяти и даёт больше ложных срабатываний. На практике ставят два правила: короткое для быстрых атак и длинное для медленных.

Цена ошибки тоже измерима. Сенсор на 10 Гбит/с при среднем размере пакета 500 байт обрабатывает около 2,5 млн пакетов в секунду; при перегрузке он начинает отбрасывать пакеты, и часть трафика проходит без проверки. Поэтому inline-сенсор всегда имеет бюджет производительности, а не «работает, пока хватает».

пакетов/с = 10e9 / (500 * 8) = 2,5e6

Итоги темы

IDS видит копию трафика, а не оригинал; расхождение между копией и получателем — основа уклонения. Фрагментация, перекрытие сегментов и кодирование работают там, где сенсор не нормализует данные до применения правил.

Профиль трафика остаётся даже в шифрованном канале: размеры, интервалы, отпечатки. Джиттер и случайность помогают, но сами становятся признаком.

Анти-форензика не делает следы невидимыми, а создаёт противоречия; обнаружение строится на инвариантах и базовых линиях, а не на списке сигнатур. Следующая тема выходит за пределы провода — в эфир.

Литература

  1. Ziemba G., Reed D., Traina P. Security Considerations for IP Fragment Filtering. — RFC 1858, IETF, 1995. https://www.rfc-editor.org/rfc/rfc1858
  2. Ptacek T. H., Newsham T. N. Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection. — Secure Networks Inc., 1998.
  3. Scarfone K., Mell P. Guide to Intrusion Detection and Prevention Systems (IDPS). — NIST Special Publication 800-94, 2007. https://doi.org/10.6028/NIST.SP.800-94
  4. The Suricata Documentation. — https://docs.suricata.io/
  5. The Zeek Documentation. — https://docs.zeek.org/
  6. Sanders C. Practical Packet Analysis. 3rd ed. — No Starch Press, 2017.
  7. MITRE ATT&CK. Defense Evasion. — https://attack.mitre.org/tactics/TA0005/