Wie kann ich das System herunterfahren, wenn ich keine SeShutdownPrivilege habe?

2960
Ian Boyd

Benutzern in Windows können verschiedene Berechtigungen gewährt werden

Berechtigungen bestimmen die Art der Systemvorgänge, die ein Benutzerkonto ausführen kann. Ein Administrator weist Benutzer- und Gruppenkonten Berechtigungen zu. Die Berechtigungen jedes Benutzers umfassen diejenigen, die dem Benutzer und den Gruppen, zu denen der Benutzer gehört, gewährt werden.

Derzeit gibt es 35 Privilegien. Einige der interessanteren sind:

  • SeSystemtimePrivilege : Erforderlich, um die Systemzeit zu ändern.
  • SeTimeZonePrivilege : Erforderlich, um die Zeitzone der internen Uhr des Computers anzupassen
  • SeBackupPrivilege : Dieses Privileg bewirkt, dass das System unabhängig von der für die Datei angegebenen Zugriffssteuerungsliste (Access Control List, ACL) die gesamte Lesezugriffssteuerung auf alle Dateien gewährt.
  • SeCreatePagefilePrivilege : Erforderlich zum Erstellen einer Auslagerungsdatei.
  • SeRemoteShutdownPrivilege : Erforderlich, um ein System mithilfe einer Netzwerkanforderung herunterzufahren.
  • SeDebugPrivilege : Erforderlich zum Debuggen und Anpassen des Speichers eines Prozesses, der einem anderen Konto gehört.

Ich interessiere mich aber für:

  • SeShutdownPrivilege : Erforderlich, um ein lokales System herunterzufahren.

Mir ist aufgefallen, dass ich dieses Privileg eigentlich nicht habe . Über eine Eingabeaufforderung mit erhöhten Rechten:

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

Dies wird bestätigt, wenn Sie Process Explorer verwenden, um das Sicherheitstoken eines Prozesses zu prüfen, der als ich ausgeführt wird:

Wie kann ich das System herunterfahren, wenn ich keine SeShutdownPrivilege habe?

Und doch kann ich das System herunterfahren. Warum?

Die Gruppenrichtlinie sagt, ich sollte es haben

Wenn Sie die lokalen Sicherheitsrichtlinien - Editor - Snap (verwenden secpol.msc), können Sie sehen, dass ich sollte das Privileg haben:

  • secpol.msc

    • Sicherheitseinstellungen
    • Lokale Richtlinien
    • Zuweisung von Benutzerrechten
    • Fahren Sie das System herunter

      Wie kann ich das System herunterfahren, wenn ich keine SeShutdownPrivilege habe?

Die Erklärung des Privilegs:

Fahren Sie das System herunter

Diese Sicherheitseinstellung bestimmt, welche Benutzer, die lokal am Computer angemeldet sind, das Betriebssystem mit dem Befehl Herunterfahren herunterfahren können. Missbrauch dieses Benutzerrechts kann zu einer Dienstverweigerung führen.

Standardeinstellung auf Arbeitsstationen: Administratoren, Sicherungsoperatoren, Benutzer.

Standardeinstellung auf Servern: Administratoren, Sicherungsoperatoren.

Standardeinstellung für Domänencontroller: Administratoren, Sicherungsoperatoren, Serveroperatoren, Druckoperatoren.

Ich bin ein Benutzer . Manchmal bin ich Administrator und manchmal NotAdministrator .

Vielleicht sollte die Frage sein, warum ich nicht das Privileg habe.

Aber die Realität ist, dass ich kein Privileg habe; und wenn ich lokal angemeldet bin, kann ich das lokale System herunterfahren.

Warum?


@Mehrdad hatte eine gute Antwort, die er gelöscht hat, was meiner Meinung nach Aufmerksamkeit verdient und beantwortet die Frage kurz und bündig:

Du hast das Privileg. Es ist lediglich standardmäßig deaktiviert. Wenn Sie das Privileg nicht hätten , wäre es überhaupt nicht aufgeführt .
Beachten Sie, dass SE_PRIVILEGE_REMOVEDes anders ist als fehlendes SE_PRIVILEGE_ENABLEDoder SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Bonus lesen

20
Ihre Gruppenrichtlinie, die von der Domäne verwaltet wird, überschreibt Ihre lokale Gruppenrichtlinie. Passen Sie die Domänenberechtigungen anstelle der lokalen Berechtigungen an. Wenn Sie "whoami / priv:" gelaufen sind, in welcher Benutzergruppe waren Sie? Wenn ich Ihre Fragen nicht vollständig verstanden habe, bearbeiten Sie Ihre Frage, da ich nur vermute, was Sie fragen. Ramhound vor 6 Jahren 0
Ich frage, warum ich das System herunterfahren kann, wenn mein Sicherheitstoken nicht über das Privileg verfügt. Ob das Privileg vom lokalen Computer oder vom Domänencontroller stammt: So oder so habe ich es nicht. Ian Boyd vor 6 Jahren 0
Das Entfernen des Netzsteckers umgeht alle Privilegienprobleme ... :) Natürlich hängt es davon ab, wie es neu gestartet wird ... Solar Mike vor 6 Jahren 0

2 Antworten auf die Frage

29
user996142

Sie haben die Berechtigung, die jedoch deaktiviert ist . Das sagt Ihnen PowerShell.

Um das System herunterzufahren, verwenden Sie die aufgerufene Win32API-Funktion InitiateSystemShutdownoder ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0); 

Diese Funktionen beachten:

Um den lokalen Computer herunterzufahren, muss der aufrufende Thread die Berechtigung SE_SHUTDOWN_NAME besitzen. Standardmäßig können Benutzer das SE_SHUTDOWN_NAME- Privileg auf dem Computer aktivieren, auf dem sie angemeldet sind, und Administratoren können das SE_REMOTE_SHUTDOWN_NAME-Privileg auf Remotecomputern aktivieren.

Wie Sie sehen, überprüft Windows die Thread- Berechtigungen (jeder Thread hat ein Token mit Berechtigungen). Wenn Sie ExitWindowsExohne die Berechtigung SE_SHUTDOWN_NAME aufrufen, schlägt die Funktion mit dem Fehler fehl:

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

Von Ihnen standardmäßig erstellte Threads erben Ihre Berechtigungen. Ein Programm kann jedoch ein deaktiviertes Privileg aktivieren, das mit AdjustTokenPrivilegesfolgenden Berechtigungen erteilt wurde :

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

Das Ändern von Berechtigungen in einem Token lautet:

AdjustTokenPrivileges Sie können dem Token keine Berechtigungen hinzufügen oder entfernen . Es können nur vorhandene Berechtigungen aktiviert werden, die derzeit deaktiviert sind, oder vorhandene Berechtigungen, die derzeit aktiviert sind


Warum ist dieses Privileg standardmäßig deaktiviert? Um sicherzustellen, dass kein Programm Windows versehentlich herunterfahren kann. Anwendungen sollten dies explizit verlangen.

Es gibt ein altes, aber sehr gutes Buch: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ über all das.

Ich habe dieses Buch vor ein paar Jahren gekauft; Ich muss es noch einmal lesen. Ian Boyd vor 6 Jahren 0
Wenn Sie C kennen, können Sie VS Community (die kostenlos ist) herunterladen und versuchen, den PC programmgesteuert ohne Privilegien herunterzufahren. Aktivieren Sie dann dieses Privileg programmatisch und versuchen Sie es erneut. Es ist der beste Weg, etwas über Windows zu lernen :) user996142 vor 6 Jahren 0
@ user996142 - was, indem du es herunterfährst? Ich denke, du hast recht. :) Jules vor 6 Jahren 0
5
Ƭᴇcʜιᴇ007

Dies liegt daran, dass Ihr Benutzer zu einer Gruppe gehört, für die diese Berechtigung aktiviert ist.

Um zu sehen, welche Gruppe (n):

  • Öffnen Sie eine PowerShell- (oder Befehls-) Eingabeaufforderung als Admin.
  • Laufen secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Zeigen Sie den Inhalt von OutFile.cfg in Notepad oder in ähnlichen Kategorien an und suchen Sie nach dem SeShutdownPrivilegeEintrag. Sie werden (sollten) ein paar SIDs für Benutzer und / oder Gruppen sehen, für die diese Berechtigung aktiviert ist.

Ich habe also drei kurze SIDs aufgelistet. Kurze SIDs sind normalerweise Konten / Gruppen auf Computerebene. Zum Beispiel ist einer von ihnen S-1-5-32-545.

Mit PowerShell können wir ermitteln, für welches Konto bzw. welche Gruppe diese SID steht:

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

Das kehrt zurück BUILTIN\Users.

Da Sie ein Benutzer dieses Computers sind, sind Sie automatisch Mitglied dieser Gruppe, dh Sie können den Computer herunterfahren.

Die anderen beiden, die ich habe, sind S-1-5-32-544und S-1-5-32-551. Dies sind die Standardgruppe BUILTIN\Administratorsund die BUILTIN\Backup OperatorsGruppe. Welche Zeile steht mit den Gruppen, die Sie im secpol.mscDialog sehen.