Come posso spegnere il sistema quando non ho SeShutdownPrivilege


20

Agli utenti di Windows possono essere concessi vari privilegi

I privilegi determinano il tipo di operazioni di sistema che un account utente può eseguire. Un amministratore assegna i privilegi agli account utente e di gruppo. I privilegi di ciascun utente includono quelli concessi all'utente e ai gruppi a cui appartiene l'utente.

Attualmente ci sono 35 privilegi. Alcuni dei più interessanti sono:

  • SeSystemtimePrivilege : richiesto per modificare l'ora di sistema.
  • SeTimeZonePrivilege : richiesto per regolare il fuso orario associato all'orologio interno del computer
  • SeBackupPrivilege : questo privilegio fa sì che il sistema conceda il controllo di accesso in lettura a qualsiasi file, indipendentemente dall'elenco di controllo di accesso (ACL) specificato per il file.
  • SeCreatePagefilePrivilege : richiesto per creare un file di paging.
  • SeRemoteShutdownPrivilege : necessario per arrestare un sistema utilizzando una richiesta di rete.
  • SeDebugPrivilege : richiesto per eseguire il debug e regolare la memoria di un processo di proprietà di un altro account.

Ma quello che mi interessa è:

  • SeShutdownPrivilege : richiesto per arrestare un sistema locale.

Ho notato che in realtà non ho questo privilegio. Da un prompt dei comandi elevato:

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

Ciò è confermato quando si utilizza Process Explorer per esaminare il token di sicurezza di un processo elevato in esecuzione come me:

inserisci qui la descrizione dell'immagine

Eppure posso spegnere il sistema. Perché?

La politica di gruppo dice che dovrei averlo

Se usi lo snapin dell'editor dei criteri di sicurezza locali ( secpol.msc), puoi vedere che dovrei avere il privilegio:

  • secpol.msc

    • Impostazioni di sicurezza
    • Politiche locali
    • Assegnazione dei diritti dell'utente
    • Spegni il sistema

      inserisci qui la descrizione dell'immagine

La spiegazione del privilegio:

Spegni il sistema

Questa impostazione di sicurezza determina quali utenti che sono connessi localmente al computer possono arrestare il sistema operativo usando il comando Shut Down. L'uso improprio di questo diritto dell'utente può comportare una negazione del servizio.

Impostazione predefinita su workstation: amministratori, operatori di backup, utenti.

Impostazione predefinita sui server: amministratori, operatori di backup.

Predefinito sui controller di dominio: amministratori, operatori di backup, operatori server, operatori di stampa.

Sono un utente . A volte sono un amministratore , altre volte non sono un amministratore .

Forse la domanda dovrebbe essere: perché non ho il privilegio.

Ma la realtà è che non ho il privilegio; eppure, quando accedo localmente, posso spegnere il sistema locale.

Perché?


@Mehrdad ha avuto una buona risposta, che ha cancellato, che credo meriti attenzione e risponda alla domanda in modo corretto e conciso:

Si ha il privilegio. È semplicemente disabilitato per impostazione predefinita. Se non avessi il privilegio , non verrebbe elencato affatto .
Si noti che SE_PRIVILEGE_REMOVEDè diverso dalla mancanza SE_PRIVILEGE_ENABLEDo SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Lettura bonus


I criteri di gruppo gestiti dal dominio sostituiranno i criteri di gruppo locali. Regola le autorizzazioni del dominio anziché le autorizzazioni locali. Quando hai eseguito "whoami / priv :, in quale gruppo di utenti eri? Se non ho completamente capito cosa stai chiedendo, modifica la tua domanda, perché sto solo indovinando ciò che stai chiedendo.
Ramhound

Sto chiedendo perché sono in grado di arrestare il sistema quando il mio token di sicurezza non ha il privilegio. Se il privilegio proviene dal computer locale o dal controller di dominio: in entrambi i casi non ce l'ho.
Ian Boyd,

La rimozione della spina di alimentazione elimina tutti i problemi relativi ai privilegi ... :) Naturalmente dipende da come si riavvia ...
Solar Mike,

Risposte:


29

Hai l'autorizzazione, ma è disabilitata . Questo è ciò che ti dice PowerShell.

Per spegnere il sistema si utilizza la funzione Win32API chiamata InitiateSystemShutdowno ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0);

Queste funzioni notano:

Per arrestare il computer locale, il thread chiamante deve disporre del privilegio SE_SHUTDOWN_NAME. Per impostazione predefinita, gli utenti possono abilitare il privilegio SE_SHUTDOWN_NAME sul computer a cui hanno effettuato l'accesso e gli amministratori possono abilitare il privilegio SE_REMOTE_SHUTDOWN_NAME su computer remoti.

Come puoi vedere, Windows controlla i privilegi di thread (qualsiasi thread ha token con privilegi). Se chiami ExitWindowsExsenza il privilegio SE_SHUTDOWN_NAME , la funzione fallirà con l'errore:

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

I thread creati per impostazione predefinita ereditano i tuoi privilegi; ma un programma può abilitare un privilegio disabilitato che gli è stato concesso usando 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);

Cambiare i privilegi in un token dice:

AdjustTokenPrivileges impossibile aggiungere o rimuovere i privilegi dal token. Può solo abilitare i privilegi esistenti che sono attualmente disabilitati o disabilitare i privilegi esistenti che sono attualmente abilitati


Quindi, perché questo privilegio è disabilitato per impostazione predefinita? Per assicurarsi che nessun programma possa arrestare Windows per errore. Le domande dovrebbero richiederlo esplicitamente.

C'è un libro antico ma molto buono: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ su tutte queste cose.


In realtà ho comprato quel libro un paio di anni fa; dovrò rileggerlo.
Ian Boyd,

Se conosci C, puoi scaricare la community VS (che è gratuita) e provare a spegnere il PC a livello di codice con out of priv. Quindi, abilitare questo priv a livello di codice e riprovare). È il modo migliore per studiare qualcosa su Windows :)
user996142

@ user996142 - cosa, spegnendolo? Immagino che tu abbia ragione. :)
Jules,

5

È perché il tuo utente appartiene a un gruppo che ha quel privilegio abilitato.

Per vedere di persona quale gruppo (i):

  • Aprire un prompt di PowerShell (o comando) come amministratore.
  • Corri secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Visualizza il contenuto di OutFile.cfg in Blocco note o simili e cerca la SeShutdownPrivilegevoce. Vedrai (dovresti) un paio / alcuni SID per utenti e / o gruppi che hanno quel privilegio abilitato.

Quindi ho tre brevi SID elencati. I SID brevi sono generalmente account / gruppi a livello di computer. Ad esempio, uno di questi è S-1-5-32-545.

Utilizzando PowerShell possiamo determinare quale account / gruppo rappresenta SID:

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

Questo ritorna BUILTIN\Users.

Dato che sei un utente su quel computer, sei automaticamente un membro di quel gruppo, il che significa che puoi spegnere il computer.

Le altre due che ho sono S-1-5-32-544e S-1-5-32-551. Questi sono il BUILTIN\Administratorsgruppo standard e il BUILTIN\Backup Operatorsgruppo. In linea con i gruppi che vedi nella secpol.mscfinestra di dialogo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.