
CVE-2018-16858 реализация эксплойта
В этой статье будет показано, как использовать простую ошибку в программе для открытия бэкдора в системе, использующей эту программу.
Рассматриваемая уязвимость определена как CVE-2018-16858 и относится к офисному пакету LibreOffice. Эта ошибка позволяет в специально сформированном файле выполнить обход каталогов, что даёт возможность выполнить код Python. Данное выполнение привязывается или запускается при действии пользователя с документом и происходит без каких-либо предупреждений пользователя о выполнении макросов.
Данный документ разделён на пять частей. В первой части будет объяснена сама ошибка, как распаковать OpenDocument, как изменить его структуру для выполнения нужного локального скрипта и как снова собрать документ для его выполнения и тестирования.
Во второй части мы увидим, как использовать локальное выполнение для запуска любой команды в системе, в которой открыт документ, и создадим бэкдор, позволяющий выполнять удалённые команды.
В третьей части мы автоматизируем процесс создания документов, которые создают бэкдоры с прямой или обратной связью, определяя IP-адрес и порт, к которым необходимо подключиться.
Четвёртая часть будет посвящена интеграции уязвимости в систему Metasploit, чтобы с помощью msfconsole можно было создавать документы, совместимые с методом эксплуатации Metasploit. Это позволит выбирать в качестве выполняемого кода любую нагрузку, определённую в наборе Metasploit.
Пятая и последняя часть покажет, как интегрировать в антивирусную систему процесс обнаружения, позволяющий идентифицировать заражённые файлы LibreOffice с помощью описанной выше процедуры. Будет использоваться формат обнаружения антивируса ClamAV, что позволит лучше понять процесс обнаружения, используемый антивирусами, и тем самым облегчить нашу защиту от подобных угроз.
Весь процесс будет выполняться для систем Linux на основе Debian, но описанное здесь может быть применено и к другим системам, так как всё подробно описано. И сама уязвимость, и концептуальные доказательства оригинальной CVE были разработаны для версии LibreOffice под Windows, поэтому всегда можно обратиться к этому источнику, чтобы использовать описанное в данном документе аналогично для версий Windows.
LibreOffice (и, по генетическим причинам, Apache OpenOffice) имеет уязвимость в версиях, предшествующих последней (6.1.5), которая позволяет выполнять код Python, расположенный в любом месте компьютера, без предупреждения пользователя о выполнении макроса.
Чтобы увидеть эту уязвимость, мы можем создать новый документ в текстовом редакторе, написать в нём что-нибудь, выделить это и создать гиперссылку. Для создания гиперссылки в тексте необходимо выбрать меню Insert и в нём опцию Hyperlink (также можно выделить текст и затем использовать комбинацию клавиш Ctrl+K).
Появится следующее диалоговое окно:

Чтобы определить гиперссылку, нужно вставить URL и нажать Apply. Кроме опции URL, в нижней части диалогового окна, где можно прочитать Further Settings, у нас будет кнопка со значком Play, которая также позволит нам привязать события к определённым действиям. Именно здесь мы определим, что хотим выполнить код Python в качестве действия.
При нажатии этой кнопки откроется новое диалоговое окно:

В нём мы сможем выбрать одно из трёх базовых событий и скрипт, который хотим использовать. В качестве события выберем Mouse Over Object, а в качестве скрипта из семейства LibreOffice Macros выберем Python Samples. Внутри этой опции существует только один скрипт по умолчанию с именем TableSample, который мы и выберем.
После этого, если навести мышь на текст, который мы превратили в гиперссылку, мы увидим, что открывается окно с документом, содержащим таблицу. Это означает, что мы связали событие наведения мыши на гиперссылку со скриптом на Python. Наша цель — заменить это действие на другое, которое нам нужно.
Для этого сохраним созданный документ и выйдем из LibreOffice, чтобы выполнить в консоли ряд команд.
Формат документа ODT — это не что иное, как zip-архив с набором файлов внутри (формат DOCX от Microsoft Office очень похож). Поэтому первым делом мы распакуем файл с помощью распаковщика zip-архивов.
В нашем случае мы будем использовать утилиту командной строки unzip, поэтому просто выполним следующую команду:
user@host:~/Documents/prueba$ unzip ~/Documents/blog/exploitlibreoffice/doc/CV.odt
После этого мы увидим файлы, которые на самом деле находятся внутри файла OpenDocument. Наиболее важными для нас будут файл mimetypes, файл content.xml и файл styles.xml.
Файл mimetype должен быть первым в списке файлов zip-архива, поэтому при повторной упаковке файлов мы должны заставить наш архиватор сделать так, иначе файл не будет интерпретирован как OpenDocument.
Файл content.xml содержит текст документа, который мы написали, с некоторыми тегами, указывающими, в каком формате должен отображаться текст.
Например, в следующей строке:
<text:p text:style-name="_5f_ECV_5f_SectionDetails">Indicar lista de documentos adjuntos a su CV. Ejemplos:</text:p>
Можно увидеть пример абзаца текста, написанного с определённым стилем, заданным атрибутом text:style-name. Текст абзаца находится между открывающим тегом text:p и закрывающим тегом </text:p>.
Скрипт, связанный с гиперссылкой, которую мы создали, также можно увидеть довольно просто. Если мы поищем в тексте content.xml слово python или имя загруженного нами скрипта Python, в нашем случае TableSample.py, то легко обнаружим строку, в которой нужно изменить содержимое:
<script:event-listener script:language="ooo:script" script:event-name="dom:mouseover" xlink:href="vnd.sun.star.script:pythonSamples|TableSample.py$createTable?language=Python&location=share" xlink:type="simple"/>
В этой строке находится путь к скрипту Python, который будет загружен при наведении мыши на гиперссылку с именем TableSample.py, и функция, которая будет выполнена из кода Python, в данном случае createTable.
Проблема LibreOffice заключается в том, что при чтении документов значение кода Python для загрузки не очищается должным образом. Программа не очищает символы ../ из пути к файлу, поэтому можно получить доступ к любому файлу в системе, в которой открыт текстовый документ. Кроме того, если этот файл является файлом с кодом Python, мы сможем выполнить любую функцию, определённую в этом файле.
В качестве первой концептуальной проверки мы сделаем так, чтобы при наведении на гиперссылку запускался калькулятор, в нашем случае программа galculator открывает калькулятор. Нам нужно создать программу на Python, которая позволяет выполнить команду внутри функции, в том стиле, как ожидает выполнение LibreOffice. Для этого создадим следующий код по пути /tmp/prueba.py:
import os;
def ejecuta():
os.system("galculator");
С помощью этого небольшого кода мы достигнем нашей цели. Теперь нужно добавить как файл Python /tmp/prueba.py, так и имя функции ejecuta в вызов, который делается в файле odt. Таким образом, строка, вызывающая Python, будет выглядеть следующим образом:
<script:event-listener script:language="ooo:script" script:event-name="dom:mouseover" xlink:href="vnd.sun.star.script:pythonSamples|../../../../../../../../../../../tmp/prueba.py$ejecuta?language=Python&location=share" xlink:type="simple"/>
Как видно, мы добавили большое количество ../, чтобы гарантировать подъём до корня файловой системы. А оттуда добавили конкретный путь к нашему файлу Python (prueba.py). После $ добавлено слово ejecuta — это функция, которая запускает калькулятор.