Хакер - Спецвыпуск журнала «Хакер» #47, октябрь 2004 г.
net.inet.tcp.log_in_vain=1
На нагруженном сервере, правда, тебя может засыпать количеством сообщений.
Если не нужна поддержка смешного протокола T/TCP (TCP for Transactions), то пакеты с флагами SYN+FIN можно смело отбрасывать как неликвидные :). Протокол редко где используется, а потому это имеет смысл.
Листинг
net.inet.tcp.drop_synfin=1
Обманываем сканерыВторжение в систему начинается со сканирования – это прописная истина. Можно (и нужно) уже на этом этапе усложнить жизнь злоумышленнику. Так, пакетный фильтр OpenBSD PF имеет встроенную возможность определения и блокирования сканеров, используя технологию Passive OS Fingerprinting. Достаточно добавить правило «block quick from any os NMAP» в pf.conf, чтобы результаты работы популярного сканера nmap заставили хакера почесать затылок. Также nmap'у можно противодействовать с помощью «scrub in all» и фильтрации TCP-пакетов с особыми флагами, к примеру:
Листинг
block return-rst in log quick proto tcp all flags FP/FP
block return-rst in log quick proto tcp all flags SE/SE
block return-rst in log quick proto tcp all flags FUP/FUP
Но можно обойтись и userland-средствами. Например, утилитой portsentry.
Она открывает для прослушивания указанные TCP/UDP-порты, логирует обращения к ним и позволяет реагировать на сканирование. После скачивания с http://packetstormsecurity.nl/UNIX/IDS/ и установки portsentry правим portsentry.conf:
Листинг
TCP_PORTS="42,88,135,139,145,389,443,445,464,593,636,637,1025,1026,1027,1029,1433,3372,3389»
UDP_PORTS="»
Я указал набор TCP-портов, очень похожий на тот, что открывает Windows 2000 Server в дефолтовой установке. UDP-порты прослушивать мы не будем – их редко сканируют.
После этого имеет смыл указать хосты, чье сканирование мы будем игнорировать, например, машины из локалки. Пропиши путь к файлу со списком игнорируемых хостов:
Листинг
IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore»
Чтобы portsentry не занималась ненужным отображением IP-адреса в имя хоста, отключи обратный резольвинг:
Листинг
RESOLVE_HOST = «0»
Далее блокируем IP-адреса хостов, с которых производится сканирование:
Листинг
BLOCK_TCP="1»
А теперь укажи, как ты хочешь это делать. Например, добавлением правила фаервола:
Листинг
KILL_ROUTE="/sbin/ipfw add 1 deny all from $TARGET$:255.255.255.255 to any»
Также можно заносить атакующих в hosts.deny для усиления защиты демонов, использующих tcpwrappers:
Листинг
KILL_HOSTS_DENY="ALL: $TARGET$ : DENY»
Наконец, можно указать баннер, выдаваемый при подключении к порту, прослушиваемому portsentry:
Листинг
PORT_BANNER="WHOM DO YOU WANT TO HACK TODAY?»
Учти, что блокировать хосты таким образом – крайняя мера, так как есть возможность превратить network в notwork, заблокировав легитимных клиентов. В общем случае я бы не рекомендовал использовать KILL_ROUTE. У меня уже два с лишним года работает машинка, приспособленная в свое время именно для снятия подобной статистики (ради интереса). В настоящее время в hosts.deny содержится 12373 записи, и помимо злачных притонов интернета в черный список попали вполне легитимные адреса. Сервисы, работающие на том сервере, не используют tcpwrappers, так что никто не страдает. Но сам факт достоин внимания.
Меняем баннерыЛюбой демон, принимающий внешние соединения, так или иначе «демонстрирует себя» баннером – однострочным приветствием, выдающимся клиенту в ответ на соединение с ним. Самый простой способ увидеть это – совершить соединение telnet'ом с сервером на порт, прослушиваемый демоном:
Листинг
[(22:42)(29.10%)(p1):~/articles/tricksec ] telnet smtp.gameland.ru 110
Trying 62.213.71.4…
Connected to smtp.gameland.ru.
Escape character is '^]'.
+OK Microsoft Exchange Server 2003 POP3 server version 6.5.7226.0 (server500.gameland.ru) ready.
Почти всегда это служебная информация, нужная для работы сервиса, но иногда – совершенно бесполезная и даже вредная. Разные сервисы ведут себя по-разному: кто-то ограничивается лаконичным именем хоста и типом сервиса (domain.com ESMTP), а кто-то выдает себя с потрохами, раскрывая свое имя и версию. Если в нашем примере будет найдена уязвимость в определенных версиях Exchange, то взломщик за пару минут напишет баннер-граббер, который соединяется с хостами и снимает с них версию Exchange. Таким нехитрым способом можно легко найти уязвимый хост. Теперь понятно, почему смена баннера имеет смысл: она позволяет скрыть версию сервиса или даже ввести в заблуждение взломщика. По этой причине многие демоны имеют возможность считывать баннер прямо из конфига. Если же нет – мы в мире OpenSource и не поленимся залезть в исходники. Учти, смена баннера не даст нам полной иллюзии «другого» сервиса. Шанс определить демона и, например, отличить Apache от IIS все равно остается – по поведению программы в ответ на различные запросы, коду ошибок, специфичных сообщений, формированию заголовков писем (в случае SMTP-сервера) и т.п., так как жестких стандартов поведения того же почтового сервера нет и каждый реализует протокол по-своему. Однако от примитивных механизмов определения демона мы защитимся (подробнее про fingerprinting читай в другой статье этого номера).
OpenSSHСамый популярный пакет для удаленного администрирования по протоколу ssh, хоть и написанный весьма компетентными хакерами из OpenBSD team, но имеющий длинную историю взломов. Баннер в конфиге не выставляется, так что будем править сорцы. Найди в файле version.h следующие строки:
#define SSH_VERSION «OpenSSH_3.8p1»
Их и следует изменить. Полностью удалять строку не нужно, согласно стандарту, сервер обязан выдать версию ssh-протокола, а затем – имя демона. Я советую ограничиться удалением версии openssh, но ты можешь проявить фантазию. Затем собирай openssh как обычно.
ApacheЭто классика. Смена баннера самого популярного web-сервера – весьма частое развлечение админов. Здесь тоже не обойтись без правки исходных текстов. В каталоге с исходниками найди файл src/include/httpd.h, а в нем – следующие строки:
Листинг
#define SERVER_BASEPRODUCT «Apache»
#define SERVER_BASEREVISION «1.3.29»
Теперь меняй их на Microsoft-IIS 4.0 и коллекционируй сигнатуры старых добрых unicode-атак :). В Apache 2.0.x надо править файл include/ap_release.h, строки:
Листинг
#define AP_SERVER_BASEPRODUCT «Apache»
#define AP_SERVER_MAJORVERSION «2»
#define AP_SERVER_MINORVERSION «0»
#define AP_SERVER_PATCHLEVEL «50»
PostfixЭтот удобный и (относительно, как и все в этом мире) безопасный SMTP-сервер позволяет указать баннер прямо в конфиге, main.cf:
$smptd_banner = $mydomain ESMTP MyCoolServer
Sendmail
По умолчанию sendmail выдает слишком много информации. В нем часто находят уязвимости, так что светить версией – себе дороже. Можно поправить sendmail.cf:
O SmtpGreetingMessage=$j ESMTP InsecureMailserver
Или sendmail.mc:
define(`confSMTP_LOGIN_MSG', `$j ESMTP UnsecureMailserver')
BINDNamed – популярный DNS-сервер от Internet Software Consorcium. Известен прежде всего своей историей уязвимостей, так что рассказать миру о том, какая у тебя версия named – значит жить как на иголках до следующей Security Advisory. Правь named.conf, в глобальной секции options {} пиши:
version «Microsoft DNS»;
VsFTPdЭто чрезвычайно безопасный ftp-сервер с поддержкой ssl-соединений. Указать баннер можно прямо в vsftpd.conf:
ftpd_banner=mydomain.com Microsoft FTP Service (Version 5.0)
BSD FTPdВо Free/Net/OpenBSD можно поправить приветствие стандартного ftpd. Для этого нужно найти в файле /usr/src/libexec/ftpd/ftpd.c строчку:
reply(220, «%s FTP server (%s) ready.», hostname, version);
Она может встретиться несколько раз, так, во FreeBSD за баннер отвечает конструкция:
Листинг
if (hostinfo)
reply(220, «%s FTP server (%s) ready.», hostname, version);
else
reply(220, «FTP server ready.»);
В обоих случаях в выводе строки можно написать, что душа пожелает (а можно поступить более 31337-но – изменить значение hostinfo на 0 перед вышеуказанным блоком if).
Эти нехитрые трюки, конечно, помогут тебе изменить поведение сервера, но они не закрывают уязвимостей в сервисах, так что маскировка не лишает тебя главной задачи – патчить, патчить и еще раз патчить. Желаю тебе как можно реже испытывать в этом необходимость.
Мнение экспертаАндрей «Andrushock» Матвеев, редактор рубрики «Unixoid» журнала «Хакер»:
«Идеальной или совершенной защиты не бывает. Мы можем только стремиться к обеспечению должного уровня безопасности за счет своевременного обновления программного обеспечения, грамотного разграничения доступа, корректной настройки интернет-служб и, конечно же, предотвращения утечек информации – здесь я подразумеваю весь спектр предпринимаемых действий начиная от сокрытия сервисных баннеров и заканчивая воспрепятствованию перехвату конфиденциальных данных организации. Очень многое зависит от системного администратора, от его политики, опыта, навыков работы и знаний. Известны случаи, когда правильно сконфигурированные серверы на базе Red Hat Linux могли похвастаться тысячедневными аптаймами, в то время как хосты под управлением OpenBSD не выдерживали и недельного натиска глобальной сети. За счет открытого исходного кода можно каждый день изменять поведение системы и/или стека TCP/IP, главное – придерживаться одного простого правила: не ломать стандарты, задокументированные в RFC.