訪問令牌(Access tokens)
訪問令牌是描述進程或線程的安全上下文的對象。令牌中的信息包括與進程或線程關聯的用戶帳戶的標識和特權信息。當用戶登錄時,系統通過將用戶密碼與安全數據庫(如域認證中的NTDS或本地認證中的SAM文件)中存儲的信息進行比較來驗證用戶密碼。如果密碼經過驗證,則系統將生成訪問令牌。代表該用戶執行的每個進程都有此訪問令牌的副本。(通常我們在輸入密碼登陸進入Windows界面時就是一個生成訪問令牌的過程)當線程與安全對象進行交互或嘗試執行需要特權的系統任務時,系統使用訪問令牌來標識用戶。訪問令牌包含以下信息:
Access Token的組成
- 用戶賬戶的安全標識符(SID)
- 用戶所屬的組的SID
- 用於標識當前登陸會話的登陸SID
- 用戶或用戶組所擁有的權限列表
- 所有者SID
- 主要組的SID
- 訪問控制列表
- 訪問令牌的來源
- 令牌是主要令牌還是模擬令牌
- 限制SID的可選列表
- 目前的模擬等級
- 其他統計的數據
Windows Access Token分兩種:
訪問令牌(Access Token)是Windows操作系統用描述進程或者線程安全上下文的一個對象。
Windows下有兩種類型的Token令牌:授權令牌和模擬令牌。
-
授權令牌(Delegation Token)
-
也叫主令牌,是由windows內核創建並分配給進程的默認訪問令牌,每一個進程有一個主令牌,它描述了與當前進程相關的用戶帳戶的安全上下文。用於交互式登錄(如rdp登錄訪問)。
-
模擬令牌(Impersonation Token)
-
所在進程的主令牌會自動附加到當前的線程上,作為線程的安全上下文。而線程可以運行在另一個非主令牌的訪問令牌下執行,而這個令牌被稱為模擬令牌。用於非交互式的會話(利用WMI進行遠程訪問)。
主令牌與進程相關;模擬令牌與模擬令牌的線程相關。
注:兩種令牌會在系統重啟或者關機后才會全部清除,不然將會一直在內存中存留。也就是說,如果機器不關機或者重啟的話,就會存在散落的令牌。在系統注銷后,具有授權令牌的用戶會變為模擬令牌Impersonation Token,但依然有效。默認情況下,當前用戶只能看到當前用戶自己和比自己權限低的所有訪問令牌。
此外,線程可以模擬客戶端帳戶。模擬允許線程使用客戶端的安全上下文與安全對象進行交互。模擬客戶端的線程同時具有主令牌和模擬令牌。(出現這種情況是因為服務操作是在寄宿進程中執行,在默認的情況下,服務操作是否具有足夠的權限訪問某個資源(比如文件)取決於執行寄宿進程Windows帳號的權限設置,而與作為客戶端的Windows帳號無關。在有多情況下,我們希望服務操作執行在基於客戶端的安全上下文中執行,以解決執行服務進行的帳號權限不足的問題。簡單來說就是我們希望不同客戶端來訪問服務時,服務可以模擬客戶端的身份去訪問服務,而不是用自己的主進程Token身份去訪問。)
Windows Access Token的產生過程
- 使用憑據(用戶密碼)進行認證
- 當前登錄會話(Session)的創建
- Windows此時會返回用戶sid和用戶組sid
- LSA(Local Security Authority)創建一個Token
- 依據該token創建進程、線程(如果CreaetProcess時自己指定了 Token, LSA會用該Token, 否則就繼承父進程Token進行運行)
特權 (Privilege)
系統有一個帳戶數據庫,存儲了用戶或用戶群的特權。當用戶登錄后,系統產生一個訪問令牌(access token)包含了用戶的特權清單,這包含用戶所在群的特權。注意特權僅限於本地計算機,域帳戶在不同計算機上有不同特權。
當用戶試圖執行一個特權操作,系統檢查用戶的訪問令牌以確定使用是否具有必要的特權。調用GetTokenInformation函數可以檢查特權。
另外,還有令牌中的權限列表,權限與對象訪問無關,所以與安全描述符,SID等無關。當線程執行一些管理相關的操作時,系統會檢查該線程的令牌中是否含有特定的權限,如果有,則允許線程執行該操作,否則拒絕。
命令行獲取訪問令牌的信息
獲取 當前登錄的用戶的訪問令牌信息:whoami /all
WHOAMI /UPN //用戶主體 (User Principal) 格式顯示用戶名 名稱 (UPN)格式。
WHOAMI /FQDN // 用完全合格的 (Fully Qualified) 格式顯示用戶名 可分辨名稱(FQDN) 格式。
WHOAMI /LOGONID // 顯示當前用戶的登錄 ID。
WHOAMI /USER // 顯示當前用戶的信息以及安全標識符 (SID)。
WHOAMI /USER /FO LIST
WHOAMI /USER /FO CSV
WHOAMI /GROUPS //顯示當前用戶的組成員信息、帳戶類型和安全 標識符 (SID) 和屬性。
WHOAMI /GROUPS /FO CSV /NH //NH指定在輸出中不顯示列標題。只對 TABLE 和 CSV 格式有效。
WHOAMI /PRIV // 顯示當前用戶的安全特權。
WHOAMI /PRIV /FO TABLE //指定要顯示的輸出格式。有效值為 TABLE、LIST、 CSV。CSV 格式不顯示列標題。默認格式是 TABLE。
WHOAMI /USER /GROUPS
WHOAMI /USER /GROUPS /PRIV
WHOAMI /ALL //顯示當前用戶名、屬於的組以及安全標識符(SID) 和當前用戶訪問令牌的特權。
WHOAMI /ALL /FO LIST
WHOAMI /ALL /FO CSV /NH
WHOAMI /? //顯示此幫助消息。
編寫一個模擬令牌demo
https://www.anquanke.com/post/id/204721