Уязвимости в ОС и программном обеспечении всегда являлись одними из самым мощных векторов тестирования на проникновение. Какими интересными свежими уязвимостями можно пополнить свой арсенал? В статье попробуем разобраться, как работают 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 снабжен исходным кодом, в котором есть даже интересные комментарии. С использованием исходного кода опишем верхнеуровнего алгоритм эксплойта:

  1. main функция почти весь код содержит в цикле, условием которого является успешное чтение ключа реестра SYSTEM\\CurrentControlSet\\Services\\Fax\\ImagePath. Причем поиск осуществляется следующего значения — %systemroot%\\Temp\\asmae.exe

  2. На строке 76 и 77 внутри цикла устанавливается приоритет процесса и потока эксплойта.

         SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
         SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

    Это может указывать на то, что эксплойт использует проблему типа Race Condition.

  3. Подтверждение пункту 2 можно привести так же использование вот такого цикла для загрузки процессора:

    DWORD WINAPI thread(void* args) {
     do {
    
     } while (1);
    }
  4. Основная эксплуатация происходит параллельно следующей команде:

    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 — самая популярная подсистема для повышения привилегий. Данная уязвимость не стала исключением. Основные проблемы, которые преследуют эту подсистему — рассинхронизация создания и уничтожения объектов, с которыми работают алгоритмы. Практически всегда это элементы пользовательского интерфейса, которые создаются со случайными значениями параметров инициализации.

Публичный эксплойт для этой уязвимости можно также найти в репозитории здесь.

Сам эксплойт использует достаточно простой алгоритм, однако, благодаря введенным в ОС подсистемам защиты, выполнение этого алгоритма может быть достаточно нетривиальной задачей.

Итак, чтобы повысить привилегии для пользователя, эксплойт выполняет следующие этапы:

  1. Создание и инициализация фэйковых объектов подсистемы Win32k

  2. Использование уязвимости или стандартного механизма ОС для получения маппинга оперативной памяти ядра ОС

  3. Поиск primary Token в памяти запущенного процесса

  4. Модификация привилегий напрямую или с использованием донорского процесса, как правило это процесс 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 файл, который будет выполнять запуск команд на системе с привелегиями пользователя, который открыл документ.

Триггер можно найти здесь.

Выводы

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


Материал подготовлен Александром Колесниковым в рамках курса «Пентест. Практика тестирования на проникновение».

Комментарии (1)


  1. vya
    19.10.2021 23:51

    Сколько уязвимостей уже открыто, а сколько ещё предстоит открыть...

    for (int i = 0; i < 0x40; i++) - код поехал.