0x00 前言
在這一系列文章中,我們將討論基于windows令牌(Token)的攻擊方式,全面理解令牌、特權(quán)(Privilege)等知識(shí)點(diǎn),了解令牌及特權(quán)在Windows系統(tǒng)安全架構(gòu)中的實(shí)現(xiàn)機(jī)制。
令牌篡改攻擊(Token Manipulation Attack)是多個(gè)APT組織及惡意軟件常用的一種技術(shù),可以用來在受害者系統(tǒng)上獲取高權(quán)限,或者以其他用戶身份執(zhí)行操作(用戶仿冒)。
MITRE上給出了使用該技術(shù)的相關(guān)APT組織及涉及到的工具:

令牌篡改實(shí)際上并不完全屬于漏洞利用范疇,這里我們?yōu)E用的是Windows系統(tǒng)自身的功能,通過某些Windows API函數(shù)來修改調(diào)用進(jìn)程的安全上下文,以便模擬另一個(gè)進(jìn)程(通常是低權(quán)限進(jìn)程)的安全上下文。模擬過程可以通過目標(biāo)進(jìn)程的線程來完成,后面我們?cè)僭敿?xì)討論這一點(diǎn)。Windows使用這種功能來修改調(diào)用進(jìn)程所屬線程的安全上下文,將其修改成其他用戶的安全上下文,以執(zhí)行某些操作。
Windows系統(tǒng)中有各種用戶,比如System、Network Service、Local Service以及Administrator賬戶(組)及普通域用戶。這些用戶賬戶都運(yùn)行在不同的安全上下文中,具備一定級(jí)別的訪問權(quán)限。默認(rèn)情況下,System在本地系統(tǒng)中具備最高權(quán)限。在大多數(shù)情況下,惡意程序希望竊取運(yùn)行在System安全上下文中的進(jìn)程令牌,以獲得最高權(quán)限。
0x01 令牌
在分析這些技術(shù)前,我們先來了解下令牌及特權(quán)的基本知識(shí)。
令牌(Token)或者訪問令牌(Accss Token)是一個(gè)內(nèi)核對(duì)象,用來描述進(jìn)程或線程所使用的安全上下文。
訪問令牌中包含各種信息,比如安全標(biāo)識(shí)符(SID,Security Identifier)、令牌類型(Token Type)、用戶及組信息、權(quán)限、登錄會(huì)話(Logon Session)等,系統(tǒng)會(huì)在用戶登錄時(shí)分配訪問令牌。
為了執(zhí)行各種操作或者使用Windows中的各種資源,進(jìn)程必須使用Windows句柄打開或者創(chuàng)建對(duì)象,才能訪問內(nèi)核對(duì)象。內(nèi)核會(huì)根據(jù)訪問令牌賦予進(jìn)程匹配的訪問權(quán)限。
訪問令牌創(chuàng)建

- 當(dāng)用戶登錄主機(jī)時(shí),系統(tǒng)會(huì)創(chuàng)建訪問令牌。
- 檢測(cè)密碼是否正確,執(zhí)行認(rèn)證過程。
- 在安全數(shù)據(jù)庫中檢查用戶詳細(xì)信息。
- 檢查用戶是否屬于內(nèi)置的管理員組中,如果滿足條件,則生成兩個(gè)令牌:完整的管理員訪問令牌及標(biāo)準(zhǔn)用戶訪問令牌。
- 如果用戶不屬于內(nèi)置管理員組,則只會(huì)生成標(biāo)準(zhǔn)用戶訪問令牌。
訪問令牌在Windows系統(tǒng)的UAC(用戶訪問控制)功能中發(fā)揮重要作用。
當(dāng)屬于內(nèi)置管理員組的用戶登錄時(shí),系統(tǒng)并沒有向用戶提供完整的管理員訪問令牌。Windows系統(tǒng)會(huì)為該用戶創(chuàng)建拆分(split)令牌。這里有兩種類型的拆分令牌:“Filtered Token”(過濾令牌)及“Elevated Token”(提升令牌)。
當(dāng)用戶分配的是Filtered Token時(shí),基本意味著用戶運(yùn)行在中完整性(medium integrity)級(jí)別上,被剔除了管理員組權(quán)限及SID,這意味著用戶無法直接執(zhí)行各種管理任務(wù)。為了執(zhí)行管理任務(wù),用戶必須通過UAC認(rèn)證,或者輸入正確的憑據(jù)。
當(dāng)用戶通過UAC認(rèn)證或輸入正確憑據(jù)后,系統(tǒng)會(huì)給用戶分配Elevated Token,用戶就可以執(zhí)行管理任務(wù)。Elevated Token是帶有高完整性的令牌,其中包括管理員組的SID及權(quán)限。

圖. 執(zhí)行管理任務(wù)時(shí)彈出確認(rèn)窗口

圖. 用戶需輸入憑據(jù)以執(zhí)行管理任務(wù)
如果正確配置UAC,那就能有效發(fā)揮該機(jī)制的安全功能。
如果大家想全面理解UAC,可以參考官方提供的這篇文章。
令牌機(jī)理
為了進(jìn)一步理解Windows中的令牌對(duì)象,我們來看一下令牌的內(nèi)部機(jī)理(比如令牌對(duì)應(yīng)的內(nèi)核數(shù)據(jù)結(jié)構(gòu))。這里我們使用WinDbg來查看內(nèi)核數(shù)據(jù)結(jié)構(gòu)。
首先,我們來觀察TOKEN結(jié)構(gòu)。

在上圖中,我們可以看到TOKEN數(shù)據(jù)的完整結(jié)構(gòu),該結(jié)構(gòu)中包含其他一些數(shù)據(jù)結(jié)構(gòu),這些結(jié)構(gòu)用來定義與令牌有關(guān)的各種屬性及信息,與登錄用戶密切相關(guān)。
該結(jié)構(gòu)中包含TokenId、Privileges數(shù)組,定義了對(duì)應(yīng)該用戶所分配的所有特權(quán),TokenType定義了令牌類型:Primary或者Impersonation等。
接下來觀察TOKEN結(jié)構(gòu)中的部分?jǐn)?shù)據(jù)結(jié)構(gòu)。

SEP_TOKEN_PRIVILEGES結(jié)構(gòu)中包含與令牌相關(guān)的特權(quán)的所有信息,其中Present為令牌當(dāng)前可用的權(quán)限;Enabled為已啟用的權(quán)限;EnabledByDefault為默認(rèn)情況下已啟用的權(quán)限。

TOKEN_TYPE為枚舉類型,其中定義了令牌類型是否為Primary或者Impersonation(后續(xù)文章中會(huì)詳細(xì)分析這方面內(nèi)容)。

SECURITY_IMPERSONATION_LEVEL也是一個(gè)枚舉類型,其中指定了不同常量,用來決定調(diào)用進(jìn)程可以在哪種級(jí)別模擬目標(biāo)進(jìn)程。
常量的定義可參考微軟官方文檔,具體如下:

我們將使用TOKEN_TYPE及SECURITY_IMPERSONATION_LEVEL常量來模擬令牌,可根據(jù)具體情況來設(shè)置相應(yīng)值,比如是使用Primary令牌來創(chuàng)建進(jìn)程,或者是使用Impersonation令牌來模擬某個(gè)進(jìn)程。

SID_AND_ATTRIBUTES結(jié)構(gòu)定義了SID(安全標(biāo)識(shí)符)及SID的屬性。
0x02 特權(quán)
一般而言,特權(quán)(Privilege)這個(gè)詞指的是上級(jí)單位根據(jù)某些條件賦予某人或者某個(gè)組織的一種特殊權(quán)利。
與之類似,在Windows系統(tǒng)中,管理員可以為用戶分配某些特權(quán)以執(zhí)行系統(tǒng)相關(guān)的活動(dòng)。默認(rèn)情況下系統(tǒng)會(huì)給用戶分配一些特權(quán),而管理員也可以使用“本地安全策略設(shè)置”在本地為用戶分配一些特權(quán)。

特權(quán)決定哪個(gè)用戶可以控制系統(tǒng)資源,以執(zhí)行系統(tǒng)相關(guān)任務(wù),如關(guān)機(jī)、調(diào)試被其他進(jìn)程使用的進(jìn)程內(nèi)存、將驅(qū)動(dòng)載入內(nèi)存中、備份文件及目錄等。
Windows系統(tǒng)中可用的特權(quán)常量可參考此處資料。
在上文中,我們提到SEP_TOKEN_PRIVILEGES結(jié)構(gòu)中包含Enabled及EnabledByDefault成員,這意味著分配給用戶的所有特權(quán)默認(rèn)情況下不一定處于啟用狀態(tài),只有某些特權(quán)在分配時(shí)被啟用,如果需要其他特權(quán)來執(zhí)行系統(tǒng)相關(guān)任務(wù),則必須通過外部方式啟用這些特權(quán)。
標(biāo)準(zhǔn)用戶已啟用的特權(quán)如下圖所示:

如上圖所示,只有SeChangeNotifyPrivilege特權(quán)處于啟用狀態(tài),分配給用戶的其他特權(quán)處于禁用狀態(tài)。為了使用這些特權(quán),我們首先必須執(zhí)行啟用操作。
在本系列文章中,我們將啟用SE_DEBUG_NAME特權(quán),該特權(quán)可以幫我們調(diào)試無法訪問的進(jìn)程或者運(yùn)行在SYSTEM賬戶下的進(jìn)程。
下面來觀察不同用戶所對(duì)應(yīng)的令牌,這里我們來觀察運(yùn)行在標(biāo)準(zhǔn)用戶及管理員用戶安全上下文中的notepad進(jìn)程所對(duì)應(yīng)的令牌。
我們使用WinDbg來查看目標(biāo)進(jìn)程(這里為notepad.exe)的令牌。
標(biāo)準(zhǔn)用戶的令牌狀態(tài)如下:

上圖中可以看到進(jìn)程對(duì)應(yīng)的Session ID(已登錄的會(huì)話)、Impersonation Level、TokenType等,該進(jìn)程的令牌類型為Primary。此外上圖頂部的輸出信息表明對(duì)應(yīng)的線程沒有處于模擬狀態(tài),使用的是Primary令牌。
從圖中可知分配給該進(jìn)程的特權(quán)與分配給普通用戶的特權(quán)一樣,因?yàn)樵撨M(jìn)程運(yùn)行在標(biāo)準(zhǔn)用戶的安全上下文中。
Elevation Type的值為3(Limited,受限),這表明這是一個(gè)受限令牌,其中剔除了管理員特權(quán),禁用了管理員組。
管理員用戶的令牌狀態(tài)如下:

上圖的令牌信息與標(biāo)準(zhǔn)用戶類似,但分配的特權(quán)要比標(biāo)準(zhǔn)用戶要多得多,基本上所有特權(quán)都會(huì)分配管理員用戶。此外,我們可以看到這里的Elevation Type為2(Full,完整),表明這是提升(Elevated)令牌,沒有被剔除某些權(quán)限及用戶組。
備注:只有當(dāng)UAC啟用時(shí),Elevation Type才為2或者3,當(dāng)UAC禁用或者用戶為內(nèi)置管理員賬戶或者服務(wù)賬戶時(shí),Type等于1。
0x03 總結(jié)
在本文中,我們討論了訪問令牌以及訪問令牌的使用場(chǎng)景、生成時(shí)間點(diǎn)、TOKEN內(nèi)部結(jié)構(gòu)以及與令牌相關(guān)的許多知識(shí)點(diǎn)。這些知識(shí)點(diǎn)非常重要,可以幫我們理解令牌在Windows系統(tǒng)用戶及進(jìn)程的安全上下文的工作方式。理解這些內(nèi)容后,在下文中我們將繼續(xù)研究,使用Windows API來發(fā)起令牌篡改攻擊。
原文鏈接:https://www.anquanke.com/post/id/192892