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, при открытии которого просмотрщик выполнит произвольный код или запишет файл с произвольным содержимым в любое место на диске.

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

WARNING

Материал адpесован специалистам по безопасности и тем, кто собираeтся ими стать. Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.

 

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

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

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

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

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

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

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

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

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

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

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

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

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


7 комментариев

  1. Inject0r

    25.08.2017 at 16:13

    интересно как с параметрами cmd запустить в launchURL

  2. Inject0r

    25.08.2017 at 16:52

    Первый способ с hta почему-то не срабатывает. Файлик создается, но при запуске не появляется калькулятор.
    Сделал скрин с содержимым js, вроде все делаю как в статье написано:
    http://s019.radikal.ru/i620/1708/d9/b26dacc3a818.jpg

    Второй метод с launchURL отрабатывает без проблем.

    • Inject0r

      25.08.2017 at 17:24

      И из статьи про выполнение произвольного кода в MSOffice код аналогично не отрабатывает. Сначала думал, что что-то неправильно делаю, но из этой статьи launchURL у меня сделать удалось, а как только делаю аналогичный js с VBScript, то он не работает. Значит что-то не так с механизмом. Может для выполнения этого скрипта какие-то дополнительные компоненты должны стоять на атакуемой машине?

      • aLLy

        03.09.2017 at 11:17

        Посмотри на содержимое результирующего hta-файл, имеются ли там строки для запуска калькулятора.
        Никаких дополнительных компонентов в системе не требуется.
        В реестре можно отключить выполнение hta-файлов.
        Как варинат: попробовать hta из этой статьи https://technet.microsoft.com/en-us/library/ee692768.aspx. Отработает ли он.

  3. Skybad

    26.08.2017 at 01:18

    Да за такой игнор патчить проблемы надо по рукам бить. !!!

  4. rio

    28.08.2017 at 13:58

    А разве нельзя таким образом валидный бинарник сохранить?

    • aLLy

      03.09.2017 at 11:10

      Бинарник не получится, потому что метод saveAs сохраняет все содержимое PDF документа, а не конкретную его часть.
      Поэтому оперировать можно только теми типами файлов, что лояльно относятся к своему содержимому и структуре.
      В php-скрипт, например, можно напихать что угодно, но если встречается конструкция вида , то она выполняется. Независимо от остального содержимого документа. Также и тут с hta документом.
      На видео, при его открытии видно, что остальная часть PDF-документа просто отобразилась на экране, а часть со скриптом отработала.

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

Check Also

Пишем стилер. Как вытащить пароли Chrome и Firefox своими руками

Ты наверняка слышал о таком классе зловредных приложений, как стилеры. Их задача — вытащит…