Jak mogę zamknąć system, gdy nie mam SeShutdownPrivilege

20

Użytkownikom w systemie Windows można przyznawać różne uprawnienia

Uprawnienia określają rodzaj operacji systemowych, które może wykonywać konto użytkownika. Administrator przypisuje uprawnienia do kont użytkowników i grup. Uprawnienia każdego użytkownika obejmują uprawnienia przyznane użytkownikowi i grupom, do których użytkownik należy.

Obecnie jest 35 uprawnień. Niektóre z bardziej interesujących to:

  • SeSystemtimePrivilege : Wymagany do modyfikacji czasu systemowego.
  • SeTimeZonePrivilege : Wymagany do dostosowania strefy czasowej związanej z zegarem wewnętrznym komputera
  • SeBackupPrivilege : To uprawnienie powoduje, że system przyznaje całą kontrolę dostępu do odczytu każdemu plikowi, niezależnie od listy kontroli dostępu (ACL) określonej dla pliku.
  • SeCreatePagefilePrivilege : Wymagany do utworzenia pliku stronicowania.
  • SeRemoteShutdownPrivilege : Wymagany do zamknięcia systemu za pomocą żądania sieciowego.
  • SeDebugPrivilege : Wymagany do debugowania i dostosowania pamięci procesu należącego do innego konta.

Ale interesuje mnie:

  • SeShutdownPrivilege : Wymagany do zamknięcia systemu lokalnego.

Zauważyłem, że tak naprawdę nie mam tego przywileju. Z wiersza polecenia z podwyższonym poziomem uprawnień:

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

Jest to potwierdzone podczas używania Eksploratora procesów do sprawdzania tokenu zabezpieczającego podwyższonego procesu uruchomionego jako ja:

wprowadź opis zdjęcia tutaj

A jednak można zamknąć system. Czemu?

Zasady grupy mówią, że powinienem to mieć

Jeśli korzystasz z edytora snapin ( secpol.msc) edytora lokalnych zasad bezpieczeństwa , możesz zobaczyć, że powinienem mieć uprawnienia:

  • secpol.msc

    • Ustawienia bezpieczeństwa
    • Lokalne zasady
    • Przypisywanie praw użytkownika
    • Zamknij system

      wprowadź opis zdjęcia tutaj

Wyjaśnieniu przywileju:

Zamknij system

To ustawienie zabezpieczeń określa, którzy użytkownicy zalogowani lokalnie na komputerze mogą zamknąć system operacyjny za pomocą polecenia Zamknij system. Niewłaściwe korzystanie z tego prawa użytkownika może spowodować odmowę usługi.

Domyślnie na stacjach roboczych: administratorzy, operatorzy kopii zapasowych, użytkownicy.

Domyślnie na serwerach: administratorzy, operatorzy kopii zapasowych.

Domyślnie na kontrolerach domeny: administratorzy, operatorzy kopii zapasowych, operatorzy serwerów, operatorzy drukowania.

Jestem użytkownika . Czasami jestem administratorem , a innym razem nie jestem administratorem .

Być może pytanie powinno brzmieć dlaczego nie mam przywileju.

Ale w rzeczywistości nie mam tego przywileju; a jednak kiedy jestem zalogowany lokalnie, mogę zamknąć system lokalny.

Czemu?


@ Mehrdad miał dobrą odpowiedź, którą usunął, co moim zdaniem zasługuje na uwagę i odpowiada na pytanie ładnie i zwięźle:

Ci mają przywilej. Domyślnie jest jedynie wyłączone. Jeśli nie masz przywileju, nie będzie go wcale na liście .
Zauważ, że SE_PRIVILEGE_REMOVEDróżni się od braku SE_PRIVILEGE_ENABLEDlub SE_PRIVILEGE_ENABLED_BY_DEFAULT.

Czytanie bonusowe

Ian Boyd
źródło
Zasady grupy obsługiwane przez domenę zastąpią zasady grupy lokalnej. Dostosuj uprawnienia domeny zamiast uprawnień lokalnych. Po uruchomieniu „whoami / priv :, w jakiej grupie użytkowników byłeś? Jeśli zupełnie nie rozumiem, o co pytasz, edytuj swoje pytanie, ponieważ zgaduję, o co pytasz.
Ramhound
Pytam, dlaczego mogę zamknąć system, gdy mój token bezpieczeństwa nie ma uprawnień. Niezależnie od tego, czy przywilej pochodzi z komputera lokalnego czy kontrolera domeny: tak czy inaczej go nie mam.
Ian Boyd
Usunięcie wtyczki powoduje obejście wszystkich problemów związanych z przywilejami ... :) Oczywiście zależy od tego, jak ponownie się uruchomi ...
Solar Mike

Odpowiedzi:

29

Masz pozwolenie, ale jest wyłączone . To właśnie mówi PowerShell.

Aby zamknąć system, użyj funkcji Win32API o nazwie InitiateSystemShutdownlub ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0);

Uwaga: funkcje te:

Aby zamknąć komputer lokalny, wątek wywołujący musi mieć uprawnienie SE_SHUTDOWN_NAME. Domyślnie użytkownicy mogą włączyć uprawnienie SE_SHUTDOWN_NAME na komputerze, na którym są zalogowani, a administratorzy mogą włączyć uprawnienie SE_REMOTE_SHUTDOWN_NAME na komputerach zdalnych.

Jak widać, system Windows sprawdza uprawnienia do wątków (każdy wątek ma token z uprawnieniami). Jeśli zadzwonisz ExitWindowsExbez uprawnienia SE_SHUTDOWN_NAME , funkcja zakończy się niepowodzeniem z błędem:

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

Wątki, które tworzysz domyślnie, dziedziczą twoje uprawnienia; ale program może włączyć wyłączone uprawnienie, które zostało mu przyznane przy użyciu 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);

Zmiana uprawnień w tokenie mówi:

AdjustTokenPrivileges nie można dodawać ani usuwać uprawnień z tokena. Może włączyć tylko istniejące uprawnienia, które są obecnie wyłączone lub wyłączyć istniejące uprawnienia, które są obecnie włączone


Dlaczego więc to uprawnienie jest domyślnie wyłączone? Aby upewnić się, że żaden program nie może przypadkowo zamknąć systemu Windows. Wnioski powinny wyraźnie o to poprosić.

Istnieje starożytna, ale bardzo dobra książka: https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ o tych wszystkich sprawach.

użytkownik996142
źródło
Tak naprawdę kupiłem tę książkę kilka lat temu; Będę musiał ponownie go przeczytać.
Ian Boyd
Jeśli znasz C, możesz pobrać społeczność VS (która jest darmowa) i spróbować programowo wyłączyć komputer bez dostępu prywatnego. Następnie włącz to priv programowo i spróbuj ponownie). Jest to najlepszy sposób na
sprawdzenie
@ user996142 - co, wyłączając go? Chyba masz rację. :)
Jules
5

Jest tak, ponieważ użytkownik należy do grupy, która ma włączone to uprawnienie.

Aby przekonać się, które grupy:

  • Otwórz wiersz programu PowerShell (lub Command) jako administrator.
  • Uruchom secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • Wyświetl zawartość pliku OutFile.cfg w Notatniku lub podobnym i poszukaj SeShutdownPrivilegewpisu. Zobaczysz (powinieneś) kilka / kilka identyfikatorów SID dla użytkowników i / lub grup, które mają włączone to uprawnienie.

Mam na liście trzy krótkie identyfikatory SID. Krótkie identyfikatory SID to zazwyczaj konta / grupy na poziomie komputera. Na przykład jednym z nich jest S-1-5-32-545.

Za pomocą PowerShell możemy ustalić, które konto / grupa reprezentuje SID:

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

To powraca BUILTIN\Users.

Ponieważ jesteś użytkownikiem tego komputera, automatycznie jesteś członkiem tej grupy, co oznacza, że ​​możesz zamknąć komputer.

Pozostałe dwa mam S-1-5-32-544i S-1-5-32-551. Są to BUILTIN\Administratorsgrupa standardowa i BUILTIN\Backup Operatorsgrupa. Która linia z grupami, które widzisz w secpol.mscoknie dialogowym.

Ƭᴇcʜιᴇ007
źródło