Этап 3. Создание базы сигнатур атак
На этом этапе и начинается самое интересное, т. к. именно база сигнатур является "сердцем" любой системы обнаружения атак. Все сигнатуры атак или иных несанкционированных действий построены на стандартных фильтрах, которые являются основой любой системы обнаружения атак [SANS 1-98].
Первая категория фильтров оперирует пакетами, передаваемыми в рамках протокола IP, в соответствии с определенными соглашениями. Ниже перечислены многие из таких правил. Я не ставил целью разобрать все из них т. к. многие уже были описаны в главах 4 и 5, но большинство таких правил могут служить базой для дальнейших исследований.
Для контроля взаимодействия заданных узлов корпоративной сети по определенному протоколу необходимо отслеживать 9-й байт заголовка IР-пакета который и идентифицирует тип протокола. Например, факт использования в сети протокола маршрутизации EIGRP (номер протокола 88) оформляется следующим образом:
ip[9:l] = 88
где: ip — идентификатор протокола IP, [9:1] соответствует одному байту, начиная с 9-ой позиции, а 88 — десятичному значению данного байта. Полный список номеров протоколов указан в приложении 4. Сочетание множества таких фильтров позволит быстро обнаруживать различные события, характеризующие несанкционированную деятельность. При помощи этих же фильтров можно создать свою собственную простейшую систему обнаружения атак. Например, в журнале регистрации утилиты TCPdump идентификация протокола EIGRP выглядит так:
23:06:37 10.1.101.1 > 224.0.0.10: IP-proto-88 40 [tos 0xc0]
Для обнаружения атаки Land подходят следующие два правила:
ip[12:4] = ip[16:4]
ИЛИ
tcp and (ip[12:4] = ip[16:4]) and (tcp[0:2] = tcp[2:2])
Первое позволяет отслеживать исключительно те пакеты, в которых совпадают только адреса получателя и отправителя, а второе — обнаруживает пакеты с совпадением не только этих адресов, но и портов адресата и инициатора.
Широковещательные пакеты, которые являются основой атак Smurf и Fraggle, также распознаются с помощью одного из правил:
ip[19] - 0xff
ИЛИ
ip[19] = 0x00
Следующее правило предназначено для обнаружения широковещательных пакетов:
(ip[6:l] & 0x20 != 0) and (ip[6:2] & 0x1fff != 0)
Последний фрагмент описывается выражением:
ip[6:l] & 0x20 = 0) and (ip[6:2] & 0xlfff != 0
Чуть изменив данные правила, нам не составит труда "вычислить" атаку Ping of Death:
(ip[2:2] - ((ip[0:l]&0x0f)*4) + ( (ip[6:2]&0xlfff)*8)) > 65535
где первый компонент выражения — длина IP-пакета, второй компонент – длина заголовка, а третий — смещение фрагмента. Невозможные фрагменты описываются комбинацией
(ip[6:l]&0x20 != 0) and ((ip[2:2] - ((ip[0:1]&0x0f)*4)) & 0x7 != 0)
Еще два варианта атаки типа "отказ в обслуживании", использующие фрагментированные пакеты, — Teardrop и Sesquipedalian. Они обнаруживаются с помощью двух фильтров:
udp and ((ip[6:l] & 0x20 != 0) or (ip[6:2] & 0xlfff != 0))
и
(ip[6:l]&0x20 != 0) and (ip[6:2]&0xlfff = 0) and (ip[2:2] = (ip[0:l]&0x0f)*4)
Адреса, которые никогда не могут встречаться в вашей сети и приведенные в главе 4, описываются совокупностью следующих правил:
net 10 or net 192.168 or
(net 172 and
(((ip[13] > 15} and (ip[13] < 32)) or
((ip[17] > 15) and (ip[17] < 32) ) ))
or dst net 0 or (src net 0 and not src host 0.0.0.0)
or net 1 or net 2 or net 5 or net 23 or net 27 or net 31
or net 37 or net 39 or net 41 or net 42 or net 58 or net 59
or net 60 or
((ip[12] >= 67) and (ip[12] <= 127)) or
((ip[16] >= 67) and (ip[12] <= 127)) or
net 191.255 or net 128.0 or net 197 or net 201 or
net 223.255.255 or (ip[12] > 239) or net 255
где номер после ключевого слова net и является номером немаршрутизируемой или невозможной сети.
Наличие опций в заголовке IP-пакета обнаруживается по превышению длины заголовка (пять 32-битных слов)
(ip[0:l] & 0x0f) > 5
А сами опции контролируются путем задания в левой части правила выражения ip[20:1]. Например, проверка на наличие в IP-пакете двух опций record route и timestamp может быть реализована двумя фильтрами:
(ip[20:l] = 0x07)
ИЛИ
(ip[20:l] = 0x44)
Уже упоминаемая в главе 5 атака на межсетевой экран Raptor с помощью установленных IP-опций может быть обнаружена с помощью правила
(ip[0:l] & 0x0f > 5) and (ip[20:2] = 0x4400)
Второй категорией правил, используемых системой обнаружения атак, являются TCP- и UDP-фильтры. Для них характерно использование таких понятий, как порт источника и получателя. Например, обнаружение обращения к конкретному порту определяется правилом dst port 23 или правилом src port 21. В первом случае обнаруживается доступ к сервису Telnet (порт 23), а во втором — из FTP-сервера (порт 21). Список часто используемых портов указан в приложении 5. Данные правила, которых может быть множество, позволяют обнаружить большинство "троянских коней", использующих значения портов по умолчанию. Например, обнаружение "троянца" BackOrifice выглядит так:
udp and ((dst port 31337) or (src port 31337))
Кстати, BackOrifice может быть распознан и с помощью уже упоминаемой 8-байтовой последовательности "СЕ 63 D1 D2 16 Е7 13 CF":
udp[8:8] = 0xce63d1d216e713cf
Но, к сожалению, данное правило не применимо к BackOrifice 2000, для которого приходится задействовать другой фильтр:
(udp[10:2] = 0) and <(ip[2:2] - ((ip[0]&0x0f)*4) - 8 - 4) =
(udp[9]*256>+<udp[8]))
Помимо проверки доступа к портам можно дополнительно контролировать и специфичные адреса или сети:
(dst port 23) and (dst host fw.infosec.ru)
Контролировать доступ можно не только к конкретному порту, но и сразу к диапазону портов, например:
tcp[2:2] < 9
ИЛИ
tcp[0:2] < 9
Первое правило отвечает за порты получателя, а второе — за порты отправителя.
Фильтр, обнаруживающий атаки, которые приводят к отказу в обслуживании (атаки Chargen или Echo), выглядит следующим образом:
udp and (((port 7) and (port 13)) or ((port 7) and (port 19)) or
((port 7) and (port 37)) or ((port 13) and (port 19)) or
((port 13) and (port 37)) or ((port 19) and (port 37)) or
((src port 7) and (dst port 7)) or
((src port 13) and (dst port 13)) or
((src port 19) and (dst port 9)) or
((src port 37) and (dst port 37)))
Или так (в том случае, если доступ снаружи к этим портам запрещен):
udp and (port 7 or port 13 or port 19 or port 37)
Атака SYN Flood может быть обнаружена с помощью правила, которое следит за открытием соединения (флаг SYN установлен, а АСК — нет):
(tcp[13] & 2 != 0) and (tcp[13] & 0x10 = 0)
Один из вариантов скрытого сканирования с одновременно установленными флагами SYN и FIN детектируется следующим образом:
(tcp[13] & 2 != 0) and (tcp[13] & 1 != 0)
Другие варианты сканирования могут быть идентифицированы так:
tcp and (tcp[13] & 0x3f = 0) # NULL-сканирование
tcp and (tcp[13] & 0x01 != 0) and
(tcp[13] & 0x10 = 0) # FIN-сканирование
tcp and (tcp[13] & 0x02 != 0) and
(tcp[13] & 0x01 != 0) # SYN\FIN-сканирование
tcp and (tcp[13] & 0x04 != 0) and
(tcp[13] & 0x01 != 0) # RST\FIN-сканирование
tcp and (tcp[13] & 0x02 != 0) and
(tcp[13] & 0x04 != 0) # SYN\RST-сканирование
Можно заметить, что байт 13 TCP-пакета отвечает за контроль конкретных флагов. В частности, установленный флаг SYN определяется правилом tcp[13] & 0x02 != 0, флаг ACK — tcp[13] & 0x10 != 0, флаг RST — tcp[13] & 0x04 != 0, флаг FIN — tcp [13] & 0x01 != 0, флаг PSH — tcp [13] & 0x08 != 0, флаг URG — tcp[13] & 0x20 != 0, а отсутствие флагов соответствует tcp[13] & 0x3f = 0. Таким образом, открытие соединения по протоколу HTTP определяется суммарным фильтром:
tcp and (dst port 80) and (tcp[13] & 0x02 != 0) and (tcp[13] & 0x10 = 0)
С помощью аналогичных правил можно контролировать различные невозможные комбинации флагов (помимо скрытого сканирования). В частности, так можно обнаружить факт применения систем Nmap и Queso для удаленной идентификации ОС.
Третья группа правил включает ICMP-фильтры. Самый простой фильтр - обнаружение ECHO REQUEST и ECHO REPLY:
((icmp[0] =8) or (icmpf[0] =0))
Несмотря на простоту описанных конструкций, с их помощью можно со давать очень эффективные правила и фильтры, учитывающие технолог обработки информации практически любой корпоративной сети. Предложим, что трафик не удовлетворяет следующим признакам [SANS1-98]:
· доступ к 80 TCP-порту (НТТР-трафик);
· доступ к 53 (DNS) и 137 (NetBIOS) UDP-портам;
· запросы ECHO-REQUEST и ответ ECHO-REPLY;
· сообщения об ошибках Host unreachable и Time exceeded.
· Тогда для его контроля применимо следующее правило:
(dst host www.infosec.ru and
((tcp and ((tcp[13] & 2 != 0) and (tcp[13] & 0x10 = 0))
and (not dst port 80))
or
(udp and not dst port 53 and not src port 53 and not dst port 137)
or
(icmp and (icmp[0] != 8) and (icmp[0] != 0)
and (icmp[0] != 3) and (icmp[0] != 11))
or
(not (tcp or udp or icmp))
))
Заключение
В данной главе были рассмотрены основы построения своей собственной системы обнаружения атак, функционирующей на уровне сети. И, несмотря на то, что в ней не описаны все возможные сигнатуры атак, указанные принципы помогут читателю самому создать персональную базу данных сигнатур атак, учитывающих самые последние достижения хакерских технологий. В этом помогут главы 2, 4 и 5, разбирающие различные атаки и аспекты обнаружения несанкционированной деятельности.
Глава 13