Инструментальные средства обеспечения безопасности

Инструментальные средства проверки TCP/IP-стека

Разбить на страницы
Показывать лекцию целиком

Проверка стека TCP/IP вашего брандмауэра, Web-сервера или маршрутизатора не входит в ежедневный осмотр системы с целью обеспечения ее безопасности и даже не входит в еженедельную ревизию. Однако инструментальные средства, предназначенные для проверки стека, могут помочь вам проверить списки управления доступом и исправить уровни доступа. Они также анализируют то, как ваши серверы могут отвечать на атаки, вызывающие отказ в обслуживании (Denial-of-Service) или на другие критические сетевые условия. Некоторые из этих инструментальных средств могут также использоваться для создания произвольных TCP-, UDP- или даже DNS-пакетов. Эти функциональные возможности позволяют вам создавать собственные специфические тесты сценариев - от испытаний допустимой нагрузки, до тестирования совместимости протоколов. Если вам когда-либо приходилось программировать сокеты в системе Unix, то вы обнаружите, что эти инструментальные средства значительно сокращают время, необходимое для создания удобной программы.

ISIC: инструмент для проверки работоспособности IP-стека

Проверка IP-стека своей системы Windows, Linux, Mac или BSD могла бы выглядеть чисто академическим занятием. В конце концов, не так легко делать отладку сетевого кода операционной системы, независимо от того, имеете ли вы исходный текст. С другой стороны, выполнение нескольких тестов в отношении брандмауэров, маршрутизаторов или других хостов, являющихся оплотом защиты вашей сети, дают некоторое полезное представление о том, как каждое устройство реагирует на разнообразный трафик. Это важно при тестировании списков управления доступом, мер защиты от надувательства (anti-spoofing) и сопротивления некоторым типам атак, вызывающим отказ в обслуживания (Denial-of-Service).

Реализация

Комплект /. Он основан на использовании библиотеки создания пакетов libnet, которая должна быть установлена на вашей системе. Приложение ISIC представляет собой комплект из пяти программ: ISIC, tcpsic, udpsic, icmpsic и esic. Каждая из этих программ генерирует различные типы допустимых и недопустимых пакетов для протоколов IP, TCP, UDP, ICMP и ARP. Это дает возможность тестировать не только общие сетевые протоколы (IP), но также и более специфические.

Isic

Утилита ISIC имеет дело с тестами IP-уровня, включая IP-адреса отправителя и получателя, номер версии IP и длину заголовка. Когда вы запускаете программу ISIC, она действует как пакетная пушка, выбрасывая IP-пакеты в сеть с максимальной скоростью. Некоторые из этих пакетов преднамеренно искажены. Используйте процентные опции, чтобы изменить соотношение между дефектными и хорошими пакетами.

Использование:

isic [-v] [-D] -s <ip отправителя> -d <ip получателя>
  [-p <количество генерируемых пакетов>] [-k <пропущенные пакеты>] 
     [-x <посылать пакет X раз>]
  [-r <случайное начальное число>] 
     [-m <максимальная скорость генерации (КБ/с)>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>]
                    [-I <Случайная длина заголовка IP>]

Например, вы можете посмотреть, как шлюз обрабатывает большое количество искаженных пакетов, чтобы определить влияние DoS-атак на пропускную способность сети. Следующая команда посылает пустые IP-пакеты с адреса 192.168.0.12 на адрес 192.168.0.1. В процессе генерации трафика 10% от общего количества пакетов будут содержать неверный номер версии IP (версия, отличная от "4"); не будут генерироваться пакеты, содержащие неподходящую длину заголовка и 50% пакетов будут разделены на фрагменты.

# isic -s 192.168.0.12 -d 192.168.0.1 -F50 -V10 -I0
Compiled against Libnet 1.0.2a
Installing Signal Handlers.
Seeding with 13584
No Maximum traffic limiter
Bad IP Version = 10%    Odd IP Header Length = 0% Frag'd Pcnt = 50%
    1000    @   6192.1 pkts/sec and 3036.2 k/s 
    2000    @   5175.3 pkts/sec and 2109.4 k/s
    3000    @   6040.3 pkts/sec and 2208.7 k/s
    4000    @   6009.8 pkts/sec and 2329.2 k/s
    5000    @   6072.4 pkts/sec and 2335.6 k/s
    6000    @   5325.1 pkts/sec and 2018.3 k/s
    7000    @   6170.7 pkts/sec and 2327.2 k/s

Статистические данные пакетов выводятся для групп в тысячу пакетов. В предыдущем примере ISIC генерирует приблизительно 6000 пакетов в секунду, что грубо соответствует производительности в 2-3 Мбит/с. Помните, 50% от всех этих пакетов фрагментированы и требуют, чтобы брандмауэр (или принимающее устройство) восстанавливал пакеты, что может быть слишком интенсивной нагрузкой на процессор или память, или даже привести к обходу системы обнаружения вторжений. Другие 10% от общего количества пакетов имеют неправильный номер версии IP. К счастью, стек принимающей сети опускает эти пакеты с минимальным влиянием на систему.

Если вы хотите ограничить производительность утилиты ISIC, сожмите ее с помощью опции -m. Это ограничит скорость генерации пакетов определенным количеством килобайт в секунду. Это можно сделать иначе, используя опцию -p, ограничивая отправку определенным числом пакетов.

Никакое тестирование не пойдет впрок, если вы не сможете повторить ввод или сделать запись результатов. Опция -D позволяет регистрировать содержание каждого пакета по мере его выхода в сеть.

192.168.0.12 -> 192.168.0.1 tos [27] id [0] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [250] id [1] ver [4] frag [56006]
192.168.0.12 -> 192.168.0.1 tos [34] id [2] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [213] id [3] ver [4] frag [39249]
192.168.0.12 -> 192.168.0.1 tos [249] id [4] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [91] id [5] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [26] id [6] ver [4] frag [0]

На первый взгляд, это может показаться не очень полезным, но взгляните на поле IPID. Каждый последующий пакет увеличивает это значение на единицу. Следовательно, вы можете просмотреть файл регистрации, например брандмауэра, чтобы увидеть, какой именно пакет вызвал ошибку. Посмотрите раздел "Советы и уловки" далее в этой лекции, чтобы познакомиться с множеством примеров того, как отслеживать ошибки.

Совет. Добавьте опцию -D, чтобы получить список, содержащий информацию об отладке (содержание пакета) для любого из пакетов *sic.

Tcpsic

Приставка TCP в названии утилиты указывает на то, что она предназначена для генерации случайных TCP-пакетов и данных. Ее использование подобно использованию программы ISIC, но вы можете также указывать порты получателя и отправителя. Это дает вам возможность тестировать службы Web (порт 80), почты (порт 25) или VPN (несколько портов) в дополнение к тестированию системы. Обратите внимание, что у tcpsic добавлены другие процентные опции для хорошего и плохого трафика, который она генерирует.

Использование:

tcpsic [-v] [-D] -s <ip отправителя> [, порт] 
   -d <ip получателя> [, порт]
  [-r начальное случайное число] 
   [-m <максимальная скорость генерации (КБ/с)>]
  [-p <количество генерируемых пакетов>] [-k <пропускаемые пакеты>] 
    [-x <посылать пакет X раз>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>] 
    [-I <Опции IP>]
                    [-T <Опции TCP>] [-u <срочные данные>] 
                         [-t <контрольная сумма TCP>]

Не забудьте ставить запятую между номером порта и IP-адресом. Если вы опускаете номер порта, то tcpsic выбирает случайный порт для каждого пакета.

# tcpsic -s 192.168.0.12,1212 -d 192.168.0.1,80

Udpsic

Утилита udpsic также позволяет определять порты наряду с IP-адресами отправителя и получателя. У протокола UDP нет таких возможностей, как у TCP, и меньше процентных опций, которые нужно определять.

Использование:

udpsic [-v] [-D]-s <ip отправителя> 
 [,порт]-d <ip получателя> [,порт]
  [-r начальное случайное число] 
     [-m <максимальная скорость генерации (КБ/с)>]
  [-p <число генерируемых пакетов>] [-k < пропускаемые пакеты >] 
     [-x <посылать пакет X раз>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>] 
    [-I <Опции IP>]
                    [-U <Контрольная сумма UDP>]

UDP составляет меньшую часть IP-трафика. Обычно он относится к DNS-трафику.

# udpsic -s 192.168.0.12,1212 -d 192.168.0.1,53

Однако этот инструмент может также использоваться для тестирования серверов, выполняющих протоколы поточной передачи ( streaming ) типа протоколов, использующихся в медиа-серверах ( media servers ) и в сетевых играх.

Icmpsic

Большинство сетей блокируют входящие ICMP-сообщения в своих сетях. Используйте инструмент icmpsic, чтобы посмотреть, как ваше устройство защиты обрабатывает ICMP-трафик, включая трафик, который не попадает в категорию Ping. Нормальный ICMP-трафик обычно состоит из парных ICMP-запросов ( echo request ) (хост задает вопрос: "Есть ли там кто-нибудь?") и ICMP-ответов ( echo reply ) (ответ хоста: "Мы и они"). Существуют другие типы ICMP-сообщений, которые охватывают управление доступом и метками времени ( timestamp ). Большую часть времени весь ICMP-трафик, направленный из интернета в сеть, блокирован. Во внутренней сети утилита ping обычно может искать свободно, так почему бы не исследовать, как устройства обрабатывают чрезмерный ICMP-трафик?

Использование:

icmpsic [-v] [-D]-s <ip отправителя> 
  [, порт]-d <ip получателя> [,порт]
[-r начальное случайное число] 
   [-m <максимальная скорость генерации (КБ/с)>]
[-p <число генерируемых пакетов>] [-k <пропускаемые пакеты>] 
  [-x <посылать пакет X раз>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>] 
  [-I <Опции IP>]
                    [-i <Плохая контрольная сумма ICMP>]

Хотя использование утилиты подразумевает, что вы можете указать порты с помощью аргументов -s и -d, установка номера порта заставляет утилиту icmpsic вместо этого использовать широковещательный (broadcast) адрес. Номера портов не являются частью ICMP-протокола. На уровне IP вы все еще можете генерировать фрагментированные пакеты ( -F ), пакеты с плохими версиями IP ( -V ) и пакеты с плохими опциями IP ( -I ). ICMP является подмножеством протокола IP, поэтому эти опции все еще доступны.

Единственная опция, специфическая для ICMP, позволяет посылать неверную контрольную сумму ICMP-сообщения, которая должна делать полученный пакет недействительным. Во всем остальном, утилита ).

Esic

Буква e в названии esic означает Ethernet-сеть. Этот инструмент передает пакеты со случайными номерами, другими словами, пакеты, основанные не на TCP/IP-протоколе. Это единственный инструмент, который работает ниже уровня IP, поэтому он не может обеспечить генерацию такого же количества недопустимых пакетов.

Использование:

esic -i interface [-s <MAC-адрес отправителя>] 
 [-d <MAC-адрес получателя>]
  [-p <протокол #> или "rand">] [-r <начальное случайное число>]
  [-c <# число посылаемых пакетов>] [-l <максимальная длина пакета>]
  [-m <# число пакетов между распечаткой>]

Использование этого инструмента ограничено, главным образом, тестированием брандмауэров или причинением разрушительного ущерба коммутаторам. Обратите внимание, что заданный по умолчанию MAC-адрес получателя - широковещательный. Это означает, что любой пакет, который вы создаете без использования опции -d, будет передаваться на каждый интерфейс хаба или коммутатора. Это могло бы создавать наплыв пакетов, приводящий к атаке, вызывающей отказ в обслуживании, или к такому потоку, который коммутатор не успевает обрабатывать, таким образом, низводя функцию коммутатора до функции хаба и допуская возможность перехвата трафика. Конечно, потребуется большой трафик, чтобы повлиять на 100-мегабайтный коммутатор.

Советы и уловки

Комплект инструментов ISIC предназначен не для эзотерических сетевых тестов. Каждому инструменту соответствуют определенные сценарии, для которых он полезен. В таблице 17.1 перечислен каждый инструмент и некоторые примеры сценариев тестирования.

Сценарии тестов, выполняемые с помощью комплекта isic
Инструмент Сценарий теста
ISIC Брандмауэры. Маршрутизаторы. Хосты защитного бастиона (Web-серверы, DNS-серверы, почтовые серверы).
tcpsic Брандмауэры (особенно, интерфейс администрирования). Маршрутизаторы (особенно, интерфейс администрирования). Важные службы (22: SSH, 25: SMTP, 80: HTTP, 443: HTTP, 8080: proxies).
udpsic Важные службы (53: DNS).
icmpsic Маршрутизаторы. Брандмауэры.
esic Брандмауэры. Маршрутизаторы. Коммутаторы (включая атаки трафика повышенной интенсивности, которые могут дать возможность прослушивания сети).

Брандмауэры

Все эти инструментальные средства помогают удостовериться в правильности набора правил брандмауэра и производительности системы, находящейся под давлением. Например, вы могли бы запустить утилиту ISIC с высоким процентом недопустимых пакетов, чтобы создать повышенную нагрузку.

# isic -s 172.16.19.12 -d 192.168.0.1 -F75 -V75 -I75

Недопустимые пакеты предназначены для того, чтобы создать более тяжелую нагрузку на брандмауэр. Брандмауэры имеют тенденцию работать эффективно, когда трафик нормален. Как системный администратор, вы должны также беспокоиться о том, как брандмауэр действует в неблагоприятных условиях. Число 75 после опций -F, -V и -I означает, что у 75 % от всех пакетов будут ошибки в версии IP, длине заголовка и подсчете фрагментов. Хотя такая команда не является сигнатурой какой-либо специфической атаки, вызывающей отказ в обслуживании, но она может вызвать подобные эффекты.

Можно параллельно запустить tcpsic, чтобы проверить, как брандмауэр обрабатывает трафик к находящемуся за ним Web-хозяйству.

# tcpsic -s 172.16.19.23,3434 -d 192.168.0.37,80

Теоретически, брандмауэр должен просто сбрасывать недопустимый трафик и переходить к следующему пакету; однако вы можете обнаружить случаи, в которых брандмауэр тратит необычно много времени на определенный номер протокола, фрагмент или недопустимую опцию TCP. Конечно, атака на брандмауэр не является единственной возможностью. В таблице 17.2 показаны другие типы тестов, которые вы можете выполнить.

Сценарии общих тестов
Тест Сценарий
Нацелен на брандмауэр Посылайте трафик на IP-адрес брандмауэра или на один из его портов администрирования.
Подмена IP-адресов Генерируйте трафик на неподходящий интерфейс. Например, используйте адреса отправителя из адресного пространства 172.16.0.0/16 для интерфейса, который обслуживает сеть 10.1.2.0/24. Этот тест особенно полезен для брандмауэров с несколькими интерфейсами. Кроме того, он может обнаруживать проблемы с правилами брандмауэра, защищающими от обманов, или их отсутствие.
Нацелен на хосты позади брандмауэра Пытайтесь передавать трафик через брандмауэр, чтобы посмотреть, останавливает ли он пакеты, сформированные с изъяном.
Внимание. Если вы генерируете пакеты опцией rand для IP-адреса отправителя в инструментах tcpsic или udpsic, то сервер получателя может ответить на эти IP-адреса при попытке завершить трехэтапное квитирование по TCP-протоколу! Имейте в виду, что вы можете неосторожно передать TCP-, RST- и FIN-пакеты на случайные адреса.

Другая полезная методика генерации пакетов для тестов на повышенную нагрузку состоит в использовании случайного заполнителя ( rand placeholder ) для IP-адреса отправителя. Любое из инструментальных средств комплекта ISIC генерирует случайные IP-адреса, если это указано, даже из резервного адресного пространства. Используйте эту программу, чтобы проверить, как брандмауэр обрабатывает DNS-трафик, включающий 50 % неправильных контрольных сумм UDP.

# udpsic -s rand -d 192.168.0.121,53 -U50

Управление пакетами

Каждый инструмент поддерживает опции -m, -p, -k и -x, чтобы управлять созданием пакета и пропускной способностью. Используйте опцию -m, чтобы ограничить максимальную пропускную способность, которую пробует использовать инструмент ISIC. Эта опция может быть полезна для установления базовой нагрузки против сервера (например, маршрутизатора) или службы (например, HTTP). Например, по следующей команде никаких вредных пакетов не генерируется, но посылается устойчивый трафик в 1000 Кбит/с к Web-серверу.

# tcpsic -s rand -d 192.168.0.37,80 -m 1000 -F0 -V0 -I0 -t0

Этот тест может также показать, как брандмауэр регистрирует трафик при тяжелых нагрузках. Если бы это была атака, вызывающая отказ в обслуживании, но полная информация была зафиксирована только для первых нескольких подключений, то вы не можете быть уверены, что очевидное нападение не прикрывает сфокусированную атаку на Web-сервер. Также удостоверьтесь, что у брандмауэра достаточно пространства на диске для хранения файлов регистрации.

Опция -p предписывает ISIC посылать установленное число пакетов и затем останавливаться. Опция -k заставляет isic пропускать заданное число пакетов. Например, следующая команда генерирует 100000 пакетов, но опускает первые 50000.

# icmpsic -s rand -d 192.168.0.12 -p100000 -k50000

Iptest

Утилита /). Фильтр IP является брандмауэром и программным обеспечением NAT для ядра BSD и Linux 2.0.x (плюс версии для Solaris, HP-UX и QNX). Его первоначальная цель заключалась в проверке на устойчивость брандмауэра к ошибкам в критических сетевых условиях.

Реализация

Все тесты требуют четырех опций для определения отправителя и получателя каждого пакета. IP-адрес отправителя определяется опцией -s; получатель всегда задается последним аргументом (без флага опции).

# iptest -s 172.16.34.213 192.168.12.84

Если IP-адрес отправителя не принадлежит физической сетевой карте (NIC), использующейся для генерации трафика, вам может понадобиться определить также сетевой интерфейс ( -d ) и шлюз ( -g ) в командной строке.

# iptest -s 10.87.34.213 -d le0 -g 192.168.12.1 192.168.12.84

Затем вы можете позволить инструменту Iptest пройти весь список встроенных тестов, или выбрать более узко направленные тесты с помощью опций -n и -pt, где n - число в интервале от одного до семи, а t - номер "точечного теста" (point test) для соответствующего n. Другими словами, вы выбираете опцию между единицей и семеркой. Например, опция пять ( -5 ) содержит большинство TCP-тестов. В пределах пятой опции есть восемь точечных тестов ( -p ). Окончательно команда, предназначенная для выполнения пятой опции с ее первым точечным тестом, будет выглядеть следующим образом:

# iptest -s 10.87.34.213-d le0-g 192.168.12.1 -5 -p1 192.168.12.84

В этом примере будут проверены все комбинации флагов TCP. В таблице 17.3 описаны более полезные опции меню.

Опции утилиты iptest и их точечные тесты
Номер опции Точечный тест Описание
Опции iptest
-1 7 Генерирует пакеты с фрагментами нулевой длины.
-1 8 Создает пакеты длиной более 64 килобайт после сборки. Это могло бы вызвать переполнение буфера в плохих сетевых стеках.
-2 1 Создает пакеты с длиной опции IP, которая больше, чем длина пакета.
-6 n/a Генерирует фрагменты пакета, которые перекрываются при реконструкции. Это может наносить ущерб менее устойчивым стекам TCP/IP. Если вы используете этот тест, выполняйте его отдельно от других.
-7 n/a Генерирует 1024 случайных IP-пакета. Поля IP-уровня будут правильны, но данные пакета - случайны.
Опции UDP теста
-4 1,2 Создает длину полезной нагрузки UDP протокола, которая меньше (1) или больше (2), чем длина пакета.
-4 3,4 Создает UDP-пакет, в котором номер порта отправителя (3) или получателя (4) попадает на границу байта: например, 0, 1, 32767, 32768, 65535. Этот тест может обнаружить граничные (off-by-one) ошибки.
Опции ICMP теста
-3 с 1 по 7 Генерирует различные нестандартные ICMP-типы и коды. Может выявить ошибки в списке контроля доступа ACL, которые, как предполагается, блокируют ICMP-сообщения.
Опции TCP теста
-5 1 Генерирует все возможные комбинации флагов опций TCP. Этот тест может выявить логические проблемы в способах, которыми стек TCP/IP обрабатывает или игнорирует пакеты.
-5 2,3 Создает пакеты, в которых номера пакетов (2) и номера подтверждения (3) попадают на границы байта. Этот тест может выявить граничные ( off-by-one ) ошибки.
-5 4 Создает SYN -пакеты различных размеров. SYN -пакет с нулевым размером является повсеместным пакетом сканирования порта. Система обнаружения вторжений или брандмауэр должны отслеживать все виды SYN -пакетов, соответствующих подозрительной деятельности.
-5 7,8 Создает пакеты, в которых номер порта отправителя (7) или порта получателя (8) попадает на границу байта. Например, 0, 1, 32767, 32768, 65535. Может выявить граничные ошибки ( off-by-one ).

Пример из жизни. Эксплуатационные качества брандмауэра

Сетевых администраторов всегда интересует, как хорошо брандмауэр защищает сеть, как он действует при активных нападениях (таких как атаки, вызывающие отказ в обслуживании, и интенсивное сканирование) и как он справляется с тяжелыми нагрузками. В связи с этим Джек намерен проверить свой брандмауэр. Он берет следующий сценарий и загружает его на свой лэптоп с системой FreeBSD. Этот лэптоп помещен перед брандмауэром. Это означает, что он представляет трафик, приходящий из интернета.

#!/bin/sh
# IP Stack test
# usage: test.sh gateway source destination
# note, change "le1" to your interface
iptest -1 -d le1 -g $1 -s $2 $3
iptest -2 -d le1 -g $1 -s $2 $3
iptest -3 -d le1 -g $1 -s $2 $3
iptest -4 -d le1 -g $1 -s $2 $3
iptest -5 -d le1 -g $1 -s $2 $3
iptest -6 -d le1 -g $1 -s $2 $3
iptest -7 -d le1 -g $1 -s $2 $3
isic -s $2 -d $3 -p10000
tcpsic -s $2 -d $3 -p10000

Затем берет другой лэптоп и размещает его за брандмауэром. Эта сеть имеет высокую пропускную способность. Она содержит только коммутаторы, и это значит, что ему надо будет подключиться к так называемому спэн-порту (span - Switched Port Analyzer), чтобы перехватить весь трафик с помощью утилиты tcpdump. К счастью, система обнаружения вторжений уже находится на спэн-порте. Поскольку система обнаружения вторжений (IDS) не уловила никаких атак в течение последних двух месяцев, и тест выполняется после окончания рабочего времени, то никто не может пожаловаться, что IDS была выключена в течение нескольких минут. Джек отключает IDS и подключает свой лэптоп, выполняющий tcpdump. Он запускает тест :, но ничего не происходит!

После нескольких минут перепроверки сценария теста IP-стека, Джек осознает, что спэн-порт, который прослушивался IDS, никогда, фактически, не был установлен на режим спэн. Другими словами, в течение последних двух месяцев IDS был способен перехватить только трафик, который был послан непосредственно ему. Джек быстро исправляет ошибку и продолжает тест брандмауэра, но все это показывает, что регулярное тестирование необходимо для поддержания жизнеспособности вашей сети, даже если вы не пытаетесь решить определенную проблему!

Nemesis: создание пакетов 101

Инструмент nemesis предназначен для создания собственных IP-пакетов. В отличие от утилит isic и Iptest, которые автоматически генерируют хорошие и вредные пакеты, nemesis может изменять любую часть пакета. Утилита основана на библиотеке libnet, но ее легче использовать, чем libnet или libpcap, потому что она не требует никакой манипуляции на уровне сокета. Вместо написания и отладки программ на языке C, вы можете быстро настроить сценарий командного интерпретатора. Вам надо только определить содержимое данных в командной строке; nemesis сам создает и посылает пакет.

Реализация

Комплект nemesis содержит утилиты, предназначенные для создания пакетов и пакетных данных для протоколов ARP, DNS, ICMP, IGMP, OSPF, RIP, TCP и UDP. Каждая утилита называется соответственно nemesis - <протокол>, где <протокол> - один из восьми поддерживаемых типов протокола. Например, nemesis-dns имеет дело с созданием DNS-пакетов, в то время как nemesis-tcp создает пакеты для TCP-трафика. Вы можете выполнить общую отладку сети и тестирование с помощью инструментальных средств nemesis-udp и nemesis-tcp. Другие инструментальные средства приспособлены для тестирования более специализированных протоколов или служб.

Требуется некоторое время, чтобы начать создание пакетов с помощью nemesis, но как только вы создадите каркас, в нем будет просто производить небольшие изменения. Каждое из инструментальных средств комплекта nemesis требует основных IP-опций. Каждое из инструментальных средств поддерживает следующие опции.

Опции IP:

-S  <IP адрес отправителя>
    -D  <IP адрес получателя>
    -I  <IP ID (идентификатор)>
    -T  <IP TTL (время жизни дейтаграммы)>
    -t  <IP tos (тип сервиса)>
    -F  <IP frag (смещение фрагмента)>
    -O  <Опции IP>

Опции Data Link:

-d  <Устройство Ethernet>
    -H  <MAC-адрес отправителя>
    -M  <MAC-адрес получателя>

Утилита nemesis-tcp может быть особенно полезна при составлении общей картины атак, называемых "reply attacks", за счет анализа пакетов, которые вы перехватили в сети. Например, чтобы подделать сеанс TCP, вам нужно знать не только одноранговый (peer) IP-адрес и номер порта, но также и порядковый номер пакета (SEQ) и номер подтверждения (ACK). Таким образом, вы можете обрабатывать любую часть трехэтапного квитирования при установлении связи по TCP. Утилита nemesis-tcp поддерживает следующие специфические для TCP опции.

Опции TCP:

[-x <порт отправителя>]
    [-y <порт получателя>]
    -f  <Опции флагов TCP>
    -fS SYN,-fA ACK,-fR RST,-fP PSH,-fF FIN,-fU URG
    -w  < Размер окна>
    -s  <номер SEQ>
    -a  <номер ACK>
    -u  <TCP urgent pointer (указатель срочности)>
    -P  <Файл полезной нагрузки (двоичный или ASCII)>
    -v  VERBOSE (Подробный - вывод структуры пакета на стандартное 
        устройство stdout)
Совет. Помещайте опции TCP флага ( -f ) перед опциями порта ( -x, -y ). Иначе флаги могут быть применены не по назначению.

Утилита nemesis-udp поддерживает приведенные ниже опции. Заметьте, что UDP, как протокол, не устанавливающий соединения и не имеющий состояния, не предусматривает так много опций, как TCP. Некоторые применения этой утилиты могли бы состоять в толковом сканировании портов при поиске UDP-служб, таких как SNMP, используя опцию -P для обработки определенного пакета.

Опции UDP:

[-x <порт отправителя>]
    [-y <порт получателя>]
    -P <Файл полезной нагрузки>
    -v VERBOSE (подробный вывод структуры пакета на стандартное 
       устройство stdout)

В разделе <Пример из жизни> в конце этой лекции, посмотрите пример генерации SNMP-пакета.

опции ICMP:

-i  <Тип ICMP>
    -c  <Код ICMP>
    -s  <Порядковый номер>
    -m  <Маска ICMP>
    -G  <Предпочитаемый шлюз>
    -Co <Время возникновения запроса>
    -Cr <Время получения запроса>
    -Ct <Время передачи ответа>
    -P  <Файл полезной нагрузки (двоичный или ASCII)>
    -v  VERBOSE (подробный - вывод структуры пакета на стандартное 
        устройство stdout)

Комплект nemesis поддерживает также DNS ( nemesis-dns ), ARP ( nemesis-arp ), IGMP ( nemesis-igmp ) и OSPF ( nemesis-ospf ) протоколы. Хотя они относительно мало известны, возможности протоколов IGMP и OSPF могут быть полезны для сетевых инженеров, пробующих отлаживать глобальные сети.

Пример из жизни. Вбрасывание пакетов

Одной из особенностей хорошего брандмауэра является способность динамически открывать и закрывать порты для отдельных TCP-подключений. Вы можете использовать утилиту nemesis, чтобы проверить способность набора правил вашего брандмауэра к контролю состояний ( statefulness ). Это может быть важным тестом для предотвращения атак подмены пакетов ( packet spoofing ). Например, вы можете проверить правило, которое разрешает трафик NetBIOS (TCP-порт 139) только между двумя хостами: 10.0.0.27 и 192.168.0.90.

Когда начинается подключение, хост 192.168.0.90 посылает TCP SYN -пакет с порта 1066 на порт 139 адреса 10.0.0.27. Ниже приводится частичный перехват данных утилитой tcpdump из начального трафика.

19:34:48.663980 192.168.0.90.1066 > 10.0.0.27.139: S 847815674:847815674 (0)
 win 16384 < mss1460, nop, nop, sackOK > (DF)
19:34:48.664567 10.0.0.27.139 > 192.168.0.90.1066: S 4141875831:4141875831 (0)
 ack 847815675 win 17520 < mss 1460, nop, nop, sackOK > (DF)
19:34:48.665586 192.168.0.90.1066 > 10.0.0.27.139:. ack 1 win 17520 (DF)

В этой точке брандмауэр разрешает трафик, имеющий такую комбинацию IP-адресов и портов, которая обычно используется для установления соединения. Последующие TCP-пакеты несут ACK-флаг, пока подключение не будет закрыто флагами FIN или RST. Это то место, где вы тестируете брандмауэр с помощью утилиты nemesis-tcp.

Первый тест состоит в определении того, позволяет ли брандмауэр пройти произвольному пакету, несущему флаги FIN или RST.

# nemesis -tcp -S 192.168.0.90-D 10.0.0.27 -fF -x 1066 -y 139
# nemesis -tcp -S 192.168.0.90-D 10.0.0.27 -fR -x 1066 -y 139

Конечно, вы должны выполнять tcpdump с другой стороны брандмауэра (в сети 10.x), чтобы увидеть, проходят ли пакеты через набор правил. Брандмауэр должен блокировать эти пакеты, потому что номера TCP-пакетов неверны ( nemesis назначает их случайным образом). Если эти пакеты были разрешены брандмауэром, то атаки, вызывающие отказ в обслуживании, могли бы быть выполнены против адреса 10.0.0.27, наводняя его RST-пакетами, то есть никакие допустимые подключения не могли бы поддерживаться!

Затем вы увидите, как брандмауэр обрабатывает ACK-пакеты. Некоторые хакерские нелегальные инструментальные средства туннелируют связь полностью по этим пакетам (посмотрите AckCmd на сайте http://ntsecurity.nu или скрытые каналы связи stcpshell в лекции "Черный ход и средства удаленного доступа").

# nemesis -tcp-S 192.168.0.90-D 10.0.0.27 -fA -x 1066 -y 139

То же самое может быть сделано для UDP-подключений. Из-за ненадежной природы UDP-протокола, брандмауэры имеют тенденцию применять ограничение на срок бездеятельности, как только было установлено UDP-подключение. Вы можете проверить временное ограничение брандмауэра с помощью инструмента nemesis-udp. Используйте тот же сценарий, который использовали ранее, но тестируйте UDP-порт 135 (также используемый для трафика NetBIOS). Во-первых, установите подключение между адресами 192.168.0.90 и 10.0.0.27; Netcat работает отлично. Затем выполните следующую команду, чтобы протестировать 5-минутное время ожидания. Команда sleep берет в качестве аргумента количество секунд; 300 секунд равно 5 минутам.

# sleep 300; nemesis -udp -S 192.168.0.90 -D 10.0.0.27 -x 1066 -y 135

Теперь выполните tcpdump с другой стороны брандмауэра. Если ваш сеанс утилиты tcpdump перехватит UDP-трафик, это значит, что трафик от nemesis-udp пересек брандмауэр. Это подразумевает, что время ожидания брандмауэра, вероятно, более 5 минут.

Наконец, вы можете также протестировать то, как брандмауэр мог бы реагировать на программу туннелирования ICMP-типа Loki (см. лекции "Черный ход и средства удаленного доступа"). Например, брандмауэр никогда не должен разрешать ответ ICMP, если запрос ICMP (сгенерированный утилитой ping, например) происходил не из внутреннего IP-адреса.

# nemesis -icmp -S 192.168.0.90 -D 10.0.0.27 -i 0 -c 0

Можно протестировать все потенциальные 255 типов ICMP (хотя существует, приблизительно, только 40), чтобы увидеть, знает ли брандмауэр, как обработать определенные значения. К счастью, по умолчанию он блокирует пакет, вместо того чтобы разрешать ему вход в сеть 10.x.

#!/bin/sh
TYPE=0
while [ $TYPE -le 255 ] ; do
    nemesis-icmp -S 192.168.0.90 -D 10.0.0.27 -i $TYPE -c 0
    TYPE="expr $TYPE + 1 "
done

Наконец, вы можете испробовать заключительный тест, чтобы проконтролировать, как брандмауэр обрабатывает SNMP-запросы GET. Следующая методика была бы также удобна для более точного метода сканирования портов для служб SNMP. При нормальном UDP-сканировании пустой пакет посылается на порт 161, и ожидается ответ SNMP службы, которого может и не быть, так как пакет неправильный. В данном случае, вы фактически посылаете полный SNMP-запрос. Сначала вы должны создать файл полезной нагрузки, который содержит UDP-данные. Используйте сетевой анализатор потоков ( sniffer ), чтобы перехватить SNMP-трафик и иметь ориентировочные пакеты (см. лекцию "Анализаторы сетевых потоков"). В нашем Perl-скрипте имеется SNMP-запрос GET для строки сообщества "public". Числа, записанные полужирным шрифтом, представляют строку public в шестнадцатеричной записи.

#!/usr/bin/perl
# snmp.pl
# mps -     Generate data for an SNMP GET "public"
$snmp =     "302c02010004067075626c6963a01f020426805d1e0201" .
            "000201003011300f060b2a8648ce340301020102010500";
print pack("H*", $snmp);

Далее, создайте файл полезной нагрузки и выполните утилиту nemesis-udp.

$ ./snmp.pl snmp.payload
$ nemesis-udp -S 192.168.0.179 -D 192.168.0.241 -x 2001 -y 161 
   -P snmp.payload

Этот программный код посылает SNMP-запрос GET с порта 2001 адреса 192.168.0.179 к порту 161 по адресу 192.168.0.241. Мы должны использовать утилиту tcpdump, чтобы наблюдать за ответом.

$ tcpdump-n udp

За пределами командной строки

Инструменты isic и nemesis обеспечивают полный набор функциональных возможностей, которые могут быть быстро вставлены в сценарии командного интерпретатора ( shell ), программы Perl или отдельные командные строки. Они также снимают проблемы отладки собственных C или C++ программ, так как переменные, указатели памяти и сетевая адресация обрабатываются без участия пользователя. С другой стороны, у вас также появляется возможность покопаться во внутренностях этих программ и написать свои собственные программы генерации пакетов, основываясь на библиотеках libnet или libpcap.

Страницы:

Проверка стека TCP/IP вашего брандмауэра, Web-сервера или маршрутизатора не входит в ежедневный осмотр системы с целью обеспечения ее безопасности и даже не входит в еженедельную ревизию. Однако инструментальные средства, предназначенные для проверки стека, могут помочь вам проверить списки управления доступом и исправить уровни доступа. Они также анализируют то, как ваши серверы могут отвечать на атаки, вызывающие отказ в обслуживании (Denial-of-Service) или на другие критические сетевые условия. Некоторые из этих инструментальных средств могут также использоваться для создания произвольных TCP-, UDP- или даже DNS-пакетов. Эти функциональные возможности позволяют вам создавать собственные специфические тесты сценариев - от испытаний допустимой нагрузки, до тестирования совместимости протоколов. Если вам когда-либо приходилось программировать сокеты в системе Unix, то вы обнаружите, что эти инструментальные средства значительно сокращают время, необходимое для создания удобной программы.

ISIC: инструмент для проверки работоспособности IP-стека

Проверка IP-стека своей системы Windows, Linux, Mac или BSD могла бы выглядеть чисто академическим занятием. В конце концов, не так легко делать отладку сетевого кода операционной системы, независимо от того, имеете ли вы исходный текст. С другой стороны, выполнение нескольких тестов в отношении брандмауэров, маршрутизаторов или других хостов, являющихся оплотом защиты вашей сети, дают некоторое полезное представление о том, как каждое устройство реагирует на разнообразный трафик. Это важно при тестировании списков управления доступом, мер защиты от надувательства (anti-spoofing) и сопротивления некоторым типам атак, вызывающим отказ в обслуживания (Denial-of-Service).

Реализация

Комплект /. Он основан на использовании библиотеки создания пакетов libnet, которая должна быть установлена на вашей системе. Приложение ISIC представляет собой комплект из пяти программ: ISIC, tcpsic, udpsic, icmpsic и esic. Каждая из этих программ генерирует различные типы допустимых и недопустимых пакетов для протоколов IP, TCP, UDP, ICMP и ARP. Это дает возможность тестировать не только общие сетевые протоколы (IP), но также и более специфические.

Isic

Утилита ISIC имеет дело с тестами IP-уровня, включая IP-адреса отправителя и получателя, номер версии IP и длину заголовка. Когда вы запускаете программу ISIC, она действует как пакетная пушка, выбрасывая IP-пакеты в сеть с максимальной скоростью. Некоторые из этих пакетов преднамеренно искажены. Используйте процентные опции, чтобы изменить соотношение между дефектными и хорошими пакетами.

Использование:

isic [-v] [-D] -s <ip отправителя> -d <ip получателя>
  [-p <количество генерируемых пакетов>] [-k <пропущенные пакеты>] 
     [-x <посылать пакет X раз>]
  [-r <случайное начальное число>] 
     [-m <максимальная скорость генерации (КБ/с)>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>]
                    [-I <Случайная длина заголовка IP>]

Например, вы можете посмотреть, как шлюз обрабатывает большое количество искаженных пакетов, чтобы определить влияние DoS-атак на пропускную способность сети. Следующая команда посылает пустые IP-пакеты с адреса 192.168.0.12 на адрес 192.168.0.1. В процессе генерации трафика 10% от общего количества пакетов будут содержать неверный номер версии IP (версия, отличная от "4"); не будут генерироваться пакеты, содержащие неподходящую длину заголовка и 50% пакетов будут разделены на фрагменты.

# isic -s 192.168.0.12 -d 192.168.0.1 -F50 -V10 -I0
Compiled against Libnet 1.0.2a
Installing Signal Handlers.
Seeding with 13584
No Maximum traffic limiter
Bad IP Version = 10%    Odd IP Header Length = 0% Frag'd Pcnt = 50%
    1000    @   6192.1 pkts/sec and 3036.2 k/s 
    2000    @   5175.3 pkts/sec and 2109.4 k/s
    3000    @   6040.3 pkts/sec and 2208.7 k/s
    4000    @   6009.8 pkts/sec and 2329.2 k/s
    5000    @   6072.4 pkts/sec and 2335.6 k/s
    6000    @   5325.1 pkts/sec and 2018.3 k/s
    7000    @   6170.7 pkts/sec and 2327.2 k/s

Статистические данные пакетов выводятся для групп в тысячу пакетов. В предыдущем примере ISIC генерирует приблизительно 6000 пакетов в секунду, что грубо соответствует производительности в 2-3 Мбит/с. Помните, 50% от всех этих пакетов фрагментированы и требуют, чтобы брандмауэр (или принимающее устройство) восстанавливал пакеты, что может быть слишком интенсивной нагрузкой на процессор или память, или даже привести к обходу системы обнаружения вторжений. Другие 10% от общего количества пакетов имеют неправильный номер версии IP. К счастью, стек принимающей сети опускает эти пакеты с минимальным влиянием на систему.

Если вы хотите ограничить производительность утилиты ISIC, сожмите ее с помощью опции -m. Это ограничит скорость генерации пакетов определенным количеством килобайт в секунду. Это можно сделать иначе, используя опцию -p, ограничивая отправку определенным числом пакетов.

Никакое тестирование не пойдет впрок, если вы не сможете повторить ввод или сделать запись результатов. Опция -D позволяет регистрировать содержание каждого пакета по мере его выхода в сеть.

192.168.0.12 -> 192.168.0.1 tos [27] id [0] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [250] id [1] ver [4] frag [56006]
192.168.0.12 -> 192.168.0.1 tos [34] id [2] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [213] id [3] ver [4] frag [39249]
192.168.0.12 -> 192.168.0.1 tos [249] id [4] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [91] id [5] ver [4] frag [0]
192.168.0.12 -> 192.168.0.1 tos [26] id [6] ver [4] frag [0]

На первый взгляд, это может показаться не очень полезным, но взгляните на поле IPID. Каждый последующий пакет увеличивает это значение на единицу. Следовательно, вы можете просмотреть файл регистрации, например брандмауэра, чтобы увидеть, какой именно пакет вызвал ошибку. Посмотрите раздел "Советы и уловки" далее в этой лекции, чтобы познакомиться с множеством примеров того, как отслеживать ошибки.

Совет. Добавьте опцию -D, чтобы получить список, содержащий информацию об отладке (содержание пакета) для любого из пакетов *sic.

Tcpsic

Приставка TCP в названии утилиты указывает на то, что она предназначена для генерации случайных TCP-пакетов и данных. Ее использование подобно использованию программы ISIC, но вы можете также указывать порты получателя и отправителя. Это дает вам возможность тестировать службы Web (порт 80), почты (порт 25) или VPN (несколько портов) в дополнение к тестированию системы. Обратите внимание, что у tcpsic добавлены другие процентные опции для хорошего и плохого трафика, который она генерирует.

Использование:

tcpsic [-v] [-D] -s <ip отправителя> [, порт] 
   -d <ip получателя> [, порт]
  [-r начальное случайное число] 
   [-m <максимальная скорость генерации (КБ/с)>]
  [-p <количество генерируемых пакетов>] [-k <пропускаемые пакеты>] 
    [-x <посылать пакет X раз>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>] 
    [-I <Опции IP>]
                    [-T <Опции TCP>] [-u <срочные данные>] 
                         [-t <контрольная сумма TCP>]

Не забудьте ставить запятую между номером порта и IP-адресом. Если вы опускаете номер порта, то tcpsic выбирает случайный порт для каждого пакета.

# tcpsic -s 192.168.0.12,1212 -d 192.168.0.1,80

Udpsic

Утилита udpsic также позволяет определять порты наряду с IP-адресами отправителя и получателя. У протокола UDP нет таких возможностей, как у TCP, и меньше процентных опций, которые нужно определять.

Использование:

udpsic [-v] [-D]-s <ip отправителя> 
 [,порт]-d <ip получателя> [,порт]
  [-r начальное случайное число] 
     [-m <максимальная скорость генерации (КБ/с)>]
  [-p <число генерируемых пакетов>] [-k < пропускаемые пакеты >] 
     [-x <посылать пакет X раз>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>] 
    [-I <Опции IP>]
                    [-U <Контрольная сумма UDP>]

UDP составляет меньшую часть IP-трафика. Обычно он относится к DNS-трафику.

# udpsic -s 192.168.0.12,1212 -d 192.168.0.1,53

Однако этот инструмент может также использоваться для тестирования серверов, выполняющих протоколы поточной передачи ( streaming ) типа протоколов, использующихся в медиа-серверах ( media servers ) и в сетевых играх.

Icmpsic

Большинство сетей блокируют входящие ICMP-сообщения в своих сетях. Используйте инструмент icmpsic, чтобы посмотреть, как ваше устройство защиты обрабатывает ICMP-трафик, включая трафик, который не попадает в категорию Ping. Нормальный ICMP-трафик обычно состоит из парных ICMP-запросов ( echo request ) (хост задает вопрос: "Есть ли там кто-нибудь?") и ICMP-ответов ( echo reply ) (ответ хоста: "Мы и они"). Существуют другие типы ICMP-сообщений, которые охватывают управление доступом и метками времени ( timestamp ). Большую часть времени весь ICMP-трафик, направленный из интернета в сеть, блокирован. Во внутренней сети утилита ping обычно может искать свободно, так почему бы не исследовать, как устройства обрабатывают чрезмерный ICMP-трафик?

Использование:

icmpsic [-v] [-D]-s <ip отправителя> 
  [, порт]-d <ip получателя> [,порт]
[-r начальное случайное число] 
   [-m <максимальная скорость генерации (КБ/с)>]
[-p <число генерируемых пакетов>] [-k <пропускаемые пакеты>] 
  [-x <посылать пакет X раз>]
Процентные опции:   [-F фрагментирование] [-V <Плохая версия IP>] 
  [-I <Опции IP>]
                    [-i <Плохая контрольная сумма ICMP>]

Хотя использование утилиты подразумевает, что вы можете указать порты с помощью аргументов -s и -d, установка номера порта заставляет утилиту icmpsic вместо этого использовать широковещательный (broadcast) адрес. Номера портов не являются частью ICMP-протокола. На уровне IP вы все еще можете генерировать фрагментированные пакеты ( -F ), пакеты с плохими версиями IP ( -V ) и пакеты с плохими опциями IP ( -I ). ICMP является подмножеством протокола IP, поэтому эти опции все еще доступны.

Единственная опция, специфическая для ICMP, позволяет посылать неверную контрольную сумму ICMP-сообщения, которая должна делать полученный пакет недействительным. Во всем остальном, утилита ).

Esic

Буква e в названии esic означает Ethernet-сеть. Этот инструмент передает пакеты со случайными номерами, другими словами, пакеты, основанные не на TCP/IP-протоколе. Это единственный инструмент, который работает ниже уровня IP, поэтому он не может обеспечить генерацию такого же количества недопустимых пакетов.

Использование:

esic -i interface [-s <MAC-адрес отправителя>] 
 [-d <MAC-адрес получателя>]
  [-p <протокол #> или "rand">] [-r <начальное случайное число>]
  [-c <# число посылаемых пакетов>] [-l <максимальная длина пакета>]
  [-m <# число пакетов между распечаткой>]

Использование этого инструмента ограничено, главным образом, тестированием брандмауэров или причинением разрушительного ущерба коммутаторам. Обратите внимание, что заданный по умолчанию MAC-адрес получателя - широковещательный. Это означает, что любой пакет, который вы создаете без использования опции -d, будет передаваться на каждый интерфейс хаба или коммутатора. Это могло бы создавать наплыв пакетов, приводящий к атаке, вызывающей отказ в обслуживании, или к такому потоку, который коммутатор не успевает обрабатывать, таким образом, низводя функцию коммутатора до функции хаба и допуская возможность перехвата трафика. Конечно, потребуется большой трафик, чтобы повлиять на 100-мегабайтный коммутатор.

Советы и уловки

Комплект инструментов ISIC предназначен не для эзотерических сетевых тестов. Каждому инструменту соответствуют определенные сценарии, для которых он полезен. В таблице 17.1 перечислен каждый инструмент и некоторые примеры сценариев тестирования.

Сценарии тестов, выполняемые с помощью комплекта isic
Инструмент Сценарий теста
ISIC Брандмауэры. Маршрутизаторы. Хосты защитного бастиона (Web-серверы, DNS-серверы, почтовые серверы).
tcpsic Брандмауэры (особенно, интерфейс администрирования). Маршрутизаторы (особенно, интерфейс администрирования). Важные службы (22: SSH, 25: SMTP, 80: HTTP, 443: HTTP, 8080: proxies).
udpsic Важные службы (53: DNS).
icmpsic Маршрутизаторы. Брандмауэры.
esic Брандмауэры. Маршрутизаторы. Коммутаторы (включая атаки трафика повышенной интенсивности, которые могут дать возможность прослушивания сети).

Брандмауэры

Все эти инструментальные средства помогают удостовериться в правильности набора правил брандмауэра и производительности системы, находящейся под давлением. Например, вы могли бы запустить утилиту ISIC с высоким процентом недопустимых пакетов, чтобы создать повышенную нагрузку.

# isic -s 172.16.19.12 -d 192.168.0.1 -F75 -V75 -I75

Недопустимые пакеты предназначены для того, чтобы создать более тяжелую нагрузку на брандмауэр. Брандмауэры имеют тенденцию работать эффективно, когда трафик нормален. Как системный администратор, вы должны также беспокоиться о том, как брандмауэр действует в неблагоприятных условиях. Число 75 после опций -F, -V и -I означает, что у 75 % от всех пакетов будут ошибки в версии IP, длине заголовка и подсчете фрагментов. Хотя такая команда не является сигнатурой какой-либо специфической атаки, вызывающей отказ в обслуживании, но она может вызвать подобные эффекты.

Можно параллельно запустить tcpsic, чтобы проверить, как брандмауэр обрабатывает трафик к находящемуся за ним Web-хозяйству.

# tcpsic -s 172.16.19.23,3434 -d 192.168.0.37,80

Теоретически, брандмауэр должен просто сбрасывать недопустимый трафик и переходить к следующему пакету; однако вы можете обнаружить случаи, в которых брандмауэр тратит необычно много времени на определенный номер протокола, фрагмент или недопустимую опцию TCP. Конечно, атака на брандмауэр не является единственной возможностью. В таблице 17.2 показаны другие типы тестов, которые вы можете выполнить.

Сценарии общих тестов
Тест Сценарий
Нацелен на брандмауэр Посылайте трафик на IP-адрес брандмауэра или на один из его портов администрирования.
Подмена IP-адресов Генерируйте трафик на неподходящий интерфейс. Например, используйте адреса отправителя из адресного пространства 172.16.0.0/16 для интерфейса, который обслуживает сеть 10.1.2.0/24. Этот тест особенно полезен для брандмауэров с несколькими интерфейсами. Кроме того, он может обнаруживать проблемы с правилами брандмауэра, защищающими от обманов, или их отсутствие.
Нацелен на хосты позади брандмауэра Пытайтесь передавать трафик через брандмауэр, чтобы посмотреть, останавливает ли он пакеты, сформированные с изъяном.
Внимание. Если вы генерируете пакеты опцией rand для IP-адреса отправителя в инструментах tcpsic или udpsic, то сервер получателя может ответить на эти IP-адреса при попытке завершить трехэтапное квитирование по TCP-протоколу! Имейте в виду, что вы можете неосторожно передать TCP-, RST- и FIN-пакеты на случайные адреса.

Другая полезная методика генерации пакетов для тестов на повышенную нагрузку состоит в использовании случайного заполнителя ( rand placeholder ) для IP-адреса отправителя. Любое из инструментальных средств комплекта ISIC генерирует случайные IP-адреса, если это указано, даже из резервного адресного пространства. Используйте эту программу, чтобы проверить, как брандмауэр обрабатывает DNS-трафик, включающий 50 % неправильных контрольных сумм UDP.

# udpsic -s rand -d 192.168.0.121,53 -U50

Управление пакетами

Каждый инструмент поддерживает опции -m, -p, -k и -x, чтобы управлять созданием пакета и пропускной способностью. Используйте опцию -m, чтобы ограничить максимальную пропускную способность, которую пробует использовать инструмент ISIC. Эта опция может быть полезна для установления базовой нагрузки против сервера (например, маршрутизатора) или службы (например, HTTP). Например, по следующей команде никаких вредных пакетов не генерируется, но посылается устойчивый трафик в 1000 Кбит/с к Web-серверу.

# tcpsic -s rand -d 192.168.0.37,80 -m 1000 -F0 -V0 -I0 -t0

Этот тест может также показать, как брандмауэр регистрирует трафик при тяжелых нагрузках. Если бы это была атака, вызывающая отказ в обслуживании, но полная информация была зафиксирована только для первых нескольких подключений, то вы не можете быть уверены, что очевидное нападение не прикрывает сфокусированную атаку на Web-сервер. Также удостоверьтесь, что у брандмауэра достаточно пространства на диске для хранения файлов регистрации.

Опция -p предписывает ISIC посылать установленное число пакетов и затем останавливаться. Опция -k заставляет isic пропускать заданное число пакетов. Например, следующая команда генерирует 100000 пакетов, но опускает первые 50000.

# icmpsic -s rand -d 192.168.0.12 -p100000 -k50000

Iptest

Утилита /). Фильтр IP является брандмауэром и программным обеспечением NAT для ядра BSD и Linux 2.0.x (плюс версии для Solaris, HP-UX и QNX). Его первоначальная цель заключалась в проверке на устойчивость брандмауэра к ошибкам в критических сетевых условиях.

Реализация

Все тесты требуют четырех опций для определения отправителя и получателя каждого пакета. IP-адрес отправителя определяется опцией -s; получатель всегда задается последним аргументом (без флага опции).

# iptest -s 172.16.34.213 192.168.12.84

Если IP-адрес отправителя не принадлежит физической сетевой карте (NIC), использующейся для генерации трафика, вам может понадобиться определить также сетевой интерфейс ( -d ) и шлюз ( -g ) в командной строке.

# iptest -s 10.87.34.213 -d le0 -g 192.168.12.1 192.168.12.84

Затем вы можете позволить инструменту Iptest пройти весь список встроенных тестов, или выбрать более узко направленные тесты с помощью опций -n и -pt, где n - число в интервале от одного до семи, а t - номер "точечного теста" (point test) для соответствующего n. Другими словами, вы выбираете опцию между единицей и семеркой. Например, опция пять ( -5 ) содержит большинство TCP-тестов. В пределах пятой опции есть восемь точечных тестов ( -p ). Окончательно команда, предназначенная для выполнения пятой опции с ее первым точечным тестом, будет выглядеть следующим образом:

# iptest -s 10.87.34.213-d le0-g 192.168.12.1 -5 -p1 192.168.12.84

В этом примере будут проверены все комбинации флагов TCP. В таблице 17.3 описаны более полезные опции меню.

Опции утилиты iptest и их точечные тесты
Номер опции Точечный тест Описание
Опции iptest
-1 7 Генерирует пакеты с фрагментами нулевой длины.
-1 8 Создает пакеты длиной более 64 килобайт после сборки. Это могло бы вызвать переполнение буфера в плохих сетевых стеках.
-2 1 Создает пакеты с длиной опции IP, которая больше, чем длина пакета.
-6 n/a Генерирует фрагменты пакета, которые перекрываются при реконструкции. Это может наносить ущерб менее устойчивым стекам TCP/IP. Если вы используете этот тест, выполняйте его отдельно от других.
-7 n/a Генерирует 1024 случайных IP-пакета. Поля IP-уровня будут правильны, но данные пакета - случайны.
Опции UDP теста
-4 1,2 Создает длину полезной нагрузки UDP протокола, которая меньше (1) или больше (2), чем длина пакета.
-4 3,4 Создает UDP-пакет, в котором номер порта отправителя (3) или получателя (4) попадает на границу байта: например, 0, 1, 32767, 32768, 65535. Этот тест может обнаружить граничные (off-by-one) ошибки.
Опции ICMP теста
-3 с 1 по 7 Генерирует различные нестандартные ICMP-типы и коды. Может выявить ошибки в списке контроля доступа ACL, которые, как предполагается, блокируют ICMP-сообщения.
Опции TCP теста
-5 1 Генерирует все возможные комбинации флагов опций TCP. Этот тест может выявить логические проблемы в способах, которыми стек TCP/IP обрабатывает или игнорирует пакеты.
-5 2,3 Создает пакеты, в которых номера пакетов (2) и номера подтверждения (3) попадают на границы байта. Этот тест может выявить граничные ( off-by-one ) ошибки.
-5 4 Создает SYN -пакеты различных размеров. SYN -пакет с нулевым размером является повсеместным пакетом сканирования порта. Система обнаружения вторжений или брандмауэр должны отслеживать все виды SYN -пакетов, соответствующих подозрительной деятельности.
-5 7,8 Создает пакеты, в которых номер порта отправителя (7) или порта получателя (8) попадает на границу байта. Например, 0, 1, 32767, 32768, 65535. Может выявить граничные ошибки ( off-by-one ).

Пример из жизни. Эксплуатационные качества брандмауэра

Сетевых администраторов всегда интересует, как хорошо брандмауэр защищает сеть, как он действует при активных нападениях (таких как атаки, вызывающие отказ в обслуживании, и интенсивное сканирование) и как он справляется с тяжелыми нагрузками. В связи с этим Джек намерен проверить свой брандмауэр. Он берет следующий сценарий и загружает его на свой лэптоп с системой FreeBSD. Этот лэптоп помещен перед брандмауэром. Это означает, что он представляет трафик, приходящий из интернета.

#!/bin/sh
# IP Stack test
# usage: test.sh gateway source destination
# note, change "le1" to your interface
iptest -1 -d le1 -g $1 -s $2 $3
iptest -2 -d le1 -g $1 -s $2 $3
iptest -3 -d le1 -g $1 -s $2 $3
iptest -4 -d le1 -g $1 -s $2 $3
iptest -5 -d le1 -g $1 -s $2 $3
iptest -6 -d le1 -g $1 -s $2 $3
iptest -7 -d le1 -g $1 -s $2 $3
isic -s $2 -d $3 -p10000
tcpsic -s $2 -d $3 -p10000

Затем берет другой лэптоп и размещает его за брандмауэром. Эта сеть имеет высокую пропускную способность. Она содержит только коммутаторы, и это значит, что ему надо будет подключиться к так называемому спэн-порту (span - Switched Port Analyzer), чтобы перехватить весь трафик с помощью утилиты tcpdump. К счастью, система обнаружения вторжений уже находится на спэн-порте. Поскольку система обнаружения вторжений (IDS) не уловила никаких атак в течение последних двух месяцев, и тест выполняется после окончания рабочего времени, то никто не может пожаловаться, что IDS была выключена в течение нескольких минут. Джек отключает IDS и подключает свой лэптоп, выполняющий tcpdump. Он запускает тест :, но ничего не происходит!

После нескольких минут перепроверки сценария теста IP-стека, Джек осознает, что спэн-порт, который прослушивался IDS, никогда, фактически, не был установлен на режим спэн. Другими словами, в течение последних двух месяцев IDS был способен перехватить только трафик, который был послан непосредственно ему. Джек быстро исправляет ошибку и продолжает тест брандмауэра, но все это показывает, что регулярное тестирование необходимо для поддержания жизнеспособности вашей сети, даже если вы не пытаетесь решить определенную проблему!

Nemesis: создание пакетов 101

Инструмент nemesis предназначен для создания собственных IP-пакетов. В отличие от утилит isic и Iptest, которые автоматически генерируют хорошие и вредные пакеты, nemesis может изменять любую часть пакета. Утилита основана на библиотеке libnet, но ее легче использовать, чем libnet или libpcap, потому что она не требует никакой манипуляции на уровне сокета. Вместо написания и отладки программ на языке C, вы можете быстро настроить сценарий командного интерпретатора. Вам надо только определить содержимое данных в командной строке; nemesis сам создает и посылает пакет.

Реализация

Комплект nemesis содержит утилиты, предназначенные для создания пакетов и пакетных данных для протоколов ARP, DNS, ICMP, IGMP, OSPF, RIP, TCP и UDP. Каждая утилита называется соответственно nemesis - <протокол>, где <протокол> - один из восьми поддерживаемых типов протокола. Например, nemesis-dns имеет дело с созданием DNS-пакетов, в то время как nemesis-tcp создает пакеты для TCP-трафика. Вы можете выполнить общую отладку сети и тестирование с помощью инструментальных средств nemesis-udp и nemesis-tcp. Другие инструментальные средства приспособлены для тестирования более специализированных протоколов или служб.

Требуется некоторое время, чтобы начать создание пакетов с помощью nemesis, но как только вы создадите каркас, в нем будет просто производить небольшие изменения. Каждое из инструментальных средств комплекта nemesis требует основных IP-опций. Каждое из инструментальных средств поддерживает следующие опции.

Опции IP:

-S  <IP адрес отправителя>
    -D  <IP адрес получателя>
    -I  <IP ID (идентификатор)>
    -T  <IP TTL (время жизни дейтаграммы)>
    -t  <IP tos (тип сервиса)>
    -F  <IP frag (смещение фрагмента)>
    -O  <Опции IP>

Опции Data Link:

-d  <Устройство Ethernet>
    -H  <MAC-адрес отправителя>
    -M  <MAC-адрес получателя>

Утилита nemesis-tcp может быть особенно полезна при составлении общей картины атак, называемых "reply attacks", за счет анализа пакетов, которые вы перехватили в сети. Например, чтобы подделать сеанс TCP, вам нужно знать не только одноранговый (peer) IP-адрес и номер порта, но также и порядковый номер пакета (SEQ) и номер подтверждения (ACK). Таким образом, вы можете обрабатывать любую часть трехэтапного квитирования при установлении связи по TCP. Утилита nemesis-tcp поддерживает следующие специфические для TCP опции.

Опции TCP:

[-x <порт отправителя>]
    [-y <порт получателя>]
    -f  <Опции флагов TCP>
    -fS SYN,-fA ACK,-fR RST,-fP PSH,-fF FIN,-fU URG
    -w  < Размер окна>
    -s  <номер SEQ>
    -a  <номер ACK>
    -u  <TCP urgent pointer (указатель срочности)>
    -P  <Файл полезной нагрузки (двоичный или ASCII)>
    -v  VERBOSE (Подробный - вывод структуры пакета на стандартное 
        устройство stdout)
Совет. Помещайте опции TCP флага ( -f ) перед опциями порта ( -x, -y ). Иначе флаги могут быть применены не по назначению.

Утилита nemesis-udp поддерживает приведенные ниже опции. Заметьте, что UDP, как протокол, не устанавливающий соединения и не имеющий состояния, не предусматривает так много опций, как TCP. Некоторые применения этой утилиты могли бы состоять в толковом сканировании портов при поиске UDP-служб, таких как SNMP, используя опцию -P для обработки определенного пакета.

Опции UDP:

[-x <порт отправителя>]
    [-y <порт получателя>]
    -P <Файл полезной нагрузки>
    -v VERBOSE (подробный вывод структуры пакета на стандартное 
       устройство stdout)

В разделе <Пример из жизни> в конце этой лекции, посмотрите пример генерации SNMP-пакета.

опции ICMP:

-i  <Тип ICMP>
    -c  <Код ICMP>
    -s  <Порядковый номер>
    -m  <Маска ICMP>
    -G  <Предпочитаемый шлюз>
    -Co <Время возникновения запроса>
    -Cr <Время получения запроса>
    -Ct <Время передачи ответа>
    -P  <Файл полезной нагрузки (двоичный или ASCII)>
    -v  VERBOSE (подробный - вывод структуры пакета на стандартное 
        устройство stdout)

Комплект nemesis поддерживает также DNS ( nemesis-dns ), ARP ( nemesis-arp ), IGMP ( nemesis-igmp ) и OSPF ( nemesis-ospf ) протоколы. Хотя они относительно мало известны, возможности протоколов IGMP и OSPF могут быть полезны для сетевых инженеров, пробующих отлаживать глобальные сети.

Пример из жизни. Вбрасывание пакетов

Одной из особенностей хорошего брандмауэра является способность динамически открывать и закрывать порты для отдельных TCP-подключений. Вы можете использовать утилиту nemesis, чтобы проверить способность набора правил вашего брандмауэра к контролю состояний ( statefulness ). Это может быть важным тестом для предотвращения атак подмены пакетов ( packet spoofing ). Например, вы можете проверить правило, которое разрешает трафик NetBIOS (TCP-порт 139) только между двумя хостами: 10.0.0.27 и 192.168.0.90.

Когда начинается подключение, хост 192.168.0.90 посылает TCP SYN -пакет с порта 1066 на порт 139 адреса 10.0.0.27. Ниже приводится частичный перехват данных утилитой tcpdump из начального трафика.

19:34:48.663980 192.168.0.90.1066 > 10.0.0.27.139: S 847815674:847815674 (0)
 win 16384 < mss1460, nop, nop, sackOK > (DF)
19:34:48.664567 10.0.0.27.139 > 192.168.0.90.1066: S 4141875831:4141875831 (0)
 ack 847815675 win 17520 < mss 1460, nop, nop, sackOK > (DF)
19:34:48.665586 192.168.0.90.1066 > 10.0.0.27.139:. ack 1 win 17520 (DF)

В этой точке брандмауэр разрешает трафик, имеющий такую комбинацию IP-адресов и портов, которая обычно используется для установления соединения. Последующие TCP-пакеты несут ACK-флаг, пока подключение не будет закрыто флагами FIN или RST. Это то место, где вы тестируете брандмауэр с помощью утилиты nemesis-tcp.

Первый тест состоит в определении того, позволяет ли брандмауэр пройти произвольному пакету, несущему флаги FIN или RST.

# nemesis -tcp -S 192.168.0.90-D 10.0.0.27 -fF -x 1066 -y 139
# nemesis -tcp -S 192.168.0.90-D 10.0.0.27 -fR -x 1066 -y 139

Конечно, вы должны выполнять tcpdump с другой стороны брандмауэра (в сети 10.x), чтобы увидеть, проходят ли пакеты через набор правил. Брандмауэр должен блокировать эти пакеты, потому что номера TCP-пакетов неверны ( nemesis назначает их случайным образом). Если эти пакеты были разрешены брандмауэром, то атаки, вызывающие отказ в обслуживании, могли бы быть выполнены против адреса 10.0.0.27, наводняя его RST-пакетами, то есть никакие допустимые подключения не могли бы поддерживаться!

Затем вы увидите, как брандмауэр обрабатывает ACK-пакеты. Некоторые хакерские нелегальные инструментальные средства туннелируют связь полностью по этим пакетам (посмотрите AckCmd на сайте http://ntsecurity.nu или скрытые каналы связи stcpshell в лекции "Черный ход и средства удаленного доступа").

# nemesis -tcp-S 192.168.0.90-D 10.0.0.27 -fA -x 1066 -y 139

То же самое может быть сделано для UDP-подключений. Из-за ненадежной природы UDP-протокола, брандмауэры имеют тенденцию применять ограничение на срок бездеятельности, как только было установлено UDP-подключение. Вы можете проверить временное ограничение брандмауэра с помощью инструмента nemesis-udp. Используйте тот же сценарий, который использовали ранее, но тестируйте UDP-порт 135 (также используемый для трафика NetBIOS). Во-первых, установите подключение между адресами 192.168.0.90 и 10.0.0.27; Netcat работает отлично. Затем выполните следующую команду, чтобы протестировать 5-минутное время ожидания. Команда sleep берет в качестве аргумента количество секунд; 300 секунд равно 5 минутам.

# sleep 300; nemesis -udp -S 192.168.0.90 -D 10.0.0.27 -x 1066 -y 135

Теперь выполните tcpdump с другой стороны брандмауэра. Если ваш сеанс утилиты tcpdump перехватит UDP-трафик, это значит, что трафик от nemesis-udp пересек брандмауэр. Это подразумевает, что время ожидания брандмауэра, вероятно, более 5 минут.

Наконец, вы можете также протестировать то, как брандмауэр мог бы реагировать на программу туннелирования ICMP-типа Loki (см. лекции "Черный ход и средства удаленного доступа"). Например, брандмауэр никогда не должен разрешать ответ ICMP, если запрос ICMP (сгенерированный утилитой ping, например) происходил не из внутреннего IP-адреса.

# nemesis -icmp -S 192.168.0.90 -D 10.0.0.27 -i 0 -c 0

Можно протестировать все потенциальные 255 типов ICMP (хотя существует, приблизительно, только 40), чтобы увидеть, знает ли брандмауэр, как обработать определенные значения. К счастью, по умолчанию он блокирует пакет, вместо того чтобы разрешать ему вход в сеть 10.x.

#!/bin/sh
TYPE=0
while [ $TYPE -le 255 ] ; do
    nemesis-icmp -S 192.168.0.90 -D 10.0.0.27 -i $TYPE -c 0
    TYPE="expr $TYPE + 1 "
done

Наконец, вы можете испробовать заключительный тест, чтобы проконтролировать, как брандмауэр обрабатывает SNMP-запросы GET. Следующая методика была бы также удобна для более точного метода сканирования портов для служб SNMP. При нормальном UDP-сканировании пустой пакет посылается на порт 161, и ожидается ответ SNMP службы, которого может и не быть, так как пакет неправильный. В данном случае, вы фактически посылаете полный SNMP-запрос. Сначала вы должны создать файл полезной нагрузки, который содержит UDP-данные. Используйте сетевой анализатор потоков ( sniffer ), чтобы перехватить SNMP-трафик и иметь ориентировочные пакеты (см. лекцию "Анализаторы сетевых потоков"). В нашем Perl-скрипте имеется SNMP-запрос GET для строки сообщества "public". Числа, записанные полужирным шрифтом, представляют строку public в шестнадцатеричной записи.

#!/usr/bin/perl
# snmp.pl
# mps -     Generate data for an SNMP GET "public"
$snmp =     "302c02010004067075626c6963a01f020426805d1e0201" .
            "000201003011300f060b2a8648ce340301020102010500";
print pack("H*", $snmp);

Далее, создайте файл полезной нагрузки и выполните утилиту nemesis-udp.

$ ./snmp.pl snmp.payload
$ nemesis-udp -S 192.168.0.179 -D 192.168.0.241 -x 2001 -y 161 
   -P snmp.payload

Этот программный код посылает SNMP-запрос GET с порта 2001 адреса 192.168.0.179 к порту 161 по адресу 192.168.0.241. Мы должны использовать утилиту tcpdump, чтобы наблюдать за ответом.

$ tcpdump-n udp

За пределами командной строки

Инструменты isic и nemesis обеспечивают полный набор функциональных возможностей, которые могут быть быстро вставлены в сценарии командного интерпретатора ( shell ), программы Perl или отдельные командные строки. Они также снимают проблемы отладки собственных C или C++ программ, так как переменные, указатели памяти и сетевая адресация обрабатываются без участия пользователя. С другой стороны, у вас также появляется возможность покопаться во внутренностях этих программ и написать свои собственные программы генерации пакетов, основываясь на библиотеках libnet или libpcap.

Вернуться к учебному плану