Sedebugprivilege отключить windows 10

Обновлено: 05.07.2024

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Учетные записи пользователей Windows обладают привилегиями, иначе - правами, которые позволяют или запрещают выполнять определенные (привилегированные) действия над всей системой, а не над отдельными объектами, например правом на вход в систему, отладку программ других пользователей, изменение системного времени и т. п. Некоторые, исключительно «мощные» привилегии (те, что позволяют выполнять важные и небезопасные действия) перечислены в табл. 7-1.

Таблица 7-1. Наиболее важные привилегии Windows

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

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

Привилегия SeBackupPrivilege

Учетной записи с привилегией Backup files and directories доступно чтение файлов, прямого доступа к которым у нее нет. Так, если пользователю Blake нужно сделать резервную копию файла, он сможет считать файл, несмотря на то, что ACL файла явно запрещает ему доступ обычными средствами. Программа резервного копирования читает файлы, вызывая функцию CreateFile с флагом FILE_FLAG_ BACKUP_SEMANTICS. В этом легко убедиться, выполнив следующие операции.

1. Войдите в систему под учетной записью с привилегией, разрешающей архивирование файлов и каталогов, например под учетной записью локального администратора или оператора архива.

2. Создайте небольшой текстовый файл Test.txt с произвольным содержимым.

3. Средством редактирования ACL добавьте в файл запись ACE, явно запрещающую вам доступ. К примеру, если имя учетной записи Blake, добавьте такую ACE: Blake (Deny All).

printf("OpenProcessToken() завершилась с ошибкой -> %d", GetLastError()); return -1;

printf("AdjustTokenPrivileges() завершилась с ошибкой ->%d", GetLastError());

printf("AdjustTokenPrivileges() выполнена успешно, но не все привилегии заданы \n");

рг^'Г("\п\пПытаемся считать %s с флагами 0x%x \ n", szFileName, dwFlags);

printf("Функция CreateFile() завершилась с ошибкой -> %d",

printf("ReadFile() завершилась с ошибкой - > %d", GetLastError());

printf("Использовано: %s <filename>", argv[0]); return;

Этот пример кода вы найдете среди других примеров в папке Secureco2\Chap-terQJ. При работе программа должна вывести в отладочном окне следующее:

Пытаемся считать Test.txt с флагами 0x80.

Функция CreateFile() завершилась с ошибкой -> 5

Пытаемся считать Test.txt с флагами 0x2000080 flags Успех, считано 15 байт.

Текст: Hello, Blake!

Как видите, первый вызов CreateFile завершился с ошибкой запрета доступа (ошибка с номером 5), а второй удался, так как мы добавили привилегию, разрешающую архивирование, и установили флаг FILE_FLAG_BACKUP_SEMANTICS.

При работе с SeBackupPrivilege я использовал дополнительный код. Однако, если у пользователя уже есть привилегии SeBackupPrivilege и SeRestorePrivilege, дополнительно ничего делать не придется. Воспользовавшись NTBackup.exe, он сможет прочитать любой файл, для этого следует сделать резервную копию в обход ACL, а затем восстановить файл в месте, где у него прав больше.

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

Привилегия SeRestorePrivilege

Несложно догадаться, что она противоположна привилегии резервного копирования. Она позволяет переписывать файлы, в том числе DLL-библиотеки и EXE-файлы, к которым обычного доступа у злоумышленника нет! Кроме того, она предоставляет право поменять владельца объекта, а владелец обладает безграничным доступом к объекту.

Привилегия SeDebugPrivilege

Кроме того, вызовом функции TerminateProcess пользователю с привилегией Debug Programs удастся завершить любой процесс в системе. Иначе говоря, такой, обычный в других отношениях, пользователь может запросто «уронить» систему, «грохнув» один их ключевых системных процессов, например Lsass.exe, диспетчер локальной безопасности (Local Security Authority, LSA).

И это только цветочки!

Отличный источник информации о внедрении кода в потоки программ - книга Джеффри Рихтера (Jeffrey Richter) «Programming Applications for Microsoft Windows» (Microsoft Press) (Рихтер Дж. Windows для профессионалов: Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows. СПб.: «Питер»; М.: «Русская Редакция», 2001).

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

Привилегия SeTcbPrivilege

Учетную запись с привилегией Act as part of the operating system [ее также часто называют Trusted Computing Base (TCB)] можно рассматривать как высоконадежный системный компонент. Она предоставляет максимум полномочий и поэтому считается самой опасной в Windows. Вот почему по умолчанию эта привилегия предоставляется только учетной записи SYSTEM.

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

Примечание Чаще всего необходимость предоставления привилегии TCB обусловлена необходимостью вызова функций типа LogonUser, которые без нее не работают. Но, начиная с Windows XP, при вызове LogonUser из приложения для входа под пользовательской учетной записью Windows эта привилегия больше не требуется. Тем не менее она нужна при входе под учетной записью Passport или когда параметр GroupSid не равен NULL

Привилегии SeAssignPrimaryTokenPrivilege и SeIncreaseQuotaPrivilege

Учетная запись с привилегиями Replace A Process Level Token и Increase Quotas позволяет получить доступ к маркеру процесса другого пользователя и создать от его имени новый процесс - так называемые атаки с подменой источника (spoofing) или с целью повышения полномочий.

Привилегия SeLoadDriverPrivilege

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

Замечу, что для загрузки драйверов самонастройки (Plug and Play) эта привилегия не нужна - их загружает системная служба Plug and Play.

Привилегия SeRemoteShutdownPrivilege

Ее действие очевидно - она позволяет удаленно завершать работу компьютера. Заметьте: как и в остальных случаях, пользователь должен обладать привилегией на целевом компьютере. А теперь представьте себе, сколько радости вы доставите злоумышленнику, предоставив эту привилегию группе Everyone (Все) на всех компьютерах сети! Никакая успешная распределенная DоS-атака (Denial of Service) не сможет создать такой кавардак!

Привилегия SeTakeOwnershipPrivilege

В Windows NT/2000/XP существует понятие владелец объекта (owner). Это лицо (или объект), пользующееся полной и нераздельной властью над всеми объектами, которыми владеет. Обладателю этой привилегии ничего не стоит «позаимствовать» объект у «законного» владельца, таким образом получив неограниченный доступ к любому объекту системы.

Примечание Bypass Traverse Checking (Обход перекрестной проверки), или SeChangeNotifyPrivilege - единственная привилегия, необходимая всем учетным записям пользователей. Она требуется для получения информации об изменениях файлов и каталогов. Впрочем, главное преимущество этой привилегии по умолчанию в том, что она позволяет избежать процедуры проверки доступа на пути к определенному объекту в любой файловой системе Windows или в реестре. Привилегия применяется при оптимизации файловой системы NTFS.

date

15.09.2017

directory

SQL Server, Безопасность, Групповые политики

comments

комментариев 5

В предыдущей статье мы рассказывали, что одной из техник защиты от извлечения паролей из памяти Windows mimikatz-like утилитами является запрет получения debug-привилегии для администраторов системы с помощью групповой политики Debug Program. Однако недавно обнаружилось, что без прав отладки (в Windows это привилегия SeDebugPrivilege), локальный администратор сервера не может установить или обновлять Microsoft SQL Server. Дело в том, что установщик SQL Server при запуске проверяет наличие привилегий SeSecurity. SeBackup и SeDebug, которые нужны ему для запуска процесса SQL Server и получения информации об успешном запуске SQL Server. Вот как это выглядит.

Во время установки SQL Server при выполнении предварительных проверок установщик спотыкается на проверке Setup account privileges.

Rule “Setup account privileges” failed


Откроем теперь отчет установки SystemConfigurationCheck_Report.htm.

:журнал установки sql server SystemConfigurationCheck_Report.htm

Как вы видите, установщик при проверке правила HasSecurityBackupAndDebugPrivilegesCheck установил, что у текущего процесса отсутствует одна из следующих привилегий:

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

(09) 2017-09-12 14:25:13 Slp: Initializing rule : Setup account privileges

(09) 2017-09-12 14:25:13 Slp: Rule is will be executed : True
(09) 2017-09-12 14:25:13 Slp: Init rule target object: Microsoft.SqlServer.Configuration.SetupExtension.FacetPrivilegeCheck
(09) 2017-09-12 14:25:13 Slp: Rule ‘HasSecurityBackupAndDebugPrivilegesCheck’ Result: Running process has SeSecurity privilege, has SeBackup privilege and does not have SeDebug privilege.
(09) 2017-09-12 14:25:13 Slp: Evaluating rule : HasSecurityBackupAndDebugPrivilegesCheck
(09) 2017-09-12 14:25:13 Slp: Rule running on machine: msk-sql10
(09) 2017-09-12 14:25:13 Slp: Rule evaluation done : Failed

Я решил поискать обходной путь получения прав SeDebugPrivilege без изменения или отключения политики Debug programs. И как оказалось, имеется довольно простой способ обхода этой политики при наличии прав локального администратора на сервере. В этом нам поможет утилита secedit, позволяющая управлять локальными политиками безопасности сервера.

Проверяем текущие привилегии:

whoami priv

whoami /priv

Как вы видите, сейчас в текущем токене пользователя отсутствует привилегия SeDebugPrivilege .

Экспортируем текущие права пользователей, настроенные групповыми политиками в текстовый файл:

secedit /export /cfg secpolicy.inf /areas USER_RIGHTS

Теперь с помощью любого тестового редактора нужно открыть на редактирование файл secpolicy.inf и в секцию [Privilege Rights] добавить строку, предоставляющую права Debug Programs группе локальных администраторов.

SeDebugPrivilege = *S-1-5-32-544

Примечание. SID группы локальных администраторов S-1-5-32-544 можно заменить на любой другой. Процесс преобразования имени группы или пользователя в SID описан в статье Как узнать SID пользователя по имени и наоборот

Сохраните файл. Теперь нужно применить новые пользовательские права:

secedit /configure /db secedit.sdb /cfg secpolicy.inf /overwrite /areas USER_RIGHTS

Примечание. Необходимо подтвердить перезапись текущих настроек.

secedit /configure /db secedit.sdb /cfg secpolicy.inf /overwrite /areas USER_RIGHTS

Теперь нужно выполнить логофф/логон и с помощью secpol.msc убедиться, что для группы локальных администраторов назначены права Debug Program. Это же подтверждает команда whoami /priv:

SeDebugPrivilege Debug programs Enabled

получение привелегии SeDebugPrivilege

Теперь можно запускать установку/обновлений SQL Server. Но стоит иметь в виду, что привилегия SeDebugPrivilege в данном случается назначается лишь временно и они будут сброшены при следующем обновлении групповых политик (но уже после logoff пользователя).

Как вы понимаете, включение запретительной политики Debug programs не является панацей от получения права SeDebugPrivilege вредоносными программами, которые уже проникли на сервер с правами локального администратора, что может скомпрометировать все учетные записи пользователей/администраторов, работящих на сервере.

Event 4673 illustration

-->

Описание события:

Это событие создается при попытке выполнения привилегированных операций системной службы.

Это событие создает, например, когда использовались привилегии SeSystemtimePrivilege, SeCreateGlobalPrivilegeили SeTcbPrivilege.

Событие отказа создается при сбое попытки вызова службы.

Примечание. Рекомендации приведены в разделе Рекомендации по мониторингу безопасности для этого события.

XML события:

Необходимые роли сервера: нет.

Минимальная версия ОС: Windows Server 2008, Windows Vista.

Версии события: 0.

Описания полей:

Тема:

  • Security ID [Type = SID]: SID учетной записи, запрашиваемой привилегированной операции. Средство просмотра событий автоматически пытается разрешить идентификатор безопасности SID и отобразить имя учетной записи. Если идентификатор безопасности разрешить не удается, в событии будут отображены исходные данные.

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

Имя учетной записи [Тип = UnicodeString]: имя учетной записи, запрашиваемой привилегированной операции.

Account Domain [Type = UnicodeString]: домен субъекта или имя компьютера. Форматы различаются и включают в себя следующее:

Пример имени домена NETBIOS: CONTOSO

Полное имя домена в нижнем регистре: contoso.local

Полное имя домена в верхнем регистре: CONTOSO.LOCAL

Для некоторых известных субъектов безопасности, таких как LOCAL SERVICE или ANONYMOUS LOGON, значение этого поля равно "NT AUTHORITY".

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

Logon ID [Type = HexInt64]: шестнадцатеричное значение, которое может помочь сопоставить это событие с недавними событиями содержащими тот же идентификатор входа, например: “4624: Учетная запись успешно вошла в систему.”

Служба:

Server [Type = UnicodeString]: содержит имя подсистемы Windows, вызываемой рутиной. Примерами подсистем являются:

Диспетчер учетной записи безопасности

Служба локальной безопасности NT / Служба проверки подлинности

Модуль Win32 SystemShutdown

Имя службы [Тип = UnicodeString] [Необязательный]: поставляет имя привилегированной подсистемной службы или функции. Например, "RESET RUNTIME LOCAL SECURITY" может быть указана службой local Security Authority, используемой для обновления базы данных местной политики безопасности, или LsaRegisterLogonProcess() может быть указана службой локальной безопасности NT, используемой для регистрации нового процесса логона.

Процесс:

Process ID [Type = Pointer]: hexadecimal Process ID процесса, который пытался вызвать привилегированную службу. ИД процесса (PID) — это число, которое операционная система использует для идентификации активного процесса уникальным образом. Узнать значение PID для определенного процесса можно, например, в диспетчере задач (вкладка "Подробности", столбец "ИД процесса"):

Task manager illustration

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

Кроме того, можно сопоставить этот ИД процесса с ИД процесса в других событиях, например в событии "4688: создан процесс" Информация о процессе\ ИД нового процесса.

Имя процесса [Type = UnicodeString]: полный путь и имя исполняемого для процесса.

Сведения о запросе на обслуживание:

  • Привилегии [Type = UnicodeString]: список запрашиваемой пользовательской привилегии. Возможные привилегии зависят от подкатегории, как использование нечувствительных привилегий аудита, так и использование конфиденциальной привилегии аудита, как показано в следующих двух таблицах: **** ****

Рекомендации по контролю безопасности

Для 4673 (S, F): была вызвана привилегированная служба.

Монитор этого события, в котором "Subject\Security ID" не является одним из этих известных принципов безопасности: LOCAL SYSTEM, NETWORK SERVICE, LOCAL SERVICE, и где "Subject\Security ID" не является административной учетной записью, которая, как ожидается, будет иметь перечисленные привилегии. ** Особенно отслеживайте события сбоя.

Если необходимо отслеживать события, связанные с определенными подсистемами Windows ("Service\Server"), например NT Local Security Authority / Authentication Service или Security Account Manager, отслеживайте это событие для соответствующего "Service\Server".

Если необходимо отслеживать события, связанные с определенными службами безопасности Windows или функциями ("Service\Service Name"), например LsaRegisterLogonProcess(), отслеживайте это событие для соответствующего "Service\Service Name".

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

Вы можете отслеживать, не находится ли "Имяпроцесса" в стандартной папке (например, не в System32 или Program Files) или в ограниченной папке (например, **** Временные файлы Интернета).

Если у вас есть заранее определенный список ограниченных подстройок или слов в именах процессов (например,"mimikatz" или** "cain.exe"), **проверьте эти подстройки в "Имяпроцесса".

Для определенного "Subject\Security ID", если имеется определенный список разрешенных привилегий, отслеживайте "Привилегии", которые он не должен использовать.****

Если у вас есть список определенных прав пользователей, которые никогда не должны использоваться или использоваться только несколькими учетных записями****(например, SeDebugPrivilege), срабатывает оповещение о таких "привилегиях".

Если у вас есть список определенных прав пользователей, для которых каждое использование должно быть оповещено или отслеживается (например, SeRemoteShutdownPrivilege), срабатывает оповещение для этих "привилегий".

В настоящее время 35 привилегий. Вот некоторые из наиболее интересных:

Но то, что меня интересует, это:

Я заметил, что на самом деле у меня нет этой привилегии. Из командной строки с повышенными правами:

Это подтверждается при использовании Process Explorer для проверки токена безопасности процесса с повышенными правами, запущенного от имени пользователя:


И все же я могу выключить систему. Зачем?

Если вы используете оснастку редактора локальной политики безопасности ( secpol.msc ), вы увидите, что у меня должна быть привилегия:


Я Пользователь. Иногда я администратор, а иногда я не администратор.

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

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

У @Mehrdad был хороший ответ, который он удалил, что, я думаю, заслуживает внимания и отвечает на вопрос красиво и лаконично:

2 ответа 2

У вас есть разрешение, но оно отключено. Вот что говорит PowerShell.

Для выключения системы вы используете функцию Win32API, которая называется InitiateSystemShutdown или ExitWindowsEx :

Примечание этих функций:

Как видите, Windows проверяет привилегии потоков (любой поток имеет токен с привилегиями). Если вы вызываете ExitWindowsEx без привилегии SE_SHUTDOWN_NAME , функция завершится с ошибкой:

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

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

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