標題:基於域信任關係的域攻擊

taibeihacker

Moderator

基于域信任关系的域攻击​

域信任​

建立域之間的信任關係,是為了一個域的用戶能方便地訪問其他域的資源,同時也方便了對域網絡的管理和維護。這種模式在帶來便利的同時,也存在很多可以被惡意攻擊者利用的地方。
域信任關係可以是單向\雙向信任、可傳遞\不可傳遞信任、內部\外部信任、跨域鏈接信任(cross link trust)等類型。例如,2 個域之間有單向可傳遞的外部信任關係。同一個森林(Forest)內部的域信任關係,一般隱含為雙向可傳遞的內部信任關係。
20200504095856.png-water_print

部署:
20200504095938.png-water_print

父子信任關係是最常見的域信任關係,在同一個森林內部,加入一個新域時,最常見的是子域模式(Parent- Child),或者是樹根模式(Tree-Root),這兩種模式分別會建立父子信任\樹根信任關係,都是雙向可傳遞的內部信任關係。
20200504101001.png-water_print

跨域鏈接信任(cross link),指的是在同一個森林的兩個子域間建立直接的信任關係。因為在同一個森林中,域的組織關係是樹狀結構,從一個子域到另外一個域,需要從樹枝的子域順尋到根域(Forest Root),然後從根域繼續順尋到另外一個子域,而跨域鏈接相當於在2 個子域之間之間建立了一個快捷方式的信任關係,以減少認證和授權的時間和步驟。
內部信任指的是森林內部域之間的信任關係。相應地,外部信任(External Domain Trust)指的是域和所在森林之外的域之間的信任關係。
還有一種MIT 信任(Kerberos 協議及標準由MIT 提出),是Windows 域與非Windows 域之間的信任關係,由於應用較少,本文不討論此種類型的域信任關係。

跨域认证和资源访问授权​

當2 個域之間建立域信任關係時,會建立共享的域間密鑰(Inter-Realm Key,簡寫為IRKey),其作用相當於Krbtgt,只不過IRKey 用於相互信任的2 個域之間的認證,而Krbtgt 用於同一個域服務器的AC 和KDC 之間的認證。
信任域之間的認證授權過程,與同一個域中的認證授權大抵相似,但仍然有不少區別。
20200504102209.png-water_print

Jack 向DC1 發起認證請求,數據由Jack 的口令NTLM 值加密;
DC1 使用Jack 的口令NTLM 值驗證收到的認證請求,返回一個通過認證的TGT 票據給Jack;
Jack 使用TGT 票據,向DC1 發起授權請求,發起請求訪問DC2 中文件服務的TGS_REQ;
DC1 檢查到文件服務在DC2 中,返回一個可轉投的TGT(Referral TGT),指明需轉投到DC2,使用IRKey 加密可轉投TGT 中的認證信息;
Jack 收到可轉投的TGT 後,根據提示信息,使用轉投TGT,發起訪問DC2 中文件服務的請求TGS_REQ;
DC2 收到請求後,使用IRKey 驗證可轉投TGT 中的認證信息,返回一個允許訪問文件服務的TGS 票據,票據中部分信息使用運行文件服務的服務賬號的口令NTLM 值加密;
Jack 使用收到的TGS 票據訪問DC2 中的文件服務;
文件服務的服務賬號使用口令NTLM 值校驗TGS
當2 個域之間建立信任關係時,會在全局域數據庫中存檔對方的SPN、DNS 等信息,方便訪問時進行查詢。例如,上圖中,DC1 會存檔DC2 中所有的服務SPN、DNS 等信息。
如果Jack 請求訪問的服務在DC1 的全局數據庫中,則會返迴轉投TGT,如果不在,如果DC1 有父域,則DC1 會向父域請求直至森林的根域服務器,如果DC1 本身是根服務器(本例中DC1 是根域服務器),則直接告訴Jack,請求訪問的服務不存在。
一個森林只有一個全局數據庫。

SIDHistory 版跨域黄金票据​

在一個域中,一旦我們獲取Krbtgt 的NTLM 值,則可以構造黃金票據,偽造成域內任意用戶,包括管理員,獲取對域的完全訪問控制權限。但是在同一個森林的不同域中,黃金票據不再有效。
回顧一下黃金票據的幾大要素,即域名、域的SID(Security Identifier)、本域Krbtgt 用戶口令NTLM 值、想偽造票據的用戶RID(Relative Identifier,在無特別指明情況下,Mimikatz 工具會設置RID 為域管理員的RID)。不同的域有不同的Krbtgt,導致黃金票據在不同的域之間失效。
1
mimikatz.exe 'kerberos:golden /user:anyusername /domain:lab.adsec.com /sid:S-1-5-21-2732272027-1570987391-2638982533 /krbtgt:16ed27ee7848756cfa96b33c25e3ad3d /ptt' exit
20200504110910.png-water_print

不同的域有不同的Krbtgt,導致黃金票據在不同的域之間失效。
可以看到,在構造lab.adsec.com 域的黃金票據時,在本域中有效,到父級域adsec.com 中票據失效。
如果一個用戶的SIDHistory 屬性被設置為高權限組或者用戶的ID,則該用戶也具備等同於高權限組或者用戶的權限。如果我們偽造的黃金票據中加入目標域的域管理員組的SID,則可以獲取目標域的域管理員權限,黃金票據和SIDHistory 的結合,可實現跨域黃金票據。
由於每個域的SID 都不同,疊加SIDHistory 的黃金票據不具備通用性。根據微軟的描述,在同一個域森林內部,企業管理組EA(Enterprise Administrators) 會自動被森林內部所有域加入到本域的域管理員組,且EA 只存在於根域中,所以企業管理組EA 的SID 固定為根域的SID 加上固定的RID 即519。
因此,如果將使用企業管理組EA 的SID 設置SIDHistory 屬性,和黃金票據結合,則在只獲取任意一個域krbtgt 賬號NTLM 值的前提下,可實現森林內部所有域的跨域黃金票據,這種票據可簡稱為SIDHistory 版黃金票據。
當然也可以添加森林內某個指定域的管理員組SID 為SIDHistory,但是這樣的黃金票據只對該指定域有效,對其他域無效。不如使用企業管理員SID 的票據那樣有通用性。
1
mimikatz.exe 'kerberos:golden /user:anyusername sids:[EA組的sid] /sid:[lab.adsec.com域的sid] /domain:lab.adsec.com /krbtgt:16ed27ee7848756cfa96b33c25e3ad3d /ptt' exit
20200504111832.png-water_print

仍然在lab.adsec.com 域中構造黃金票據,但添加了SIDS 參數,使用根域的企業管理員SID 作為參數值,即SIDHistory 版黃金票據,對lab.adsec.com 和adsec.com 域均有效。
這裡需要注意的是,實現SIDHistory 版黃金票據的基礎是森林內信任關係,因為如果不是森林內信任關係,則SIDHistory 會被微軟的SID Filter 規則過濾掉,從而失效,但森林內部不會有SID Filter 規則。這也是為什麼說是森林而非域才是安全邊界。

IRKey 版跨域黄金票据​

當2 個域之間建立域信任關係時,需要建立共享的域間密鑰(Inter-Realm Key,簡寫為IRKey),其作用相當於Krbtgt,只不過是用於相互信任的2 個域之間,而Krbtgt 用於同一個域服務器的AC 和KDC 之間。
只要獲取森林內部任意域的krbtgt 賬號的NTLM 值,則通過SIDHistory 版黃金票據,即可獲取全森林所有域的控制權。因此為了防禦,必須2 次修改森林內部所有域的krbtgt 賬號的NTLM 值。
在多域環境中,IRKey 和主機賬號類似,系統默認每30 天自動修改一次NTLM。所以即使2 次修改森林內所有域的krbtgt 賬號的NTLM,IRKey 的NTLM 大概率仍然沒有發生改變(小概率是krbtgt 的NTLM 修改正好碰上了IRKey 的修改週期)。
類似白銀票據,可以使用IRKey 偽造域間可轉投票據(Inter-Realm Referral TGT),獲取目標域的域管理員權限,再結合上一節的SIDHistory 版黃金票據,再次獲取整個森林的控制權。這裡需要注意的是SID 為目標域的SID。
在域中,大部分帶‘$’ 符號的賬號為Computer 賬號,但是User 組帶‘$’ 符號的賬號為信任賬號,可以通過域服務器自帶的Powershell 命令Get-ADUser 獲取所有帶‘$’ 符號的User 賬號,下圖中ADSEC$ 賬號為信任賬號,隸屬於Users 組。
20200504112640.png-water_print

有2 種方式可以獲取信任賬號的NTLM 值。

Dcsync 获取信任账号的 NTLM 值​

下圖採用Dcsync 方式,獲取lab.adsec.com 域中信任賬號adsec$ 的NTLM 值,結果表明該賬號的類型為TRUST_ACCOUNT
20200504112712.png-water_print

lsadum 获取信任账号的 NTLM 值​

採用lsadump:trust /patch方式。從下圖中可看到有[IN] LAB.ADSEC.COM - ADSEC.COM 和[OUT] ADSEC.COM - LAB.ADSEC.COM 兩種不同的NTLM 值,分別是往外到其他域和往內到本域訪問時用到的值。因為雙向信任關係其實是2 個單向信任關係的疊加,所以會有2 個密鑰。這裡我們要從本域構造IRKey 版黃金票據訪問森林內部其他域,所以使用IN 這個NTLM 值。
20200504113851.png-water_print

由於IRKey 存在於森林內部的信任域之間,也存在於森林外部的森林之間,均可用於轉投認證。在SIDHistory 版黃金票據中,由於SID Filter 規則,在森林之間不能使用,但是IRKey 版不涉及這個安全過濾規則,仍然有效。 IRKey 版黃金票據可以分作森林內部的、森林外部的2 種,操作方法類似,這裡我們著重介紹森林內部的IRKey 版黃金票據。
20200504114210.png-water_print

域間轉投票據的認證,依靠IRKey 加密。在我們已知IRKey 的前提下,可以偽造持有該IRKey 的信任域的任意用戶。測試中,我們構造一個票據,告訴adsec.com 域,轉投認證的用戶為administrator,而且SIDHistory 為根域的企業管理員。
構造成功後,具備adsec.com 的管理員權限,但是不能高權限訪問lab.adsec.com,因為構造的票據是到adsec.com 域的管理員票據。在獲取adsec.com 域的高權限後,可以獲取該域的krbtgt 賬號的NTLM 值,在此基礎上,繼續構造SIDHistory 版黃金票據,從而可以獲取整個森林的控制權。

域信任关系的获取​

在大型域網絡中,因為公司併購、企業重組、業務擴展等各種原因,域網絡的組織模式、信任關係各有不同。這些不同的信任關係,均存放在森林根域的數據庫中(Global Catalog),有多種方式可以獲取這些數據
PowerView、BloodHound 工具分別提供了多種獲取域信任關係的方式,且能可視化信任關係。下面將介紹從森林內部的某個子域的主機,獲取整個森林信任關係的方法和過程。
Powerview:
20200505091724.png-water_print

先使用Get-NetForestTrust 命令獲取森林級別的信任關係,共有2 個森林,分別為adsec.com、testlab.com,2 個森林建立了雙向信任關係
使用Get-NetDomainTrust 命令獲取adsec.com 域的域級別信任關係,即森林內部關係,有到lab.adsec.com 的ParentChild 信任關係和到res.com 域的TreeRoot 兩種森林內部關係。
測試中,Get-NetDomainTrust 的參數adsec.com 表示查詢指定域上的信任關係,一般情況下,只要指定的域信任當前查詢主機所在的域,就可以獲取對方的信任關係數據。
在查詢時可以使用Export-CSV -NoTypeInformation 將輸出結果轉換為CSV 格式,命令為Get-DomainTrustMapping -API | Export-CSV -NoTypeInformation trusts-mapping.csv。然後使用TrustVisualizer 工具進行可視化輸出。最後使用yED 工具轉換為可視化圖形。
20200505092621.png-water_print

利用域信任实现跨域攻击​

如果一個域內用戶(假設用戶為eviluser)想訪問其他域的資源訪問,首先確保目標域信任當前用戶所在的域,這是基本前提,然後必須具備以下3個條件之一
eviluser 被目標域加入了某個組,這個組在目標域中具有資源訪問權限;
eviluser 被目標域中的某些主機或服務器添加為本地組,例如被某台服務器添加為本地管理員組;
當前用戶被目標域的某些域對象添加為訪問控制ACL 的安全主體(Security Principal),例如可以修改某個域用戶對象的口令
也許有人疑問,根據前面介紹的內容,既然只要獲取了當前域的Krbtgt 賬號或者IRKey 賬號的NTLM 值, 即可獲取整個森林的控制權,那沒有必要再介紹森林內部的跨域攻擊
這是因為在實際情況中,並不一定能順利獲取某個域的Krbtgt 賬號或者IRKey 賬號的NTLM 值,例如域資源少、配置嚴謹、系統更新及時等,這時需要繞道至更大的域,才有更多的機會獲取Krbtgt 賬號或者IRKey 賬號的NTLM 值,因為資源越多,存在脆弱點的概率越大
要實現從當前用戶eviluser 開始,跨域攻擊A 域,首先得確保當前用戶具備跨域訪問A 域資源的權限,所以攻擊環節應該包括幾個步驟
從當前域的數據庫中,枚舉有哪些域信任當前域(出),由於是攻擊其他域,所以不用關注當前域信任哪些外部域(入),這從上一節介紹的方法可以輕鬆獲取
利用信任關係,枚舉目標域中哪些組包含外來域的用戶。這裡需要特別解釋一點的是,在域內通常有3 種類型的組,第1 種是域本地組(Domain Local Groups),可以添加跨域、跨森林的組成員,也是最常見的組;第2 種是全局組(Global Groups),不允許有任何跨域組成員,即使是同一個森林也不可以,權限較高,例如企業管理組;第3 種是通用組(Universal Groups),可以添加森林內的任何成員,但是跨森林的不可以。在森林內部的跨域攻擊中,我們只關注第一、三種域內組。一個用戶的memberof 屬性由組的member 屬性計算而來,前提是組的member 屬性已經更新到全局目錄數據庫中(Global Catalog)。如果一個用戶被森林中另外一個域添加為通用組成員,通用組將member 屬性更新到森林的全局目錄數據庫中,用戶的memberof 屬性會通過計算被更新;
一個用戶被森林中另外一個域添加為域本地組成員時,由於域本地組不會更新memberof 屬性到全局目錄數據庫中,因此用戶的memberof 屬性也不會被計算更新。所以,即使我們有權限查詢森林的全局目錄數據庫,也只能得到被添加到其他域通用組的成員屬性,要想獲得加入其他域域本地組的成員屬性,需要逐個輪詢所有的域
枚舉目標域中主機\服務器的本地組,查看哪些外來用戶被加入到主機\服務器的本地組,可以通過GPO 組策略進行枚舉,也可以通過PowerView 逐個探測,當然BloodHood 自動化的全部探測。
枚舉目標域內對象的ACL,檢查是否有包含外來域用戶的域對象ACL。一般而言,任意用戶均可查看所有域內對象的ACL,同時全局數據庫中保存了所有域對象的ACL,可以很方便的枚舉。 PowerView 提供了Get-DomainObjectACL 命令,可方便枚舉
20200505102041.png-water_print

對第2、3、4 步篩選出的用戶做第二次篩選,篩選出屬於當前域的用戶,作為在當前域中的攻擊對象,例如獲取目標用戶的NTLM 值或者TGT 票據,本域的攻擊方法。
利用第3 步攻擊獲取的用戶NTLM 值或者TGT 票據進行跨域訪問,進入目標域,然後攻擊獲取目標域的Krbtgt 賬號或者IRKey 賬號的NTLM 值,如果條件不成熟,繼續上面的步驟,逐步進入更多的域中尋找機會。當一個用戶被森林外部域加入某個組時,會出現在外部目標域的CN=ForeignSecurityPrincipals,DC=domain,DC=com 組中,相當於用戶在外部域中的代表或者別名,而且域中的所有外來用戶具備相同的SID,這是跨森林的SID 過濾安全機制的效果。
所以只要枚舉ForeignSecurityPrincipals 組,就可得知哪些用戶具有這個外部森林的訪問權限,假設用戶結果集合為ExternalUsers。接下來,先查看是否包含我們當前所在域的用戶,如果有,則直接攻擊這些用戶獲取NTLM 值或者TGT 票據,從而獲取森林外部域的資源訪問權限
如果沒有,則查看ExternalUsers 是否包含我們當前所在森林的用戶,假設結果合集為InternalUsers。在當前森林中查詢定位InternalUsers 所在的域。以這些域為目標,使用森林內部的跨域攻擊方法,攻擊這些域,獲取進入這些域的權限,再從這些域中攻擊InternalUsers 中的用戶,從而獲取外部域的資源訪問權限,這是一種繞道攻擊

SID 过滤机制​

微軟宣稱森林是活動目錄的安全邊界,但是跨森林的攻擊在2005 年就已經出現。首先解釋什麼是SIDHistory 和SID 過濾機制

SIDHistory​

SIDHistory(在PAC 結構中為ExtraSids 字段)是為了方便用戶在域之間的遷移。當一個用戶遷移到新的域後,原來的SID 以及所在組的一些SID,都可被加入到新域中新用戶的SIDHistory 屬性。當這個新的用戶訪問某個資源時,根據SID 或者SIDHistory 在資源ACL 中的匹配性來判斷是拒絕或者允許訪問。因此SIDHistory 相當於多了一個或者多個組屬性,權限得到了擴張
在同一個森林內部的跨域信任關係中,SIDHistory 屬性沒有被SID 過濾保護機製過濾。如果一個子域的用戶SIDHistory 屬性添加了企業管理員(企業管理員肯定是森林的管理員)的SID,則子用戶具備了森林的企業管理員權限,權限得到了擴張,所以SIDHistory 後來被修改為受保護的屬性
而跨森林的信任關係中,SIDHistory 屬性被SID 過濾機製過濾,不再具備上面的特權屬性,這也是森林是活動目錄的安全邊界的原因之一

SID 过滤机制​

當一個用戶的TGT 通過域信任關係被轉遞到一個新域後,TGT 中的PAC(privileged attribute certificate) 包含用戶的SID 和SIDHisto
 
返回
上方