Access token windows что это



Windows Tokens

Эксперт OTUS — Александр Колесников поделился с нами полезной статьёй, которую написал специально для студентов курса «Пентест. Практика тестирования на проникновение».

Предыдущая статья рассказывала о том, как эксплойты используют технику копирования токена для повышения привилегий. В этой статье мы попытаемся рассмотреть еще одну технику модификации токенов, а также постараемся узнать, как задаются привилегии, которые помещаются в Primary Token.

Все примеры в статье имеют ознакомительный характер, и если вы захотите повторить эксперименты, то используйте виртуальную машину, так как некоторые из действий могут вывести вашу рабочую машину из строя. Все эксперименты выполняются только для исследовательских задач.

Настройка тестового стенда

Для экспериментов подойдет пара виртуальных машин, которые работают по NAT сети. Две потому что нет другого способа проводить ядерную отладку операционной системы. А NAT сеть, чтобы были отладочные символы, с ними проще и быстрее искать данные без исходного кода. Настройка отладчика есть на просторах сети, но все же ниже будет пару строк как это делается для операционной системы Windows 10 1909.

1. Устанавливаем отладчик. Для операционной системы Windows есть только Windbg Preview, установим его:

2. Переводим целевую операционную систему в отладочный режим:

Перезагружаем систему. И открываем вторую машину, которая будет содержать отладчик:

После перезагрузки системы:

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

Token

Официальная документация гласит, что основные данные, которые существуют в операционной системе касательно привилегий пользователя хранятся в специальной структуре, которая называется Primary Token. В прошлой статье мы не останавливались подробно на части, которая описывается Se* привилегиями. Наиболее интересные привилегии, которые могут быть использованы для эскалации привилегий, вывода из строя ОС:

Каждая строка это константа, которая определяет, какие привилегии существуют в токене. В операционной системе данный из токена включены в специальную структуру, которая называется “Security Descriptor”:

В качестве подопытного процесса возьмём процесс System. Для получения адреса токена можно ввести следующую команду — dx @$cursession.Processes[4].KernelObject.Token

Токен хранится с использованием EXFAST_REF это означает, что нужно занулить последний байт, чтобы вычислить адрес токена:

Посмотрим полный список групп и привилегий у пользователя System:

Стоит обратить внимание на тот факт, что найти “Security Descriptor” можно за несколько шагов, которые представлены выше на снимке. Полный список информации о привилегиях и группах представлен ниже:

Исследуем, что будет, если мы модифицируем ссылку на токен из отладчика:

Из-за изменения токена на нулевой, произошёл BSOD. В Windows была возможность использовать нулевой токен, но всё закончилось на Windows 10 1607. Был имплементирован механизм, который вызывает BSOD, если ссылка на токен в “Security Descriptor” модифицируется. Анализ дампа показывает, что проблема в испорченном объекте:

А можем ли мы все таки произвести модификацию без BSOD? Попробуем модифицировать так, чтобы осталась возможность работать с ОС. Для проверки попробуем создать условия, при которых токен обычного пользователя включал максимальное количество привилегий:

1.Найдем системный процесс и выясним, какие привилегии у него включены:

2.Пройдем в токен cmd.exe просмотрим текущее значение на включенные права:

3.Модифицируем права. Список прав после модификации:

Модификация прошла успешно, но все равно пользователь не может аттачиться к ряду системных приложений. Из-за того, что у пользователя еще остались ограничения из-за Integrity Levels и дополнительных битов, которые запрещают взаимодействие с процессами.

А можно ли провести выставление конкретных прав у пользователя в дескрипторе? Попробуем определить. В официальной документации указываются только строковые приставления констант, попробуем переписать токен значениями: 0x1

BSOD не произошло, похоже что механизм защиты просматривает только случаи, когда испорчен заголовок объекта. Это хорошо, значит, можно брутить. Первое значение, которое показало какой-то вменяемый результат — 0x100000 .

В итоге перебора значений были получены следующие данные о константах в токене:

SeDebugPrivilege — 0x100000

SeAuditPrivilege — 0x200000

SeSystemEnvironmentPrivilege — 0x400000

SeCreatePermanentPrivilege — 0x010000

SeSystemtimePrivilege — 0x001000

SeSecurityPrivilege — 0x000100

SeLockMemoryPrivilege — 0x000010

Получается, что хранимые привилегии это всего лишь байт в поле из 6 байт. И все действия, которые были проведены в отладчике, могут быть выполнены через shellcode, только нужно учитывать, что в эксперименте мы просто проставляли права как существующие, но для их полноценного использования их нужно еще включить. То есть записать привилегии по адресу SEPTOKEN_PRIVILEGES и _SEPTOKENPRIVILEGES+0x8.

Проведем следующий эксперимент — отнимем привилегии у процесса System и посмотрим, сможем ли мы выполнить операции, которые требуют расширенных привилегий.

В качестве теста была запущена команда netstat -ab , команда успешно отработала. Почему так произошло? Ведь все данные из токена о привилегиях были удалены. Здесь стоит вспомнить, что в ОС Windows привилегии наследуются от группы к пользователю, поэтому пока пользователь System принадлежит группам из списка ниже, он сможет продолжать использовать свои привилегии:

Ну и напоследок, шелкод, который можно использовать в качестве payload для эксплойтов из прошлой статьи:

Источник

Sysadminium

База знаний системного администратора

Маркеры доступа

Из этой статьи вы узнаете, что такое маркеры доступа, и из чего они состоят. А также я покажу, как запустить программу с изменённым маркером доступа.

Теория

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

Маркеры доступа затем используются монитором безопасности SRM (про него было написано здесь). Основываясь на маркерах доступа монитор решает какие объекты и к чему имеют доступ.

Маркер доступа включает в себя:

  • SID пользователя;
  • SID всех групп в которые входит пользователь;
  • массив привилегий, при этом привилегии бывают разные, например выключать компьютер, или сменить владельца у объекта;
  • уровень целостности;
  • ID сеанса;
  • состояние UAC.

Когда пользователь входит в систему, его первый процесс получает маркер доступа. Поскольку по умолчанию дочерние процессы наследуют маркер своего создателя, все процессы в сеансе пользователя запускаются с одним и тем же маркером. Но маркер приложения может слегка измениться, например при запуске приложения от имени администратора. При таком запуске изменяется уровень целостности и соответственно маркер доступа.

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

Практика

Системная утилита Runas умеет запускать процессы от имени других пользователей. И соответственно с другими маркерами доступа.

С помощью следующей команды, вы можете запустить приложение “Блокнот” от имени какого-нибудь другого пользователя:

А теперь, давайте запустим две командные строки, одну от имени администратора а другую обычно. И посмотрим на их маркеры доступа в Process Explorer. Для этого откроем свойства запущенных процессов и перейдем на вкладку “Security“:

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

Источник

Access Tokens

An access token is an object that describes the security context of a process or thread. The information in a token includes the identity and privileges of the user account associated with the process or thread. When a user logs on, the system verifies the user’s password by comparing it with information stored in a security database. If the password is authenticated, the system produces an access token. Every process executed on behalf of this user has a copy of this access token.

The system uses an access token to identify the user when a thread interacts with a securable object or tries to perform a system task that requires privileges. Access tokens contain the following information:

  • The security identifier (SID) for the user’s account
  • SIDs for the groups of which the user is a member
  • A logon SID that identifies the current logon session
  • A list of the privileges held by either the user or the user’s groups
  • An owner SID
  • The SID for the primary group
  • The default DACL that the system uses when the user creates a securable object without specifying a security descriptor
  • The source of the access token
  • Whether the token is a primary or impersonation token
  • An optional list of restricting SIDs
  • Current impersonation levels
  • Other statistics

Every process has a primary token that describes the security context of the user account associated with the process. By default, the system uses the primary token when a thread of the process interacts with a securable object. Moreover, a thread can impersonate a client account. Impersonation allows the thread to interact with securable objects using the client’s security context. A thread that is impersonating a client has both a primary token and an impersonation token.

Use the OpenProcessToken function to retrieve a handle to the primary token of a process. Use the OpenThreadToken function to retrieve a handle to the impersonation token of a thread. For more information, see Impersonation.

You can use the following functions to manipulate access tokens.

Function Description
AdjustTokenGroups Changes the group information in an access token.
AdjustTokenPrivileges Enables or disables the privileges in an access token. It does not grant new privileges or revoke existing ones.
CheckTokenMembership Determines whether a specified SID is enabled in a specified access token.
CreateRestrictedToken Creates a new token that is a restricted version of an existing token. The restricted token can have disabled SIDs, deleted privileges, and a list of restricted SIDs.
DuplicateToken Creates a new impersonation token that duplicates an existing token.
DuplicateTokenEx Creates a new primary token or impersonation token that duplicates an existing token.
GetTokenInformation Retrieves information about a token.
IsTokenRestricted Determines whether a token has a list of restricting SIDs.
OpenProcessToken Retrieves a handle to the primary access token for a process.
OpenThreadToken Retrieves a handle to the impersonation access token for a thread.
SetThreadToken Assigns or removes an impersonation token for a thread.
SetTokenInformation Changes a token’s owner, primary group, or default DACL.

The access token functions use the following structures to describe the parts of an access token.

Structure Description
TOKEN_CONTROL Information that identifies an access token.
TOKEN_DEFAULT_DACL The default DACL that the system uses in the security descriptors of new objects created by a thread.
TOKEN_GROUPS Specifies the SIDs and attributes of the group SIDs in an access token.
TOKEN_OWNER The default owner SID for the security descriptors of new objects.
TOKEN_PRIMARY_GROUP The default primary group SID for the security descriptors of new objects.
TOKEN_PRIVILEGES The privileges associated with an access token. Also determines whether the privileges are enabled.
TOKEN_SOURCE The source of an access token.
TOKEN_STATISTICS Statistics associated with an access token.
TOKEN_USER The SID of the user associated with an access token.

The access token functions use the following enumeration types.

Источник

Маркеры доступа

Маркер доступа — это объект, описывающий контекст безопасностипроцесса или потока. Сведения в маркере включают удостоверение и привилегии учетной записи пользователя, связанной с процессом или потоком. Когда пользователь входит в систему, система проверяет пароль пользователя, сравнивая его с данными, хранящимися в базе данных безопасности. Если пароль прошел проверку подлинности, система создает маркер доступа. Каждый процесс, выполняемый от имени этого пользователя, имеет копию этого маркера доступа.

Система использует маркер доступа для идентификации пользователя, когда поток взаимодействует с защищаемым объектом или пытается выполнить системную задачу, требующую привилегий. Маркеры доступа содержат следующие сведения:

  • Идентификатор безопасности для учетной записи пользователя
  • Идентификаторы безопасности для групп, членом которых является пользователь
  • Идентификатор безопасности входа, идентифицирующий текущий сеанс входа
  • Список привилегий , удерживаемых пользователем или группами пользователей.
  • Идентификатор безопасности владельца
  • Идентификатор безопасности для основной группы
  • DaCL по умолчанию, используемый системой при создании защищаемого объекта без указания дескриптора безопасности.
  • Источник маркера доступа
  • Указывает, является ли маркер основным или олицетворением .
  • Необязательный список ограничений идентификаторов БЕЗОПАСНОСТИ
  • Текущие уровни олицетворения
  • Другая статистика

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

Используйте функцию OpenProcessToken для получения дескриптора к основному маркеру процесса. Используйте функцию OpenThreadToken , чтобы получить дескриптор маркера олицетворения потока. Дополнительные сведения см. в разделе «Олицетворение».

Для управления маркерами доступа можно использовать следующие функции.

Функция Описание
AdjustTokenGroups Изменяет сведения о группе в маркере доступа.
AdjustTokenPrivileges Включает или отключает привилегии в маркере доступа. Он не предоставляет новые привилегии или отменяет существующие.
CheckTokenMembership Определяет, включен ли указанный идентификатор безопасности в указанном маркере доступа.
CreateRestrictedToken Создает новый маркер, который является ограниченной версией существующего маркера. Ограниченный маркер может иметь отключенные идентификаторы БЕЗОПАСНОСТИ, удаленные привилегии и список ограниченных идентификаторов БЕЗОПАСНОСТИ.
DuplicateToken Создает новый токен олицетворения, дублирующий существующий маркер.
DuplicateTokenEx Создает новый первичный маркер или маркер олицетворения, дублирующий существующий маркер.
GetTokenInformation Извлекает сведения о маркере.
IsTokenRestricted Определяет, содержит ли маркер список ограничений идентификаторов БЕЗОПАСНОСТИ.
OpenProcessToken Извлекает дескриптор в основной маркер доступа для процесса.
OpenThreadToken Извлекает дескриптор маркера доступа олицетворения для потока.
SetThreadToken Назначает или удаляет токен олицетворения для потока.
SetTokenInformation Изменяет владельца маркера, основную группу или daCL по умолчанию.

Функции маркера доступа используют следующие структуры для описания частей маркера доступа.

Структура Описание
TOKEN_CONTROL Сведения, определяющие маркер доступа.
TOKEN_DEFAULT_DACL DaCL по умолчанию, используемый системой в дескрипторах безопасности новых объектов, созданных потоком.
TOKEN_GROUPS Указывает идентификаторы и атрибуты идентификаторов безопасности группы в маркере доступа.
TOKEN_OWNER Идентификатор безопасности владельца по умолчанию для дескрипторов безопасности новых объектов.
TOKEN_PRIMARY_GROUP Идентификатор безопасности основной группы по умолчанию для дескрипторов безопасности новых объектов.
TOKEN_PRIVILEGES Привилегии, связанные с маркером доступа. Также определяет, включены ли привилегии.
TOKEN_SOURCE Источник маркера доступа.
TOKEN_STATISTICS Статистика, связанная с маркером доступа.
TOKEN_USER Идентификатор безопасности пользователя, связанного с маркером доступа.

Функции маркера доступа используют следующие типы перечисления.

Источник

You may also like...