Wie kann ich das System herunterfahren, wenn ich nicht über SeShutdownPrivilege verfüge?

20

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. Zu den Berechtigungen jedes Benutzers gehören die Berechtigungen, die dem Benutzer und den Gruppen gewährt wurden, denen der Benutzer angehört.

Derzeit gibt es 35 Berechtigungen. Einige der interessanteren sind:

  • SeSystemtimePrivilege : Erforderlich, um die Systemzeit zu ändern.
  • SeTimeZonePrivilege : Erforderlich, um die Zeitzone anzupassen, die der internen Uhr des Computers zugeordnet ist
  • SeBackupPrivilege : Dieses Privileg bewirkt, dass das System allen Dateien unabhängig von der für die Datei angegebenen Zugriffssteuerungsliste (Access Control List, ACL) Lesezugriffskontrolle 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.

Aber der, der mich interessiert, ist:

  • SeShutdownPrivilege : Erforderlich, um ein lokales System herunterzufahren.

Mir ist aufgefallen, dass ich dieses Privileg eigentlich nicht habe . An einer 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 den Process Explorer verwenden , um das Sicherheitstoken eines erhöhten Prozesses zu überprüfen, der unter mir ausgeführt wird:

Bildbeschreibung hier eingeben

Und doch kann ich das System herunterfahren. Warum?

Die Gruppenrichtlinie besagt, dass ich es haben sollte

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

      Bildbeschreibung hier eingeben

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. Der Missbrauch dieses Benutzerrechts kann zu einer Dienstverweigerung führen.

Standard auf Arbeitsstationen: Administratoren, Sicherungs-Operatoren, Benutzer.

Standard auf Servern: Administratoren, Sicherungsoperatoren.

Standard auf Domänencontrollern: Administratoren, Sicherungs-Operatoren, Server-Operatoren, Druck-Operatoren.

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

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

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

Warum?


@Mehrdad hatte eine gute Antwort, die er gelöscht hat, die meiner Meinung nach Beachtung verdient und die die Frage nett und prägnant beantwortet:

Du hast das Privileg. Es ist lediglich standardmäßig deaktiviert. Wenn Sie nicht das Privileg hätten , würde es überhaupt nicht aufgeführt werden .
Beachten Sie, dass oder SE_PRIVILEGE_REMOVEDfehlt .SE_PRIVILEGE_ENABLEDSE_PRIVILEGE_ENABLED_BY_DEFAULT

Bonus Lesung

Ian Boyd
quelle
Ihre Gruppenrichtlinie, die von der Domäne verwaltet wird, setzt Ihre lokale Gruppenrichtlinie außer Kraft. Passen Sie die Domänenberechtigungen anstelle der lokalen Berechtigungen an. Wenn Sie lief, "whoami / priv :, in welcher Benutzergruppe waren Sie? Wenn ich vollständig nicht verstanden habe, was Sie fragen, bearbeiten Sie Ihre Frage, weil ich nur eine wilde Vermutung aufnehme, was Sie fragen.
Ramhound
Ich frage, warum ich das System herunterfahren kann, wenn mein Sicherheitstoken nicht berechtigt ist. Egal, ob das Privileg vom lokalen Computer oder vom Domänencontroller stammt: So oder so habe ich es nicht.
Ian Boyd
Das Entfernen des Netzsteckers umgeht alle Rechteprobleme ... :) Natürlich hängt es davon ab, wie es neu gestartet wird ...
Solar Mike

Antworten:

29

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

Zum Herunterfahren des Systems verwenden Sie die Win32API-Funktion InitiateSystemShutdownoder ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0);

Diese Funktionen beachten:

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

Wie Sie sehen, überprüft Windows Thread- Berechtigungen (jeder Thread verfügt über Token mit Berechtigungen). Wenn Sie ExitWindowsExohne das Zugriffsrecht SE_SHUTDOWN_NAME aufrufen, schlägt die Funktion mit dem folgenden Fehler fehl:

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

Threads, die Sie standardmäßig erstellen, erben Ihre Berechtigungen. Ein Programm kann jedoch ein deaktiviertes Privileg aktivieren, das ihm gewährt wurde mit 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);

Das Ändern von Berechtigungen in einem Token lautet:

AdjustTokenPrivileges Berechtigungen können nicht zum Token hinzugefügt oder daraus entfernt werden. Es können nur vorhandene Berechtigungen aktiviert werden, die derzeit deaktiviert sind, oder vorhandene Berechtigungen deaktiviert werden, die derzeit aktiviert sind


Warum ist dieses Privileg standardmäßig deaktiviert? So stellen Sie sicher, dass kein Programm Windows versehentlich herunterfahren kann. Bewerbungen sollten dies ausdrücklich verlangen.

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

user996142
quelle
Ich habe dieses Buch tatsächlich vor ein paar Jahren gekauft. Ich muss es noch einmal lesen.
Ian Boyd
Wenn Sie C kennen, können Sie die kostenlose VS-Community herunterladen und versuchen, den PC programmgesteuert mit out of priv herunterzufahren. Aktivieren Sie dies dann programmgesteuert und versuchen Sie es erneut. Es ist der beste Weg, um etwas über Windows zu lernen :)
user996142
@ user996142 - was, indem man es herunterfährt? Vermutlich hast du recht. :)
Jules
5

Dies liegt daran, dass Ihr Benutzer einer Gruppe angehört, für die dieses Recht aktiviert ist.

Um selbst zu sehen, welche Gruppe (n):

  • Öffnen Sie eine PowerShell-Eingabeaufforderung (oder eine Eingabeaufforderung) als Administrator.
  • Rennen secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Zeigen Sie den Inhalt von OutFile.cfg im Editor oder ähnlich an und suchen Sie nach dem SeShutdownPrivilegeEintrag. Sie werden (sollten) einige SIDs für Benutzer und / oder Gruppen sehen, für die diese Berechtigung aktiviert ist.

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

Mithilfe von PowerShell können wir ermitteln, für welches Konto / welche Gruppe die SID steht:

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

Dies kehrt zurück BUILTIN\Users.

Da Sie ein Benutzer auf diesem Computer sind, sind Sie automatisch Mitglied dieser Gruppe. Dies bedeutet, dass Sie den Computer herunterfahren können.

Die anderen zwei, 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 Aufstellung mit den Gruppen, die Sie im secpol.mscDialogfeld sehen.

ƬᴇcƬᴇιʜ007
quelle