Intrusion Detection                   http://security.tsu.ru/info/unix/lance/ids.html
Knowing when someone is knocking on your door.
Lance Spitzner
_________________________________________________________________________________

Как обнаружить вторжение
Как узнать, что кто-то стучится в Вашу дверь.

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

Установка системы обнаружения попыток вторжения

Обсуждаемые здесь способы легки в применении. Если Вас интересует более серьезная защита, то Вам следует применить трехсторонюю Intusion Detection System , такую как Network Flight Recorder (http://www.nfr.net/nfr). Она применяет анализ трафика и усовершенствованный алгоритм определения попыток вторжения. Наш подход более простой.
Существует множество различных методов, которыми пользуются хакеры. Один из них - сканирование портов.
Это попытки установить соединение с множеством различных портов с целью определения, какие порты открыты и какие сервисы на них запущены. Скан портов может применяться к одной машине либо к определенному диапазону IP-адресов либо выбор может быть случайным.
Итак, мы построим систему, которая будет оповещать нас каждый раз, когда кто-либо попытается установить соединение с заранее определенным нами портом. Во-первых, мы определим 3-5 популярных у хакеров портов. Затем мы определим 2-3 системы, прослушивающих  эти порты. Когда эти порты будут сканироваться, системный лог запишет эту попытку, система выполнит заранее определенные действия,  затем пошлет сообщение контактному лицу.
В конечном счете Вы получите сообщение по каждому просканированному порту. Если у Вас 3 системы, каждая из которых слушает по 4 порта, тогда Вы можете получить до 12 почтовых сообщений о сканировании портов.
Но обычно хакеры, сканирующие сети, ищут какую-либо одну уязвимость, напрмер, imap(port 143). В таком случае мы получим только 3 сообщения, по одному на каждую систему. Когда же сканируется один хост, то часто диапазон сканируемых портов варьируется от 1 до 1024. В этом случае мы получим только 4 сообщения, по одному на каждый хост.  Основываясь на полученой информации, Вы сможете определить, что интересует хакера. См. Пример I.
Для того, чтобы применить эту методику, мы для начала определяем 2-3 системы для мониторинга.Я часто
выбираю DNS-сервер, потому что многие сканирующие средства начинают со сканирования Сервера Имен для построения базы данных IP-адресов. Затем выделяем от трех до пяти наиболее часто сканируемых портов. Будьте уверены, что Вы будете извещены о том, что кто-либо соединился с этим портом.  Для того, чтобы узнать, какие порты популярны у сканеров, посмотрите www.cert.ortg, CERT alerts. Мы же определяем:

imap (port 143)
SMB (port 139)
login (port  513)
http (port 80)

Возможно, Ваша система и не использует эти порты. В противном случае, убедитесь, что эти порты не прикрыты файрволом или экранным роутером.
Мы применим TCP Wrapper (автор Wietse Venema). Это средство позволит нам контролировать, вести логи и, самое главное,  реагировать на попытки получения доступа к "обернутому" Wrapper'ом  сервису. TCP Wrapper запишет в лог сообщение о попытке соединения (с помощью syslog)  и затем запустит механизм оповещения.
Я настоятельно рекомендую инсталлировать TCP Wrapper. Он легко компилируется, конфигурируется и прост в применении. Вы можете найти его здесь - ftp://coast.cs/purdue.edu/pub/tools/unix. Перед компиляцией включите опцию language extension в Makefile (Это существенно улучшит конфигурируемость). Информация об установке TCP Wrapper есть здесь -- "Armoring Solaris".
Итак, как только мы установили TCP Wrapper, мы "оборачиваем" 4 вышеупомянутых порта. Порты сначала определяются в файле /etc/services, а затем добавляются в файл /etc/inetd.conf. Вот пример "обернутого" imap:
imap    stream    tcp    nowait    root    /usr/local/bin/tcpd imap.trap
В /etc/hosts.allow помещаем следующую строку:
imap.trap:    ALL:    spawn (/var/adm/ids.sh  %d  %h  %H)
Таким образом мы приказываем  tcpd принимать все запросы на установление соединения вне зависимости от IP-адреса,  затем запускать скрипт определения вторжения, и этот скрипт извещает нас о попытке вторжения.
ids.sh расположен в дирректории /var/adm. ( Ему передаются следующие параметры: %d - имя демона, в данном случае imapd, %h - имя (если есть) или адрес хоста-клента (хоста, с которого сканируется Ваша система), %H - имя или адрес сервера,  Вашего хоста - прим. перевод.)   .  Вы можете его изменить по своему вкусу. В моем примере проводится анализ данных, запускается safe_finger к источнику вторжения, посылается по электронной почте сообщение контактому лицу и  запускается snoop с целью определения дополнительных действий со стороны взломщика ( последнее - в зависимости от "оборачиваемого" сервиса). См. Пример II.
Теперь, если кто-либо установит соединение с одним из определенных нами выше портов, мы получим сообщение, содержащее критические данные.  Например, некто сканирует нашу сеть по 143 порту с целью обнаружения уязвимостей. Три системы в нашей сети слушают этот порт. Соединение устанавливается и запускается tcpd (как определено в /etc/inetd.conf - прим. перевод.). Он просматривает файл /etc/hosts.allow и находит строку, относящуюся к imap.trap. Что в свою очередь порождает исполнение скрипта /var/adm/ids.sh,
который собирает полезные сведения, делает finger к клиенту, посылает админу предупреждение об обнаружении попытки  вторжения и запускает snoop. Затем tcpd пытается запустить /usr/sbin/imap.trap, который не существует. Tcpd завершает работу, сообщив об ошибке в syslog (сообщение о несуществующем imap.trap - прим. перевод.). Чтобы избежать этого, Вы можете создать простой скрипт /usr/sbin/imap.trap, который не будет ничего выполнять.
Стоит упомянуть Denial od Service attacks, DoS-аттаку.  В таком случае, чем больше функций выполняет Ваш скрипт ( ids.sh ), тем больше загружается Ваша система.  Атакующий хост может вывести Вашу систему из строя путем установления многочисленных соединений к определенному порту, вынудив таким образом Вашу систему исполнить скрипт столько же раз. Если Ваш скрипт выполняет много действий, то я рекомендую Вам ограничить число процессов, запускающихся на Вашей системе при установлении соединения с одним IP-адресом. Самый простой способ сделать это - поискать IP-адрес источника сканирования в tcpdlog. (Т.е. в логе, который ведет Ваш tcpd, см. /etc/sysconf.log, скорее всего, это будет  /var/log/secure - прим. перевод.). Если Вы не найдете его там, значит, этот адрес сканирует Вас впервые, и Вы можете запускать обычный скрипт обнаружения попытки вторжения. Если же Вы обнаружите, что этот адрес встречался в логе и раньше, то не следует запускать скрипт во избежание перегрузки системы, просто добавьте в лог запись об этом IP-адресе.
(Дополните Ваш ids.sh-скрипт таким поиском -прим. перевод.)
Альтернатива TCP Wrapper - роутер. Многие не имеют возможности использовать на каждой системе методику обнаружения вторжения. Тогдв Вы можете применить описанную выше методику  к маршрутизатору. Сначала Вы выбираете 2-3 системы и 3-5 портов для мониторинга.  Строите ACL  ( Access Control List - список тех, кому разрешен доступ), таким образом Вы запретите доступ к определенным системам и к определенным портам.
Исходя из ACL syslog-сервер будет вести логи по всем попыткам установления соединения. Теперь Вы легко сможете отслеживать запрещенный траффик и легко определите, была ли попытка вторжения. Я успешно применял этот метод в сочетании с Switch, который автоматизирует и процесс фильтрации, и процесс извещения.
Эти решения не достаточно полны. Многие современные сканеры портов не завершают установку соединения,
(не выполняя SYN/ACK последовательность ), другие используют неверные пакеты ( FIN или Xmas-сканы).
Описанные мною методы не обнаруживают такие видя сканирования. В таком случае Вам необходимы усовершенствованные средства, например tcplogd, который обнаруживает такое скрытое сканирование.
Существуют и другие способы обнаружения вторжения. Сначала Вы уясняете себе методологию вторжения, затем применяете отслеживающие и предупреждающие процедуры. Примером могут послужить многочисленные неудачные попытки залогиниться. Пять последовательных неудачных попыток записываются в /var/adm/loginlog. Это может случиться , если кто-то подбирает логин и пароль. Все мои системы с помощью cronjob ежедневно проверяют этот файл на наличие записей. Если записи присутствуют, то кто-то либо забыл свой пароль и пытается вспомнить его либо кто-то пытается подобрать логин и пароль с целью вторжения. Cronjob посылает мне эти строки из /var/adm/loginlog, делает копию в архив, затем очищает лог.
Другой пример  -  /cgi-bin/test-cgi аттака, применяемая к www-серверам. Вместо запрещения cgi-скрипта  я заставляю его вести лог и емэлить мне всякий раз, когда некто пытается применить взлом по cgi-уязвимости.
Такая методика не требует ничего, кроме добавления в test-cgi-скрипт нескольких строк ( предварительно не забудьте проверить его на Вашей системе).
Как мы смогли убедиться, существует немало простых способов обнаружения попыток вторжения. И хотя они не совершенны, они дают возможность определить существование опасности и защитить Вашу сеть.
А что же делать в случае обнаружения попытки вторжения ?

Реакция на вторжение

Ваш первый шаг - утвердиться во мнении, что Вашу систему пытаются взломать. Даже если Вы получили емэйл от TCP Wrapper, это вовсе не означает, что Вас сканируют. Возможно, кто-то просто ошибся. Но, если все три Ваши ситемы сканировались в одно и то же время по одному и тому же порту, то это скорее всего будет означать сканирование с целью обнаружения определенных уязвимостей. И что же дальше?
Контр-атака и выведение удаленной системы из строя- это последнее, что Вы можете предпринять. Следует быть осторожным, реагируя на сканирование.
Возможно, Вас действительно сканируют, но не со злым умыслом либо случайно.Многие крупные организации периодически сканируют свои сети и удаленные офисы. Я лично знаю случай, когда некто сканировал чужую сеть по ошибке. Часто люди, отвечающие за системы, инициировавшие сканирование Ваших систем, просто не знают о фактах сканирования из их сетей. Или некая система уже взломана и в данный момент используется в качестве стартовой площадки для дальнейших взломов. В большинстве случаев админ "виновной" сети заинтересован в получении от Вас информации об инциденте и устранении проблемы.
IP-адрес, показанный в Ваших логах, может быть неверным или может оказаться приманкой (ловушкой). Многие сканирующие средства позволяют изменять IP-адрес-источник на любой, какой выберет взломщик.
Ваши логи могут показывать 5 различных IP-адресов, но на самом деле Вас сканируют с одной и той же системы . Взломщик может использовать обманные IP-адреса. В таком случае определить, какой IP-адрес из 5 является истинным источником сканирования, чрезвычайно трудно. Также может пострадать настоящий владелец адреса.
Из лучших побуждений Вы можете нанести больше вреда, чем пользы. Предположим, Вы обнаружили, что Ваша система взломана и используется в качестве стартовой площадки для дальнейших неправомерных действий. Вы обнаружили "заднюю дверку", оставленную взломщиком, выяснили, какими средствами он пользовался, проанализировали логи и затем принялись извещать об инциденте админа удаленной сети, различные организации, занимающиеся сбором информации о таких случаях и вообще всех и вся. В этом Ваша ошибка. Наиболее вероятно, что после Ваших действий, хакер заметет за собой следы: почистит логи, удалит оставленные им средства мониторинга, либо вообще удалит все с диска.
Возможно, сисадмин удаленной сети уже знает об этом хакере, наблюдает за ним и выслеживает его, а Вы можете испортить дело.  Также Вас могут заподозрить во лжи. Сисадмин удаленной системы Вас не знает и может заподозрить в Вас истинного хакера, который пытается защитить себя, обвинив кого-либо еще.
Как правило, полагаясь только на себя, можно больше наломать дров, чем получить положительный результат.
Поэтому правильнее будет для начала собрать максимум информации . Сначала определить IP-адреса по логам, затем организации, которым эти адреса принадлежат ( с помощью whois, dig, nslookup). Напишите им письмо с подробным описанием  деталей, включая строки из лога для подтверждения. Возможно, Вы захотите послать копию письма организации - провайдеру удаленной сети. Если же вторжение достаточно серьезное, то сообщите об этом в организации, профессионально занимающиеся подобными инцидентами - например,  CERT http://www.ciac.org  или CIAC http://www.cert.org   Если  сканирование продолжается без какой-либо реакции со стороны администраторов удаленной сети, позвоните им. Телефон может стать весьма действенным средством.

Заключение

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

Пример I.

Subject: ### Intrusion Detection Alert ###

You have received this alert because the network
is potentially being scanned. The information below
is the packet that was logged and dropped.

Date: Sat Jan 24
Time: 18:47:46
Source: ICARUS.CC.UIC.EDU
Destination: lisa
Service: imap

--- Finger Results ---

[ICARUS.CC.UIC.EDU]

Login Name TTY Idle When Where

Spitzner Lance Everett Spitzn pts/72 Sun 18:42 lspitz-4.soho.entera

Пример II.

#!/bin/ksh
#
# Script launched by tcpd for intrusion detection purposes
#

USER=lance@spitzner.net
SRV=`echo $1 | cut -f1 -d.`
DATE=`date "+%a %b %e"`
TIME=`date "+%T"`
FINGER=`/usr/local/bin/safe_finger @$2`

MAIL=/usr/bin/mail

$MAIL $USER <<EOF
Subject: ### Intrusion Detection Alert ###

You have received this alert because the network
is potentially being scanned. The information below
is the packet that was logged and dropped.

Date: $DATE
Time: $TIME
Source: $2
Destination: $3
Service: $SRV

--- Finger Results ---

$FINGER

EOF

##### If the service is imap, lets go ahead and snoop the session.

if [ $SRV=imap ]; then

snoop -v -c 5000 -o /var/adm/$2_snoop.$$ $2 &

fi



Перевод sciurus@mail.ru
19 апреля 2000г.