Como posso desligar o sistema quando não tenho o SeShutdownPrivilege

20

Usuários do Windows podem receber vários privilégios

Privilégios determinam o tipo de operações do sistema que uma conta de usuário pode executar. Um administrador atribui privilégios a contas de usuário e grupo. Os privilégios de cada usuário incluem aqueles concedidos ao usuário e aos grupos aos quais o usuário pertence.

Atualmente existem 35 privilégios. Alguns dos mais interessantes são:

  • SeSystemtimePrivilege : Necessário para modificar a hora do sistema.
  • SeTimeZonePrivilege : necessário para ajustar o fuso horário associado ao relógio interno do computador
  • SeBackupPrivilege : esse privilégio faz com que o sistema conceda todo o controle de acesso de leitura a qualquer arquivo, independentemente da lista de controle de acesso (ACL) especificada para o arquivo.
  • SeCreatePagefilePrivilege : Necessário para criar um arquivo de paginação.
  • SeRemoteShutdownPrivilege : necessário para desligar um sistema usando uma solicitação de rede.
  • SeDebugPrivilege : necessário para depurar e ajustar a memória de um processo pertencente a outra conta.

Mas o que mais me interessa é:

  • SeShutdownPrivilege : necessário para desligar um sistema local.

Percebi que na verdade não tenho esse privilégio. Em um prompt de comando elevado:

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

Isso é confirmado ao usar o Process Explorer para examinar o token de segurança de um processo elevado em execução como eu:

insira a descrição da imagem aqui

E ainda assim eu posso desligar o sistema. Por quê?

A Diretiva de Grupo diz que eu deveria tê-lo

Se você usar o editor de diretiva de segurança local snapin ( secpol.msc), poderá ver que eu deveria ter o privilégio:

  • secpol.msc

    • Configurações de segurança
    • Políticas locais
    • Cessão de direitos do usuário
    • Desligue o sistema

      insira a descrição da imagem aqui

A explicação do privilégio:

Desligue o sistema

Essa configuração de segurança determina quais usuários com logon local no computador podem desligar o sistema operacional usando o comando Desligar. O uso indevido deste direito de usuário pode resultar em negação de serviço.

Padrão nas estações de trabalho: administradores, operadores de backup, usuários.

Padrão em servidores: administradores, operadores de backup.

Padrão nos controladores de domínio: Administradores, Operadores de backup, Operadores de servidor, Operadores de impressão.

Eu sou um usuário . Às vezes sou administrador e outras vezes não sou administrador .

Talvez a pergunta deva ser por que não tenho o privilégio.

Mas a realidade é que não tenho o privilégio; e ainda assim, quando conectado localmente, posso desligar o sistema local.

Por quê?


@Mehrdad teve uma boa resposta, que ele excluiu, o que eu acho que merece atenção e responde à pergunta de maneira bem e sucinta:

Você tem o privilégio. É apenas desativado por padrão. Se você não tivesse o privilégio, ele não seria listado .
Observe que SE_PRIVILEGE_REMOVEDé diferente de falta SE_PRIVILEGE_ENABLEDou SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Leitura de bônus

Ian Boyd
fonte
Sua política de grupo tratada pelo domínio substituirá a política de grupo local. Ajuste as permissões de domínio em vez das permissões locais. Quando você executou, "whoami / priv :, em que grupo de usuários você estava? Se eu não entendi completamente o que você está perguntando, edite sua pergunta, porque eu estou apenas tentando adivinhar o que você está perguntando.
Ramhound,
Estou perguntando por que sou capaz de desligar o sistema quando meu token de segurança não tem o privilégio. Se o privilégio vem da máquina local ou do controlador de domínio: de qualquer forma, não o tenho.
23817 Ian Boyd
Removendo o plugue de energia fica em torno de todas as questões de privilégio ... :) É claro que depende de como ele é reiniciado ...
Solar Mike

Respostas:

29

Você tem a permissão, mas está desativada . É isso que o PowerShell está lhe dizendo.

Para desligar o sistema, use a função Win32API chamada InitiateSystemShutdownou ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0);

Essas funções observam:

Para desligar o computador local, o segmento de chamada deve ter o privilégio SE_SHUTDOWN_NAME. Por padrão, os usuários podem habilitar o privilégio SE_SHUTDOWN_NAME no computador no qual estão conectados, e os administradores podem habilitar o privilégio SE_REMOTE_SHUTDOWN_NAME em computadores remotos.

Como você pode ver, o Windows verifica os privilégios de thread (qualquer thread possui token com privilégios). Se você ligar ExitWindowsExsem o privilégio SE_SHUTDOWN_NAME , a função falhará com o erro:

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

Os threads que você cria por padrão herdam seus privilégios; mas um programa pode habilitar um privilégio desabilitado que foi concedido 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);

Alterar privilégios em um token diz:

AdjustTokenPrivileges não pode adicionar ou remover privilégios do token. Ele pode habilitar privilégios existentes atualmente desabilitados ou desabilitar privilégios existentes atualmente habilitados


Então, por que esse privilégio está desativado por padrão? Para garantir que nenhum programa possa desligar o Windows por acidente. Os aplicativos devem solicitar isso explicitamente.

Existe um livro antigo, mas muito bom: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ sobre tudo isso.

user996142
fonte
Na verdade, comprei esse livro há alguns anos; vou ter que reler.
Ian Boyd
Se você conhece C, pode fazer o download da comunidade VS (que é gratuita) e tentar desligar o PC de forma programática com o out of priv. Em seguida, ative este priv programaticamente e tente novamente). É a melhor maneira de estudar qualquer coisa sobre o Windows :)
user996142
@ user996142 - o que, desligando-o? Acho que você está certo. :)
Jules
5

É porque seu usuário pertence a um grupo que tem esse privilégio ativado.

Para ver por si mesmo quais grupos:

  • Abra um prompt do PowerShell (ou Comando) como administrador.
  • Corra secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Visualize o conteúdo do OutFile.cfg no bloco de notas ou similar e procure a SeShutdownPrivilegeentrada. Você (deve) verá alguns / poucos SIDs para usuários e / ou grupos com esse privilégio ativado.

Então, eu tenho três SIDs curtos listados. SIDs curtos são geralmente contas / grupos no nível do computador. Por exemplo, um deles é S-1-5-32-545.

Usando o PowerShell, podemos determinar qual conta / grupo que o SID representa:

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

Isso retorna BUILTIN\Users.

Como você é um usuário desse computador, automaticamente é membro desse grupo, o que significa que você pode desligar o computador.

Os outros dois que eu tenho são S-1-5-32-544e S-1-5-32-551. Estes são o BUILTIN\Administratorsgrupo padrão e o BUILTIN\Backup Operatorsgrupo. Qual alinhar com os grupos que você está vendo na secpol.msccaixa de diálogo.

Ƭᴇcʜιᴇ007
fonte