Windows Token原理及利用
NO.1 登陸會話與訪問令牌
在windows登錄后,一旦用戶成功通過身份驗證,LSA 將創建一個新的登錄會話并生成一個訪問令牌,一個登錄會話可以有多個關聯的訪問令牌,但一個訪問令牌只能鏈接到一個登錄會話。
每個新登錄會話都可以通過 64 位本地唯一標識符 (LUID) 進行識別,稱為登錄 ID,并且每個訪問令牌都必須包含一個身份驗證 Id(或 AuthId)參數,該參數通過此 LUID 標識源/鏈接登錄會話。當然,每一個進程也是對應一個訪問令牌并關聯一個登錄會話。
訪問令牌充當的是登錄會話替身,代表了用戶的安全上下文屬性,比如說SID、GROUP、PRIV等。
在任務管理器就能看到每個進程對應的用戶,這也是訪問令牌其中的一個標識:

NO.2 令牌的作用
每一個進程都都有一個唯一的主令牌,而一個進程可以有多個線程。每當線程嘗試訪問由 Windows 內核管理的安全對象時,例如進程、線程、句柄、令牌等,Windows 都會執行訪問檢查:
- 誰請求的訪問?
- 它訪問對象的意圖是什么?
- 誰可以訪問對象?
首先,Windows會檢查調用線程關聯的令牌的授權屬性(例如,用戶 sid、組成員身份、權限等),然后Windows 將查看線程請求的所需訪問權限,最后還需要表明訪問的意圖。

在檢查過程中,Windows會檢索目標對象的安全描述符。安全描述符包含一個自由訪問控制列表(DACL ),它指定哪些用戶/組有權訪問對象以及授予的訪問權限。
某些特權可以使用戶繞過內核中對給定對象的訪問檢查。例如,如果令牌啟用了SeDebugPrivilege特權,Windows內核將跳過對任何進程和線程對象的DACL檢查。常見的濫用比如:憑據竊取、提權、防御規避等。

除了SeDebugPrivilege,還有其他特權也經常被攻擊者濫用:
1.SeBackupPrivilege
描述:此權限使授予對任何文件的所有讀取訪問控制權,而不管為該文件指定的[訪問控制列表](https://msdn.microsoft.com/library/windows/desktop/ms721532#-security-access-control-list-gly)(ACL)。
攻擊場景:收集
2.SeCreateTokenPrivilege
描述:需要創建主令牌。
攻擊場景:權限提升
3.SeLoadDriverPrivilege
描述:需要加載或卸載設備驅動程序。
攻擊場景:持久化;防御規避
4.SeRestorePrivilege
描述:需要執行還原操作。此特權使系統授予對任何文件的所有寫訪問控制,而不管為文件指定的 ACL。
攻擊場景:持久化;防御規避
5.SeTakeOwnershipPrivilege
描述:需要獲得對象的所有權而不被授予自由訪問權限。
攻擊場景:持久化;防御規避;收集
6.SeTcbPrivilege
描述:此權限將其持有者標識為受信任計算機庫的一部分。某些受信任的受保護子系統被授予此特權。
攻擊場景:權限提升
NO.3 模擬令牌
模擬是指在安全上下文中執行線程的功能,該上下文不同于擁有該線程的進程的上下文。在客戶端的安全上下文中運行時,服務器在一定程度上"是"客戶端。服務器線程使用代表客戶端憑據的訪問令牌來獲取對客戶端具有訪問權限的對象的訪問權限。
訪問令牌是描述進程或線程的安全上下文的對象。它們提供的信息包括用戶帳戶的標識和用戶帳戶可用的特權子集。每個進程都有一個 主訪問令牌 ,用于描述與進程關聯的用戶帳戶的安全上下文。默認情況下,當進程的線程與安全對象交互時,系統將使用主標記。但是,當線程模擬客戶端時,模擬線程同時具有主訪問令牌和模擬令牌。模擬標記代表客戶端的安全上下文,此訪問令牌是在模擬期間用于訪問檢查的令牌。當模擬結束時,該線程會恢復為僅使用主訪問令牌。
默認情況下,所有線程都將繼承與其進程的主令牌相同的安全上下文。但是,模擬允許線程切換到不同的安全上下文。
NO.4 令牌的利用
攻擊者可以通過三種方法利用訪問令牌:
假冒/竊取令牌攻擊者創建一個新的訪問令牌,該令牌使用 DuplicateToken(Ex) 復制現有令牌。
使用令牌創建進程攻擊者創建一個新的訪問令牌,并使用它創建一個在模擬用戶的安全上下文下運行的新進程。
制作和模擬令牌對手擁有用戶名和密碼,但用戶未登錄系統。攻擊者可以使用該功能為用戶創建登錄會話。該函數將返回新會話的訪問令牌的副本,攻擊者可以使用該令牌將令牌分配給線程。

NO.5 竊取/模擬令牌流程
一般的利用流程為:
WindowsPrincipal:判斷當前權限
LookupPrivilegeValue:判斷是否擁有SeDebugPrivilege權限
OpenProcess:打開進程獲取句柄
OpenProcessToken:打開進程令牌獲取hToken
DuplicateToken:復制令牌
CreateProcessWithTokenW:啟動進程

NO.6 其他問題
竊取問題
在竊取令牌時會發現,并不是所有的進程都能進行令牌竊取,這跟OpenProcess()提供的訪問權限有關:
當我們使用 PROCESS_QUERY_INFORMATION 或 PROCESS_ALL_ACCESS 的訪問權限對某些 SYSTEM 進程調用 OpenProcess() 時,我們可以成功竊取這些進程的訪問令牌。這些進程包括:
dllhost.exelsass.exe OfficeClickToRun.exe svchost.exe(只適用于某些PID)Sysmon64.exeunsecapp.exe VGAuthService.exevmacthlp.exe vmtoolsd.exe winlogon.exe
對于受 PPL 保護的某些 SYSTEM 進程,如果我們以 PROCESS_QUERY_LIMITED_INFORMATION 訪問權限調用 OpenProcess(),還是能夠竊取訪問令牌,這些進程包括:
csrss.exeMemory Compression.exe services.exesmss.exewininit.exe
總結:
- 如果想在某個進程上調用OpenProcessToken(),那么BUILTIN\Administrator必須為TokenOwner
- 如果SYSTEM進程受PPL(Protected Process Light)保護,那么我們必須使用PROCESS_QUERY_LIMITED_INFORMATION訪問權限來調用OpenProcess()
權限問題
模擬令牌的完整性級別必須小于或等于調用進程的完整性級別,否則模擬調用也將失敗。比如,在開啟UAC的情況下只能模擬未提升權限的(過濾的)中等完整性令牌。
NO.7 參考
https://0x00-0x00.github.io/research/2018/10/17/Windows-API-and-Impersonation-Part1.html
https://0x00-0x00.github.io/research/2018/10/21/Windows-API-And-Impersonation-Part-2.html
https://www.elastic.co/cn/blog/introduction-to-windows-tokens-for-security-practitioners
https://www.elastic.co/cn/blog/how-attackers-abuse-access-token-manipulation
https://s3cur3th1ssh1t.github.io/SharpImpersonation-Introduction/
https://www.mcafee.com/enterprise/en-us/assets/reports/rp-access-token-theft-manipulation-attacks.pdf
https://blog.palantir.com/windows-privilege-abuse-auditing-detection-and-defense-3078a403d74e
https://securitytimes.medium.com/understanding-and-abusing-process-tokens-part-i-ee51671f2cfa
https://github.com/001SPARTaN/FaceDancer/blob/master/FaceDancer/FaceDancer.cs