Як я можу вимкнути систему, коли у мене немає 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 для вивчення маркера безпеки підвищеного процесу, який працює як я:

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

І все ж я можу вимкнути систему. Чому?

Групова політика говорить, що я повинен її мати

Якщо ви користуєтесь редактором локальної політики безпеки Snapin ( 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/ про всі ці речі.


Я фактично купив цю книгу пару років тому; мені доведеться перечитати його.
Ян Бойд

Якщо ви знаєте, ви можете завантажити спільноту VS (яка безкоштовна) та спробувати вимкнути програмне забезпечення ПК із неприватних. Потім увімкніть цю програму програмно та спробуйте знову). Це найкращий спосіб вивчити що-небудь про Windows :)
user996142

@ user996142 - що, відключивши його? Здогадайтесь, ви праві. :)
Жуль

5

Це тому, що ваш користувач належить до групи, у якій включена така привілей.

Щоб побачити для себе, яку групу:

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

Тож у мене в списку три короткі SID. Короткі 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діалоговому вікні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.