Уязвимости в ОС и программном обеспечении всегда являлись одними из самым мощных векторов тестирования на проникновение. Какими интересными свежими уязвимостями можно пополнить свой арсенал? В статье попробуем разобраться, как работают 3 уязвимости в ОС Windows и MS Office, которые были опубликованы в последние полгода.
Список уязвимостей
С каждым годом, несмотря на улучшение процессов разработки программного обеспечения и введения большого количества систем защит, количество выпускаемых в паблик эксплойтов растет. Поэтому, чтобы не потеряться в этом море ошибок и готовых эксплойтов, выполним несколько шагов.
Шаг первый — определим набор программного обеспечения, который нам был бы интересен. Так как пентест обычно проводится для корпоративных сетей, где особой популярностью пользуется ОС Windows, то логично будет в список включать уязвимости для нее и её компонентов. Итак, в списке следующий софт:
Windows 7,8,10
Windows Server 2016, 2019
Exchange Server
Sharepoint Server
Пакет приложений MS Office
Atlassian Confluence
Atlassian Jira
git
WordPress
...
Быстрый поиск через любую поисковую машину находит несколько тысяч уязвимостей, которые были выпущены в public для перечисленных продуктов. Определим небольшой список:
CVE-2021-1727 (Windows)
CVE-2021-1732 (Windows)
CVE-2021-40444 (Office)
CVE-2021-1727
Уязвимость в ОС Windows, согласно находится в Windows Installer сервисе. Успешная эксплуатация может позволить повысить свои привилегии до уровня пользователя System. Иными словами, это полная компрометация ОС. Описание, в чем конкретно заключается уязвимость, не доступно. Среди уязвимых систем — Windows 7, 8, 10 до 2004 билда включительно.
Попробуем найти информацию среди уже готовых эксплойтов. Первая же ссылка нас приводит к вот этому репозиторию. Эксплойт написан на языке программирования C++. В этот раз нам повезло: PoC снабжен исходным кодом, в котором есть даже интересные комментарии. С использованием исходного кода опишем верхнеуровнего алгоритм эксплойта:
main
функция почти весь код содержит в цикле, условием которого является успешное чтение ключа реестраSYSTEM\\CurrentControlSet\\Services\\Fax\\ImagePath
. Причем поиск осуществляется следующего значения —%systemroot%\\Temp\\asmae.exe
-
На строке 76 и 77 внутри цикла устанавливается приоритет процесса и потока эксплойта.
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
Это может указывать на то, что эксплойт использует проблему типа Race Condition.
-
Подтверждение пункту 2 можно привести так же использование вот такого цикла для загрузки процессора:
DWORD WINAPI thread(void* args) { do { } while (1); }
-
Основная эксплуатация происходит параллельно следующей команде:
c:\\windows\\system32\\msiexec.exe", L" /fa C:\\Windows\\Temp\\asmae.msi /quiet
Таким образом, перед нами эксплойт, который приводит к Race Condition и, используя эту уязвимость, перезатирает исполняемый файл для сервиса внутри Windows. В данном случае используется сервис "Fax".
В репозитории уже есть 2 файла, которые используются для запуска полезной нагрузки: asmae.msi
и asmae.exe
.
CVE-2021-1732
Уязвимость в Windows Win32k подсистеме. Win32k — самая популярная подсистема для повышения привилегий. Данная уязвимость не стала исключением. Основные проблемы, которые преследуют эту подсистему — рассинхронизация создания и уничтожения объектов, с которыми работают алгоритмы. Практически всегда это элементы пользовательского интерфейса, которые создаются со случайными значениями параметров инициализации.
Публичный эксплойт для этой уязвимости можно также найти в репозитории здесь.
Сам эксплойт использует достаточно простой алгоритм, однако, благодаря введенным в ОС подсистемам защиты, выполнение этого алгоритма может быть достаточно нетривиальной задачей.
Итак, чтобы повысить привилегии для пользователя, эксплойт выполняет следующие этапы:
Создание и инициализация фэйковых объектов подсистемы Win32k
Использование уязвимости или стандартного механизма ОС для получения маппинга оперативной памяти ядра ОС
Поиск primary Token в памяти запущенного процесса
Модификация привилегий напрямую или с использованием донорского процесса, как правило это процесс System.exe
Эксплойт с самого начала использует механизм поиска базовых адресов в оперативной памяти. Для этого используется функция HmValidateHandle
. На основании данных от этой функции собирается примитив для чтения памяти:
QWORD MyRead64(QWORD qwDestAddr)
{
MENUBARINFO pmbi = {};
pmbi.cbSize = sizeof(MENUBARINFO);
if (g_bIsInit)
{
}
else
{
QWORD *pTemp = (QWORD*)LocalAlloc(0x40u, 0x200ui64);
memset(pTemp, 0, 0x200);
QWORD qwBase = 0x000000400000000;
QWORD qwAdd = 0x0000000800000008;
for (int i = 0; i < 0x40; i++)
{
*(pTemp + i) = qwBase + qwAdd*i;
}
*(QWORD *)ref_g_pMem5 = (QWORD)pTemp;
GetMenuBarInfo(g_hWndMax, -3, 1, &pmbi);
g_pmbi_rcBar_left = pmbi.rcBar.left;
bool g_bIsInit = 1;
}
*(QWORD *)ref_g_pMem5 = qwDestAddr - g_pmbi_rcBar_left;
GetMenuBarInfo(g_hWndMax, -3, 1, &pmbi);
return (unsigned int)pmbi.rcBar.left + ((__int64)pmbi.rcBar.top << 32);
}
В качестве примитива на запись используется функция SetWindowLongPtrA
. Далее перезатирается токен для выполнения команд с повышенными привелегиями.
CVE-2021-40444
Уязвимость в модуле mshtml, который используется для работы с разметкой в ОС Windows. Наиболее популярной уязвимость стала в совокупности с использованием MS Office пакета приложений. Это, наверное, одна из самых простых узявимостей, которые появлялись за последнее время. Уязвимость достаточно быстро получила большое количество фреймворков для воспроизведения и использования. Например, вот этот репозиторий.
Суть уязвимости заключается в том, что mshtml используется для того, чтобы скачивать из сети шаблоны для работы с Office документами. Причем производятся подобные загрузки автоматически, без какой-либо валидации.
В стандартном сценарии загрузка шаблонов позволяет работать с xml/html файлами, которые могут перемежаться cab архивами. Это обстоятельство и используется для эксплуатации. То есть чтобы стриггерить узявимость, эксплойты из репозитория просто создают подложный файл шаблона и cab файл, который будет выполнять запуск команд на системе с привелегиями пользователя, который открыл документ.
Триггер можно найти здесь.
Выводы
Изучение уязвимостей может помочь более эффективно использовать их при тестировании на проникновение. Без знаний о том, что происходит в результате использования той или иной уязвимости, будет потрачено драгоценное время, которого всегда мало на проведение всех тестов.
Материал подготовлен Александром Колесниковым в рамках курса «Пентест. Практика тестирования на проникновение».
vya
Сколько уязвимостей уже открыто, а сколько ещё предстоит открыть...
for (int i = 0; i < 0x40; i++) - код поехал.