Бал-маскарад или Обмануть хакера

Автор: manager Воскресенье, Март 16th, 2008 Нет комментариев

Рубрика: Безопасность

Процесс взлома компьютерных систем показан во всевозможных средствах массовой информации в романтическом свете и разрекламирован как простой запуск «суперхакерских» программ и кликание кнопок типа «Next», «OK», etc. Исходя из такой информации можно сделать вывод, что слово «безопасность» никаким образом не относится к компьютерному миру, однако… В реальной жизни, как знают многие и еще многие догадываются, дело обстоит гораздо сложнее. Безусловно, без специальных программ-помощников не обойтись, но их использование — это КОДА всего произведения. Для того чтобы применить тот или иной эксплойт (Exploit, Xploit — исходный код программы, реже готовая программа, выполняющая воздействие на жертву, пользуясь «дырками»), надо найти бреши в системе, а это неразрывно связано со знанием того, на какой платформе и с каким программным обеспечением работает жертва. Именно процесс наблюдения, поиска и проверки ошибок занимает основную часть времени работы по взлому. Иногда эта часть может затянуться на месяцы. Сегодня мы поговорим о том, как процесс взлома «убить на корню», то есть на первом этапе — этапе сбора информации.

Лирическое отступление

Первой и основной задачей администратора является своевременное исправление ошибок в системе, что является единственным гарантом безопасности. Качество выполнения этой задачи напрямую зависит от добросовестности администратора. Почтовые рассылки производителей вашего программного обеспечения, а также «походы» на www.securityfocus.com помогут вовремя подлатать систему, что сразу снизит опасность быть «удачно» атакованными. На деле оказывается, что большая часть администраторов слишком халатно относится к своему «электронному подопечному» и не выполняет обычных профилактических работ, олицетворяя собой старую поговорку «Пока гром не грянет, мужик не перекрестится». Многие исходят из соображения «А кому мы нужны?». Может быть, у вас нет конкурентов, может быть, нет врагов, но множество «псевдохакеров» при появлении информации о новом «баге» начинают его проверять на всех, кто попадется под руку. Может, в следующий раз это будете вы…

Ложь во спасение. Этап 1

Итак, приступим к выполнению поставленной в начале статьи задачи. В качестве примера возьмем веб-сервер Apache 2.0.36 под управлением операционной системы Windows2000 Professional. Выбор конфигурации для примера не имеет никакого значения, так как главной нашей «головной болью» будет сокрытие информации о системе. Конечно, лучшим способом скрыть эту информацию является отключение от сети Интернет, локальной сети и сети электропитания вообще. Но мы, как говорится, пойдем другим путем.

Сперва займемся веб-сервером. Как хакер может определить его «марку»? Подключимся к серверу вручную (без браузера) с помощью программы telnet (в данном случае по протоколу HTTP) и запросим простейшую информацию — первую страницу сайта.

E:\Work\> telnet localhost 80

Подключились и делаем запрос (можно вместо GET отправить запрос HEAD, чтобы получить только заголовки)

GET / HTTP/1.0
User-Agent: Murzilla 3000 Platinum
Referer: http://www.necrosoft.com
Ответ сервера
HTTP/1.1 200 OK
Date: Sat, 07 Sep 2002 07:42:21 GMT
Server: Apache/2.0.36 (Win32) DAV/2
Accept-Ranges: bytes
Content-Length: 732
Connection: close
Content-Type: text/html; charset=WINDOWS-1251
Content-Language: ru
(Далее будет текст HTML-страницы)

Как можно заметить, в третьей строке ответа сервера находятся данные, сообщающие, что веб-сервер у нас Apache, а операционная система — Windows. Это самая первая информация, которую мы обязаны скрыть.

Для этого откроем файл …path_to_Apache/conf/httpd.conf и найдем такую строку:

LoadModule headers_module modules/mod_headers.so

Если в начале строки стоит знак «#» (комментарий), то удаляем его. Эта строка подключает Apache-модуль mod_headers, что дает нам возможность переопределить заголовки, выдаваемые сервером в ответах на запросы. Теперь в любом разделе конфигурации сервера или виртуального хоста расположим вот такую строчку (можно сразу рядом с LoadModule):

Header add Server «Superbison Server 2002 Chinese Edition»

А теперь снова сделаем запрос к серверу (после внесения изменений в конфигурационный файл сервер требуется перезапустить).

E:\Work\> telnet localhost 80
HEAD / HTTP/1.0
User-Agent: Murzilla 3000 Platinum
Referer: http://www.necrosoft.com
HTTP/1.1 200 OK
Date: Sat, 07 Sep 2002 07:55:08 GMT
Server: Superbison Server 2002 Chinese Edition
Accept-Ranges: bytes
Content-Length: 732
Connection: close
Content-Type: text/html; charset=WINDOWS-1251
Content-Language: ru

Почувствовали разницу ;-) ? Конечно, такие названия серверов писать не стоит, так как это сразу покажет хакеру, что заголовки сервера изменены и налицо попытка скрыть информацию. Нам же не нужна «попытка», нам нужно сокрытие. Поэтому поставим реальный заголовок существующего сервера.

Server: Apache/1.3.20 (Unix) FrontPage/5.0.2.2510 PHP/4.2.2 mod_fastcgi/2.2.12 mod_ssl/2.8.4 OpenSSL/0.9.5a rus/PL30.5
Server: Microsoft-IIS/5.0
Server: Apache/1.3.17 (Unix) PHP/4.0.4pl1 rus/PL30.3
Server: Apache/1.3.26 (Unix) Resin/2.1.0
Server: AOLserver/3.4.2
Server: WebLogic 5.1.0 Service Pack 5 08/17/2000 07:21:55 #79895

Выбирайте любой на свой вкус.

Вторым пунктом в списке наших задач стоит сокрытие информации о программном обеспечении, работающем на сервере, то есть о CGI-программах. Серверные приложения можно писать практически на любом языке, даже на JavaScript и VBScript (технология Active Server Pages). Каждый тип cgi-программ имеет свое стандартное расширение (по умолчанию), которое легко можно переопределить. Вот основные из них

*.cgi — Perl, Cи, Pascal, и т.п., интерпретируемые системой
*.pl — Perl
*.php, *.php3, *.php4 — PHP
*.asp — ASP (см. выше)
*.shtml — страницы с директивами SSI
*.jsp — JSP (Java Server Pages)
и т.п.

Эти расширения служат только для того, чтобы «объяснить» серверу, что делать с файлом: запускать, обрабатывать или отдавать на обработку другой программе. Распознавание этих расширений задается в том же конфигурационном файле сервера. В связи с тем, что на нашем сервере должна быть «сплошная ложь», мы все эти расширения перепишем. Пример для расширения *.cgi.

AddHandler cgi-script .cgi

Эту строчку следует заменить примерно на такую:

AddHandler cgi-script .xhtml

Теперь все наши Perl-скрипты, скомпилированные (Си, Паскаль) программы, и т.п. для сервера будем называть как ИмяФайла.xhtml

На качестве их работы это никак не отразится, зато введет в заблуждение тех, кто захочет «проверить» на прочность сервер. Можно придумать что-нибудь «попроще», например *.java. Теперь, вместо поиска брешей в cgi-скриптах, злоумышленник будет перелопачивать мегабайты архивов BUGTRAQ’ов в поисках багов Java-машин и безуспешно пытаться применить юниксовые эксплойты к Windows 2000. Гарантированно могу сказать, что уже только эти меры отобьют весь энтузиазм у «псевдохакеров» через час максимум — это могут подтвердить логи сервера ;-) . Вышеописанным способом можно переопределить все расширения файлов.

Следующим этапом в конфигурировании сервера будет установка страниц, посвященных ошибкам. Страницы, выдаваемые сервером при ошибках, например, при обращении к несуществующему файлу, тоже могут «засветить» установленный софт (см. рис.1). Кроме указания на «марку» сервера страницы ошибок имеют и кое-какой дизайн, который у всех серверов, естественно, разный. Переопределить «ошибочные страницы» можно несколькими способами:

ErrorDocument 404 «

Нот фаунд и все такое

»

Заменить своим текстом

ErrorDocument 404 /errors/404.html

Отправить на другую страницу (точнее, выдать другую)

ErrorDocument 404 «/cgi-bin/errors.pl?404″

Отправить на скрипт (лучший вариант, т.к. можно обрабатывать ошибки по-своему)

ErrorDocument 404 http://linux.org.ru/

Отправить вообще «куда-нибудь»

Самым удобным способом является второй, то есть выдача другой, специально подготовленной страницы. Но лучшим способом будет выполнение скрипта (третий способ). В этом случае можно своевременно обнаружить попытки атаки. К тому же данная установка поможет при публичном тестировании системы на «мертвые» или ошибочные ссылки. Данные настройки следует произвести для всех вариантов ошибок.

Еще одной «находкой для шпиона» могут быть, как это ни смешно звучит, иконки. Да, именно иконки. Те, которые отображаются рядом с именами файлов и директорий, когда в какой-либо директории нет индексного файла и при этом в настройках предусмотрен просмотр директорий (см. рис.2). Для того чтобы исправить эту «ошибку», нам нужно либо запретить просмотр директорий (что предпочтительнее), либо заменить все иконки на иконки другого сервера (который мы выбрали в качестве «маскарадного костюма»). Иконки определяются следующими директивами:

AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip .rar .ace
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
И так далее…

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

Options FollowSymLinks Includes ExecCGI Indexes
# В Options нужно убрать параметр Indexes
AllowOverride None
Order allow,deny
Allow from all

Вот и все решение проблемы иконок (что гораздо проще их переделки ;-) ). В результате этих изменений, при обращении к директории, не содержащей индексного файла, пользователь увидит сообщение об ошибке 403 (рис. 3).

Вообще, к конфигурированию сервера Apache можно подойти творчески. В комплекте сервера имеется множество полезных модулей. С помощью mod_env, mod_headers, mod_setenvif и т.п. можно настроить окружение как вам заблагорассудится. С помощью таких модулей, как mod_cgi, mod_perl, mod_rewrite, можно не только уменьшить нагрузку на сервер, но и создать мощную систему анализа подключений и предупреждения нападений.

Ложь во спасение. Этап 2

Кроме обычного веб-сервера часто на сервере установлено множество других программных продуктов, например FTP-сервер, почтовые SMTP, POP3, IMAP сервера, Secure Shell (ssh) и многие другие. У каждого такого сервера есть так называемый «баннер» — приветствие, выдающееся клиенту при подключении. Естественно, в этом приветствии содержится информация, указывающая на «марку» сервера. Содержание таких баннеров можно изменять в настройках сервера. Эта возможность оказывается нам очень кстати.

Вот пример баннера:

(C:\)
cmapuk@home]# telnet ftp11. zzzzzzzzzzz.ru 21 (подключаемся)

20 ftp11 FTP server (UNIX(r) System V Release 4.0) ready.

Далее, с помощью команды SYST можно узнать дополнительную информацию:

SYST

215 UNIX Type: L8 Version SunOS

Все эти «признаки» ОС необходимо маскировать.

Ложь во спасение. Этап 3

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

В качестве наживки воспользуемся фиктивным FTP-сервером, функции которого будут совершенно отличными от функций настоящего FTP-сервера. Наш сервер должен будет принимать подключения, выдавать фальшивый баннер, причем баннер какого-нибудь «дырявейшего» реального сервера. Кроме того, сервер должен будет регистрировать и тщательно логировать все действия подключившегося хоста. Для достоверности, наш сервер будет обрабатывать несколько определенных протоколов FTP-команд. В их числе будут USER и PASS, после которых сервер сообщит об ошибке авторизации; также используем команду SYST, описанную выше. Пример такого лже-FTP-сервера:

#!/usr/bin/perl
use Socket;
use POSIX qw(sys_wait_h);
$paddr = sockaddr_in(21, INADDR_ANY);
socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname(‘tcp’)) or die «Socket error: $!»;
bind(SERVER, $paddr) or die «Bind error: $!»;
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1);
listen(SERVER, SOMAXCONN) or die «Listen error: $!»;
$banner=»220 ftp11 FTP server (UNIX(r) System V Release 4.0) ready.»;
sub rea {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&rea;
}
sub killer {
print STDERR «Shutdown!»;
$SIG{KILL} = \&killer;
exit;
}
$SIG{CHLD} = \&rea;
$SIG{KILL} = \&killer;
while ($hacker_paddr = accept(CLIENT, SERVER)){
next if $pid = fork;
die «Fork error: $!» unless defined $pid;
close(SERVER);
open(LOG,»>>/home/ftpfake/connection.log»);
print LOG time.»\t»;
print LOG join(«\t»,sockaddr_in($hacker_paddr)).»\n»;
close(LOG);
select CLIENT;
$|=1;
print CLIENT «$banner\r\n»;
while(){
if(/^user (.+?)/i){
local $u=$1;
chomp($u);
if($u=~/^anonymous$/i){
print CLIENT «331 password required for $u.\r\n»;
}else{
print CLIENT «331 password required for $u.\r\n»;
local $line=;
if($line !~ /^pass /i){
print CLIENT «530 login incorrect.\r\n»;
}else{
print CLIENT «530 please send your password.\r\n»;
}
}
}elsif(/^syst /i){
print CLIENT «215 UNIX Type: L8 Version SunOS\r\n»;
}elsif(/^noop$/i){
print CLIENT «200 OK\r\n»;
}elsif(/^help$/i){
print CLIENT «214 take a look at ftp://ftp.rfc-editor.org/in-notes/rfc959.txt\r\n»;
}elsif(/^quit/){
print CLIENT «Bye!\r\n»;
close(CLIENT);
select(STDOUT);
}else{
print CLIENT «500 command not understood\r\n»;
}
}
} continue {
close(CLIENT);
}

С помощью такой «FTP-провокации» можно сбить с толку многих злоумышленников. А кроме того, собрать о них полезную информацию, которую можно применить против них самих. В самом простом случае можно «нюкнуть» по тому адресу, с которого пришел запрос.

Ложь во спасение. Этап 4

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

Эта идея не нова. Уже давно существуют подобные программные продукты, которые таким способом «превращают» одну систему в другую. Вот несколько примеров:

IPtrap (http://www.jedi.claranet.fr/) прослушивает несколько TCP-портов, изображая поддельные сервисы (X11, NetBIOS, DNS и т.п). Когда удаленный клиент соединяется с одним из этих портов, его IP-адрес будет залогирован. Запускается вместе с IPTables и IPChains, но можно запустить и любой внешний сценарий (поддерживает IPv6).

Tiny Honeypot (http://freshmeat.net/redir//31309/url_tgz/thp-0.4.3.tar.gz). Программа-ловушка (что следует из ее названия), основанная на iptables редиректах и xinetd. Tiny Honeypot прослушивает каждый TCP-порт, не используемый в данный момент, регистрирует все подключения и изображает обратную связь со злоумышленником, вводя таким образом в заблуждение большинство известных автоанализаторов, сканеров.

Также может оказаться полезной программа, подобная Anti-Hack.

Anti-Hack (http://www.networkingfiles.com/Firewalls/downloads/antihackdownload.htm) — это система, контролирующая использование портов. Программа способна наблюдать одновременно за 125 портами. Anti-Hack детально логирует попытки подключения и к тому же отправляет злоумышленнику сообщение о том, что «вас снимает скрытая камера!».

Подобного программного обеспечения в Сети можно найти множество. От простых утилит до сложных систем. С помощью такого программного обеспечения вы сможете защититься от подавляющего большинства хакеров. Кроме того, «обследование» вашей системы злоумышленником может быть вовремя зафиксировано, а это 90% вашей безопасности. Однако все вышеописанные меры не спасут вас от продвинутых хакеров…

Отпечатки пальцев стерлись?

«Что делать?» — процитируете вы классика. Сделать еще много чего можно, но для начала стоит рассказать, почему предыдущий раздел закончен так пессимистично.

Проблема «недостандартизации» в компьютерном мире встречается на каждом шагу. Большинство производителей программного обеспечения (будь то броузер или операционная система) при разработке «укладываются» в стандарты и общепринятые нормы лишь отчасти. Это утверждение можно смело отнести к реализации стека TCP/IP в операционных системах. С помощью низкоуровневого исследования неизвестной удаленной системы можно сделать выводы об установленной оперционной системе. Итак, методом проб, ошибок и исключений злоумышленник может определить не только название ОС, но и ее версию.

В терминологии специалистов по безопасности имеется выражение fingerprints — «отпечатки пальцев». Этот термин обозначает особенности операционной системы в реализации TCP/IP, а также прикладных протоколов. «Отпечатки пальцев» собираются комплексным исследованием системы. Приведу некоторые из методов, используемых в создании fingerprint’а системы.

Метод снятия отпечатка с сервиса telnet

#!Perl
use Socket;
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname(‘tcp’));
$addr=sockaddr_in(23,inet_aton(’127.0.0.1′));
print «Connection…\t»;
if(connect(SOCK, $addr)){
print «OK!\n»;
sysread(SOCK, $finger, 200);
print «Fingerprint: «;
print join(» «,map {ord($_)} split(//, $finger));
}else{
print «Error!\n»;
}
close(SOCK);

С помощью вот такого нехитрого скрипта я получаю следующий результат при сканировании самого себя:

Connection… OK!
Fingerprint: 255 253 37 255 251 1 255 253 3 255 253 31 255 253 0 255 251 0

Эти числа — не что иное, как опции telnet-сессии, проанализировав которые, можно «положить в карман» первый элемент мозаичной картины на тему версии операционной системы. Бороться с данным явлением можно, используя «правильные» настройки сервиса telnet (или заменяя при необходимости стандартный сервер вообще). Дефолтные настройки (по умолчанию) администратор просто обязан изменять. Кроме того, здесь можно опять же замаскироваться под настройки другой реализации telnet.

Вышеописанный механизм определения ОС «предоставляется» не только telnet, но и другими сервисами. Однако эти методы не так информативны и не дают 100% гарантии определения ОС. При квалифицированном подходе администратора данные «возможности» можно устранить, а то и применить в средствах маскировки. Однако все эти «отпечатки» относятся, скорее, к дополнительному программному обеспечению, нежели к самой операционной системе…

Настоящие отпечатки пальцев

Настоящие fingerprint’ы операционная система оставляет при реализации протокола TCP/IP, а точнее, при приеме TCP-пакетов и ответе на них. Каждая операционная система по-своему реагирует на «TCP-команды», посылаемые компьютером-»собеседником». Вот примеры таких различий:

1. Реакция на пакет FIN. По стандарту, описанному в документе RFC 793, сервер должен ответить на пакет FIN (завершение соединения), посланный без попытки к установлению соединения (без SYN, ACK), пакетом RST. Однако некоторые операционные системы (Windows, CISCO, HP/UX, IRIX, и другие) не посылают ничего в ответ на FIN.

2. При пересылке каждого TCP-пакета между двумя компьютерами в пакете происходит изменение числового идентификатора ISN, который служит для «правильного» порядка получения сообщений и для сохранения защищенного виртуального канала между хостами. Главная задача этого идентификатора — все время изменяться. В различных операционных системах эта задача решена по-разному. И это дает дополнительную возможность к определению системы (а также ее версии). Вот несколько примеров:

Старые весрии UNIX изменяют ISN постоянным увеличением последнего на число 64.

Solaris, FreeBSD, IRIX и др. реализуют приращение ISN случайным образом.

Linux v.>2.0, OpenVMS устанавливают ISN вообще случайно.

В системах Windows увеличение ISN происходит небольшими приращениями, зависящими от времени.

Концентраторы 3Com, принтеры Apple LaserWriter устанавливают постоянный ISN (0803h и 0C7001h соответственно).

3. Анализ поля Window в заголовке TCP-пакета, полученного от сервера, в некоторых случаях может однозначно охарактеризовать операционную систему последнего.

Например, операционная система AIX имеет значение поля Window — 3F25h (единственная).

Windows NT5, ***BSD имеют поле Window, равное 402Eh.

4. Реакция на нестандартные ситуации. При отправке запроса FIN/PSH/URG-пакет со своим ISN в поле ISS, большая часть операционных систем ответит пакетом, в поле ACK которого установит прибывший ISN. А ОС Windows, например, установят в поле ACK ответного пакета ISN+1

Список примеров можно еще долго продолжать. В нем будут и особенности TCP-пакетов систем и особенности ICMP, IP, и многие другие параметры систем. Бесспорным лидером в распознавании систем является технология nmap [www.insecure.org] (и ее последователи). Программное обеспечение nmap (RuNmap www.nmap.ru)создано для комплексного исследования удаленных систем различными способами, в том числе и низкоуровневым анализом.

Конечно, при существовании таких технологий, многими исследователями ведется работа по созданию технологий противодействия. Во-первых, это настройки системы (что, в общем-то, очевидно), а во-вторых, дополнительные утилиты, как, например, Fingerprint Fucking Tool от PKcrew (www.pkcrew.org) для FreeBSD.

З.Ы.

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

З.Ы.Ы.

Данная статья представлена исключительно для ознакомления. Автор не несет ответственности за любые действия, совершенные читателем после прочтения этой статьи.

Источник: «Компьютер Price», http://www.comprice.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты