¿Cómo puedo apagar el sistema cuando no tengo SeShutdownPrivilege?

20

Los usuarios de Windows pueden tener varios privilegios.

Los privilegios determinan el tipo de operaciones del sistema que puede realizar una cuenta de usuario. Un administrador asigna privilegios a cuentas de usuarios y grupos. Los privilegios de cada usuario incluyen los otorgados al usuario y a los grupos a los que pertenece el usuario.

Actualmente hay 35 privilegios. Algunos de los más interesantes son:

  • SeSystemtimePrivilege : requerido para modificar la hora del sistema.
  • SeTimeZonePrivilege : necesario para ajustar la zona horaria asociada con el reloj interno de la computadora
  • SeBackupPrivilege : este privilegio hace que el sistema otorgue todo el control de acceso de lectura a cualquier archivo, independientemente de la lista de control de acceso (ACL) especificada para el archivo.
  • SeCreatePagefilePrivilege : obligatorio para crear un archivo de paginación.
  • SeRemoteShutdownPrivilege : requerido para apagar un sistema usando una solicitud de red.
  • SeDebugPrivilege : requerido para depurar y ajustar la memoria de un proceso propiedad de otra cuenta.

Pero el que me interesa es:

  • SeShutdownPrivilege : requerido para apagar un sistema local.

Noté que en realidad no tengo este privilegio. Desde un símbolo del sistema 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
   ...

Esto se confirma cuando se utiliza Process Explorer para examinar el token de seguridad de un proceso elevado que se ejecuta como yo:

ingrese la descripción de la imagen aquí

Y aún así puedo apagar el sistema. ¿Por qué?

La Política de grupo dice que debería tenerlo

Si usa el editor de políticas de seguridad local snapin ( secpol.msc), puede ver que debería tener el privilegio:

  • secpol.msc

    • Configuraciones de seguridad
    • Políticas locales
    • Asignación de derechos de usuario
    • Apagar el sistema

      ingrese la descripción de la imagen aquí

La explicación del privilegio:

Apagar el sistema

Esta configuración de seguridad determina qué usuarios que han iniciado sesión localmente en la computadora pueden apagar el sistema operativo mediante el comando Apagar. El mal uso de este derecho de usuario puede resultar en una denegación de servicio.

Predeterminado en estaciones de trabajo: administradores, operadores de respaldo, usuarios.

Valor predeterminado en servidores: administradores, operadores de respaldo.

Valor predeterminado en controladores de dominio: administradores, operadores de respaldo, operadores de servidores, operadores de impresión.

Soy un usuario . A veces soy administrador , y otras veces no soy administrador .

Quizás la pregunta debería ser por qué no tengo el privilegio.

Pero la realidad es que no tengo el privilegio; y, sin embargo, cuando inicie sesión localmente, puedo apagar el sistema local.

¿Por qué?


@Mehrdad tuvo una buena respuesta, que eliminó, lo que creo que merece atención y responde a la pregunta de manera agradable y sucinta:

Usted tiene el privilegio. Simplemente está deshabilitado por defecto. Si no tuviera el privilegio, entonces no estaría en la lista .
Tenga en cuenta que SE_PRIVILEGE_REMOVEDes diferente de la falta SE_PRIVILEGE_ENABLEDo SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Lectura adicional

Ian Boyd
fuente
Su política de grupo manejada por el dominio anulará su política de grupo local. Ajuste los permisos de dominio en lugar de los permisos locales. Cuando ejecutaste, "whoami / priv :, ¿en qué grupo de usuarios estabas? Si no he entendido completamente lo que estás preguntando, edita tu pregunta, porque solo estoy adivinando lo que estás preguntando.
Ramhound
Me pregunto por qué puedo apagar el sistema cuando mi token de seguridad no tiene el privilegio. Si el privilegio proviene de la máquina local o del controlador de dominio: de cualquier manera, no lo tengo.
Ian Boyd
Al quitar el enchufe de alimentación se solucionan todos los problemas de privilegios ... :) Por supuesto, depende de cómo se reinicie ...
Solar Mike

Respuestas:

29

Tiene el permiso, pero está deshabilitado . Eso es lo que PowerShell te está diciendo.

Para apagar el sistema, utiliza la función Win32API llamada InitiateSystemShutdowno ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0);

Estas funciones nota:

Para apagar la computadora local, el hilo de llamada debe tener el privilegio SE_SHUTDOWN_NAME. De manera predeterminada, los usuarios pueden habilitar el privilegio SE_SHUTDOWN_NAME en la computadora en la que han iniciado sesión, y los administradores pueden habilitar el privilegio SE_REMOTE_SHUTDOWN_NAME en computadoras remotas.

Como puede ver, Windows verifica los privilegios de hilo (cualquier hilo tiene token con privilegios). Si llama ExitWindowsExsin el privilegio SE_SHUTDOWN_NAME , la función fallará con el error:

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

Los hilos que cree por defecto heredan sus privilegios; pero un programa puede habilitar un privilegio deshabilitado que se le ha otorgado 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);

Cambiar privilegios en un token dice:

AdjustTokenPrivileges no puede agregar ni quitar privilegios del token. Solo puede habilitar los privilegios existentes que están actualmente deshabilitados o deshabilitar los privilegios existentes que están habilitados actualmente


Entonces, ¿por qué este privilegio está deshabilitado de forma predeterminada? Para asegurarse de que ningún programa pueda cerrar Windows por accidente. Las aplicaciones deben solicitar esto explícitamente.

Hay un libro antiguo pero muy bueno: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ sobre todas esas cosas.

usuario996142
fuente
De hecho, compré ese libro hace un par de años; Tendré que volver a leerlo.
Ian Boyd
Si conoce C, puede descargar la comunidad VS (que es gratuita) e intentar apagar la PC mediante programación fuera de priv. Luego, habilite este priv programáticamente e intente nuevamente). Es la mejor manera de estudiar nada acerca de Windows :)
user996142
@ user996142: ¿qué, al apagarlo? Supongo que tienes razón. :)
Jules
5

Es porque su usuario pertenece a un grupo que tiene ese privilegio habilitado.

Para ver por usted mismo qué grupo (s):

  • Abra un indicador de PowerShell (o comando) como administrador.
  • Ejecutar secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Vea el contenido de OutFile.cfg en el Bloc de notas o similar, y busque la SeShutdownPrivilegeentrada. Verá (debería) ver un par / pocos SID para usuarios y / o grupos que tengan habilitado ese privilegio.

Entonces tengo tres SID cortos en la lista. Los SID cortos suelen ser cuentas / grupos a nivel de computadora. Por ejemplo, uno de ellos es S-1-5-32-545.

Usando PowerShell podemos determinar qué cuenta / grupo representa ese SID:

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

Esto vuelve BUILTIN\Users.

Como eres un usuario de esa computadora, automáticamente eres miembro de ese grupo, lo que significa que puedes apagar la computadora.

Los otros dos que tengo son S-1-5-32-544, y S-1-5-32-551. Estos son el BUILTIN\Administratorsgrupo estándar y el BUILTIN\Backup Operatorsgrupo. Que se alinean con los grupos que estás viendo en el secpol.mscdiálogo.

Ƭᴇcʜιᴇ007
fuente