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

20

Les utilisateurs de Windows peuvent bénéficier de divers privilèges

Les privilèges déterminent le type d'opérations système qu'un compte 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 : requis pour modifier l'heure du système.
  • SeTimeZonePrivilege : requis pour ajuster le fuseau horaire associé à l'horloge interne de l'ordinateur
  • SeBackupPrivilege : ce privilège oblige le système à accorder tout contrôle d'accès en lecture à n'importe quel fichier, quelle que soit la liste de contrôle d'accès (ACL) spécifiée pour le fichier.
  • SeCreatePagefilePrivilege : requis pour créer un fichier d' échange .
  • 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.

Je remarque que je ne pas vraiment avoir ce privilège. À 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
   ...

Cela est confirmé lors de l'utilisation de Process Explorer pour examiner le jeton de sécurité d'un processus élevé s'exécutant en tant que moi:

entrez la description de l'image ici

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 voir que je devrais avoir le privilège:

  • secpol.msc

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

      entrez la description de l'image ici

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. Une mauvaise utilisation 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.

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 administrateur et parfois je ne suis pas administrateur .

La question devrait peut-être être de savoir pourquoi je n'ai pas le privilège.

Mais la réalité est que je n'ai pas le privilège; et pourtant, une fois connecté localement, je peux arrêter le système local.

Pourquoi?


@Mehrdad a eu une bonne réponse, qu'il a supprimée, qui, je pense, mérite l'attention et répond à la question de manière claire et succincte:

Vous avez le privilège. Il est simplement désactivé par défaut. Si vous n'aviez pas le privilège, il ne serait pas du tout répertorié .
Notez que SE_PRIVILEGE_REMOVEDc'est différent de manquer SE_PRIVILEGE_ENABLEDou SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Lecture bonus

Ian Boyd
la source
Votre stratégie de groupe gérée par le domaine remplacera votre stratégie de groupe locale. Ajustez les autorisations de domaine au lieu des autorisations locales. Lorsque vous avez couru, "whoami / priv :, dans quel groupe d'utilisateurs étiez-vous? Si je n'ai pas complètement compris ce que vous demandez, modifiez votre question, car je ne fais que deviner ce que vous demandez.
Ramhound
Je demande pourquoi je peux arrêter le système lorsque mon jeton de sécurité n'a pas le privilège. Que le privilège vienne de la machine locale ou du contrôleur de domaine: de toute façon je ne l'ai pas.
Ian Boyd
Le retrait de la fiche d'alimentation contourne tous les problèmes de privilège ... :) Bien sûr, cela dépend de la façon dont il redémarre ...
Solar Mike

Réponses:

29

Vous avez l'autorisation, mais elle est désactivée . C'est ce que PowerShell vous dit.

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

ExitWindowsEx(EWX_POWEROFF, 0);

Ces fonctions notent:

Pour arrêter 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 les ordinateurs distants.

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

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

Les threads 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);

Changer les privilèges dans un jeton dit:

AdjustTokenPrivileges ne peut pas ajouter ou supprimer des privilèges du jeton. Il ne peut activer que les privilèges existants qui sont actuellement désactivés ou désactiver les privilèges existants qui sont 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 candidatures doivent le demander explicitement.

Il y a un livre ancien mais très bon: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ sur tout ça.

user996142
la source
J'ai acheté ce livre il y a quelques années; je vais devoir la relire.
Ian Boyd
Si vous connaissez C, vous pouvez télécharger la communauté VS (qui est gratuite) et essayer d'arrêter le PC par programmation avec out of priv. Ensuite, activez ce privilège par programme et réessayez). C'est le meilleur moyen d'étudier quoi que ce soit sur Windows :)
user996142
@ user996142 - quoi, en le fermant? Je suppose que tu as raison. :)
Jules
5

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

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

  • Ouvrez une invite PowerShell (ou commande) en tant qu'administrateur.
  • Courez secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Affichez le contenu d'OutFile.cfg dans le Bloc-notes ou similaire, et recherchez l' SeShutdownPrivilegeentrée. Vous verrez (devriez) voir quelques / quelques SID pour les utilisateurs et / ou les groupes qui ont ce privilège activé.

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

En utilisant PowerShell, nous pouvons déterminer quel 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

Cela revient BUILTIN\Users.

Étant donné que vous êtes un utilisateur de cet ordinateur, vous êtes automatiquement membre de ce groupe, ce qui signifie que vous pouvez arrêter l'ordinateur.

Les deux autres que j'ai sont S-1-5-32-544, et S-1-5-32-551. Ce sont le BUILTIN\Administratorsgroupe standard et le BUILTIN\Backup Operatorsgroupe. Quel alignement avec les groupes que vous voyez dans la secpol.mscboîte de dialogue.

Ƭᴇcʜιᴇ007
la source