0x00 前言
在這一系列文章中,我們將討論基于windows令牌(Token)的攻擊方式,全面理解令牌、特權(Privilege)等知識點,了解令牌及特權在Windows系統(tǒng)安全架構中的實現(xiàn)機制。
令牌篡改攻擊(Token Manipulation Attack)是多個APT組織及惡意軟件常用的一種技術,可以用來在受害者系統(tǒng)上獲取高權限,或者以其他用戶身份執(zhí)行操作(用戶仿冒)。
MITRE上給出了使用該技術的相關APT組織及涉及到的工具:
令牌篡改實際上并不完全屬于漏洞利用范疇,這里我們?yōu)E用的是Windows系統(tǒng)自身的功能,通過某些Windows API函數(shù)來修改調(diào)用進程的安全上下文,以便模擬另一個進程(通常是低權限進程)的安全上下文。模擬過程可以通過目標進程的線程來完成,后面我們再詳細討論這一點。Windows使用這種功能來修改調(diào)用進程所屬線程的安全上下文,將其修改成其他用戶的安全上下文,以執(zhí)行某些操作。
Windows系統(tǒng)中有各種用戶,比如System、Network Service、Local Service以及Administrator賬戶(組)及普通域用戶。這些用戶賬戶都運行在不同的安全上下文中,具備一定級別的訪問權限。默認情況下,System在本地系統(tǒng)中具備最高權限。在大多數(shù)情況下,惡意程序希望竊取運行在System安全上下文中的進程令牌,以獲得最高權限。
0x01 令牌
在分析這些技術前,我們先來了解下令牌及特權的基本知識。
令牌(Token)或者訪問令牌(Accss Token)是一個內(nèi)核對象,用來描述進程或線程所使用的安全上下文。
訪問令牌中包含各種信息,比如安全標識符(SID,Security Identifier)、令牌類型(Token Type)、用戶及組信息、權限、登錄會話(Logon Session)等,系統(tǒng)會在用戶登錄時分配訪問令牌。
為了執(zhí)行各種操作或者使用Windows中的各種資源,進程必須使用Windows句柄打開或者創(chuàng)建對象,才能訪問內(nèi)核對象。內(nèi)核會根據(jù)訪問令牌賦予進程匹配的訪問權限。
訪問令牌創(chuàng)建
- 當用戶登錄主機時,系統(tǒng)會創(chuàng)建訪問令牌。
- 檢測密碼是否正確,執(zhí)行認證過程。
- 在安全數(shù)據(jù)庫中檢查用戶詳細信息。
- 檢查用戶是否屬于內(nèi)置的管理員組中,如果滿足條件,則生成兩個令牌:完整的管理員訪問令牌及標準用戶訪問令牌。
- 如果用戶不屬于內(nèi)置管理員組,則只會生成標準用戶訪問令牌。
訪問令牌在Windows系統(tǒng)的UAC(用戶訪問控制)功能中發(fā)揮重要作用。
當屬于內(nèi)置管理員組的用戶登錄時,系統(tǒng)并沒有向用戶提供完整的管理員訪問令牌。Windows系統(tǒng)會為該用戶創(chuàng)建拆分(split)令牌。這里有兩種類型的拆分令牌:“Filtered Token”(過濾令牌)及“Elevated Token”(提升令牌)。
當用戶分配的是Filtered Token時,基本意味著用戶運行在中完整性(medium integrity)級別上,被剔除了管理員組權限及SID,這意味著用戶無法直接執(zhí)行各種管理任務。為了執(zhí)行管理任務,用戶必須通過UAC認證,或者輸入正確的憑據(jù)。
當用戶通過UAC認證或輸入正確憑據(jù)后,系統(tǒng)會給用戶分配Elevated Token,用戶就可以執(zhí)行管理任務。Elevated Token是帶有高完整性的令牌,其中包括管理員組的SID及權限。
圖. 執(zhí)行管理任務時彈出確認窗口
圖. 用戶需輸入憑據(jù)以執(zhí)行管理任務
如果正確配置UAC,那就能有效發(fā)揮該機制的安全功能。
如果大家想全面理解UAC,可以參考官方提供的這篇文章。
令牌機理
為了進一步理解Windows中的令牌對象,我們來看一下令牌的內(nèi)部機理(比如令牌對應的內(nèi)核數(shù)據(jù)結構)。這里我們使用WinDbg來查看內(nèi)核數(shù)據(jù)結構。
首先,我們來觀察TOKEN結構。
在上圖中,我們可以看到TOKEN數(shù)據(jù)的完整結構,該結構中包含其他一些數(shù)據(jù)結構,這些結構用來定義與令牌有關的各種屬性及信息,與登錄用戶密切相關。
該結構中包含TokenId、Privileges數(shù)組,定義了對應該用戶所分配的所有特權,TokenType定義了令牌類型:Primary或者Impersonation等。
接下來觀察TOKEN結構中的部分數(shù)據(jù)結構。
SEP_TOKEN_PRIVILEGES結構中包含與令牌相關的特權的所有信息,其中Present為令牌當前可用的權限;Enabled為已啟用的權限;EnabledByDefault為默認情況下已啟用的權限。
TOKEN_TYPE為枚舉類型,其中定義了令牌類型是否為Primary或者Impersonation(后續(xù)文章中會詳細分析這方面內(nèi)容)。
SECURITY_IMPERSONATION_LEVEL也是一個枚舉類型,其中指定了不同常量,用來決定調(diào)用進程可以在哪種級別模擬目標進程。
常量的定義可參考微軟官方文檔,具體如下:
我們將使用TOKEN_TYPE及SECURITY_IMPERSONATION_LEVEL常量來模擬令牌,可根據(jù)具體情況來設置相應值,比如是使用Primary令牌來創(chuàng)建進程,或者是使用Impersonation令牌來模擬某個進程。
SID_AND_ATTRIBUTES結構定義了SID(安全標識符)及SID的屬性。
0x02 特權
一般而言,特權(Privilege)這個詞指的是上級單位根據(jù)某些條件賦予某人或者某個組織的一種特殊權利。
與之類似,在Windows系統(tǒng)中,管理員可以為用戶分配某些特權以執(zhí)行系統(tǒng)相關的活動。默認情況下系統(tǒng)會給用戶分配一些特權,而管理員也可以使用“本地安全策略設置”在本地為用戶分配一些特權。
特權決定哪個用戶可以控制系統(tǒng)資源,以執(zhí)行系統(tǒng)相關任務,如關機、調(diào)試被其他進程使用的進程內(nèi)存、將驅(qū)動載入內(nèi)存中、備份文件及目錄等。
Windows系統(tǒng)中可用的特權常量可參考此處資料。
在上文中,我們提到SEP_TOKEN_PRIVILEGES結構中包含Enabled及EnabledByDefault成員,這意味著分配給用戶的所有特權默認情況下不一定處于啟用狀態(tài),只有某些特權在分配時被啟用,如果需要其他特權來執(zhí)行系統(tǒng)相關任務,則必須通過外部方式啟用這些特權。
標準用戶已啟用的特權如下圖所示:
如上圖所示,只有SeChangeNotifyPrivilege特權處于啟用狀態(tài),分配給用戶的其他特權處于禁用狀態(tài)。為了使用這些特權,我們首先必須執(zhí)行啟用操作。
在本系列文章中,我們將啟用SE_DEBUG_NAME特權,該特權可以幫我們調(diào)試無法訪問的進程或者運行在SYSTEM賬戶下的進程。
下面來觀察不同用戶所對應的令牌,這里我們來觀察運行在標準用戶及管理員用戶安全上下文中的notepad進程所對應的令牌。
我們使用WinDbg來查看目標進程(這里為notepad.exe)的令牌。
標準用戶的令牌狀態(tài)如下:
上圖中可以看到進程對應的Session ID(已登錄的會話)、Impersonation Level、TokenType等,該進程的令牌類型為Primary。此外上圖頂部的輸出信息表明對應的線程沒有處于模擬狀態(tài),使用的是Primary令牌。
從圖中可知分配給該進程的特權與分配給普通用戶的特權一樣,因為該進程運行在標準用戶的安全上下文中。
Elevation Type的值為3(Limited,受限),這表明這是一個受限令牌,其中剔除了管理員特權,禁用了管理員組。
管理員用戶的令牌狀態(tài)如下:
上圖的令牌信息與標準用戶類似,但分配的特權要比標準用戶要多得多,基本上所有特權都會分配管理員用戶。此外,我們可以看到這里的Elevation Type為2(Full,完整),表明這是提升(Elevated)令牌,沒有被剔除某些權限及用戶組。
備注:只有當UAC啟用時,Elevation Type才為2或者3,當UAC禁用或者用戶為內(nèi)置管理員賬戶或者服務賬戶時,Type等于1。
0x03 總結
在本文中,我們討論了訪問令牌以及訪問令牌的使用場景、生成時間點、TOKEN內(nèi)部結構以及與令牌相關的許多知識點。這些知識點非常重要,可以幫我們理解令牌在Windows系統(tǒng)用戶及進程的安全上下文的工作方式。理解這些內(nèi)容后,在下文中我們將繼續(xù)研究,使用Windows API來發(fā)起令牌篡改攻擊。
原文鏈接:https://www.anquanke.com/post/id/192892