Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2022-37969PoC — Учебное пособие по CVE-2022-37969 с акцентом на методологию эксплуатации ядра, а не на внутренние причины CVE | Kitploit
Инструменты/GitHubGitHub/emilc3978/cve-2022-37969poc
Повышение привилегийКриминалистика памятиАнализ уязвимостейЭксплуатацияОбратная инженерияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubemilc3978/cve-2022-37969poc

CVE-2022-37969PoC

Учебное пособие по CVE-2022-37969 с акцентом на методологию эксплуатации ядра, а не на внутренние причины CVE

Репозиторий
21711 месяцев назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Содержание

Общее введение

Этот материал создан для прояснения общих аспектов эксплуатации Windows. В нём объясняются базовые концепции применительно к CVE-2022-37969. Конечный результат — рабочее PoC. Он не разъясняет каждый аспект CVE, но предоставляет переиспользуемые фрагменты кода и объясняет механизмы, которые встречаются во многих эксплойтах общего назначения.

Целевой пользователь — начинающий reverse-инженер, разработчик эксплойтов, который ищет рабочий исходный код proof of concept для тестирования и понимания основ Windows Internals. Материал служит отправной точкой для дальнейшего изучения.

Требования: базовые навыки отладки ядра, базовый reverse engineering, базовые знания Windows internals, навыки программирования на c/c++

Контекст

Программа — это фрагмент кода, выполняющийся на машине. Как правило, программа получает данные (входные данные), выполняет вычисления с их использованием и генерирует данные (выходные данные). Большинство программ написаны людьми и поэтому содержат ошибки. Ошибка порождается исходным кодом, который был написан некорректно (программист хотел сделать с входными данными одно, а получившийся код дал иной результат, чем предполагалось). Большинство ошибок исправляются до выпуска продукта, но некоторые остаются. Это происходит потому, что существуют разные типы ошибок, и некоторые из них сложнее обнаружить, чем другие.

Windows — это компьютерная программа, написанная людьми, и поэтому в ней есть ошибки. Почему это важно? Потому что системы Windows могут запускать программы, которые работают с чувствительными данными, такими как банковские счета, базы данных здравоохранения и прочее. Некоторые ошибки могут быть использованы для незаконного получения доступа к ограниченным данным (это хороший вариант применения эксплойта).

Существует множество видов ошибок, некоторые полезны, некоторые нет. Как правило, ошибки порождаются входными данными программы, которые в сочетании с некорректно написанными строками кода приводят к некорректному выводу или поведению программы. Поиск таких входных данных — задача специалиста по безопасности (или хакера). Следующий шаг — оценить полученное некорректное поведение/вывод и ответить на вопрос: «Можно ли использовать это с пользой?». На этом этапе ошибки классифицируются по разным категориям. Например, ошибка может вызывать повреждение некоторых структур данных и приводить к перезагрузке целевого компьютера. Её полезность ограничена. Одна ошибка может привести к записи входных данных в область памяти, которая контролирует права доступа к ограниченным файлам. Такой тип ошибок более полезен.

Итак, из множества всех возможных ошибок хакер ищет подмножество, наиболее полезное для его целей. В общем виде проблема звучит так: «Могу ли я подать целевой программе специально сформированные входные данные так, чтобы не сломать систему, но при этом повысить свой уровень доступа и получить выгоду?»

После этого нетехнического введения можно сформулировать цель данного руководства: Можем ли мы найти программу Windows, которая принимает некорректные входные данные и, в результате ошибки разработчика, позволяет незаконно повысить наши привилегии с обычного пользователя до администратора?

Целевая программа: Windows CLFS (Common Log File System Driver)

Название эксплойта: CVE-2022-37969

Тип: Local Privilege Escalation

ЗАГРУЗКА УЯЗВИМОГО ISO: Скачать здесь

Общая теория повышения привилегий в Windows

Адресное пространство Windows примерно разделено на пользовательское пространство (user-space, где выполняются обычные программы) и пространство ядра (kernel-space, где работают сама операционная система и программное обеспечение аппаратных компонентов — драйверы). Обычный пользователь не должен иметь доступ к пространству ядра, однако существуют механизмы, с помощью которых программы обычного пользователя могут обращаться к частям кода ядра (системные вызовы, процедуры драйверов). Зачем нам нужен доступ? Чтобы взаимодействовать с ОС безопасным и контролируемым образом, как это предусмотрено разработчиками ОС.

Некоторые драйверы используют входные данные, предоставленные пользователем, для работы со структурами данных в пространстве ядра. Если входные данные вызывают ошибку, ядро может быть повреждено. Один из таких случаев — Common Log File System Driver. Используя особые входные данные, мы можем заставить драйвер изменить структуры данных ядра, которые хранят уровень привилегий пользователя, и перезаписать обычного пользователя на администратора.

Что нужно изменить, чтобы повысить привилегии до администратора?

Начнём с конечной цели. Windows хранит внутри структуры данных ядра с именем _EPROCESS информацию о каждом процессе, выполняющемся в системе. Пример _EPROCESS

Одно из важных полей — struct _EX_FAST_REF Token. Это ещё одна структура данных, которая, в свою очередь, указывает на данные, относящиеся к уровню привилегий соответствующего процесса. На следующем рисунке процесс System имеет системный токен, а процесс Explorer — токен обычного пользователя.

Tokens

Таким образом, чтобы повысить привилегии Explorer.exe, нам нужно скопировать значение из _EPROCESS-->Token процесса System в _EPROCESS-->Token процесса Explorer. Мы достигнем чего-то похожего, скопировав системный токен в токен нашей собственной программы и запустив командную строку из повышенного процесса (дочерние процессы наследуют токен родительского процесса).

Для выполнения этих действий нам нужны механизмы для:

  1. Получения адреса структуры данных _EPROCESS в ядре
  2. Чтения значения поля Token для процесса System
  3. Получения адреса структуры данных _EPROCESS для Explorer
  4. Записи значения токена System по смещению Token в структуре _EPROCESS процесса Explorer

Поиск структуры данных _EPROCESS для целевого процесса по PID

Введение: природа Windows на протяжении многих лет: Как и в случае с обнаружением новых уязвимостей, Windows требовала исправлений для их устранения. Кроме того, с появлением новых технологий Windows требовала обновлений, чтобы оставаться конкурентоспособной. Одним из ключевых требований была обратная совместимость с предыдущими версиями. А иногда безопасность достигалась за счёт сокрытия деталей реализации. Структуры данных и определения функций удалялись из документации, но функциональность оставалась. Благодаря reverse engineering исследователи смогли использовать эти функции для различных целей.

Для поиска адреса _EPROCESS в ядре мы будем использовать недокументированную функцию: NtQuerySystemInformation (см. ссылку для параметров). Используя параметр SystemInformationClass, мы можем указать, какую информацию хотим получить. Мы получим общую информацию о процессах, указав значение SystemExtendedHandleInformation (#define SystemExtendedHandleInformation 0x40).

Особенность использования NtQuerySystemInformation заключается в том, что мы заранее не знаем длину возвращаемых данных, но у NtQuerySystemInformation есть механизм, который помогает. Если функция вызвана с массивом неправильного размера для требуемых данных, она возвращает ошибку и корректный размер данных, который следовало запросить. Это можно использовать для корректного чтения информации о процессах следующим образом:

  1. Вызовите NtQuerySystemInformation с фиктивным параметром SystemInformationLength
  2. Прочитайте возвращённое значение параметра ReturnLength
  3. Снова вызовите NtQuerySystemInformation с корректным значением SystemInformationLength, полученным на предыдущем шаге
Скачать инструмент