當前位置:
首頁 > 新聞 > 利用 Bifrost 滲透域環境中的 Mac 主機

利用 Bifrost 滲透域環境中的 Mac 主機

Kirbi 使用 Bifrost 步行到活動目錄的世界

針對 macOS 的紅隊

蘋果公司每次發布新版本的 Macintosh 操作系統時,都會向前邁進一大步。每一次更改都會使一整套攻擊性工具失效,或者是增加了多個額外的障礙。正因為如此,由於 Python 和 shell 的穩定性,紅隊成員和滲透測試人員歷史性地傾向於使用 Python 和 shell 命令。然而,隨著蘋果公司的新方向的發展,不能保證外部語言如 Python、 Ruby 或 Perl 默認存在於 macOS 端點上。

這將新功能的開發推向操作系統或蘋果專用的編程語言。畢竟,如果 Python 不在討論範圍內,那麼像 Empire、 Impacket 或 Responder 這樣的通用工具也不不可能在討論範圍內。甚至蘋果自己的一些腳本語言版本,如 自動化Javascript (JXA) ,也維護得很差,功能也不完整。

作為紅隊,假設你能夠在 macOS 端點上執行命令,兩個最大的痛點就是證書訪問和橫向移動。但是有一件事人們經常忘記,那就是證書有很多種形式。MacOS 端點上有比用戶密碼哈希或明文密碼更多的憑據。具體來說,就是 Kerberos 的票證。這在活動目錄(AD)連接的計算機上更有用,但是這到底有多常見呢?

在 Twitter 上進行的關於加入到了域環境的 macOS 的調查

從快速的民意調查結果來看,至少有30%的人在至少25%的時間裡遇到過加入了域環境的 Mac 主機。為了幫助處理 macOS 端點上的 Kerberos 票證,我發布了一個新的名為 Bifrost 的開源工具。Bifrost是一個 Objective C 庫,它使用較低級別的 Kerberos API 和手動 Kerberos 網路流量,允許收集、操作、過濾和發現 macOS 上的 Kerberos 相關信息。

這篇文章的其餘部分主要關注 macOS 特定的背景知識、 Kerberos 的濫用以及防禦方面的考慮。

活動目錄不僅僅是 Windows

當談到活動目錄(AD)時,大多數人最初想到的是 微軟、 Windows,有時候還有 Kerberos。正因為如此,有大量的研究和工具致力於這些攻擊面的濫用和防禦。像 Bloodhound 這樣的工具試圖用圖論來說明 AD 攻擊路徑,而像 Rubeus 和 Kekeo 這樣的工具則旨在強調 Kerberos 在 Windows 上的特定弊端。這篇文章將從 macOS 的角度來看一些相同的濫用技術,如超越哈希傳遞攻擊,kerberoasting和票證傳遞攻擊。

然而,隨著企業的成長,除了 Windows 之外,還有更多的系統需要管理、保護和維護。解決這個問題有兩種主要的方法: 要麼將這些新系統加入到當前的 活動目錄環境中,要麼找到其他一些集中管理它們的方法。雖然不一定是每天都會發生的情況,但 macOS 端點加入到 Windows 活動目錄環境的情況正變得越來越常見。大多數 macOS 上的終端安全或服務提供商仍然在尋找 python 實例、惡意命令行二進位文件或直接的 keychain 訪問,這使得對 Kerberos 的 API 訪問從攻擊性的角度來看非常有吸引力。

Kerberos

由於活動目錄可以歸結為用於組織用戶、組、策略和容器的管理工具,因此需要有處理身份驗證和授權的輔助組件。當涉及到網路級別的身份驗證時,Kerberos 就是行業標準安全協議; 然而,Kerberos 不是微軟創造的。

因為 Kerberos 是開源的,並且由 MIT 免費提供,所以現在有一些主要的變體在使用。

·最真實的形式是各種 *nix 應用程序使用的由 MIT 實際實現的 Kerberos。

·最常見的實現是微軟改編過的協議,它與 Windows 中的活動目錄一起使用——這個版本不是開源的

·Heimdal 是Kerberos 版本 5 標準的另一種免費的開源 實現。這是 macOS 端點中包含的實現。

一般來說,基於 Kerberos 版本5規範構建的所有框架都具有一定程度的互操作性,但是實現和攻擊面差異很大。本博客的其餘部分將集中討論 macOS 上的 Heimdal 實現。

對於那些不熟悉 Kerberos 的人來說,下面的圖片是一個很好的高層次概述:

Kerberos 簡而言之的概述

該過程接受用戶的密碼,並對其進行哈希,然後使用該密碼獲取所謂的票證授予票證(Ticket Granting Ticket,TGT)——步驟1和2。此時,不再需要用戶的明文密碼。這個 TGT 是用戶的身份。當嘗試訪問網路資源(文件共享、 ssh 等)時,用戶會使用這個 TGT 獲得服務票證——步驟3和4。這是一個特定於用戶和他們想要訪問的服務的票證。最後一步是向實際的服務提供這個服務票證,以查看用戶是否有權訪問它,如果有權訪問,則提供訪問(比如遠程掛載共享)——步驟5和6。

這裡的關鍵是,用戶的 TGT 或服務票證也是遠程認證該用戶的有效方法,而不是需要用戶的純文本密碼或需要用戶的哈希來傳遞哈希。

活動目錄配置

從攻擊者的角度來看,首先要發現的是加入了活動目錄的 macOS 端點的配置。大多數情況下,/etc/krb5.conf 中有一個全局可讀的文件。其中包含與活動目錄環境交互的配置。但這並不是一個嚴格的要求。一台 macOS 計算機可以在沒有這個文件的情況下加入到活動目錄中,這種情況非常常見。此文件包含以下信息:

·支持票證授予票證(TGTs)和服務票證(如 AES256、 AES128、 RC4-HMAC 和3DES)的加密類型

·允許可轉發、可代理和可更新的票證標誌

·票證生命期限

·預設域和密鑰分發中心(KDC)的位置和埠

·預設票證存儲選項

用戶還可以通過進入系統參數設置-用戶和組-登錄選項-網路帳戶伺服器來查看他們已加入的域的 NETBIOS 短名稱。

macOS 上的票證存儲

下一步是確定 Kerberos 票證存儲在哪裡。根據所需的操作系統和安全級別,存儲 Kerberos 憑證有許多不同的方法,但是默認情況下,macOS 使用帶有 KCM (一種基於進程的憑證緩存)的憑證緩存 (ccache)條目。

查看憑據緩存有限子集的一種方法是打開 Keychain Access,單擊頂部的 Keychain Access 並選擇 Ticket Viewer。這是唯一一個用於查看當前用戶票證信息的 GUI 版本。然而,這種方法看到的內容是極其有限的。如果使用 Ticket Viewer 來獲取和存儲 Kerberos 憑證,那麼該信息將存儲在 Keychain 中,並且可以通過提供登錄密鑰鏈密碼來顯示。下圖中顯示的 UUID 對應於與票據相關聯的憑證緩存名稱:

Kerberos 將憑證存儲在密鑰鏈中

用戶通常使用以下內置的二進位文件與票據存儲器和 macOS 憑證緩存進行交互,這些文件不會保存任何東西到票據查看器中:

·Kinit ——通過輸入明文密碼獲得用戶的初始票證授予票證(TGT)

·Klist —— 列出特定 ccache 中條目的一些元數據,或列出內存中所有可見的 ccache

·Ktutil ——處理 keytab 條目(稍後將詳細介紹)

·kcc ——kerberos 憑證緩存操作

從攻擊的角度來看,依賴命令行上的內置命令是一種容易被檢測到的方法。默認情況下,macOS 中包含的 Kerberos 框架公開了一些較低級別的 API,用於與鍵標籤(keytab)和緩存進行交互。要獲得與 klist 類似的功能,只需在 Bifrost 中運行 list 操作:

Bifrost 列出了所有的憑據緩存條目

這將循環遍歷所有可在內存中發現的憑證緩存,並顯示有關緩存和內部所有票據的信息(注意: 這不需要提升的許可權)。上面的示例顯示 LAB\lab_admin 的默認緩存(用*表示)具有一種類型的 API,這意味著憑據實際上是位於 KCM 守護進程中的 KCM 憑據。該緩存有兩個條目: 用戶的 TGT 和另外一個條目,該條目描述了 KCM 如何訪問這些數據的信息(krb5 vs gssapi)。不過,第一個條目實際上包含用戶的 TGT,因此可以使用 -action dump -source tickets 命令轉儲它:

使用 Bifrost 導出憑證

關於上面的這張導出票證的截圖中,我們有幾件事需要注意。Bifrost將首先描述它將要丟棄的票證。這包括主體、所使用的加密類型、過期時間、票據上的標誌以及與票據相關的加密密鑰等信息。接下來要注意的是一個標記為 Kirbi 的巨大 base64編碼字元串。為方便 Bifrost 的操作,所有轉儲和導入的票證均採用 Kirbi 格式。這與 Mimikatz、 Kekeo 和 Rubeus 等工具使用的格式相同。這使得從 Bifrost 丟棄的票證可以立即導入到 windows 機器中,反之亦然。

票證傳遞

在 macOS 上導入票據類似於在 Windows 上導入票據。要考慮的關鍵問題是,每個憑據緩存都類似於窗口中的不同登錄會話。單個憑據緩存中的所有憑據都應該具有相同的客戶端主體名稱。這將防止在相同的憑據緩存中為 Alice 提供 TGT,為 Bob 提供 TGT,但是它們可以各自擁有自己的憑據緩存,而不會發生衝突。假設你有一張來自另一台 macOS 機器或 Windows 機器的 base64編碼的 Kirbi 票據,並且希望將其導入。下面的屏幕截圖顯示了將一個 CIFS 服務票證導入到當前用戶的默認憑證緩存中(注意: 這個操作不需要提升許可權) ,並將其導入到域控制器服務中。

導入 Kirbi 文件和憑證緩存

如果你不確定 Kirbi 票證的內容,想看看它實際上包含什麼,可以通過 -action describe 參數查看:

Kirbi 票證的描述

超越哈希傳遞

Windows 中一個非常常見的場景是獲取用戶的哈希,但是需要將其擴展到 Kerberos 領域以獲取完整的 TGT。類似於 Will (@harmj0y)的 Rubeus 項目和 post,Bifrost 可以手動構建 ASN1所需的 Kerberos 流量來獲取用戶哈希並恢復 TGT (注意: 這個操作不需要高許可權)。如果在 Windows 計算機上收集 NTLM 哈希,則應選擇 rc4加密類型。

此外,由於 Kerberos 流量是手動構造的,因此還有更多可用的選項。如果你有用戶密碼的 AES256 哈希值,但想要更容易破解(如 RC4) ,那麼使用 -tgtEnctype rc4 標誌指定它。

Kerberoasting

現在你可以獲得有效的 TGT 並導入它們,下一步是使用這些 TGT 來訪問服務。威爾在他的博客中非常詳盡地報道了 Kerberoasting 攻擊,所以這裡不會進行深入的探討,但是這也是可以通過 Bifrost 實現的。基本原則是,任何有效的 TGT 都可以用於請求到任何服務的票據。產生的票證有一部分是用相關服務的密碼哈希加密的。因此,如果服務票證被迫使用較弱的加密演算法,那麼破解服務帳戶密碼就更容易了。

由於獲得正常服務票證和 kerberoasting 之間的唯一區別是專門為最終票據請求較弱的加密類型,因此 Bifrost 的 asktgs 命令只需要一個額外的標誌-kerberoast true 來請求服務票證是 RC4加密即可,而不是請求標準的 AES256。

使用 Bifrost 執行 Kerberoasting 攻擊

只需逗號分隔 SPN,就可以同時指定多個服務。在 macOS 上,計算機賬戶上有四個默認的 SPN:

計算機中帶有$符的帳戶

在 macOS 中充當域的本地計算機帳戶與在 Windows 中有點不同。在 Windows 中,你可以注入 SYSTEM 進程並自動遠程作為計算機 $account ——這就是為什麼即使 SYSTEM 不是域帳戶,你仍然可以查詢活動目錄。如果你能夠解鎖系統鑰匙鏈(通常只需要本地管理員憑證) ,那麼你可以讀取計算機帶有$符的賬戶的明文密碼:

/Active Directory/LAB 的計算機上帶有$符的帳戶的密碼

Bifrost可以使用這個密碼和 -action askhash 命令來生成獲取 TGT 和這台計算機的服務票證所需的密碼哈希。這個密碼和其他用戶密碼的字元可能會破壞或者導致出現命令行解析問題,所以如果是這種情況,只需使用 -bpassword 參數,並傳入 base64版本的密碼即可,如下圖所示:

將明文密碼轉換為 kerberos 可用的哈希

在 macOS 上利用 Kerberos 票證

在你完成了一些 Kerberos 票據操作之後,如何在實際的環境中利用這些技術來訪問環境中的資源?

要使用 kerberos 票據訪問遠程計算機的 SMB 共享,只需使用 mount 命令:

mount -t smbfs "//computer/share" /local/path

這個時候重要的是要記住,如果掛載了一個共享,本地 root 用戶可以訪問並遍歷它。該計算機中的任何其他用戶也可以運行 mount 命令查看所有當前掛載的共享(類似於 windows 上的net use 命令)。

Alice 用戶看到了 lab_admin 用戶掛在了一個共享

使用 mount 命令可能會遇到完全限定域名的問題,如果是這種情況,只需要計算機的名稱就可以了。下面的視頻顯示了一個普通用戶——Alice,使用域管理密碼的哈希,然後掛載並遍歷域控的 C$ 共享:

使用 over-pass-the-hash 訪問一個 C$ 共享的演示視頻https://youtu.be/U3wRYfQeYDg

如果你將票據導入默認值以外的憑據緩存(用*表示) ,或者希望在磁碟上使用憑據緩存,則可以指定 KRB5CCNAME= 作為環境參數,並指定要使用的緩存。如果你正在使用內存中的文件,請確保使用完整的名稱,包括主要的API:;如果在磁碟上使用文件,請確保將FILE:添加到路徑中。

還可以將 SSH 配置為使用 Kerberos 票證,但這需要為 SSH 客戶端和 SSH 伺服器準備更多的配置參數。

鍵標籤和保存的哈希

Keytab 文件類似於 SSH 密鑰。它們存儲用於對服務的用戶進行身份驗證的加密信息。更具體地說,keytab 文件包含用於 Kerberos 身份驗證的加密密鑰,並綁定到特定的服務主體名稱(SPN)。主要的一點原因是因為它們可以提供一種跨多種應用程序的單點登錄機制,並可用於所有主要的操作系統。雖然它們是以純文本形式存儲的,但它們並不完全包含密碼的明文。

每個 macOS 設備上都有一個默認的 keytab 文件,無論它是否加入了位於 /etc/krb5.keytab 中的域(稍後將詳細介紹)。但是用戶可以在任何時候創建他們自己的 keytab。處理 keytab 的主要二進位文件是 ktutil。這個默認的 keytab 被鎖定到 root 用戶和 macOS 上具有640個許可權的 keytabusers 組。當用戶創建他們自己的 keytab 時,他們可以在上面設置不同的許可權。

創建並轉儲一個新的 keytab

這裡有一些重要的事情需要注意。因為這是一個 *nix 環境,所以大小寫的敏感性很重要。一定要把域設置為大寫所有字母,否則哈希將不起作用。此外,每個條目只有一個密鑰和一種加密類型,但可能有重複條目。如果你從上面注意到,這裡保存的哈希與使用明文密碼時生成的 AES256 哈希相同。Bifrost 還支持在從域請求 TGT 時指定 keytab 文件和加密類型。

關於 LKDC 的一個注意事項

自10.5 開始的每個 macOS 設備都包括自己的整個本地 kerberos 堆棧——包括唯一的域、 krbtgt 用戶和密鑰分發中心。添加本地密鑰分發中心(LKDC)是為了支持兩個 Apple 設備端點之間基於 kerberos 的身份驗證,而不需要將它們連接到中央域和 KDC。當訪問遠程 macOS 端點上的共享服務(例如瀏覽文件系統)時,這就開始起作用了。

這個過程與基於 windows 的 Kerberos 有點不同,當你在掛載了一個共享文件夾後使用 Bifrost 轉儲票證時,這個過程非常明顯:

LKDC 掛載共享文件夾

這篇博文不會詳細介紹 LKDC 的所有細節以及它是如何工作的或者是它與其他活動目錄的不同之處,但是從這些數據中可以「輕鬆地獲得」一些信息。頂部突出顯示的區域包含遠程計算機的明文密碼、用戶名和主機名。當用Bifrost轉儲票據時,你會得到一個用於掛載共享的base64版本的明文密碼。底部突出顯示的部分顯示了共享的掛載位置。

請記住,這是一個完全不同的Kerberos領域,其生成密鑰的方法與本博客的其餘部分不同,也與微軟的實現不同。這裡的鑰匙可以在 /etc/krb5.keytab 文件中本地用戶的 Open Directory 屬性中的 dsAttrTypeNative: HeimdalSRPKey 和 dsAttrTypeNative: kerberos 屬性中找到。你可以使用 dscl 實用程序或 Orchard 項目來讀取這些文件,但必須提升你的許可權才能訪問其中的任何文件。這裡存儲的值是ASN1符號,所以如果你想要探索這些值,那麼你應該使用ASN1解碼器來解析這些片段。

防禦方面的考慮

macOS 上沒有太多原生的機會來深入研究這些 API,但 Heimdal Kerberos 確實提供了一種方法,至少可以在這些 API 調用上啟用調試級日誌記錄:

sudo defaults write /Library/Preferences/com.apple.Kerberos logging -dict-add krb5 "0-/SYSLOG:"

sudo defaults write /Library/Preferences/com.apple.Kerberos logging -dict-add kcm "0-/SYSLOG:"

sudo defaults write com.apple.MITKerberosShim EnableDebugging -bool true

sudo defaults write /Library/Preferences/com.apple.Kerberos logging -dict-add kcm "1-/ASL:"

默認情況下,/Library/Preferences/com.apple.Kerberos.plist 文件並不存在,這個文件在創建時是一個全局可讀的文件。攻擊者可以通過讀取這個文件來確定潛在的日誌記錄功能,並在許可權提升後禁用日誌記錄。

此外,有了新的終端安全和服務框架(ESF) ,就有可能檢測針對 Kerberos 的攻擊行為。框架被實時載入到進程中。這將在很大程度上取決於特定的環境以及哪些進程通常利用這個框架。由於 Kerberos 確實為環境中的單點登錄(Single-Sign-On,SSO)提供了一種很好的方式,因此可能會有一大堆第三方應用程序使用這些 API。

Bifrost 的一些功能依賴於對一個域控制器進行手動 的 Kerberos 通信 (帶有哈希的asktgt、asktgs、s4u)。正因為如此,運行 Bifrost 代碼的進程將直接連接到域控制器上的88埠。根據環境的不同,這可能是一個簡單的檢測指標。

參考資料

[1] https://www.macobserver.com/analysis/macos-catalina-deprecates-unix-scripting-languages/

[2] https://github.com/EmpireProject/Empire

[3] https://github.com/SecureAuthCorp/impacket

[4] https://github.com/lgandx/Responder

[5] https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/index.html

[6] https://github.com/its-a-feature/bifrost

[7] https://github.com/BloodHoundAD/BloodHound

[8] https://github.com/GhostPack/Rubeus

[9] https://github.com/gentilkiwi/kekeo

[10] https://web.mit.edu/kerberos/

[11] https://github.com/heimdal/heimdal

[13] https://www.ericom.com/kerberos.asp#top

[14] https://web.mit.edu/kerberos/krb5-devel/doc/basic/ccache_def.html#ccache-types

[15] https://k5wiki.kerberos.org/wiki/Projects/KCM_client

[16] https://github.com/aosm/Heimdal/blob/master/kuser/kcc-commands.in

[17] http://web.mit.edu/macdev/Development/MITKerberos/MITKerberosLib/Common/Documentation/KerberosFramework.html

[18] https://github.com/gentilkiwi/mimikatz

[19] https://www.harmj0y.net/blog/redteaming/from-kekeo-to-rubeus/

[20] https://www.harmj0y.net/blog/redteaming/kerberoasting-revisited/

[21] https://blogs.technet.microsoft.com/pie/2018/01/03/all-you-need-to-know-about-keytab-files/

[22] http://ptgmedia.pearsoncmg.com/imprint_downloads/peachpit/peachpit/bookreg/0321635329/C_DirSerRG.pdf

[23] https://github.com/its-a-feature/Orchard

[24] https://opensource.apple.com/source/Heimdal/Heimdal-247.9/packages/mac/heimdal_debug.5.auto.html

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

持續對抗xHunt:通過DNS隧道檢測阻止新型PowerShell後門
歐盟發布5G網路威脅圖譜