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

部署:

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

跨域鏈接信任(cross link),指的是在同一個森林的兩個子域間建立直接的信任關係。因為在同一個森林中,域的組織關係是樹狀結構,從一個子域到另外一個域,需要從樹枝的子域順尋到根域(Forest Root),然後從根域繼續順尋到另外一個子域,而跨域鏈接相當於在2 個子域之間之間建立了一個快捷方式的信任關係,以減少認證和授權的時間和步驟。
內部信任指的是森林內部域之間的信任關係。相應地,外部信任(External Domain Trust)指的是域和所在森林之外的域之間的信任關係。
還有一種MIT 信任(Kerberos 協議及標準由MIT 提出),是Windows 域與非Windows 域之間的信任關係,由於應用較少,本文不討論此種類型的域信任關係。
跨域认证和资源访问授权
當2 個域之間建立域信任關係時,會建立共享的域間密鑰(Inter-Realm Key,簡寫為IRKey),其作用相當於Krbtgt,只不過IRKey 用於相互信任的2 個域之間的認證,而Krbtgt 用於同一個域服務器的AC 和KDC 之間的認證。信任域之間的認證授權過程,與同一個域中的認證授權大抵相似,但仍然有不少區別。

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

不同的域有不同的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

仍然在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 組。

有2 種方式可以獲取信任賬號的NTLM 值。
Dcsync 获取信任账号的 NTLM 值
下圖採用Dcsync 方式,獲取lab.adsec.com 域中信任賬號adsec$ 的NTLM 值,結果表明該賬號的類型為TRUST_ACCOUNT
lsadum 获取信任账号的 NTLM 值
採用lsadump:trust /patch方式。從下圖中可看到有[IN] LAB.ADSEC.COM - ADSEC.COM 和[OUT] ADSEC.COM - LAB.ADSEC.COM 兩種不同的NTLM 值,分別是往外到其他域和往內到本域訪問時用到的值。因為雙向信任關係其實是2 個單向信任關係的疊加,所以會有2 個密鑰。這裡我們要從本域構造IRKey 版黃金票據訪問森林內部其他域,所以使用IN 這個NTLM 值。
由於IRKey 存在於森林內部的信任域之間,也存在於森林外部的森林之間,均可用於轉投認證。在SIDHistory 版黃金票據中,由於SID Filter 規則,在森林之間不能使用,但是IRKey 版不涉及這個安全過濾規則,仍然有效。 IRKey 版黃金票據可以分作森林內部的、森林外部的2 種,操作方法類似,這裡我們著重介紹森林內部的IRKey 版黃金票據。

域間轉投票據的認證,依靠IRKey 加密。在我們已知IRKey 的前提下,可以偽造持有該IRKey 的信任域的任意用戶。測試中,我們構造一個票據,告訴adsec.com 域,轉投認證的用戶為administrator,而且SIDHistory 為根域的企業管理員。
構造成功後,具備adsec.com 的管理員權限,但是不能高權限訪問lab.adsec.com,因為構造的票據是到adsec.com 域的管理員票據。在獲取adsec.com 域的高權限後,可以獲取該域的krbtgt 賬號的NTLM 值,在此基礎上,繼續構造SIDHistory 版黃金票據,從而可以獲取整個森林的控制權。
域信任关系的获取
在大型域網絡中,因為公司併購、企業重組、業務擴展等各種原因,域網絡的組織模式、信任關係各有不同。這些不同的信任關係,均存放在森林根域的數據庫中(Global Catalog),有多種方式可以獲取這些數據PowerView、BloodHound 工具分別提供了多種獲取域信任關係的方式,且能可視化信任關係。下面將介紹從森林內部的某個子域的主機,獲取整個森林信任關係的方法和過程。
Powerview:

先使用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 工具轉換為可視化圖形。

利用域信任实现跨域攻击
如果一個域內用戶(假設用戶為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 命令,可方便枚舉

對第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 過濾機製過濾,不再具備上面的特權屬性,這也是森林是活動目錄的安全邊界的原因之一