XSEC: как изучить Windows Access Control за два часа

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Хотите изучить подсистему контроля доступа Windows за два час? Да ещё так знать эту тему, как ни один ваш преподаватель не знает? Хотите знать, как использовать функцию Windows API с самым длинным именем - AccessCheckByTypeResultListAndAuditAlarmByHandle? А увидеть код, создающий недокументированные структуры Windows? Тогда вам сюда!

В статье представлено описание библиотеки и набора тестов, которые позволят любому пользователю изучить в максимально полном объёме подсистему контроля доступа Windows при достаточно малых начальных знаниях. Рассматриваются вопросы работы с DACL, SACL, Conditional ACE, mandatory integrity checking и многие другие. Тесты позволяют пользователю самому произвольно менять входные данные и самостоятельно модифицировать их для более детального изучения нужных конкретному пользователю тем. Представленная библиотека позволят осуществлять разбор и создание всех внутренних структур подсистемы безопасности Windows, а также позволяет создавать «access tokens» с произвольными начальными данными.

Давным-давно я начал изучать подсистему безопасности Windows. Почитал отличные книги, однако каждая книга должна быть подкреплена прежде всего практикой. Так я начал свои практические эксперименты. Прежде всего, я начал со стандартной методики: создание некой файловой структуры с несколькими вложенными уровнями (директориями). На начальных этапах изучения такой «экспериментальной площадки» вполне хватало. Однако, когда я перешел к изучению DAC (Dynamic Access Control) тестовая «площадка» сильно усложнилась: мне уже пришлось разворачивать несколько виртуальных машин, на одной из которых был Windows Server, а на другой – обычная клиентская ОС. Здесь уже потребовалось изучение процесса конфигурирования множества подсистем Windows Server, что несколько отвлекало от первоначальной задачи: изучение подсистемы безопасности. В конце концов у меня была написана достаточно развитая библиотека, которая позволяла мне получать в удобном для меня виде все значения различных структур, относящихся к подсистеме безопасности Windows, а также для большинства из них – ещё и создавать их из ранее сохранённых значений. Но однажды мне пришла в голову идея, которая кардинально изменила (и сильно упростила) весь мой подход к изучению данной темы.

Как я уже сказал, у меня была развитая библиотека, позволяющая сохранять значения структур, относящихся к подсистеме безопасности, на диск, а также создавать заново из ранее сохранённых данных. Всё что было официально документировано Microsoft я уже реализовал.

Я понял, что по сути вся подсистема безопасности Windows – это только два понятия: «токен» (access token) и «дескриптор безопасности» (security descriptor a.k.a. SD). Если представить аналогию с обычной дверью, то токен это ключ, а дескриптор безопасности – замок. Все остальные понятия/сущности, которые существуют в подсистеме безопасности Windows вторичны, и базируются только на использовании токенов и дескрипторов безопасности. И для изучения подсистемы безопасности надо только три этапа: 1) умение создавать свой токен из ранее сохранённых значений; 2) умение создавать дескриптор безопасности из ранее сохранённых значений; 3) вызвать корректную системную функцию для проверки доступа полученного токена к полученному дескриптору. Нет необходимости создавать сложную файловую структуру, нет необходимости в каком-либо сервере – всё создаётся прямо на локальной машине с помощью только одной программы. Конечно, для корректного выполнения такой программы надо выполнить ряд условий, однако они крайне легко реализуются.

Программа должна быть запущена из-под административного пользователя. То есть достаточно выполнить вход обычным пользователем, но сам программный код должен быть запущен с помощью «Run As Administrator». В моих тестах я использовал Visual Studio. Также должны быть сконфигурированы определённые привилегии для пользователя, из-под которого запускаются тесты: SeCreateTokenPrivilege (Create a token object), SeTcbPrivilege (Act as part of the operating system), SeImpersonatePrivilege (Impersonate a client after authentication).

Сам проект представляет из себя стандартный проект тестов для C++. То есть у него нет «выходного файла» и всё, что он производит это результаты тестирования. Описание всех тестов представлено в данном файле. А собственно сам проект находится вот здесь. Всё в исходных кодах, без внешних зависимостей, с лицензией типа «делай всё, что хочешь, только оставь copyright». Кстати – если у кого-то есть хорошие тесты, относящиеся к теме Windows Access Control, то предлагайте и я все их рассмотрю и, возможно, реализую в данном проекте.

В конце немного ответов на вопросы, поставленные мною же в начале статьи:

1. Как изучить подсистему контроля доступа Windows за два часа?

Читайте описания тестов в данном файле. А лучше смотрите исходный код самих тестов в этом файле. Там всё подробно описано, хотя и по-английски. Рекомендую поэкспериментировать со входными параметрами к тестам – очень помогает для самостоятельного изучения материала. А вот как вы там изучите материал (лучше или хуже своего преподавателя) – это зависит только от вас самих. Но я дал вам все шансы выучить лучше его ​

2. Как использовать функцию Windows API с самым длинным именем - AccessCheckByTypeResultListAndAuditAlarmByHandle?

Вот по этой ссылке можно найти функцию, которая использует AccessCheckByTypeResultListAndAuditAlarmByHandle. И использует все параметры этой функции, все семнадцать. На самом деле AccessCheckByTypeResultListAndAuditAlarmByHandle является основной функции проверки доступа для определённого токена к определённому дескриптору безопасности тестах для моей библиотеки. Есть, конечно, схожие функции с меньшим количеством параметров и более коротким именем, однако мне более всего подошла именно эта.

3. Хотите увидеть код, создающий недокументированные структуры Windows?

Вот по этой ссылке вы можете найти функцию, создающую «binary representation» для типа данных CLAIM_SECURITY_ATTRIBUTE_V1. Сама по себе структура документирована в [MS-DTYP], однако описания, как именно она представляется в бинарных данных там нет. Эта структура нужна для задания «resource attributes» (понятие относится к DAC, Dynamic Access Control) для дескриптора безопасности (например для задания ресурсов для файла).

Источник: https://habr.com/ru/post/559118/


Интересные статьи

Интересные статьи

На работе я занимаюсь поддержкой пользователей и обслуживанием коробочной версии CRM Битрикс24, в том числе и написанием бизнес-процессов. Нужно отметить, что на самом деле я не «чист...
Те, кто собираются открывать интернет-магазин, предварительно начитавшись в интернете о важности уникального контента, о фильтрах, накладываемых поисковиками за копирование материалов с других ресурсо...
Принято считать, что персонализация в интернете это магия, которая создается сотнями серверов на основе БигДата и сложного семантического анализа контента.
При подготовке прошлой статьи от моего внимания ускользнул один любопытный пример, выловленный в одном из наших приложений. Его я оформил в виде отдельной статьи, которую вы сейчас читаете. ...
На своей ежегодной конференции для разработчиков компания Microsoft сделала сразу несколько достаточно важных презентаций. Мы выбрали две из них. Первое: в летней сборке 19H2 Windows 10 будет...