Kerberoast攻擊的另一種姿勢

大約在兩年前,Tim Medin提出了一種新的攻擊技術,他稱之為「Kerberoasting」。儘管在這種攻擊技術發布時我們還沒有意識到其全部的含義,但這種攻擊技術已經改變了我們的交戰遊戲。最近,Kerberoasting受到越來越多的關注,@mubix發布了以Kerberoasting為主題的三篇連載系列的博文,Sean Metcalf也發表過一些文章,另外@leonjza也做了一個不錯的write-up。

@machosec 在 PowerView 中pull了一個很強大的更新請求,使得使用純PowerShell進行Kerberoasting要比以往任何時候更加容易。我想在本文中簡要介紹這種技術及其背景,包括我們最近使用這種攻擊技術的一些情況,以及一些很棒的新發現。

Kerberoasting背景介紹

我第一次聽到Kerberoasting,是在2014年的SANS HackFest 上Tim演示了「攻擊Kerberos:踢爆守衛者的狗頭」的演講(他還在發布了Kerberoasting工具包)。我將簡要地說明這種攻擊姿勢的一些技術細節,但我強烈建議你閱讀Tim的PPT或Sean的一些解釋以獲取更多詳細信息。還有一個微軟發布的很不錯的文檔,標題為「Windows 上的 Kerberos技術補充」,這個文檔最終很好的解釋清楚了攻擊過程中涉及的幾個讓我感到迷惑的點。

我製作了一個kerberos工作過程的圖解,如下圖所示:

下面是我對Kerberoasting在這個過程中的理解(如果我的理解有誤,請讓我知道!):在用戶認證到密鑰分發中心後(在Windows域中KDC就是域控制器),他們會收到一個票證授予票(TGT),此票證使用域的krbtgt帳戶進行了簽名,證明他們是誰。然後TGT被用於請求域中的特定資源或服務的服務票證(TGS)。部分服務票證使用了目標服務實例的NTLM哈希進行加密。那麼KDC如何確定在加密這些服務票證時使用什麼密鑰?

Windows實現的Kerberos協議使用服務主體名稱(SPN)來確定使用哪個服務帳戶的哈希來加密服務票證。在Active Directory中有兩種「類型」的服務主體名稱:鏈接到域計算機帳戶的「基於主機」的SPN和通常(但不總是)鏈接到域用戶帳戶的「任意」的SPN。

微軟解釋說,「當在Active Directory中創建新的計算機帳戶時,將自動為內置服務生成基於主機的SPN …實際上,僅為HOST服務創建了SPN,並且所有內置服務都使用HOST SPN 」。換句話說,「HOST服務代表了託管計算機。 HOST SPN用於訪問託管計算機帳戶,長期密鑰由Kerberos協議在創建服務票據時使用。以下是我測試的域中的默認計算機帳戶示例:

你可以看到HOST/WINDOWS1 和WINDOWS1$計算機賬戶的SPN——HOST/ WINDOWS1.testlab.local。當域用戶請求訪問 WINDOWS1.testlab.local C $時,KDC會將此請求映射到HOST/WINDOWS1.testlab.local 這個SPN,這表示WINDOWS1$ 的計算機帳戶的NTLM 哈希(存儲在WINDOWS1本地和DC/KDC上的NTDS.dit Active Directory資料庫中)被用於加密伺服器部分的服務票證。然後將簽名或加密的票證提供給WINDOWS1.testlab.local,WINDOWS1.testlab.local負責確定請求用戶是否應該被授予訪問許可權。

從Kerberoasting的角度來看,我們通常不關心基於主機的SPN,因為計算機的機器帳戶密碼默認是隨機的,每30天更換一次。但是,請記住,可以為域用戶帳戶註冊任意的SPN。一個常見的例子就是一個服務賬戶管理著多個MSSQL實例;此用戶帳戶註冊的每個MSSQL實例都有一個<MSSQLSvc/HOST:PORT> 這樣的SPN,這個SPN存儲在用戶的serviceprincipalname屬性里(Sean保持的SPN更新列表可以在這裡找到)。如果我們有一個為域用戶帳戶註冊的任意SPN,那麼該用戶帳戶的明文密碼的NTLM哈希值就將用於創建服務票證。這就是Kerberoasting攻擊的關鍵。

「為什麼這是重要的?」

由於Kerberos的工作原理,任何用戶都可以請求在Active Directory中的用戶或計算機帳戶中具有已註冊SPN(HOST或任意)的任何服務的TGS。請記住,只是請求此票證並不會授予對請求用戶的訪問許可權,因為伺服器或服務才會最終確定是否應授予用戶訪問資源的許可權。 Tim認識到,由於這一點,並且因為請求SPN實例的TGS的一部分是用服務帳戶的明文密碼的NTLM哈希進行了加密,所以任何用戶都可以請求這些TGS票證,然後離線破解服務帳戶的明文密碼,而不用擔心帳戶被鎖定的風險!

要重申的是,任何具有服務主體名稱的域用戶帳戶都可以被該域中任何用戶請求該SPN的TGS,從而允許攻擊者離線破解服務帳戶的明文密碼!這顯然取決於一個可破解的服務帳戶明文密碼的複雜度,但幸運的是,對我們來說,服務帳戶往往設置了簡單的密碼並且很少更改。

Tim在他演示的PPT的第18頁提到了如下內容:

「老套的」Kerberoasting攻擊姿勢

Tim給出的利用方法或工具包是使用工具集的組合來請求票證,並從內存中提取(使用Mimikatz)票證,然後將它們轉換為可破解的格式。一般來說,整個過程如下:

1. 使用Tim的GetUserSPNS.ps1腳本或者Sean的Find-PSServiceAccounts.ps1腳本或PowerView的「Get-NetUser -SPN」來枚舉域帳戶的SPN。

2. 請求這些特定的SPN的 TGS可以使用Windows內置的工具setspn.exe或者在PowerShell中調用.NET的

System.IdentityModel.Tokens.KerberosRequestorSecurityToken類。

3. 使用Mimikatz的kerberos::list/export命令從內存中提取這些票證,並設置可選的base64導出格式。然後下載票據,或者將base64編碼的票證拖到攻擊者的機器上進行解碼。

4. 使用Tim的tgsrepcrack.py開始離線破解密碼,或者使用John the Ripper的kirbi2john.py從原始票證中提取可破解的哈希格式。

5. xan7r給 Tim的工具集增加了一個分支,他添加了一個autokerberoast.ps1腳本,自動化了上述攻擊過程。此外,@ tifkin_寫了一個Go語言版本的TGS爆破器,比原來的Python版本要快一些。

Kerberoasting攻擊的「新姿勢」

最近出現了一些東西,簡化了我們使用Kerberoasting攻擊的過程。首先,Michael Kramer在2015年9月將KRB5TGS格式添加到了John the Ripper中。其次,@ Fist0urs在2016年2月向Hashcat提交了相同的演算法,為破解這些票證打開了基於GPU破解的大門。這對我們來說真是一個分水嶺,因為它極大地擴展了我們可以破解的服務帳戶密碼的範圍。最後,Matan Hart(@machosec)對PowerView的一個pull請求刪除了對Mimikatz的需求。

因為,@machosec意識到在之前使用的.NET類KerberosRequestorSecurityToken中也有一個GetRequest()的方法,它返回Kerberos服務票證的原始位元組流。使用位字元串操作,Matan能夠輕鬆地提取加密的TGS(即可破解的哈希)。我們現在可以不再依賴Mimikatz提取票證了!

我最近將一些必要的功能轉換成了一個單獨的,自包含的腳本文件,其中包含來自PowerView的一些必要組件(這也會在Empire中更新)。我們目前正在重構PowerSploit的一些大型組件,並且更新的功能將會在更改後發布。這個自定義腳本包括Invoke-Kerberoast函數,該函數包裝了Get-NetUser -SPN(枚舉servicePrincipalName屬性值為非null的用戶帳戶)的邏輯和Get-SPNTicket,以請求關聯的TGS票證並輸出John the Ripper和Hashcat的可破解字元串。腳本的輸出如下圖所示:

它也適用於跨域請求!

默認情況下,輸出John the Ripper的格式,可以使用-OutputFormat Hashcat輸出Hashcat支持的格式。 請注意,-AdminCount參數只有Kerberoasts帳戶的AdminCount屬性為 1才有意義,這意味著這個賬戶是受保護的用戶帳戶,因此,這樣的賬戶幾乎總是高許可權賬戶:

下面是更新的Empire模塊:

請注意,對於非Empire的用法,當輸出PSObject時,你需要將結果傳遞到Format-List或ConvertTo-Csv -NoTypeInformation,以保留你想要顯示的信息。 然後你就可以利用@mubix在他的第三篇文章中所描述的破解方法破解這些票證了。

本文參考來源於harmj0y,如若轉載,請註明來源於嘶吼: Kerberoast攻擊的另一種姿勢 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

你的內網對黑客完全透明!(Xerosploit 使用)
【重大事件】知名終端模擬軟體XSHELL多官方版本存在後門,或上傳用戶伺服器賬號密碼!
金石人才培養計劃導師公布啦!——你敢說你不認識他們嗎?!
SecWiki周刊(第145期)
QQ最近總是提示QQ安全中心為您攔截異常2次,您的帳號疑似被盜,正處於保護模式中,怎麼處理?

TAG:技术分析 | 网络安全 |