web-dev-qa-db-fra.com

Comment puis-je arrêter le système lorsque je n'ai pas SeShutdownPrivilege

Les utilisateurs de Windows peuvent obtenir différents privilèges .

Les privilèges déterminent le type d'opérations système qu'un compte d'utilisateur peut effectuer. Un administrateur attribue des privilèges aux comptes d'utilisateurs et de groupes. Les privilèges de chaque utilisateur incluent ceux accordés à l'utilisateur et aux groupes auxquels l'utilisateur appartient.

Il y a actuellement 35 privilèges. Certains des plus intéressants sont:

  • SeSystemtimePrivilege : obligatoire pour modifier l'heure du système.
  • SeTimeZonePrivilege : obligatoire pour régler le fuseau horaire associé à l'horloge interne de l'ordinateur.
  • SeBackupPrivilege : ce privilège oblige le système à octroyer tout le contrôle d'accès en lecture à un fichier, quelle que soit la liste de contrôle d'accès spécifiée pour le fichier.
  • SeCreatePagefilePrivilege : obligatoire pour créer un fichier de pagination.
  • SeRemoteShutdownPrivilege : requis pour arrêter un système à l'aide d'une demande réseau.
  • SeDebugPrivilege : requis pour déboguer et ajuster la mémoire d'un processus appartenant à un autre compte.

Mais celui qui m'intéresse est:

  • SeShutdownPrivilege : requis pour arrêter un système local.

J'ai remarqué que je n'ai pas ce privilège . A partir d'une invite de commande élevée:

>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
   ...

Ceci est confirmé lorsque vous utilisez Process Explorer pour examiner le jeton de sécurité d'un processus élevé s'exécutant en tant que moi:

enter image description here

Et pourtant, je peux arrêter le système. Pourquoi?

La stratégie de groupe dit que je devrais l'avoir

Si vous utilisez le composant logiciel enfichable éditeur de stratégie de sécurité locale (secpol.msc), vous pouvez constater que je devrais avoir le privilège suivant:

  • secpol.msc

    • Les paramètres de sécurité
    • Politiques locales
    • Attribution des droits de l'utilisateur
    • Arrêtez le système

      enter image description here

L'explication du privilège:

Arrêtez le système

Ce paramètre de sécurité détermine quels utilisateurs connectés localement à l'ordinateur peuvent arrêter le système d'exploitation à l'aide de la commande Arrêter. L'utilisation abusive de ce droit d'utilisateur peut entraîner un déni de service.

Par défaut sur les postes de travail: Administrateurs, Opérateurs de sauvegarde, Utilisateurs.

Par défaut sur les serveurs: Administrateurs, Opérateurs de sauvegarde.

Valeur par défaut sur les contrôleurs de domaine: administrateurs, opérateurs de sauvegarde, opérateurs de serveur, opérateurs d'impression.

Je suis un utilisateur . Parfois, je suis un administrateur et d'autres fois, je suis NotAdministrator .

Peut-être que la question devrait être pourquoi ne pas j'ai le privilège.

Mais la réalité est que je n'ai pas le privilège; et pourtant, lorsque connecté localement, je peux éteindre le système local.

Pourquoi?


@Mehrdad avait une bonne réponse, qu'il a supprimée, ce qui mérite, à mon avis, une attention particulière et répond à la question de manière succincte:

Vous avez le privilège. Il est simplement désactivé par défaut. Si vous n'aviez pas le privilège alors , il ne figurerait pas du tout .
Notez que SE_PRIVILEGE_REMOVED est différent de l'absence de SE_PRIVILEGE_ENABLED ou de SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Lecture bonus

20
Ian Boyd

Vous avez la permission, mais c'est désactivé . C'est ce que PowerShell vous dit.

Pour arrêter le système, utilisez la fonction Win32API appelée InitiateSystemShutdown ou ExitWindowsEx :

ExitWindowsEx(EWX_POWEROFF, 0);

Ces fonctions notent:

Pour éteindre l'ordinateur local, le thread appelant doit disposer du privilège SE_SHUTDOWN_NAME. Par défaut, les utilisateurs peuvent activer le privilège SE_SHUTDOWN_NAME sur l'ordinateur auquel ils sont connectés et les administrateurs peuvent activer le privilège SE_REMOTE_SHUTDOWN_NAME sur des ordinateurs distants.

Comme vous pouvez le constater, Windows vérifie les privilèges de thread (tout thread a un jeton avec privilèges). Si vous appelez ExitWindowsEx sans le privilège SE_SHUTDOWN_NAME , la fonction échouera avec l'erreur suivante:

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

Les fils que vous créez par défaut héritent de vos privilèges. mais un programme peut activer un privilège désactivé qui lui a été accordé en utilisant 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);

Modification des privilèges dans un jeton dit:

AdjustTokenPrivileges ne peut pas ajouter ou supprimer des privilèges du jeton. Il peut uniquement activer les privilèges existants actuellement désactivés ou désactiver les privilèges existants actuellement activés.


Alors, pourquoi ce privilège est-il désactivé par défaut? Pour vous assurer qu'aucun programme ne peut arrêter Windows par accident. Les applications devraient demander cela explicitement.

Il existe un livre ancien mais très bon: https://www.Amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ à propos de tout ça.

29
user996142

C'est parce que votre utilisateur appartient à un groupe sur lequel ce privilège est activé.

Pour voir par vous-même quel (s) groupe (s):

  • Ouvrez une invite PowerShell (ou une commande) en tant qu’administrateur.
  • Exécutez secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Affichez le contenu de OutFile.cfg dans le Bloc-notes ou similaire, et recherchez l'entrée SeShutdownPrivilege. Vous devriez (devriez) voir quelques SID pour les utilisateurs et/ou les groupes pour lesquels ce privilège est activé.

Donc, j'ai trois courts SID énumérés. Les SID courts sont généralement des comptes/groupes au niveau de l'ordinateur. Par exemple, l'un d'eux est S-1-5-32-545.

En utilisant PowerShell, nous pouvons déterminer le compte/groupe que SID représente:

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

Ceci retourne BUILTIN\Users.

Puisque vous êtes un utilisateur de cet ordinateur, vous êtes automatiquement membre de ce groupe, ce qui signifie que vous pouvez l'éteindre.

Les deux autres que j'ai sont S-1-5-32-544 et S-1-5-32-551. Ce sont le groupe standard BUILTIN\Administrators et le groupe BUILTIN\Backup Operators. Qui s'aligne avec les groupes que vous voyez dans la boîte de dialogue secpol.msc.

5
Ƭᴇcʜιᴇ007