標籤:

域信任機制的攻擊技術指南Part.2

為什麼要關注這些內容呢?

域信任通常會在環境之間引入意想不到的訪問路徑。在許多企業或組織中,信任機制實施了很多年(甚至有可能超過10年),但是在安全性上沒有考慮太多。一些專註於收購其他公司的企業或組織往往只是將「新公司」的Active Directory網路作為子域或外部信任的域「插入」到現有的網路中,而沒有充分考慮安全性所帶來的影響。

由於歷史上沒有很多工具集可以讓你輕鬆的映射,列舉和顯示那些與信任機制出現錯誤配置相關聯的風險,因此許多域架構師不知道Active Directory信任體系結構帶來的意想不到的安全風險。@wald0和@cptjesus以及我在今年的Derbycon上都談及過一個話題——「配置錯誤帶來的負債」。正因為如此,各種各樣的紅隊(可能是APTz,我只是假設)多年來一直在濫用Active Directory的信任機制,並取得了非常不錯的成功。

一種常見的情況是入侵開發或輔助域,並利用這種訪問許可權轉移到安全的根域中。這也為持久性提供了很多機會——為什麼要讓代碼在安全的環境中運行,何時可以將攻擊載荷運行在不太安全的(但是可信的)域中,之後可以用來隨意的重新攻破目標?

林內的信任(父/子或樹根)引入了一個很不錯的攻擊媒介,在本文後面的信任分析中會有介紹。外部或林之間的信任不保證任何形式的特權訪問,但至少信任關係的存在意味著你可以從信任你的域中查詢到任何正常的Active Directory信息(是的,這意味著在某些情況下你可以跨Kerberoast信任,更多內容可以在本文末尾找到)。畢竟,活動目錄是作為一個可查詢的信息資料庫,信任關係是不會改變的!

信任機制攻擊策略

在我們討論如何枚舉和濫用域信任之前,我想了解審計信任關係時使用的高層策略。當我談論「信任機制攻擊策略」時,我的意思是說這是一種在內網滲透中從你拿到訪問許可權的域移動到另一個域的入侵方法。

(1)第一步是列舉你當前所在域的所有信任關係以及這些域所具有的任何信任關係,等等。基本上,你希望通過鏈接信任轉介來生成從當前上下文可以到達的所有域的映射。這將使你能夠確定你想要達到你的目標所需要跳過的域以及你可以執行什麼樣的技術(可能)實現這一入侵目標。Sean Metcalf和 Benjamin Delpy開發了SIDhistory-trust-hopping技術,能夠使得在同一個林中映射的「網格」中的任何域(例如,父->子的信任關係)都具有特殊的意義,這一塊的內容將會在本問的後續部分進一步介紹。

(2)下一步是枚舉一個域中的任何用戶/組/計算機(安全主體),這些用戶/組/計算機(安全主體)可以1)訪問另一個域中的資源(即本地管理員組中的成員資格或DACL ACE條目) 2)或者是在來自另一個域的某個組裡,如果安全主體是一個組的話,也有可能是具有來自另一個域的用戶。這裡的要點是找到以某種方式跨越映射的信任邊界的關係,因此可以在網格中提供一種從一個域到另一個域的「訪問橋」。儘管跨域嵌套關係不能保證方便的訪問,但是信任機制通常是出於某種原因而實現的,這意味著通常可能存在某種類型的跨域用戶/組/資源「嵌套」,並且在許多企業或組織中,這些關係被錯誤地進行配置。如上所述,另一個利用方法是「跨信任邊界的Kerberoasting攻擊」,這可能是跳轉信任邊界的另一個攻擊向量。更多信息請查看「另一個旁註:跨域信任邊界的Kerberoasting攻擊 」章節部分。

(3)現在你已經映射出了信任網格,類型和跨域嵌套關係,你可以獲得需要入侵的帳戶的映射關係,以便從當前域轉到目標域。通過執行有針對性的帳戶入侵方法,並利用林內域信任的SID歷史跳轉,我們就已經能夠在該域中通過多達7個以上的域來實現我們的攻擊目標。

至少,請記住,如果一個域信任你,即如果信任關係是雙向的,或者如果是單向和入站的,那麼你可以從信任域查詢任何關於Active Directory的信息。請記住,所有的父子(林內的域信任)信任關係都保持著一個隱式的雙向傳遞信任。而且,由於子域的添加方式,「企業管理員」組將自動添加到林中每個域的管理員域的本地組。這意味著信任是從林根源處「流下來」的,而我們的目標是在攻擊鏈的任何適當步驟中從子域移動到林根域。

如何枚舉信任?

OK,那麼,我怎麼去弄清楚我當前的環境中存在哪些信任關係呢?

據我所知,枚舉信任有三種主要方法:Win32 API調用,各種.NET方法和LDAP。每個方式返回一組不同的信息,每個方式又有不同的執行方法。我將介紹一種比較古老的方式以及新的姿勢,從內置(和外部)二進位文件到.NET,到Win32 API調用,到PowerShell / PowerView和BloodHound。

我將在這篇文章中使用的信任體系結構的示例如下:

此圖是使用了新的 TrustVisualizer輸出生成的(在「 可視化域信任」 部分中進行了介紹)。有了這個新的輸出,綠色的邊緣意味著「在林之內」,紅色意味著「在林之外」,藍色意味著林之間的信任關係。與@sixdub 的 DomainTrustExplorer一樣,單向信任的邊緣方向意味著訪問的方向,而不是信任的方向。

.NET方法

.NET為我們提供了一些封裝的很好的方法,可以枚舉一大堆的域和林信任信息。在我們講Win32 API和LDAP方法之前,這是PowerView實現的第一個方法。

[System.DirectoryServices.ActiveDirectory.Domain] 命名空間具有 GetCurrentDomain()方法,這個方法返回了一個靜態方法 System.DirectoryServices.ActiveDirectory.Domain類實例。這個類實現了 GetAllTrustRelationships()方法,這個方法可以很好地「 檢索該域的所有信任關係。」這種方法的優點是利用非常的簡單 ——信息以易於閱讀和理解的方式進行輸出。缺點是它不包含其他枚舉方法產生的一些附加信息。

([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()n

這曾經是PowerView中的Get-DomainTrust 默認使用的枚舉方法。我最近將默認方法更改為LDAP,因為此.NET方法默認情況下不會返回林信任,而LDAP枚舉則會返回很多額外的信息。所以在使用PowerView時為了執行這個方法,你現在需要運行Get-DomainTrust-NET 。

下圖是它如何查找我的示例域設置的信任,從sub.dev.testlab.local 運行枚舉:

林信任在功能上與域信任不同。所以如果你想枚舉任何當前的森林->林信任,你需要調用 [System.DirectoryServices.ActiveDirectory.Forest]這個命名空間。生成的林對象也有自己的 GetAllTrustRelationships()方法,它將返回任何當前林的信任關係:

([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).GetAllTrustRelationships()n

這是作為PowerView的Get-ForestTrust 方法的默認枚舉實現。以下是它如何從sub.dev.testlab.local 再次查找我的示例域設置的信任:

Win32API

你還可以通過使用返回DS_DOMAIN_TRUSTS結構的DsEnumerateDomainTrusts() 這個Win32 API調用來枚舉域信任。雖然輸出的信息比.NET方法稍微複雜一些,但它會返回了目標域的SID和GUID,以及一些有用的標誌和屬性。標誌在這裡有詳細的記錄說明,並會告訴你信任的方向,信任是否在同一個林中等等。在這份文檔的TrustAttributes規範中對屬性有詳細的記錄說明,包括諸如WITHIN_FOREST,NON_TRANSITIVE,FILTER_SIDS等等。FILTER_SIDS與QUARANTINED_DOMAIN是等同的。

你可以使用Get-DomainTrust-API (相同的sub.dev.testlab.local域)調用此方法:

值得注意的是,這似乎是使用/trusted_domains 參數執行nltest.exe 後的輸出結果:

這也是 BloodHound用來枚舉域信任的方法。你可以使用Invoke-BloodHound -CollectionMethod信任語法,使用新的SharpHound.ps1執行此操作。請注意,這也可以與用於外部信任枚舉的-Domain <foreign.domain.fqdn> 結合使用。

LDAP

域信任在Active Directory中存儲為具有 trustedDomain的objectClass的「受信任的域對象」 。這意味著你可以使用任何LDAP查詢方法來查找有關使用LDAP過濾器(objectClass = trustedDomain)存在的任何域信任的信息。

例如,這裡是dsquery的執行方式(僅適用於Windows伺服器):

dsquery * -filter "(objectClass=trustedDomain)" -attr *n

與 Joeware的Adfind等效的語法是 .adfind.exe -f objectclass = trusteddomain 。

最後,PowerView再次將此LDAP枚舉方式用作Get-DomainTrust 的默認枚舉實現方法:

由於這個LDAP方法現在是PowerView的Get-DomainTrust 的默認實現,因此我將會分解一些可能會讓人困惑的結果屬性。

結果屬性的介紹請閱讀下一篇文章。

本文翻譯自:harmj0y.net/blog/redtea ,如若轉載,請註明原文地址: 4hou.com/technology/981 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

3個步驟實現簡單語言解釋器(自製簡易編程語言)
Docker Remote api在安全中的應用雜談
搜狗輸入法泄露隱私的事是否屬實?
滲透技巧——Windows中Credential Manager的信息獲取
周鴻禕講的「大安全」到底是啥?

TAG:信息安全 |