Что такое примеры имен объектов Windows

Обновлено: 04.07.2024

В качестве домашнего задания во время самоизоляции я хотел автоматизировать анализ поверхности атаки цели в Windows. Основная цель состояла в том, чтобы построить представление архитектуры программного обеспечения, чтобы выделить поверхность атаки (будь то удаленная или локальная).

Архитектура программного обеспечения может состоять из нескольких элементов:

Обычно анализ архитектуры программного обеспечения выполняется с помощью инструментов, дающих представление в определенное время (ProcessHacker, WinObjEx и т. д.). Однако различные компоненты программной архитектуры могут вызываться динамически и временно при определенных условиях. В этом контексте могут помочь инструменты мониторинга, такие как ProcMon, но они требуют ручных операций.

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

Войдите в Icebox, структуру VMI (Virtual Machine Introspection), которая дает возможность контролировать виртуальную машину и вышележащую операционную систему. Тем не менее, базовая поддержка Windows должна быть реализована, прежде чем мы сможем рассмотреть возможность построения представления об архитектуре программного обеспечения и его поверхности атаки.

В частности, при примитивной поддержке пространства имен NT Object мы сможем собирать важную информацию для построения поверхности атаки. Результатом этой поддержки будет сначала простой текстовый журнал собранной информации.

Наконец, с VMI выполнение кода внутри виртуальной машины невозможно. Таким образом, нам придется переопределить функции ядра Windows, чтобы имитировать их поведение. Такие проекты, как Rekall и Volatility, являются хорошими точками входа с открытым исходным кодом. Я также часто использую само ядро ​​( ntoskrnl.exe ) или даже WinDBG для проверки своих предположений.

Этот пост не предназначен для представления новых концепций Windows (все нижеизложенное уже задокументировано). Тем не менее, он показывает практичный/игривый способ навигации внутри ядра Windows с помощью Icebox.

Отказ от ответственности: приведенная ниже реализация не предназначена для полной поддержки Windows со всеми ее версиями и всеми их особенностями.

Отказ от ответственности 2: я работал над этой темой, не имея в виду публикацию. Мне не удалось записать все ресурсы, которые я использовал, и некоторые ссылки могут отсутствовать. Не стесняйтесь, дайте мне знать, если заметите что-то не так.

В Icebox есть два способа мониторинга процессов:

  • перечислите живые процессы
  • наблюдайте за созданием процессов

Эти два метода описаны в предыдущем сообщении блога:

Очевидно, что все выходные данные этих методов не обязательно будут связаны с нашим программным обеспечением, некоторые из этих процессов необходимо отфильтровать. Хорошим критерием для фильтрации процессов является расположение имени файла изображения (например, в папке установки программного обеспечения).

Из установленного списка процессов можно отслеживать все взаимодействия между ними и другими объектами Windows. Центром этих взаимодействий является создание процессом HANDLE для другого объекта Windows.

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

Перерыв в какой-то момент

Создание HANDLE выполняется Windows с помощью функции ядра nt!ObpCreateHandle . Взломав эту функцию, можно контролировать все обращения к объектам со стороны программных процессов.

Прототип этой функции приведен ниже:

Интересующим параметром является объект PVOID, который является указателем на тело объекта.

Чтобы перейти к этой функции и получить указанный указатель через Icebox, мы можем использовать следующий фрагмент кода:

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

  • nt!_FILE_OBJECT
  • нт!_SECTION_OBJECT
  • nt!_ALPC_PORT
  • и т. д.

Чтобы пойти дальше, нам нужно получить общую информацию об объекте. Это было сделано с помощью реализации класса nt_Object.

Общая обработка объектов

В Windows объект nt примерно состоит из двух частей:

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

Чтобы получить доступ к этим данным с помощью имеющегося у нас непрозрачного указателя объекта, необходимо реализовать спецификацию объекта через Icebox.

Вот пример реализации класса nt_Object:

Чтобы лучше обрабатывать тело объекта, необходимо определить тип объекта.

Чтобы получить тип объекта, ядро ​​Windows использует функцию nt!ObGetObjectType. Ниже приведена одна реализация этой функции. Эта реализация опирается на две функции:

  • средство доступа к закодированному типу объекта: __get_object_type
  • декодер для извлечения реального типа объекта: __get_type_index

Помимо самого ядра, в следующем сообщении блога приведены дополнительные сведения о получении типа объекта:

Подводя итог, теперь мы можем получить три свойства запрошенного HANDLE :

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

Например, класс nt_Process, используемый для представления nt!_EPROCESS, реализует метод __get_mitigations для сбора значений MitigationFlagsValues.

Пример вывода для этого:

Дескриптор безопасности и внутренние структуры

Обработка заголовка объекта дает доступ к общей информации, такой как nt!_SECURITY_DESCRIPTOR и связанным ACL и ACE .

Эта информация о безопасности используется для определения возможности доступа к объекту с заданным идентификатором.

В некоторых случаях nt!_SECURITY_DESCRIPTOR имеет значение NULL . Обычно это означает, что любой может получить доступ к объекту.

Однако в отношении файлов это не так. Действительно, объект пространства имен nt не управляет безопасностью файлов в файловой системе.

Для большинства типов объектов репрезентативным является дескриптор безопасности в заголовке объекта.

Чтобы получить к нему доступ, ядро ​​Windows использует функцию nt!ObGetObjectSecurity, которая переопределена ниже:

Вот пример реализации класса nt_SecurityDescriptor:

Важным членом этого класса является dacl .

dacl определяет доверенных лиц, которым разрешен или запрещен доступ к защищаемому объекту.

И dacl, и sacl являются списками управления доступом (ACL):

  • dacl: определяет пользователей и группы, которым разрешен или запрещен доступ.
  • sacl : управляет аудитом доступа.

В Windows DACL реализован в виде списка записей управления доступом ( ACE ). ACE — это пара доверенных лиц с доступом к целевому защищаемому объекту.

Документация Microsoft более подробно описывает механизмы ACL.

Для получения DACL дескриптора безопасности требуется реализация функции ядра nt!RtlGetDaclSecurityDescriptor. Ниже приведена одна из возможных реализаций:

Затем этот DACL считывается через класс nt_Acl:

    Я повторно использовал большую часть кода, приведенного в примере.

Список ACE просматривается с помощью следующей функции, которая является повторной реализацией nt!RtlGetAce :

К сожалению, типы _ACE_HEADER и _ACE не публикуются в символах Windows. Определение, используемое в реализации nt!RtlGetAce, приведено ниже:

И, наконец, объект ACE инициализируется в классе nt_Ace. Этот класс будет интерпретировать AccessMask и отображать Sid доверенного лица.

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

Пример вывода для этого:

  • список процессов
  • список взаимодействий через объекты nt
  • используемый ACL-список nt объектов

Поверхность атаки почти установлена. Привилегии задействованных процессов пока неизвестны. Действительно, с точки зрения злоумышленника интересно нацеливаться на процессы, которые имеют больше привилегий (например, повышение привилегий). Так как у обычного пользователя уровень целостности Medium , то все процессы, запущенные с уровнем целостности ниже, не интересны.

Чтобы получить эту информацию, необходимо проанализировать токен процессов.

Теперь можно получить уровень целостности токена, и поверхность атаки завершена.

Действительно, мы можем выбрать поверхность атаки для анализа по следующим критериям:

  • доступная поверхность (ACL)
  • тип объекта, используемый для взаимодействия
  • привилегии целевого процесса (уровень целостности)

В качестве демонстрации этого инструмента приведем образец информации, которую вы можете собрать в работающей Windows:

Как мы видим, процесс dwm.exe, работающий с SystemIL, запросил доступ к (в порядке вывода):

  • токен с определенным dacl
  • файл (ACL для файлов обрабатываются по-разному)
  • мероприятие, доступное для всех

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

Код этого POC доступен здесь.

На данный момент можно представить себе несколько способов улучшить процесс:

  1. сохранить данные в Neo4j для улучшения визуализации

Текстовый вывод журнала не оптимален для экспериментов. Графическая визуализация могла бы быть намного более интуитивно понятной для наблюдения за связями между процессами и объектами.

  1. запустите обратный ntfs.sys, чтобы получить ACL для файлов

ACL для файлов не хранятся в диспетчере объектов, было бы интересно углубиться в ntfs.sys, чтобы понять, как можно получить доступ к ACL через память, если это возможно.

  1. реализовать сценарий автоматического извлечения уязвимостей (например, на основе операций с привилегированными файлами)

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

Именованные объекты предоставляют процессам простой способ совместного использования дескрипторов объектов. После того как процесс создал объект именованного события, мьютекса, семафора или таймера, другие процессы могут использовать это имя для вызова соответствующей функции (OpenEvent, OpenMutex, OpenSemaphore или OpenWaitableTimer), чтобы открыть дескриптор объекта. Сравнение имен чувствительно к регистру.

Имена объектов события, семафора, мьютекса, таймера ожидания, сопоставления файлов и заданий имеют одно и то же пространство имен. Если вы попытаетесь создать объект, используя имя, которое используется объектом другого типа, функция завершится ошибкой, и GetLastError вернет ERROR_INVALID_HANDLE. Поэтому при создании именованных объектов используйте уникальные имена и обязательно проверяйте значения, возвращаемые функцией, на наличие ошибок дублирования имен.

Если вы попытаетесь создать объект, используя имя, которое используется объектом того же типа, функция завершается успешно, возвращая дескриптор существующего объекта, а GetLastError возвращает ERROR_ALREADY_EXISTS. Например, если имя, указанное в вызове функции CreateMutex, совпадает с именем существующего объекта мьютекса, функция возвращает дескриптор существующего объекта. В этом случае вызов CreateMutex эквивалентен вызову функции OpenMutex. Таким образом, наличие нескольких процессов, использующих CreateMutex для одного и того же мьютекса, эквивалентно тому, что один процесс вызывает CreateMutex, в то время как другие процессы вызывают OpenMutex, за исключением того, что это устраняет необходимость гарантировать, что процесс создания запускается первым. Однако при использовании этого метода для объектов мьютекса ни один из вызывающих процессов не должен запрашивать немедленное владение мьютексом. Если несколько процессов запрашивают немедленное владение, может быть трудно предсказать, какой процесс на самом деле получает первоначальное владение.

Среда служб терминалов имеет глобальное пространство имен для событий, семафоров, мьютексов, таймеров ожидания, объектов сопоставления файлов и объектов заданий. Кроме того, каждый сеанс клиента служб терминалов имеет собственное пространство имен для этих объектов. Клиентские процессы служб терминалов могут использовать имена объектов с префиксом "Global\" или "Local\" для явного создания объекта в глобальном пространстве имен или пространстве имен сеанса. Дополнительные сведения см. в разделе Пространства имен объектов ядра. Быстрое переключение пользователей реализовано с помощью сеансов служб терминалов (каждый пользователь входит в отдельный сеанс). Имена объектов ядра должны соответствовать рекомендациям, изложенным для служб терминалов, чтобы приложения могли поддерживать несколько пользователей.

Объекты синхронизации можно создавать в частном пространстве имен. Дополнительные сведения см. в разделе Пространства имен объектов.

Windows предложит вам добавить определенные имена объектов. Из различных видео и руководств я знаю только следующие четыре:

К чему относится каждое из этих имен объектов (или групп)? есть ли еще "специальные" имена объектов? Кроме того, эти имена объектов применимы только для установки прав доступа к файлам в Windows?

1 Ответ 1

  • Имена учетных записей пользователей (допускается либо имя пользователя, либо полное имя).
  • Имена групп (например, встроенные группы, такие как "Администраторы", "Пользователи", "Операторы резервного копирования", а также пользовательские группы, созданные с помощью lusrmgr.msc).
  • Компьютеры (только в сетях Active Directory). Когда системная служба на компьютере A хочет получить доступ к ресурсу на компьютере B, у нее нет собственной учетной записи пользователя, поэтому она будет использовать «учетную запись компьютера».
  • Специальные встроенные пользователи, такие как "SYSTEM", представляющие системные службы (похожие на root в Linux).
  • Индикаторы входа в систему, такие как «ИНТЕРАКТИВНЫЙ» (получается для всех интерактивных сеансов, т. е. при входе через консоль или удаленный рабочий стол), «СЕТЬ» (получается для всех входов в систему через общий доступ к файлам или вход без пароля через WinRM/SSH), "ПАРТИЯ" (запланированные задачи планировщика заданий).
  • Виртуальные «известные группы», такие как «Все» (теперь это в основном равно «Прошедшие проверку»), «Локальные пользователи» (т. е. не пользователи Active Directory) и т. д.
  • Субъекты-шаблоны, такие как "СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ", которые сами по себе ничего не делают, но во время наследования расширяются до фактического пользователя. Например, если папка предоставляет право на изменение «СОЗДАТЕЛЮ-ВЛАДЕЛЬЦУ», а вы создаете в нем файл, то ваша учетная запись получает право на изменение.

Если вы нажмете "Дополнительно", откроется окно поиска, в котором будет перечислено большинство из вышеперечисленного.

Windows преобразует входные имена в SID (идентификаторы безопасности), но могут быть даже некоторые сущности, имеющие SID и отображаемые в списках управления доступом, которые вы на самом деле не можете ввести в этом окне.

Например, каждая системная служба также имеет свой собственный SID (отдельно от "SYSTEM"), и, если я правильно помню, каждому приложению, установленному через Microsoft Store, также присваивается собственный SID.

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

По умолчанию ваш рабочий стол содержит три объекта. Вы также можете добавлять объекты на рабочий стол, чтобы обеспечить удобный доступ к файлам, папкам и приложениям, которые вы часто используете. Например, вы можете добавить панель запуска на свой рабочий стол, чтобы открывать определенное приложение, которое вы часто используете.

Таблица 8–2 описывает типы объектов, которые можно добавить на рабочий стол.

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

Символические ссылки можно определить по стандартной стрелке, которая появляется на всех символических ссылках.

На рабочий стол можно добавить следующие типы программ запуска:

Приложение: запуск определенного приложения.

Ссылка: ссылки на определенный файл, папку или URL-адрес.

Вы можете добавлять файлы на рабочий стол. Файлы на вашем рабочем столе находятся в каталоге вашего рабочего стола.

Вы можете перемещать папки на рабочий стол и создавать папки на рабочем столе. Папки на вашем рабочем столе находятся в каталоге вашего рабочего стола.

Вы можете изменять объекты рабочего стола следующими способами:

Просмотрите свойства объекта.

Переименуйте объект.

Изменить разрешения объекта.

Измените значок, представляющий объект.

Измените размер значка, представляющего объект.

Добавить эмблему к объекту.

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

Чтобы выбрать объекты на рабочем столе

Чтобы выбрать объект на рабочем столе, нажмите на объект. Чтобы выбрать несколько объектов, нажмите и удерживайте клавишу Ctrl, затем щелкните объекты, которые хотите выделить.

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

Чтобы выбрать несколько областей, нажмите и удерживайте клавишу CTRL, а затем перетащите мышью области, которые вы хотите выделить.

Открытие объекта с рабочего стола

Чтобы открыть объект с рабочего стола, дважды щелкните объект. Либо щелкните объект правой кнопкой мыши и выберите «Открыть». Когда вы открываете объект, выполняется действие по умолчанию для объекта. Например, если объект представляет собой текстовый файл, текстовый файл открывается в окне Nautilus. Действия по умолчанию для типов файлов указаны в инструменте настройки типов файлов и программ.

Чтобы выполнить действие, отличное от действия по умолчанию для объекта, щелкните объект правой кнопкой мыши и выберите «Открыть с помощью». Выберите действие в подменю «Открыть с помощью».

Элементы в подменю «Открыть с помощью» соответствуют содержимому следующих частей инструмента настройки типов файлов и программ:

Раскрывающийся список действий по умолчанию в диалоговом окне "Редактировать тип файла"

Раскрывающийся список Viewer Component в диалоговом окне Edit type file

Вы можете настроить параметры в окне Nautilus, чтобы один раз щелкнуть файл, чтобы выполнить действие по умолчанию.

Чтобы добавить панель запуска на рабочий стол

Средство запуска на рабочем столе может запускать приложение или ссылаться на определенный файл, папку или FTP-сайт.

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

Щелкните правой кнопкой мыши на рабочем столе и выберите «Новая программа запуска». Откроется диалоговое окно «Создать средство запуска».

Информацию о том, как ввести свойства средства запуска в диалоговом окне "Создать средство запуска", см. в разделе Работа с панелями.

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

Запускает приложение gedit.

Открывает файл /user123/loremipsum.txt в приложении gedit.

Открывает папку /user123/Projects в окне Nautilus.

Добавить символическую ссылку на рабочий стол

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

Открыть определенный файл в определенном приложении.

Открыть определенную папку в окне Nautilus.

Запустить двоичный файл или скрипт.

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

Отобразите файл или папку, для которой вы хотите создать символическую ссылку, в окне Nautilus.

Создайте символическую ссылку на файл или папку. Чтобы создать символическую ссылку на файл или папку, выберите файл или папку, на которую вы хотите создать ссылку. Выберите «Правка» -> «Создать ссылку». Ссылка на файл или папку добавляется в текущую папку. Вы можете определить символические ссылки по стандартной стрелке, которая появляется на всех символических ссылках. На следующем рисунке показана символическая ссылка на файл:

Перетащите символическую ссылку на рабочий стол. Значок объекта перемещается на рабочий стол.

Добавление файла или папки на рабочий стол

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

Чтобы переместить файл или папку на рабочий стол

Вы можете переместить файл или папку из окна Nautilus на рабочий стол. Чтобы переместить файл или папку на рабочий стол, выполните следующие действия:

Откройте окно Nautilus.

В области просмотра отобразите файл или папку, которые вы хотите переместить.

Перетащите файл или папку на рабочий стол. Значок файла или папки перемещается на рабочий стол. Файл или папка перемещаются в каталог вашего рабочего стола.

Либо выберите файл или папку, затем выберите «Правка» -> «Вырезать файлы». Щелкните правой кнопкой мыши любой объект на рабочем столе и выберите "Вставить файлы".

Чтобы скопировать файл или папку на рабочий стол

Вы можете скопировать файл или папку из окна Nautilus на рабочий стол. Чтобы скопировать файл или папку на рабочий стол, выполните следующие действия:

Откройте окно Nautilus.

В области просмотра отобразите файл или папку, которые вы хотите переместить.

Нажмите и удерживайте клавишу Ctrl, затем перетащите файл или папку на рабочий стол. Значок файла или папки добавляется на рабочий стол. Файл или папка копируются в каталог вашего рабочего стола.

Либо выберите файл или папку, затем выберите «Правка» -> «Копировать файлы». Щелкните правой кнопкой мыши любой объект на рабочем столе и выберите "Вставить файлы".

Создание объекта папки на рабочем столе

Чтобы создать объект папки, щелкните правой кнопкой мыши рабочий стол, чтобы открыть меню рабочего стола. Выберите «Новая папка». На рабочий стол добавляется безымянная папка. Введите имя новой папки и нажмите клавишу «Return». Папка отображается с новым именем. Новая папка находится в каталоге вашего рабочего стола.

Чтобы удалить объект с рабочего стола

Чтобы удалить объект с рабочего стола, щелкните его правой кнопкой мыши и выберите "Переместить в корзину". Либо перетащите объект в корзину.

Чтобы удалить объект с рабочего стола

Когда вы удаляете объект с рабочего стола, он не перемещается в корзину, а немедленно удаляется с рабочего стола. Пункт меню «Удалить» доступен только в том случае, если вы выбрали параметр «Включить команду удаления, которая обходит корзину» в диалоговом окне «Настройки Nautilus».

Чтобы удалить объект с рабочего стола, щелкните его правой кнопкой мыши и выберите "Удалить".

Читайте также: