Как я могу выключить систему, если у меня нет SeShutdownPrivilege

20

Пользователям в Windows могут быть предоставлены различные привилегии

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

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

  • SeSystemtimePrivilege : требуется для изменения системного времени.
  • SeTimeZonePrivilege : требуется для настройки часового пояса, связанного с внутренними часами компьютера
  • SeBackupPrivilege : эта привилегия заставляет систему предоставлять все права доступа для чтения любому файлу независимо от списка управления доступом (ACL), указанного для файла.
  • SeCreatePagefilePrivilege : требуется для создания файла подкачки.
  • SeRemoteShutdownPrivilege : требуется для выключения системы с помощью сетевого запроса.
  • SeDebugPrivilege : требуется для отладки и настройки памяти процесса, принадлежащего другой учетной записи.

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

  • SeShutdownPrivilege : требуется для выключения локальной системы.

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

>whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                  Description                               State
=============================== ========================================= ========
SeIncreaseQuotaPrivilege        Adjust memory quotas for a process        Disabled
SeSecurityPrivilege             Manage auditing and security log          Disabled
SeTakeOwnershipPrivilege        Take ownership of files or other objects  Disabled
   ...
SeShutdownPrivilege             Shut down the system                      Disabled
   ...

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

введите описание изображения здесь

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

Групповая политика говорит, что я должен иметь это

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

  • secpol.msc

    • Настройки безопасности
    • Местные Политики
    • Назначение прав пользователя
    • Выключить систему

      введите описание изображения здесь

Explaination привилегии:

Выключить систему

Этот параметр безопасности определяет, какие пользователи, которые локально вошли в систему компьютера, могут завершить работу операционной системы с помощью команды «Завершение работы». Неправильное использование этого права пользователя может привести к отказу в обслуживании.

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

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

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

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

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

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

Зачем?


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

У вас есть привилегия. Это просто отключено по умолчанию. Если бы у вас не было этой привилегии, ее бы не было в списке .
Обратите внимание, что SE_PRIVILEGE_REMOVEDотличается от отсутствия SE_PRIVILEGE_ENABLEDили SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Бонус Чтение

Ян Бойд
источник
Ваша групповая политика, обрабатываемая доменом, переопределит вашу локальную групповую политику. Настройте разрешения домена вместо локальных разрешений. Когда вы запустили «whoami / priv:», в какой группе пользователей вы были? Если я полностью не понял, о чем вы спрашиваете, отредактируйте ваш вопрос, потому что я просто догадываюсь, что вы спрашиваете.
Ramhound
Я спрашиваю, почему я могу завершить работу системы, если мой маркер безопасности не имеет этой привилегии. Приходит ли привилегия с локальной машины или контроллера домена: в любом случае, у меня ее нет.
Ян Бойд
Снятие штепсельной вилки обходит все проблемы с привилегиями ... :) Конечно, зависит от того, как она перезагружается ...
Solar Mike

Ответы:

29

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

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

ExitWindowsEx(EWX_POWEROFF, 0);

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

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

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

Error code: 1314
A required privilege is not held by the client

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

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = LookupPrivilegeValue(NULL, "SeShutdownPrivilege");
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

HANDLE processToken = OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES);
AdjustTokenPrivileges(processToken, false, tp, 0, NULL, NULL);
CloseHandle(processToken);

Изменение привилегий в токене говорит:

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


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

Есть древняя, но очень хорошая книга: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ обо всем этом.

user996142
источник
Я на самом деле купил эту книгу пару лет назад; Я должен буду перечитать его.
Ян Бойд
Если вы знаете C, вы можете скачать VS сообщество (которое бесплатно) и попытаться завершить работу компьютера программно с привилегиями. Затем включите эту привилегию программно и попробуйте снова). Это лучший способ изучить что-нибудь о Windows :)
user996142
@ user996142 - что, выключив его? Думаю, ты прав. :)
Жюль
5

Это потому, что ваш пользователь принадлежит к группе, для которой эта привилегия включена.

Чтобы увидеть для себя, какие группы:

  • Откройте PowerShell (или командную строку) от имени администратора.
  • Беги secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Просмотрите содержимое OutFile.cfg в блокноте или аналогичном и найдите SeShutdownPrivilegeзапись. Вы должны (должны) увидеть пару / несколько идентификаторов безопасности для пользователей и / или групп, для которых эта привилегия включена.

Итак, у меня есть три коротких SID. Короткие идентификаторы обычно представляют собой учетные записи / группы на уровне компьютера. Например, один из них S-1-5-32-545.

Используя PowerShell, мы можем определить, какую учетную запись / группу представляет SID:

$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-545")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value

Это возвращается BUILTIN\Users.

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

Два других у меня есть S-1-5-32-544, и S-1-5-32-551. Это стандартная BUILTIN\Administratorsгруппа и BUILTIN\Backup Operatorsгруппа. Какую линию с группами вы видите в secpol.mscдиалоге.

Ƭᴇcʜιᴇ007
источник