我已經開始越來越多地了解 Windows 訪問令牌和權限調整,但隨著我的進步,我越來越困惑。我在這里提出一些問題,以便更好地理解 Windows 的這種安全機制。
在 Windows 中,當我為非管理員用戶運行 whoami /priv 命令時,它給了我以下結果:
C:\Users\light>whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ==================================== ========
SeShutdownPrivilege Shut down the system Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeUndockPrivilege Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
SeTimeZonePrivilege Change the time zone Disabled
但是,當我使用管理員帳戶運行此命令時,它會給我一長串特權名稱,其中大多數都被禁用。現在我的第一個問題是:為什么其中一些權限被禁用?當權限被禁用時,是否意味著用戶無法使用該權限?
我的第二個問題:我應該如何準確地修改訪問令牌以獲得 Se_Debug 權限?我執行以下步驟,但我的應用程式沒有修改令牌:
- 呼叫 OpenProcessToken 以打開訪問令牌查詢的行程。
- 初始化 TOKEN_PRIVILEGES 用于查詢訪問令牌。
- 呼叫 LookupPrivilegeValue 來檢查權限
- 呼叫 AdjustTokenPrivileges 來調整該權限
我的源代碼:
#include <Windows.h>
#include <iostream>
#pragma comment(lib, "advapi32.lib")
class privilege
{
private:
BOOL m_ok;
LUID m_luid;
LUID m_privilege_id;
HANDLE m_handle_token;
BOOL m_has_priviliege;
PRIVILEGE_SET m_privilege_set;
TOKEN_PRIVILEGES m_token_privilege;
public:
BOOL check(LPCWSTR arg_privilege)
{
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &m_handle_token))
m_ok = LookupPrivilegeValue(NULL, arg_privilege, &m_privilege_id);
if (m_ok)
{
m_privilege_set.PrivilegeCount = 1;
m_privilege_set.Control = PRIVILEGE_SET_ALL_NECESSARY;
m_privilege_set.Privilege[0].Luid = m_privilege_id;
m_privilege_set.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
m_ok = PrivilegeCheck(m_handle_token, &m_privilege_set, &m_has_priviliege);
}
if (m_ok && !m_has_priviliege)
return FALSE;
else
return TRUE;
}
BOOL set(HANDLE arg_token, LPCTSTR arg_privilege, BOOL arg_enable_privilege)
{
if (!LookupPrivilegeValue(NULL, arg_privilege, &m_luid))
{
printf("LookupPrivilegeValue error: %u\n", GetLastError());
return FALSE;
}
m_token_privilege.PrivilegeCount = 1;
m_token_privilege.Privileges[0].Luid = m_luid;
if (arg_enable_privilege)
m_token_privilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
m_token_privilege.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(arg_token, FALSE, &m_token_privilege, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
};
int main(int argc, wchar_t* argv)
{
HANDLE process_handle;
PHANDLE token_handle = NULL;
privilege o_privilege;
BOOL open_token_status = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, token_handle);
if (open_token_status != NULL)
{
std::wcout << L"OpenProcessToken has been failed." << std::endl;
return EXIT_FAILURE;
}
else
{
std::wcout << L"Process has Backup privilege: " << std::boolalpha << o_privilege.check(L"SE_BACKUP_NAME") << std::endl;
BOOL privilege_adjust_status = o_privilege.set(token_handle, L"SeBackupPrivilege", TRUE);
std::wcout << L"Process has Backup privilege: " << std::boolalpha << o_privilege.check(L"SE_BACKUP_NAME") << std::endl;
return privilege_adjust_status;
}
return 0;
}
但是這個程式無法為行程設定備份權限。有人可以逐步解釋Windows OS中的令牌列舉和調整嗎?
此外,我對模仿概念有一個真正的問題。為什么我們在 Windows 作業系統中需要這樣的東西?
uj5u.com熱心網友回復:
我應該如何準確地修改訪問令牌以獲得 Se_Debug 權限?
根據更改令牌中的權限,
您可以通過兩種方式更改主令牌或模擬令牌中的權限:
- 使用 AdjustTokenPrivileges 函式啟用或禁用特權。
- 使用 CreateRestrictedToken 函式限制或洗掉權限。
根據將權限分配給帳戶,將權限分配給用戶帳戶
您可以使用本地安全策略 Microsoft 管理控制臺 (MMC) 管理單元 (Secpol.msc) 或呼叫LsaAddAccountRights函式為帳戶分配權限。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460357.html
